]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java
JCR browser
[lgpl/argeo-commons.git] / eclipse / runtime / org.argeo.eclipse.ui.jcr / src / main / java / org / argeo / eclipse / ui / jcr / views / GenericJcrBrowser.java
1 package org.argeo.eclipse.ui.jcr.views;
2
3 import java.util.Arrays;
4
5 import javax.jcr.Node;
6 import javax.jcr.Property;
7 import javax.jcr.PropertyType;
8 import javax.jcr.RepositoryException;
9
10 import org.argeo.ArgeoException;
11 import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider;
12 import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider;
13 import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider;
14 import org.argeo.eclipse.ui.jcr.browser.RepositoryNode;
15 import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode;
16 import org.argeo.jcr.RepositoryRegister;
17 import org.eclipse.jface.action.MenuManager;
18 import org.eclipse.jface.viewers.ColumnLabelProvider;
19 import org.eclipse.jface.viewers.DoubleClickEvent;
20 import org.eclipse.jface.viewers.IDoubleClickListener;
21 import org.eclipse.jface.viewers.ISelectionChangedListener;
22 import org.eclipse.jface.viewers.IStructuredSelection;
23 import org.eclipse.jface.viewers.SelectionChangedEvent;
24 import org.eclipse.jface.viewers.TableViewer;
25 import org.eclipse.jface.viewers.TableViewerColumn;
26 import org.eclipse.jface.viewers.TreeViewer;
27 import org.eclipse.swt.SWT;
28 import org.eclipse.swt.custom.SashForm;
29 import org.eclipse.swt.layout.FillLayout;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Menu;
34 import org.eclipse.ui.part.ViewPart;
35
36 public class GenericJcrBrowser extends ViewPart {
37 private TreeViewer nodesViewer;
38 private TableViewer propertiesViewer;
39
40 private RepositoryRegister repositoryRegister;
41
42 @Override
43 public void createPartControl(Composite parent) {
44 parent.setLayout(new FillLayout());
45
46 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
47 sashForm.setSashWidth(4);
48 sashForm.setLayout(new FillLayout());
49
50 Composite top = new Composite(sashForm, SWT.NONE);
51 GridLayout gl = new GridLayout(1, false);
52 top.setLayout(gl);
53
54 // nodes viewer
55 nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL
56 | SWT.V_SCROLL);
57 nodesViewer.getTree().setLayoutData(
58 new GridData(SWT.FILL, SWT.FILL, true, true));
59 nodesViewer.setContentProvider(new NodeContentProvider());
60 nodesViewer.setLabelProvider(new NodeLabelProvider());
61 nodesViewer
62 .addSelectionChangedListener(new ISelectionChangedListener() {
63 public void selectionChanged(SelectionChangedEvent event) {
64 if (!event.getSelection().isEmpty()) {
65 IStructuredSelection sel = (IStructuredSelection) event
66 .getSelection();
67 propertiesViewer.setInput(sel.getFirstElement());
68 } else {
69 propertiesViewer.setInput(getViewSite());
70 }
71 }
72 });
73 nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
74 public void doubleClick(DoubleClickEvent event) {
75 if (event.getSelection() == null
76 || event.getSelection().isEmpty())
77 return;
78 Object obj = ((IStructuredSelection) event.getSelection())
79 .getFirstElement();
80 if (obj instanceof RepositoryNode) {
81 ((RepositoryNode) obj).login();
82 nodesViewer.refresh(obj);
83 } else if (obj instanceof WorkspaceNode) {
84 ((WorkspaceNode) obj).login();
85 nodesViewer.refresh(obj);
86 }
87
88 }
89 });
90
91 // context menu
92 MenuManager menuManager = new MenuManager();
93 Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
94 nodesViewer.getTree().setMenu(menu);
95 getSite().registerContextMenu(menuManager, nodesViewer);
96 getSite().setSelectionProvider(nodesViewer);
97
98 nodesViewer.setInput(repositoryRegister);
99
100 Composite bottom = new Composite(sashForm, SWT.NONE);
101 bottom.setLayout(new GridLayout(1, false));
102
103 // properties viewer
104 propertiesViewer = new TableViewer(bottom);
105 propertiesViewer.getTable().setLayoutData(
106 new GridData(SWT.FILL, SWT.FILL, true, true));
107 propertiesViewer.getTable().setHeaderVisible(true);
108 propertiesViewer.setContentProvider(new PropertiesContentProvider());
109 TableViewerColumn col = new TableViewerColumn(propertiesViewer,
110 SWT.NONE);
111 col.getColumn().setText("Name");
112 col.getColumn().setWidth(200);
113 col.setLabelProvider(new ColumnLabelProvider() {
114 public String getText(Object element) {
115 try {
116 return ((Property) element).getName();
117 } catch (RepositoryException e) {
118 throw new ArgeoException(
119 "Unexpected exception in label provider", e);
120 }
121 }
122 });
123 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
124 col.getColumn().setText("Value");
125 col.getColumn().setWidth(400);
126 col.setLabelProvider(new ColumnLabelProvider() {
127 public String getText(Object element) {
128 try {
129 Property property = (Property) element;
130 if (property.getType() == PropertyType.BINARY)
131 return "<binary>";
132 else if (property.isMultiple())
133 return Arrays.asList(property.getValues()).toString();
134 else
135 return property.getValue().getString();
136 } catch (RepositoryException e) {
137 throw new ArgeoException(
138 "Unexpected exception in label provider", e);
139 }
140 }
141 });
142 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
143 col.getColumn().setText("Type");
144 col.getColumn().setWidth(200);
145 col.setLabelProvider(new ColumnLabelProvider() {
146 public String getText(Object element) {
147 try {
148 return PropertyType.nameFromValue(((Property) element)
149 .getType());
150 } catch (RepositoryException e) {
151 throw new ArgeoException(
152 "Unexpected exception in label provider", e);
153 }
154 }
155 });
156 propertiesViewer.setInput(getViewSite());
157
158 sashForm.setWeights(getWeights());
159
160 }
161
162 @Override
163 public void setFocus() {
164 nodesViewer.getTree().setFocus();
165 }
166
167 /**
168 * To be overidden to adapt size of form and result frames.
169 *
170 * @return
171 */
172 protected int[] getWeights() {
173 return new int[] { 70, 30 };
174 }
175
176 /*
177 * NOTIFICATION
178 */
179 public void refresh(Object obj) {
180 nodesViewer.refresh(obj);
181 }
182
183 public void nodeAdded(Node parentNode, Node newNode) {
184 nodesViewer.refresh(parentNode);
185 nodesViewer.expandToLevel(newNode, 0);
186 }
187
188 public void nodeRemoved(Node parentNode) {
189 nodesViewer.refresh(parentNode);
190 }
191
192 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
193 this.repositoryRegister = repositoryRegister;
194 }
195 }