]> git.argeo.org Git - gpl/argeo-suite.git/blob - library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java
Improve UX.
[gpl/argeo-suite.git] / library / org.argeo.library.ui / src / org / argeo / library / ui / ContentEntryArea.java
1 package org.argeo.library.ui;
2
3 import java.util.SortedMap;
4 import java.util.TreeMap;
5
6 import javax.jcr.Node;
7 import javax.jcr.NodeIterator;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.Session;
10 import javax.jcr.nodetype.NodeType;
11 import javax.jcr.query.Query;
12
13 import org.argeo.cms.ui.CmsTheme;
14 import org.argeo.cms.ui.CmsUiProvider;
15 import org.argeo.cms.ui.CmsView;
16 import org.argeo.cms.ui.util.CmsUiUtils;
17 import org.argeo.entity.EntityType;
18 import org.argeo.jcr.Jcr;
19 import org.argeo.jcr.JcrException;
20 import org.argeo.suite.ui.SuiteEvent;
21 import org.argeo.suite.ui.SuiteIcon;
22 import org.argeo.suite.ui.widgets.TreeOrSearchArea;
23 import org.eclipse.jface.viewers.ColumnLabelProvider;
24 import org.eclipse.jface.viewers.DoubleClickEvent;
25 import org.eclipse.jface.viewers.IDoubleClickListener;
26 import org.eclipse.jface.viewers.ISelectionChangedListener;
27 import org.eclipse.jface.viewers.ITreeContentProvider;
28 import org.eclipse.jface.viewers.SelectionChangedEvent;
29 import org.eclipse.jface.viewers.TreeViewerColumn;
30 import org.eclipse.jface.viewers.Viewer;
31 import org.eclipse.swt.SWT;
32 import org.eclipse.swt.graphics.Image;
33 import org.eclipse.swt.layout.GridLayout;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Control;
36
37 public class ContentEntryArea implements CmsUiProvider {
38
39 @Override
40 public Control createUi(Composite parent, Node context) throws RepositoryException {
41 CmsTheme theme = CmsTheme.getCmsTheme(parent);
42
43 parent.setLayout(new GridLayout());
44 Ui ui = new Ui(parent, SWT.NONE);
45 ui.setLayoutData(CmsUiUtils.fillAll());
46
47 TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE);
48 nameCol.getColumn().setWidth(400);
49 nameCol.setLabelProvider(new ColumnLabelProvider() {
50
51 @Override
52 public String getText(Object element) {
53 Node node = (Node) element;
54 return Jcr.getTitle(node);
55 }
56
57 @Override
58 public Image getImage(Object element) {
59 Node node = (Node) element;
60 Image icon;
61 if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) {
62 icon = SuiteIcon.folder.getSmallIcon(theme);
63 } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) {
64 // TODO check recognized document types
65 icon = SuiteIcon.document.getSmallIcon(theme);
66 } else if (Jcr.isNodeType(node, EntityType.document.get())) {
67 icon = SuiteIcon.document.getSmallIcon(theme);
68 } else {
69 if (!isLeaf(node))
70 icon = SuiteIcon.folder.getSmallIcon(theme);
71 else
72 icon = null;
73 }
74 return icon;
75 }
76
77 });
78
79 ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
80
81 @Override
82 public void doubleClick(DoubleClickEvent event) {
83 Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
84 if (user != null) {
85 CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
86 SuiteEvent.eventProperties(user));
87 }
88
89 }
90 });
91 ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() {
92 public void selectionChanged(SelectionChangedEvent event) {
93 Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
94 if (user != null) {
95 CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
96 SuiteEvent.eventProperties(user));
97 }
98 }
99 });
100
101 ui.getTreeViewer().setContentProvider(new SpacesContentProvider());
102 ui.getTreeViewer().setInput(context.getSession());
103 return ui;
104 }
105
106 protected boolean isLeaf(Node node) {
107 return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get())
108 || Jcr.isNodeType(node, NodeType.NT_FILE);
109 }
110
111 class Ui extends TreeOrSearchArea {
112
113 public Ui(Composite parent, int style) {
114 super(parent, style);
115 }
116
117 }
118
119 class SpacesContentProvider implements ITreeContentProvider {
120
121 @Override
122 public Object[] getElements(Object inputElement) {
123 Session session = (Session) inputElement;
124 try {
125 Query query = session.getWorkspace().getQueryManager()
126 .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2);
127 NodeIterator spacesIt = query.execute().getNodes();
128 SortedMap<String, Node> map = new TreeMap<>();
129 while (spacesIt.hasNext()) {
130 Node space = spacesIt.nextNode();
131 String path = space.getPath();
132 map.put(path, space);
133 }
134 return map.values().toArray();
135 } catch (RepositoryException e) {
136 throw new JcrException(e);
137 }
138 }
139
140 @Override
141 public Object[] getChildren(Object parentElement) {
142 Node parent = (Node) parentElement;
143 if (isLeaf(parent))
144 return null;
145 return Jcr.getNodes(parent).toArray();
146 }
147
148 @Override
149 public Object getParent(Object element) {
150 Node node = (Node) element;
151 return Jcr.getParent(node);
152 }
153
154 @Override
155 public boolean hasChildren(Object element) {
156 Node node = (Node) element;
157 return !isLeaf(node);
158 }
159
160 @Override
161 public void dispose() {
162 }
163
164 @Override
165 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
166 }
167
168 }
169
170 }