1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.argeo.cms.e4.jcr;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import javax.jcr.Node;
22 import javax.jcr.Property;
23 import javax.jcr.PropertyIterator;
24 import javax.jcr.RepositoryException;
25
26 import org.argeo.cms.ui.jcr.PropertyLabelProvider;
27 import org.argeo.eclipse.ui.EclipseUiException;
28 import org.eclipse.jface.layout.TreeColumnLayout;
29 import org.eclipse.jface.viewers.ColumnWeightData;
30 import org.eclipse.jface.viewers.IBaseLabelProvider;
31 import org.eclipse.jface.viewers.ITreeContentProvider;
32 import org.eclipse.jface.viewers.TreeViewer;
33 import org.eclipse.jface.viewers.Viewer;
34 import org.eclipse.swt.SWT;
35 import org.eclipse.swt.custom.ScrolledComposite;
36 import org.eclipse.swt.layout.FillLayout;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.swt.widgets.Tree;
39 import org.eclipse.swt.widgets.TreeColumn;
40
41
42
43
44
45 public class GenericPropertyPage {
46
47
48 private Node currentNode;
49
50 public GenericPropertyPage(Node currentNode) {
51 this.currentNode = currentNode;
52 }
53
54 protected void createFormContent(Composite parent) {
55 Composite innerBox = new Composite(parent, SWT.NONE);
56
57 FillLayout layout = new FillLayout();
58 layout.marginHeight = 5;
59 layout.marginWidth = 5;
60 innerBox.setLayout(layout);
61 createComplexTree(innerBox);
62
63
64
65
66 }
67
68 private TreeViewer createComplexTree(Composite parent) {
69 int style = SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION;
70 Tree tree = new Tree(parent, style);
71 TreeColumnLayout tableColumnLayout = new TreeColumnLayout();
72
73 createColumn(tree, tableColumnLayout, "Property", SWT.LEFT, 200, 30);
74 createColumn(tree, tableColumnLayout, "Value(s)", SWT.LEFT, 300, 60);
75 createColumn(tree, tableColumnLayout, "Type", SWT.LEFT, 75, 10);
76 createColumn(tree, tableColumnLayout, "Attributes", SWT.LEFT, 75, 0);
77
78
79
80 tree.setLinesVisible(true);
81 tree.setHeaderVisible(true);
82
83 TreeViewer treeViewer = new TreeViewer(tree);
84 treeViewer.setContentProvider(new TreeContentProvider());
85 treeViewer.setLabelProvider((IBaseLabelProvider) new PropertyLabelProvider());
86 treeViewer.setInput(currentNode);
87 treeViewer.expandAll();
88 return treeViewer;
89 }
90
91 private static TreeColumn createColumn(Tree parent, TreeColumnLayout tableColumnLayout, String name, int style,
92 int width, int weight) {
93 TreeColumn column = new TreeColumn(parent, style);
94 column.setText(name);
95 column.setWidth(width);
96 column.setMoveable(true);
97 column.setResizable(true);
98 tableColumnLayout.setColumnData(column, new ColumnWeightData(weight, width, true));
99 return column;
100 }
101
102 private class TreeContentProvider implements ITreeContentProvider {
103 private static final long serialVersionUID = -6162736530019406214L;
104
105 public Object[] getElements(Object parent) {
106 Object[] props = null;
107 try {
108
109 if (parent instanceof Node) {
110 Node node = (Node) parent;
111 PropertyIterator pi;
112 pi = node.getProperties();
113 List<Property> propList = new ArrayList<Property>();
114 while (pi.hasNext()) {
115 propList.add(pi.nextProperty());
116 }
117 props = propList.toArray();
118 }
119 } catch (RepositoryException e) {
120 throw new EclipseUiException("Unexpected exception while listing node properties", e);
121 }
122 return props;
123 }
124
125 public Object getParent(Object child) {
126 return null;
127 }
128
129 public Object[] getChildren(Object parent) {
130 if (parent instanceof Property) {
131 Property prop = (Property) parent;
132 try {
133 if (prop.isMultiple())
134 return prop.getValues();
135 } catch (RepositoryException e) {
136 throw new EclipseUiException("Cannot get multi-prop values on " + prop, e);
137 }
138 }
139 return null;
140 }
141
142 public boolean hasChildren(Object parent) {
143 try {
144 return (parent instanceof Property && ((Property) parent).isMultiple());
145 } catch (RepositoryException e) {
146 throw new EclipseUiException("Cannot check if property is multiple for " + parent, e);
147 }
148 }
149
150 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
151 }
152
153 public void dispose() {
154 }
155 }
156 }