1 package org
.argeo
.eclipse
.ui
.jcr
.views
;
3 import java
.util
.Arrays
;
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
;
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
;
47 public class GenericJcrBrowser
extends ViewPart
{
48 private final static Log log
= LogFactory
.getLog(GenericJcrBrowser
.class);
50 private Session session
;
52 private TreeViewer nodesViewer
;
53 private NodeContentProvider nodeContentProvider
;
54 private TableViewer propertiesViewer
;
56 private RepositoryRegister repositoryRegister
;
59 public void createPartControl(Composite parent
) {
61 // Instantiate the generic object that fits for
62 // both RCP & RAP, must be final to be accessed in the double click
64 // Not that in RAP, it registers a service handler that provide the
65 // access to the files.
67 final JcrFileProvider jfp
= new JcrFileProvider();
68 final FileHandler fh
= new FileHandler(jfp
);
70 parent
.setLayout(new FillLayout());
72 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
73 sashForm
.setSashWidth(4);
74 sashForm
.setLayout(new FillLayout());
76 Composite top
= new Composite(sashForm
, SWT
.NONE
);
77 GridLayout gl
= new GridLayout(1, false);
81 nodesViewer
= new TreeViewer(top
, SWT
.MULTI
| SWT
.H_SCROLL
83 nodesViewer
.getTree().setLayoutData(
84 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
87 Session nodeSession
= session
;
88 if (nodeSession
== null) {
89 Repository nodeRepository
= JcrUtils
.getRepositoryByAlias(
90 repositoryRegister
, ArgeoJcrConstants
.ALIAS_NODE
);
91 if (nodeRepository
!= null)
93 nodeSession
= nodeRepository
.login();
94 } catch (RepositoryException e1
) {
95 throw new ArgeoException("Cannot login to node repository");
98 nodeContentProvider
= new NodeContentProvider(nodeSession
,
100 nodesViewer
.setContentProvider(nodeContentProvider
);
101 nodesViewer
.setLabelProvider(new NodeLabelProvider());
103 .addSelectionChangedListener(new ISelectionChangedListener() {
104 public void selectionChanged(SelectionChangedEvent event
) {
105 if (!event
.getSelection().isEmpty()) {
106 IStructuredSelection sel
= (IStructuredSelection
) event
108 propertiesViewer
.setInput(sel
.getFirstElement());
110 propertiesViewer
.setInput(getViewSite());
115 nodesViewer
.addDoubleClickListener(new IDoubleClickListener() {
116 public void doubleClick(DoubleClickEvent event
) {
117 if (event
.getSelection() == null
118 || event
.getSelection().isEmpty())
120 Object obj
= ((IStructuredSelection
) event
.getSelection())
122 if (obj
instanceof RepositoryNode
) {
123 RepositoryNode rpNode
= (RepositoryNode
) obj
;
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
;
132 // double clic on a file node triggers its opening
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
140 // TODO : enhanced that.
141 jfp
.setRootNodes((Object
[]) nodeContentProvider
144 fh
.openFile(name
, id
);
146 } catch (RepositoryException re
) {
147 throw new ArgeoException(
148 "Repository error while getting Node file info",
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
);
162 nodesViewer
.setInput(getViewSite());
164 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
165 bottom
.setLayout(new GridLayout(1, false));
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
,
175 col
.getColumn().setText("Name");
176 col
.getColumn().setWidth(200);
177 col
.setLabelProvider(new ColumnLabelProvider() {
178 public String
getText(Object element
) {
180 return ((Property
) element
).getName();
181 } catch (RepositoryException e
) {
182 throw new ArgeoException(
183 "Unexpected exception in label provider", e
);
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
) {
193 Property property
= (Property
) element
;
194 if (property
.getType() == PropertyType
.BINARY
)
196 else if (property
.isMultiple())
197 return Arrays
.asList(property
.getValues()).toString();
199 return property
.getValue().getString();
200 } catch (RepositoryException e
) {
201 throw new ArgeoException(
202 "Unexpected exception in label provider", e
);
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
) {
212 return PropertyType
.nameFromValue(((Property
) element
)
214 } catch (RepositoryException e
) {
215 throw new ArgeoException(
216 "Unexpected exception in label provider", e
);
220 propertiesViewer
.setInput(getViewSite());
222 sashForm
.setWeights(getWeights());
224 nodesViewer
.setComparer(new NodeViewerComparer());
229 public void setFocus() {
230 nodesViewer
.getTree().setFocus();
234 * To be overidden to adapt size of form and result frames.
238 protected int[] getWeights() {
239 return new int[] { 70, 30 };
245 public void refresh(Object obj
) {
246 nodesViewer
.refresh(obj
);
249 public void nodeAdded(Node parentNode
, Node newNode
) {
250 nodesViewer
.refresh(parentNode
);
251 nodesViewer
.expandToLevel(newNode
, 0);
254 public void nodeRemoved(Node parentNode
) {
256 IStructuredSelection newSel
= new StructuredSelection(parentNode
);
257 nodesViewer
.setSelection(newSel
, true);
259 IStructuredSelection tmpSel
= (IStructuredSelection
) nodesViewer
261 nodesViewer
.refresh(tmpSel
.getFirstElement());
265 public void setRepositoryRegister(RepositoryRegister repositoryRegister
) {
266 this.repositoryRegister
= repositoryRegister
;
269 public void setSession(Session session
) {
270 this.session
= session
;