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