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
;
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
.jcr
.browser
.NodeContentProvider
;
16 import org
.argeo
.eclipse
.ui
.jcr
.browser
.NodeLabelProvider
;
17 import org
.argeo
.eclipse
.ui
.jcr
.browser
.PropertiesContentProvider
;
18 import org
.argeo
.eclipse
.ui
.jcr
.browser
.RepositoryNode
;
19 import org
.argeo
.eclipse
.ui
.jcr
.browser
.WorkspaceNode
;
20 import org
.argeo
.eclipse
.ui
.jcr
.utils
.JcrFileProvider
;
21 import org
.argeo
.eclipse
.ui
.jcr
.utils
.NodeViewerComparer
;
22 import org
.argeo
.eclipse
.ui
.specific
.FileHandler
;
23 import org
.argeo
.jcr
.ArgeoJcrConstants
;
24 import org
.argeo
.jcr
.JcrUtils
;
25 import org
.argeo
.jcr
.RepositoryRegister
;
26 import org
.eclipse
.jface
.action
.MenuManager
;
27 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
28 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
29 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
30 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
31 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
32 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
33 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
34 import org
.eclipse
.jface
.viewers
.TableViewer
;
35 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
36 import org
.eclipse
.jface
.viewers
.TreeViewer
;
37 import org
.eclipse
.swt
.SWT
;
38 import org
.eclipse
.swt
.custom
.SashForm
;
39 import org
.eclipse
.swt
.layout
.FillLayout
;
40 import org
.eclipse
.swt
.layout
.GridData
;
41 import org
.eclipse
.swt
.layout
.GridLayout
;
42 import org
.eclipse
.swt
.widgets
.Composite
;
43 import org
.eclipse
.swt
.widgets
.Menu
;
44 import org
.eclipse
.ui
.part
.ViewPart
;
46 public class GenericJcrBrowser
extends ViewPart
{
47 private final static Log log
= LogFactory
.getLog(GenericJcrBrowser
.class);
49 private Session session
;
51 private TreeViewer nodesViewer
;
52 private TableViewer propertiesViewer
;
54 private RepositoryRegister repositoryRegister
;
57 public void createPartControl(Composite parent
) {
59 // Instantiate the generic object that fits for
60 // both RCP & RAP, must be final to be accessed in the double click
62 // Not that in RAP, it registers a service handler that provide the
63 // access to the files.
65 final JcrFileProvider jfp
= new JcrFileProvider();
66 final FileHandler fh
= new FileHandler(jfp
);
68 parent
.setLayout(new FillLayout());
70 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
71 sashForm
.setSashWidth(4);
72 sashForm
.setLayout(new FillLayout());
74 Composite top
= new Composite(sashForm
, SWT
.NONE
);
75 GridLayout gl
= new GridLayout(1, false);
79 nodesViewer
= new TreeViewer(top
, SWT
.MULTI
| SWT
.H_SCROLL
81 nodesViewer
.getTree().setLayoutData(
82 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
85 Session nodeSession
= session
;
86 if (nodeSession
== null) {
87 Repository nodeRepository
= JcrUtils
.getRepositoryByAlias(
88 repositoryRegister
, ArgeoJcrConstants
.ALIAS_NODE
);
89 if (nodeRepository
!= null)
91 nodeSession
= nodeRepository
.login();
92 } catch (RepositoryException e1
) {
93 throw new ArgeoException("Cannot login to node repository");
96 nodesViewer
.setContentProvider(new NodeContentProvider(nodeSession
,
98 nodesViewer
.setLabelProvider(new NodeLabelProvider());
100 .addSelectionChangedListener(new ISelectionChangedListener() {
101 public void selectionChanged(SelectionChangedEvent event
) {
102 if (!event
.getSelection().isEmpty()) {
103 IStructuredSelection sel
= (IStructuredSelection
) event
105 propertiesViewer
.setInput(sel
.getFirstElement());
107 propertiesViewer
.setInput(getViewSite());
112 nodesViewer
.addDoubleClickListener(new IDoubleClickListener() {
113 public void doubleClick(DoubleClickEvent event
) {
114 if (event
.getSelection() == null
115 || event
.getSelection().isEmpty())
117 Object obj
= ((IStructuredSelection
) event
.getSelection())
119 if (obj
instanceof RepositoryNode
) {
120 RepositoryNode rpNode
= (RepositoryNode
) obj
;
122 // For the file provider to be able to browse the various
124 // TODO : enhanced that.
125 jfp
.setRepositoryNode(rpNode
);
126 nodesViewer
.refresh(obj
);
128 } else if (obj
instanceof WorkspaceNode
) {
129 ((WorkspaceNode
) obj
).login();
130 nodesViewer
.refresh(obj
);
131 } else if (obj
instanceof Node
) {
132 Node node
= (Node
) obj
;
134 // double clic on a file node triggers its opening
136 if (node
.isNodeType("nt:file")) {
137 String name
= node
.getName();
138 String id
= node
.getIdentifier();
139 fh
.openFile(name
, id
);
141 } catch (RepositoryException re
) {
142 throw new ArgeoException(
143 "Repository error while getting Node file info",
151 MenuManager menuManager
= new MenuManager();
152 Menu menu
= menuManager
.createContextMenu(nodesViewer
.getTree());
153 nodesViewer
.getTree().setMenu(menu
);
154 getSite().registerContextMenu(menuManager
, nodesViewer
);
155 getSite().setSelectionProvider(nodesViewer
);
157 nodesViewer
.setInput(getViewSite());
159 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
160 bottom
.setLayout(new GridLayout(1, false));
163 propertiesViewer
= new TableViewer(bottom
);
164 propertiesViewer
.getTable().setLayoutData(
165 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
166 propertiesViewer
.getTable().setHeaderVisible(true);
167 propertiesViewer
.setContentProvider(new PropertiesContentProvider());
168 TableViewerColumn col
= new TableViewerColumn(propertiesViewer
,
170 col
.getColumn().setText("Name");
171 col
.getColumn().setWidth(200);
172 col
.setLabelProvider(new ColumnLabelProvider() {
173 public String
getText(Object element
) {
175 return ((Property
) element
).getName();
176 } catch (RepositoryException e
) {
177 throw new ArgeoException(
178 "Unexpected exception in label provider", e
);
182 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
183 col
.getColumn().setText("Value");
184 col
.getColumn().setWidth(400);
185 col
.setLabelProvider(new ColumnLabelProvider() {
186 public String
getText(Object element
) {
188 Property property
= (Property
) element
;
189 if (property
.getType() == PropertyType
.BINARY
)
191 else if (property
.isMultiple())
192 return Arrays
.asList(property
.getValues()).toString();
194 return property
.getValue().getString();
195 } catch (RepositoryException e
) {
196 throw new ArgeoException(
197 "Unexpected exception in label provider", e
);
201 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
202 col
.getColumn().setText("Type");
203 col
.getColumn().setWidth(200);
204 col
.setLabelProvider(new ColumnLabelProvider() {
205 public String
getText(Object element
) {
207 return PropertyType
.nameFromValue(((Property
) element
)
209 } catch (RepositoryException e
) {
210 throw new ArgeoException(
211 "Unexpected exception in label provider", e
);
215 propertiesViewer
.setInput(getViewSite());
217 sashForm
.setWeights(getWeights());
219 nodesViewer
.setComparer(new NodeViewerComparer());
224 public void setFocus() {
225 nodesViewer
.getTree().setFocus();
229 * To be overidden to adapt size of form and result frames.
233 protected int[] getWeights() {
234 return new int[] { 70, 30 };
240 public void refresh(Object obj
) {
241 nodesViewer
.refresh(obj
);
244 public void nodeAdded(Node parentNode
, Node newNode
) {
245 nodesViewer
.refresh(parentNode
);
246 nodesViewer
.expandToLevel(newNode
, 0);
249 public void nodeRemoved(Node parentNode
) {
251 IStructuredSelection newSel
= new StructuredSelection(parentNode
);
252 nodesViewer
.setSelection(newSel
, true);
254 IStructuredSelection tmpSel
= (IStructuredSelection
) nodesViewer
256 nodesViewer
.refresh(tmpSel
.getFirstElement());
260 public void setRepositoryRegister(RepositoryRegister repositoryRegister
) {
261 this.repositoryRegister
= repositoryRegister
;
264 public void setSession(Session session
) {
265 this.session
= session
;