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