]> 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
-> Finalisation of file download for 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.Arrays;
5
6 import javax.jcr.Node;
7 import javax.jcr.Property;
8 import javax.jcr.PropertyType;
9 import javax.jcr.RepositoryException;
10
11 import org.apache.commons.io.IOUtils;
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.dialogs.Error;
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.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 final 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 /*
56 * TEST
57 */
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 /*
69 * TEST END
70 */
71
72 parent.setLayout(new FillLayout());
73
74 SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
75 sashForm.setSashWidth(4);
76 sashForm.setLayout(new FillLayout());
77
78 Composite top = new Composite(sashForm, SWT.NONE);
79 GridLayout gl = new GridLayout(1, false);
80 top.setLayout(gl);
81
82 // nodes viewer
83 nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL
84 | SWT.V_SCROLL);
85 nodesViewer.getTree().setLayoutData(
86 new GridData(SWT.FILL, SWT.FILL, true, true));
87 nodesViewer.setContentProvider(new NodeContentProvider());
88 nodesViewer.setLabelProvider(new NodeLabelProvider());
89 nodesViewer
90 .addSelectionChangedListener(new ISelectionChangedListener() {
91 public void selectionChanged(SelectionChangedEvent event) {
92 if (!event.getSelection().isEmpty()) {
93 IStructuredSelection sel = (IStructuredSelection) event
94 .getSelection();
95 propertiesViewer.setInput(sel.getFirstElement());
96 } else {
97 propertiesViewer.setInput(getViewSite());
98 }
99 }
100 });
101
102 nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
103 public void doubleClick(DoubleClickEvent event) {
104 if (event.getSelection() == null
105 || event.getSelection().isEmpty())
106 return;
107 Object obj = ((IStructuredSelection) event.getSelection())
108 .getFirstElement();
109 if (obj instanceof RepositoryNode) {
110 RepositoryNode rpNode = (RepositoryNode) obj;
111 rpNode.login();
112 // For the file provider to be able to browse the repo.
113 // TODO : enhanced that.
114 jfp.setRepositoryNode(rpNode);
115
116 nodesViewer.refresh(obj);
117 } else if (obj instanceof WorkspaceNode) {
118 ((WorkspaceNode) obj).login();
119 nodesViewer.refresh(obj);
120 } // call the openFile commands on node
121 else if (obj instanceof Node) {
122 // Shell shell =
123 // aup.getWorkbench().getActiveWorkbenchWindow()
124 // .getShell();
125 // we can also do
126 // event.getViewer().getControl().getShell();
127
128 // Browser browser = new Browser(shell, SWT.NONE);
129 // browser.setText(encodedURL);
130 // boolean check = browser.setUrl(encodedURL);
131 // System.out.println("soo ?? : " + check);
132 // System.out.println("script : " + browser.executeScript);
133
134 // try {
135 // RWT.getResponse().sendRedirect(encodedURL);
136 // } catch (IOException e1) {
137 // // TODO Auto-generated catch block
138 // e1.printStackTrace();
139 // }
140
141 // final Browser browser = new Browser(parent, SWT.NONE);
142 // browser.setText(createDownloadHtml("test.pdf",
143 // "Download file"));
144
145 Node node = (Node) obj;
146 try {
147 if (node.isNodeType("nt:file")) {
148 String name = node.getName();
149 String id = node.getIdentifier();
150
151 Node child = node.getNodes().nextNode();
152 if (!child.isNodeType("nt:resource")) {
153 Error.show("Cannot open file children Node that are not of 'nt:resource' type.");
154 return;
155 }
156
157 InputStream fis = null;
158
159 try {
160 fis = (InputStream) child
161 .getProperty("jcr:data").getBinary()
162 .getStream();
163 // Instantiate the generic object that fits for
164 // both RCP & RAP.
165 fh.openFile(name, id, fis);
166 } catch (Exception e) {
167 throw new ArgeoException(
168 "Stream error while opening file", e);
169 } finally {
170 IOUtils.closeQuietly(fis);
171 }
172 }
173 } catch (RepositoryException re) {
174 re.printStackTrace();
175
176 }
177
178 }
179
180 }
181 });
182
183 // context menu
184 MenuManager menuManager = new MenuManager();
185 Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
186 nodesViewer.getTree().setMenu(menu);
187 getSite().registerContextMenu(menuManager, nodesViewer);
188 getSite().setSelectionProvider(nodesViewer);
189
190 nodesViewer.setInput(repositoryRegister);
191
192 Composite bottom = new Composite(sashForm, SWT.NONE);
193 bottom.setLayout(new GridLayout(1, false));
194
195 // properties viewer
196 propertiesViewer = new TableViewer(bottom);
197 propertiesViewer.getTable().setLayoutData(
198 new GridData(SWT.FILL, SWT.FILL, true, true));
199 propertiesViewer.getTable().setHeaderVisible(true);
200 propertiesViewer.setContentProvider(new PropertiesContentProvider());
201 TableViewerColumn col = new TableViewerColumn(propertiesViewer,
202 SWT.NONE);
203 col.getColumn().setText("Name");
204 col.getColumn().setWidth(200);
205 col.setLabelProvider(new ColumnLabelProvider() {
206 public String getText(Object element) {
207 try {
208 return ((Property) element).getName();
209 } catch (RepositoryException e) {
210 throw new ArgeoException(
211 "Unexpected exception in label provider", e);
212 }
213 }
214 });
215 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
216 col.getColumn().setText("Value");
217 col.getColumn().setWidth(400);
218 col.setLabelProvider(new ColumnLabelProvider() {
219 public String getText(Object element) {
220 try {
221 Property property = (Property) element;
222 if (property.getType() == PropertyType.BINARY)
223 return "<binary>";
224 else if (property.isMultiple())
225 return Arrays.asList(property.getValues()).toString();
226 else
227 return property.getValue().getString();
228 } catch (RepositoryException e) {
229 throw new ArgeoException(
230 "Unexpected exception in label provider", e);
231 }
232 }
233 });
234 col = new TableViewerColumn(propertiesViewer, SWT.NONE);
235 col.getColumn().setText("Type");
236 col.getColumn().setWidth(200);
237 col.setLabelProvider(new ColumnLabelProvider() {
238 public String getText(Object element) {
239 try {
240 return PropertyType.nameFromValue(((Property) element)
241 .getType());
242 } catch (RepositoryException e) {
243 throw new ArgeoException(
244 "Unexpected exception in label provider", e);
245 }
246 }
247 });
248 propertiesViewer.setInput(getViewSite());
249
250 sashForm.setWeights(getWeights());
251
252 nodesViewer.setComparer(new NodeViewerComparer());
253
254 }
255
256 @Override
257 public void setFocus() {
258 nodesViewer.getTree().setFocus();
259 }
260
261 /**
262 * To be overidden to adapt size of form and result frames.
263 *
264 * @return
265 */
266 protected int[] getWeights() {
267 return new int[] { 70, 30 };
268 }
269
270 /*
271 * NOTIFICATION
272 */
273 public void refresh(Object obj) {
274 nodesViewer.refresh(obj);
275 }
276
277 public void nodeAdded(Node parentNode, Node newNode) {
278 nodesViewer.refresh(parentNode);
279 nodesViewer.expandToLevel(newNode, 0);
280 }
281
282 public void nodeRemoved(Node parentNode) {
283
284 IStructuredSelection newSel = new StructuredSelection(parentNode);
285 nodesViewer.setSelection(newSel, true);
286 // Force refresh
287 IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
288 .getSelection();
289 nodesViewer.refresh(tmpSel.getFirstElement());
290 }
291
292 // IoC
293 public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
294 this.repositoryRegister = repositoryRegister;
295 }
296
297 }