]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java
Deprecate TreeObject (not used anywhere anymore)
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / views / GenericJcrBrowser.java
1 package org.argeo.jcr.ui.explorer.views;
2
3 import java.util.List;
4
5 import javax.jcr.Property;
6 import javax.jcr.PropertyType;
7 import javax.jcr.RepositoryException;
8 import javax.jcr.Session;
9 import javax.jcr.Value;
10 import javax.jcr.observation.Event;
11 import javax.jcr.observation.EventListener;
12 import javax.jcr.observation.ObservationManager;
13
14 import org.argeo.ArgeoException;
15 import org.argeo.eclipse.ui.TreeParent;
16 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
17 import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
18 import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser;
19 import org.argeo.jcr.RepositoryRegister;
20 import org.argeo.jcr.security.JcrKeyring;
21 import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
22 import org.argeo.jcr.ui.explorer.browser.NodeContentProvider;
23 import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider;
24 import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider;
25 import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
26 import org.argeo.jcr.ui.explorer.utils.GenericNodeDoubleClickListener;
27 import org.argeo.jcr.ui.explorer.utils.JcrUiUtils;
28 import org.eclipse.jface.action.MenuManager;
29 import org.eclipse.jface.viewers.ColumnLabelProvider;
30 import org.eclipse.jface.viewers.ISelectionChangedListener;
31 import org.eclipse.jface.viewers.IStructuredSelection;
32 import org.eclipse.jface.viewers.ITreeContentProvider;
33 import org.eclipse.jface.viewers.SelectionChangedEvent;
34 import org.eclipse.jface.viewers.StructuredSelection;
35 import org.eclipse.jface.viewers.TableViewer;
36 import org.eclipse.jface.viewers.TableViewerColumn;
37 import org.eclipse.jface.viewers.TreeViewer;
38 import org.eclipse.swt.SWT;
39 import org.eclipse.swt.custom.SashForm;
40 import org.eclipse.swt.layout.FillLayout;
41 import org.eclipse.swt.layout.GridData;
42 import org.eclipse.swt.layout.GridLayout;
43 import org.eclipse.swt.widgets.Composite;
44 import org.eclipse.swt.widgets.Display;
45 import org.eclipse.swt.widgets.Menu;
46
47 /**
48 * Basic View to display a sash form to browse a JCR compliant multirepository
49 * environment
50 */
51
52 public class GenericJcrBrowser extends AbstractJcrBrowser {
53 // private final static Log log =
54 // LogFactory.getLog(GenericJcrBrowser.class);
55 public final static String ID = JcrExplorerPlugin.ID + ".browserView";
56 private boolean sortChildNodes = false;
57
58 /* DEPENDENCY INJECTION */
59 private JcrKeyring jcrKeyring;
60 private RepositoryRegister repositoryRegister;
61
62 // This page widgets
63 private TreeViewer nodesViewer;
64 private NodeContentProvider nodeContentProvider;
65 private TableViewer propertiesViewer;
66 private EventListener resultsObserver;
67
68 // Manage documents
69 // private JcrFileProvider jcrFileProvider;
70 // private FileHandler fileHandler;
71
72 @Override
73 public void createPartControl(Composite parent) {
74
75 // look for session
76 Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession()
77 : null;
78 // if (nodeSession == null) {
79 // Repository nodeRepository = JcrUtils.getRepositoryByAlias(
80 // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
81 // if (nodeRepository != null)
82 // try {
83 // nodeSession = nodeRepository.login();
84 // // TODO : enhance that to enable multirepository listener.
85 // session = nodeSession;
86 // } catch (RepositoryException e1) {
87 // throw new ArgeoException("Cannot login to node repository");
88 // }
89 // }
90
91 // Instantiate the generic object that fits for
92 // both RCP & RAP
93 // Note that in RAP, it registers a service handler that provide the
94 // access to the files.
95 // jcrFileProvider = new JcrFileProvider();
96 // fileHandler = new FileHandler(jcrFileProvider);
97
98 parent.setLayout(new FillLayout());
99 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
100 sashForm.setSashWidth(4);
101 sashForm.setLayout(new FillLayout());
102
103 // Create the tree on top of the view
104 Composite top = new Composite(sashForm, SWT.NONE);
105 GridLayout gl = new GridLayout(1, false);
106 top.setLayout(gl);
107
108 nodeContentProvider = new NodeContentProvider(jcrKeyring,
109 repositoryRegister, sortChildNodes);
110
111 // nodes viewer
112 nodesViewer = createNodeViewer(top, nodeContentProvider);
113
114 // context menu : it is completely defined in the plugin.xml file.
115 MenuManager menuManager = new MenuManager();
116 Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
117
118 nodesViewer.getTree().setMenu(menu);
119 getSite().registerContextMenu(menuManager, nodesViewer);
120 getSite().setSelectionProvider(nodesViewer);
121
122 nodesViewer.setInput(getViewSite());
123
124 // Create the property viewer on the bottom
125 Composite bottom = new Composite(sashForm, SWT.NONE);
126 bottom.setLayout(new GridLayout(1, false));
127 propertiesViewer = createPropertiesViewer(bottom);
128
129 sashForm.setWeights(getWeights());
130 nodesViewer.setComparer(new NodeViewerComparer());
131 }
132
133 /**
134 * To be overridden to adapt size of form and result frames.
135 */
136 protected int[] getWeights() {
137 return new int[] { 70, 30 };
138 }
139
140 protected TreeViewer createNodeViewer(Composite parent,
141 final ITreeContentProvider nodeContentProvider) {
142
143 final TreeViewer tmpNodeViewer = new TreeViewer(parent, SWT.MULTI);
144
145 tmpNodeViewer.getTree().setLayoutData(
146 new GridData(SWT.FILL, SWT.FILL, true, true));
147
148 tmpNodeViewer.setContentProvider(nodeContentProvider);
149 tmpNodeViewer.setLabelProvider(new NodeLabelProvider());
150 tmpNodeViewer
151 .addSelectionChangedListener(new ISelectionChangedListener() {
152 public void selectionChanged(SelectionChangedEvent event) {
153 if (!event.getSelection().isEmpty()) {
154 IStructuredSelection sel = (IStructuredSelection) event
155 .getSelection();
156 Object firstItem = sel.getFirstElement();
157 if (firstItem instanceof SingleJcrNode)
158 propertiesViewer
159 .setInput(((SingleJcrNode) firstItem)
160 .getNode());
161 } else {
162 propertiesViewer.setInput(getViewSite());
163 }
164 }
165 });
166
167 resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay());
168 if (jcrKeyring != null)
169 try {
170 ObservationManager observationManager = jcrKeyring.getSession()
171 .getWorkspace().getObservationManager();
172 observationManager.addEventListener(resultsObserver,
173 Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/",
174 true, null, null, false);
175 } catch (RepositoryException e) {
176 throw new ArgeoException("Cannot register listeners", e);
177 }
178
179 tmpNodeViewer
180 .addDoubleClickListener(new GenericNodeDoubleClickListener(
181 tmpNodeViewer));
182 return tmpNodeViewer;
183 }
184
185 protected TableViewer createPropertiesViewer(Composite parent) {
186 propertiesViewer = new TableViewer(parent);
187 propertiesViewer.getTable().setLayoutData(
188 new GridData(SWT.FILL, SWT.FILL, true, true));
189 propertiesViewer.getTable().setHeaderVisible(true);
190 propertiesViewer.setContentProvider(new PropertiesContentProvider());
191 TableViewerColumn col = new TableViewerColumn(propertiesViewer,
192 SWT.NONE);
193 col.getColumn().setText("Name");
194 col.getColumn().setWidth(200);
195 col.setLabelProvider(new ColumnLabelProvider() {
196 public String getText(Object element) {
197 try {
198 return ((Property) element).getName();
199 } catch (RepositoryException e) {
200 throw new ArgeoException(
201 "Unexpected exception in label provider", e);
202 }
203 }
204 });
205 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
206 col.getColumn().setText("Value");
207 col.getColumn().setWidth(400);
208 col.setLabelProvider(new ColumnLabelProvider() {
209 public String getText(Object element) {
210 try {
211 Property property = (Property) element;
212 if (property.getType() == PropertyType.BINARY)
213 return "<binary>";
214 else if (property.isMultiple()) {
215 StringBuffer buf = new StringBuffer("[");
216 Value[] values = property.getValues();
217 for (int i = 0; i < values.length; i++) {
218 if (i != 0)
219 buf.append(", ");
220 buf.append(values[i].getString());
221 }
222 buf.append(']');
223 return buf.toString();
224 } else
225 return property.getValue().getString();
226 } catch (RepositoryException e) {
227 throw new ArgeoException(
228 "Unexpected exception in label provider", e);
229 }
230 }
231 });
232 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
233 col.getColumn().setText("Type");
234 col.getColumn().setWidth(200);
235 col.setLabelProvider(new ColumnLabelProvider() {
236 public String getText(Object element) {
237 try {
238 return PropertyType.nameFromValue(((Property) element)
239 .getType());
240 } catch (RepositoryException e) {
241 throw new ArgeoException(
242 "Unexpected exception in label provider", e);
243 }
244 }
245 });
246 propertiesViewer.setInput(getViewSite());
247 return propertiesViewer;
248 }
249
250 @Override
251 protected TreeViewer getNodeViewer() {
252 return nodesViewer;
253 }
254
255 /** Notifies the current view that a node has been added */
256 public void nodeAdded(TreeParent parentNode) {
257 // insure that Ui objects have been correctly created:
258 JcrUiUtils.forceRefreshIfNeeded(parentNode);
259 getNodeViewer().refresh(parentNode);
260 getNodeViewer().expandToLevel(parentNode, 1);
261 }
262
263 /** Notifies the current view that a node has been added */
264 public void nodeRemoved(TreeParent parentNode) {
265 IStructuredSelection newSel = new StructuredSelection(parentNode);
266 getNodeViewer().setSelection(newSel, true);
267 // Force refresh
268 IStructuredSelection tmpSel = (IStructuredSelection) getNodeViewer()
269 .getSelection();
270 getNodeViewer().refresh(tmpSel.getFirstElement());
271 }
272
273 class TreeObserver extends AsyncUiEventListener {
274
275 public TreeObserver(Display display) {
276 super(display);
277 }
278
279 @Override
280 protected Boolean willProcessInUiThread(List<Event> events)
281 throws RepositoryException {
282 for (Event event : events) {
283 if (getLog().isTraceEnabled())
284 getLog().debug("Received event " + event);
285 String path = event.getPath();
286 int index = path.lastIndexOf('/');
287 String propertyName = path.substring(index + 1);
288 if (getLog().isTraceEnabled())
289 getLog().debug("Concerned property " + propertyName);
290 }
291 return false;
292 }
293
294 protected void onEventInUiThread(List<Event> events)
295 throws RepositoryException {
296 if (getLog().isTraceEnabled())
297 getLog().trace("Refresh result list");
298 nodesViewer.refresh();
299 }
300
301 }
302
303 public void setSortChildNodes(boolean sortChildNodes) {
304 this.sortChildNodes = sortChildNodes;
305 }
306
307 public boolean getSortChildNodes() {
308 return sortChildNodes;
309 }
310
311 /* DEPENDENCY INJECTION */
312 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
313 this.repositoryRegister = repositoryRegister;
314 }
315
316 public void setJcrKeyring(JcrKeyring jcrKeyring) {
317 this.jcrKeyring = jcrKeyring;
318 }
319
320 }