]> 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
Improve JCR explorer
[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.Repository;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.argeo.ArgeoException;
15 import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider;
16 import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider;
17 import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider;
18 import org.argeo.eclipse.ui.jcr.browser.RepositoryNode;
19 import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode;
20 import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
21 import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
22 import org.argeo.eclipse.ui.specific.FileHandler;
23 import org.argeo.jcr.ArgeoJcrConstants;
24 import org.argeo.jcr.JcrUtils;
25 import org.argeo.jcr.RepositoryRegister;
26 import org.eclipse.jface.action.MenuManager;
27 import org.eclipse.jface.viewers.ColumnLabelProvider;
28 import org.eclipse.jface.viewers.DoubleClickEvent;
29 import org.eclipse.jface.viewers.IDoubleClickListener;
30 import org.eclipse.jface.viewers.ISelectionChangedListener;
31 import org.eclipse.jface.viewers.IStructuredSelection;
32 import org.eclipse.jface.viewers.SelectionChangedEvent;
33 import org.eclipse.jface.viewers.StructuredSelection;
34 import org.eclipse.jface.viewers.TableViewer;
35 import org.eclipse.jface.viewers.TableViewerColumn;
36 import org.eclipse.jface.viewers.TreeViewer;
37 import org.eclipse.swt.SWT;
38 import org.eclipse.swt.custom.SashForm;
39 import org.eclipse.swt.layout.FillLayout;
40 import org.eclipse.swt.layout.GridData;
41 import org.eclipse.swt.layout.GridLayout;
42 import org.eclipse.swt.widgets.Composite;
43 import org.eclipse.swt.widgets.Menu;
44 import org.eclipse.ui.part.ViewPart;
45
46 public class GenericJcrBrowser extends ViewPart {
47 private final static Log log = LogFactory.getLog(GenericJcrBrowser.class);
48
49 private Session session;
50
51 private TreeViewer nodesViewer;
52 private TableViewer propertiesViewer;
53
54 private RepositoryRegister repositoryRegister;
55
56 @Override
57 public void createPartControl(Composite parent) {
58
59 // Instantiate the generic object that fits for
60 // both RCP & RAP, must be final to be accessed in the double click
61 // listener.
62 // Not that in RAP, it registers a service handler that provide the
63 // access to the files.
64
65 final JcrFileProvider jfp = new JcrFileProvider();
66 final FileHandler fh = new FileHandler(jfp);
67
68 parent.setLayout(new FillLayout());
69
70 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
71 sashForm.setSashWidth(4);
72 sashForm.setLayout(new FillLayout());
73
74 Composite top = new Composite(sashForm, SWT.NONE);
75 GridLayout gl = new GridLayout(1, false);
76 top.setLayout(gl);
77
78 // nodes viewer
79 nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL
80 | SWT.V_SCROLL);
81 nodesViewer.getTree().setLayoutData(
82 new GridData(SWT.FILL, SWT.FILL, true, true));
83
84 // look for session
85 Session nodeSession = session;
86 if (nodeSession == null) {
87 Repository nodeRepository = JcrUtils.getRepositoryByAlias(
88 repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
89 if (nodeRepository != null)
90 try {
91 nodeSession = nodeRepository.login();
92 } catch (RepositoryException e1) {
93 throw new ArgeoException("Cannot login to node repository");
94 }
95 }
96 nodesViewer.setContentProvider(new NodeContentProvider(nodeSession,
97 repositoryRegister));
98 nodesViewer.setLabelProvider(new NodeLabelProvider());
99 nodesViewer
100 .addSelectionChangedListener(new ISelectionChangedListener() {
101 public void selectionChanged(SelectionChangedEvent event) {
102 if (!event.getSelection().isEmpty()) {
103 IStructuredSelection sel = (IStructuredSelection) event
104 .getSelection();
105 propertiesViewer.setInput(sel.getFirstElement());
106 } else {
107 propertiesViewer.setInput(getViewSite());
108 }
109 }
110 });
111
112 nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
113 public void doubleClick(DoubleClickEvent event) {
114 if (event.getSelection() == null
115 || event.getSelection().isEmpty())
116 return;
117 Object obj = ((IStructuredSelection) event.getSelection())
118 .getFirstElement();
119 if (obj instanceof RepositoryNode) {
120 RepositoryNode rpNode = (RepositoryNode) obj;
121 rpNode.login();
122 // For the file provider to be able to browse the various
123 // repository.
124 // TODO : enhanced that.
125 jfp.setRepositoryNode(rpNode);
126 nodesViewer.refresh(obj);
127
128 } else if (obj instanceof WorkspaceNode) {
129 ((WorkspaceNode) obj).login();
130 nodesViewer.refresh(obj);
131 } else if (obj instanceof Node) {
132 Node node = (Node) obj;
133
134 // double clic on a file node triggers its opening
135 try {
136 if (node.isNodeType("nt:file")) {
137 String name = node.getName();
138 String id = node.getIdentifier();
139 fh.openFile(name, id);
140 }
141 } catch (RepositoryException re) {
142 throw new ArgeoException(
143 "Repository error while getting Node file info",
144 re);
145 }
146 }
147 }
148 });
149
150 // context menu
151 MenuManager menuManager = new MenuManager();
152 Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
153 nodesViewer.getTree().setMenu(menu);
154 getSite().registerContextMenu(menuManager, nodesViewer);
155 getSite().setSelectionProvider(nodesViewer);
156
157 nodesViewer.setInput(getViewSite());
158
159 Composite bottom = new Composite(sashForm, SWT.NONE);
160 bottom.setLayout(new GridLayout(1, false));
161
162 // properties viewer
163 propertiesViewer = new TableViewer(bottom);
164 propertiesViewer.getTable().setLayoutData(
165 new GridData(SWT.FILL, SWT.FILL, true, true));
166 propertiesViewer.getTable().setHeaderVisible(true);
167 propertiesViewer.setContentProvider(new PropertiesContentProvider());
168 TableViewerColumn col = new TableViewerColumn(propertiesViewer,
169 SWT.NONE);
170 col.getColumn().setText("Name");
171 col.getColumn().setWidth(200);
172 col.setLabelProvider(new ColumnLabelProvider() {
173 public String getText(Object element) {
174 try {
175 return ((Property) element).getName();
176 } catch (RepositoryException e) {
177 throw new ArgeoException(
178 "Unexpected exception in label provider", e);
179 }
180 }
181 });
182 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
183 col.getColumn().setText("Value");
184 col.getColumn().setWidth(400);
185 col.setLabelProvider(new ColumnLabelProvider() {
186 public String getText(Object element) {
187 try {
188 Property property = (Property) element;
189 if (property.getType() == PropertyType.BINARY)
190 return "<binary>";
191 else if (property.isMultiple())
192 return Arrays.asList(property.getValues()).toString();
193 else
194 return property.getValue().getString();
195 } catch (RepositoryException e) {
196 throw new ArgeoException(
197 "Unexpected exception in label provider", e);
198 }
199 }
200 });
201 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
202 col.getColumn().setText("Type");
203 col.getColumn().setWidth(200);
204 col.setLabelProvider(new ColumnLabelProvider() {
205 public String getText(Object element) {
206 try {
207 return PropertyType.nameFromValue(((Property) element)
208 .getType());
209 } catch (RepositoryException e) {
210 throw new ArgeoException(
211 "Unexpected exception in label provider", e);
212 }
213 }
214 });
215 propertiesViewer.setInput(getViewSite());
216
217 sashForm.setWeights(getWeights());
218
219 nodesViewer.setComparer(new NodeViewerComparer());
220
221 }
222
223 @Override
224 public void setFocus() {
225 nodesViewer.getTree().setFocus();
226 }
227
228 /**
229 * To be overidden to adapt size of form and result frames.
230 *
231 * @return
232 */
233 protected int[] getWeights() {
234 return new int[] { 70, 30 };
235 }
236
237 /*
238 * NOTIFICATION
239 */
240 public void refresh(Object obj) {
241 nodesViewer.refresh(obj);
242 }
243
244 public void nodeAdded(Node parentNode, Node newNode) {
245 nodesViewer.refresh(parentNode);
246 nodesViewer.expandToLevel(newNode, 0);
247 }
248
249 public void nodeRemoved(Node parentNode) {
250
251 IStructuredSelection newSel = new StructuredSelection(parentNode);
252 nodesViewer.setSelection(newSel, true);
253 // Force refresh
254 IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
255 .getSelection();
256 nodesViewer.refresh(tmpSel.getFirstElement());
257 }
258
259 // IoC
260 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
261 this.repositoryRegister = repositoryRegister;
262 }
263
264 public void setSession(Session session) {
265 this.session = session;
266 }
267
268 }