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