]> 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
[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.io.InputStream;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.List;
7
8 import javax.jcr.Node;
9 import javax.jcr.Property;
10 import javax.jcr.PropertyType;
11 import javax.jcr.RepositoryException;
12
13 import org.apache.commons.io.IOUtils;
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.ArgeoException;
17 import org.argeo.eclipse.ui.dialogs.Error;
18 import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider;
19 import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider;
20 import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider;
21 import org.argeo.eclipse.ui.jcr.browser.RepositoryNode;
22 import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode;
23 import org.argeo.eclipse.ui.specific.FileHandler;
24 import org.argeo.jcr.RepositoryRegister;
25 import org.eclipse.jface.action.MenuManager;
26 import org.eclipse.jface.viewers.ColumnLabelProvider;
27 import org.eclipse.jface.viewers.DoubleClickEvent;
28 import org.eclipse.jface.viewers.IDoubleClickListener;
29 import org.eclipse.jface.viewers.ISelectionChangedListener;
30 import org.eclipse.jface.viewers.IStructuredSelection;
31 import org.eclipse.jface.viewers.SelectionChangedEvent;
32 import org.eclipse.jface.viewers.StructuredSelection;
33 import org.eclipse.jface.viewers.TableViewer;
34 import org.eclipse.jface.viewers.TableViewerColumn;
35 import org.eclipse.jface.viewers.TreeViewer;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.custom.SashForm;
38 import org.eclipse.swt.layout.FillLayout;
39 import org.eclipse.swt.layout.GridData;
40 import org.eclipse.swt.layout.GridLayout;
41 import org.eclipse.swt.widgets.Composite;
42 import org.eclipse.swt.widgets.Menu;
43 import org.eclipse.ui.part.ViewPart;
44
45 public class GenericJcrBrowser extends ViewPart {
46 private static Log log = LogFactory.getLog(GenericJcrBrowser.class);
47
48 private TreeViewer nodesViewer;
49 private TableViewer propertiesViewer;
50
51 private RepositoryRegister repositoryRegister;
52
53 @Override
54 public void createPartControl(Composite parent) {
55 parent.setLayout(new FillLayout());
56
57 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
58 sashForm.setSashWidth(4);
59 sashForm.setLayout(new FillLayout());
60
61 Composite top = new Composite(sashForm, SWT.NONE);
62 GridLayout gl = new GridLayout(1, false);
63 top.setLayout(gl);
64
65 // nodes viewer
66 nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL
67 | SWT.V_SCROLL);
68 nodesViewer.getTree().setLayoutData(
69 new GridData(SWT.FILL, SWT.FILL, true, true));
70 nodesViewer.setContentProvider(new NodeContentProvider());
71 nodesViewer.setLabelProvider(new NodeLabelProvider());
72 nodesViewer
73 .addSelectionChangedListener(new ISelectionChangedListener() {
74 public void selectionChanged(SelectionChangedEvent event) {
75 if (!event.getSelection().isEmpty()) {
76 IStructuredSelection sel = (IStructuredSelection) event
77 .getSelection();
78 propertiesViewer.setInput(sel.getFirstElement());
79 } else {
80 propertiesViewer.setInput(getViewSite());
81 }
82 }
83 });
84 nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
85 public void doubleClick(DoubleClickEvent event) {
86 if (event.getSelection() == null
87 || event.getSelection().isEmpty())
88 return;
89 Object obj = ((IStructuredSelection) event.getSelection())
90 .getFirstElement();
91 if (obj instanceof RepositoryNode) {
92 ((RepositoryNode) obj).login();
93 nodesViewer.refresh(obj);
94 } else if (obj instanceof WorkspaceNode) {
95 ((WorkspaceNode) obj).login();
96 nodesViewer.refresh(obj);
97 } // call the openFile commands on node
98 else if (obj instanceof Node) {
99 Node node = (Node) obj;
100 try {
101 if (node.isNodeType("nt:file")) {
102
103 Node child = node.getNodes().nextNode();
104 if (!child.isNodeType("nt:resource")) {
105 Error.show("Cannot open file children Node that are not of 'nt:resource' type.");
106 return;
107 }
108 InputStream fis = null;
109
110 try {
111 fis = (InputStream) child
112 .getProperty("jcr:data").getBinary()
113 .getStream();
114
115 String name = node.getName();
116
117 // Instantiate the generic object that fits for
118 // both
119 // RCP & RAP.
120 FileHandler fh = new FileHandler();
121 fh.openFile(name, fis);
122 // fh.openFile(file);
123 } catch (Exception e) {
124 throw new ArgeoException(
125 "Stream error while opening file", e);
126 } finally {
127 IOUtils.closeQuietly(fis);
128 }
129 }
130 } catch (RepositoryException re) {
131 re.printStackTrace();
132
133 }
134 }
135
136 }
137 });
138
139 // context menu
140 MenuManager menuManager = new MenuManager();
141 Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
142 nodesViewer.getTree().setMenu(menu);
143 getSite().registerContextMenu(menuManager, nodesViewer);
144 getSite().setSelectionProvider(nodesViewer);
145
146 nodesViewer.setInput(repositoryRegister);
147
148 Composite bottom = new Composite(sashForm, SWT.NONE);
149 bottom.setLayout(new GridLayout(1, false));
150
151 // properties viewer
152 propertiesViewer = new TableViewer(bottom);
153 propertiesViewer.getTable().setLayoutData(
154 new GridData(SWT.FILL, SWT.FILL, true, true));
155 propertiesViewer.getTable().setHeaderVisible(true);
156 propertiesViewer.setContentProvider(new PropertiesContentProvider());
157 TableViewerColumn col = new TableViewerColumn(propertiesViewer,
158 SWT.NONE);
159 col.getColumn().setText("Name");
160 col.getColumn().setWidth(200);
161 col.setLabelProvider(new ColumnLabelProvider() {
162 public String getText(Object element) {
163 try {
164 return ((Property) element).getName();
165 } catch (RepositoryException e) {
166 throw new ArgeoException(
167 "Unexpected exception in label provider", e);
168 }
169 }
170 });
171 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
172 col.getColumn().setText("Value");
173 col.getColumn().setWidth(400);
174 col.setLabelProvider(new ColumnLabelProvider() {
175 public String getText(Object element) {
176 try {
177 Property property = (Property) element;
178 if (property.getType() == PropertyType.BINARY)
179 return "<binary>";
180 else if (property.isMultiple())
181 return Arrays.asList(property.getValues()).toString();
182 else
183 return property.getValue().getString();
184 } catch (RepositoryException e) {
185 throw new ArgeoException(
186 "Unexpected exception in label provider", e);
187 }
188 }
189 });
190 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
191 col.getColumn().setText("Type");
192 col.getColumn().setWidth(200);
193 col.setLabelProvider(new ColumnLabelProvider() {
194 public String getText(Object element) {
195 try {
196 return PropertyType.nameFromValue(((Property) element)
197 .getType());
198 } catch (RepositoryException e) {
199 throw new ArgeoException(
200 "Unexpected exception in label provider", e);
201 }
202 }
203 });
204 propertiesViewer.setInput(getViewSite());
205
206 sashForm.setWeights(getWeights());
207
208 }
209
210 @Override
211 public void setFocus() {
212 nodesViewer.getTree().setFocus();
213 }
214
215 /**
216 * To be overidden to adapt size of form and result frames.
217 *
218 * @return
219 */
220 protected int[] getWeights() {
221 return new int[] { 70, 30 };
222 }
223
224 /*
225 * NOTIFICATION
226 */
227 public void refresh(Object obj) {
228 nodesViewer.refresh(obj);
229 }
230
231 public void nodeAdded(Node parentNode, Node newNode) {
232 nodesViewer.refresh(parentNode);
233 nodesViewer.expandToLevel(newNode, 0);
234 }
235
236 public void nodeRemoved(Node parentNode) {
237
238 List<Node> al = new ArrayList<Node>();
239 al.add(parentNode);
240
241 IStructuredSelection newSel = new StructuredSelection(al);
242 // IStructuredSelection newSel = new StructuredSelection(parentNode);
243
244 if (log.isDebugEnabled())
245 log.debug("new selection size = " + newSel.size());
246
247 nodesViewer.setSelection(newSel, true);
248 IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
249 .getSelection();
250
251 if (log.isDebugEnabled())
252 log.debug("set selection size = " + tmpSel.size());
253
254 nodesViewer.refresh();
255
256 //
257 // log.debug(" Class selected (Parent 1ST element) : "
258 // + tmpSel.getFirstElement().getClass());
259 // setFocus();
260 //
261 // nodesViewer.refresh(parentNode);
262
263 // // Call the refresh node command
264 // try {
265 // IWorkbench iw = JcrUiPlugin.getDefault().getWorkbench();
266 // IHandlerService handlerService = (IHandlerService) iw
267 // .getService(IHandlerService.class);
268 //
269 // // get the command from plugin.xml
270 // IWorkbenchWindow window = iw.getActiveWorkbenchWindow();
271 // ICommandService cmdService = (ICommandService) window
272 // .getService(ICommandService.class);
273 // Command cmd = cmdService
274 // .getCommand(OpenEbiDetailsEditor.COMMAND_NAME);
275 //
276 // // log.debug("cmd : " + cmd);
277 // ArrayList<Parameterization> parameters = new
278 // ArrayList<Parameterization>();
279 //
280 // // get the parameter
281 // IParameter iparam = cmd
282 // .getParameter(OpenEbiDetailsEditor.PARAM_UUID);
283 //
284 // Parameterization params = new Parameterization(iparam,
285 // ((String[]) obj)[0]);
286 // parameters.add(params);
287 //
288 // // build the parameterized command
289 // ParameterizedCommand pc = new ParameterizedCommand(cmd,
290 // parameters.toArray(new Parameterization[parameters.size()]));
291 //
292 // // execute the command
293 // handlerService = (IHandlerService) window
294 // .getService(IHandlerService.class);
295 // handlerService.executeCommand(pc, null);
296 //
297 // } catch (Exception e) {
298 // throw new ArgeoException("Error opening EBI", e);
299 // }
300 }
301
302 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
303 this.repositoryRegister = repositoryRegister;
304 }
305 }