1 package org
.argeo
.suite
.ui
;
3 import static org
.argeo
.eclipse
.ui
.EclipseUiUtils
.notEmpty
;
9 import javax
.jcr
.NodeIterator
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Session
;
12 import javax
.jcr
.observation
.Event
;
13 import javax
.jcr
.observation
.EventIterator
;
14 import javax
.jcr
.observation
.EventListener
;
15 import javax
.jcr
.query
.Query
;
16 import javax
.jcr
.query
.QueryResult
;
18 import org
.argeo
.cms
.ui
.CmsTheme
;
19 import org
.argeo
.cms
.ui
.CmsUiProvider
;
20 import org
.argeo
.cms
.ui
.util
.CmsUiUtils
;
21 import org
.argeo
.connect
.ui
.ConnectUiConstants
;
22 import org
.argeo
.connect
.ui
.util
.BasicNodeListContentProvider
;
23 import org
.argeo
.connect
.ui
.widgets
.DelayedText
;
24 import org
.argeo
.connect
.util
.XPathUtils
;
25 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
26 import org
.argeo
.entity
.EntityNames
;
27 import org
.argeo
.entity
.EntityTypes
;
28 import org
.argeo
.jcr
.JcrUtils
;
29 import org
.eclipse
.jface
.layout
.TableColumnLayout
;
30 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
31 import org
.eclipse
.jface
.viewers
.ColumnWeightData
;
32 import org
.eclipse
.jface
.viewers
.ILabelProvider
;
33 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
34 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
35 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
36 import org
.eclipse
.jface
.viewers
.TableViewer
;
37 import org
.eclipse
.swt
.SWT
;
38 import org
.eclipse
.swt
.events
.KeyEvent
;
39 import org
.eclipse
.swt
.events
.KeyListener
;
40 import org
.eclipse
.swt
.events
.ModifyEvent
;
41 import org
.eclipse
.swt
.events
.ModifyListener
;
42 import org
.eclipse
.swt
.layout
.GridData
;
43 import org
.eclipse
.swt
.layout
.GridLayout
;
44 import org
.eclipse
.swt
.widgets
.Composite
;
45 import org
.eclipse
.swt
.widgets
.Control
;
46 import org
.eclipse
.swt
.widgets
.Label
;
47 import org
.eclipse
.swt
.widgets
.Table
;
48 import org
.eclipse
.swt
.widgets
.TableColumn
;
49 import org
.eclipse
.swt
.widgets
.Text
;
51 /** List recent items. */
52 public class RecentItems
implements CmsUiProvider
{
53 int SEARCH_TEXT_DELAY
= 800;
54 private CmsTheme theme
;
56 private String entityType
;
59 public Control
createUi(Composite parent
, Node context
) throws RepositoryException
{
60 theme
= CmsTheme
.getCmsTheme(parent
);
61 parent
.setLayout(new GridLayout());
63 // Composite top = new Composite(parent, SWT.NONE);
64 // top.setLayoutData(CmsUiUtils.fillWidth());
65 // top.setLayout(new GridLayout(2, false));
67 Label lbl
= new Label(parent
, SWT
.NONE
);
68 // search.setImage(SuiteIcon.search.getSmallIcon(theme));
69 lbl
.setText(SuiteMsg
.recentItems
.lead());
70 CmsUiUtils
.style(lbl
, SuiteStyle
.recentItems
);
74 SingleEntityViewer entityViewer
= new SingleEntityViewer(parent
, SWT
.NONE
, context
.getSession());
75 entityViewer
.setLayoutData(CmsUiUtils
.fillAll());
76 entityViewer
.createUi();
81 public void init(Map
<String
, String
> properties
) {
82 entityType
= properties
.get(EntityNames
.ENTITY_TYPE
);
85 class SingleEntityViewer
extends Composite
{
87 TableViewer entityViewer
;
90 public SingleEntityViewer(Composite parent
, int style
, Session session
) {
92 this.session
= session
;
95 public void createUi() {
97 setLayout(new GridLayout());
99 entityViewer
= createListPart(this, new SingleEntityLabelProvider());
100 refreshFilteredList();
103 String
[] nodeTypes
= entityType
!= null && entityType
.contains(":") ?
new String
[] { entityType
}
105 session
.getWorkspace().getObservationManager().addEventListener(new EventListener() {
108 public void onEvent(EventIterator events
) {
109 getDisplay().asyncExec(() -> refreshFilteredList());
111 }, Event
.PROPERTY_CHANGED
| Event
.NODE_ADDED
| Event
.NODE_REMOVED
| Event
.PROPERTY_ADDED
, "/", true,
112 null, nodeTypes
, false);
113 } catch (RepositoryException e
) {
114 throw new IllegalStateException("Cannot add JCR observer", e
);
119 private void addFilterPanel(Composite parent
) {
120 // Use a delayed text: the query won't be done until the user stop
122 int style
= SWT
.BORDER
| SWT
.SEARCH
| SWT
.ICON_CANCEL
;
123 DelayedText delayedText
= new DelayedText(parent
, style
, ConnectUiConstants
.SEARCH_TEXT_DELAY
);
124 filterTxt
= delayedText
.getText();
125 filterTxt
.setLayoutData(EclipseUiUtils
.fillWidth());
127 // final ServerPushSession pushSession = new ServerPushSession();
128 delayedText
.addDelayedModifyListener(null, new ModifyListener() {
129 private static final long serialVersionUID
= 5003010530960334977L;
131 public void modifyText(ModifyEvent event
) {
132 delayedText
.getText().getDisplay().asyncExec(new Runnable() {
135 refreshFilteredList();
138 // pushSession.stop();
142 // Jump to the first item of the list using the down arrow
143 filterTxt
.addKeyListener(new KeyListener() {
144 private static final long serialVersionUID
= -4523394262771183968L;
147 public void keyReleased(KeyEvent e
) {
151 public void keyPressed(KeyEvent e
) {
152 // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
153 // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
154 if (e
.keyCode
== SWT
.ARROW_DOWN
|| e
.keyCode
== SWT
.TAB
) {
155 // Object first = entityViewer.getElementAt(0);
156 // if (first != null) {
157 // entityViewer.getTable().setFocus();
158 // entityViewer.setSelection(new StructuredSelection(first), true);
165 addDisposeListener((e
) -> {
170 protected TableViewer
createListPart(Composite parent
, ILabelProvider labelProvider
) {
171 parent
.setLayout(new GridLayout());
173 Composite tableComposite
= new Composite(parent
, SWT
.NONE
);
174 GridData gd
= new GridData(GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.GRAB_VERTICAL
175 | GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
);
176 tableComposite
.setLayoutData(gd
);
178 TableViewer v
= new TableViewer(tableComposite
);
179 v
.setLabelProvider(labelProvider
);
181 TableColumn singleColumn
= new TableColumn(v
.getTable(), SWT
.V_SCROLL
);
182 TableColumnLayout tableColumnLayout
= new TableColumnLayout();
183 tableColumnLayout
.setColumnData(singleColumn
, new ColumnWeightData(85));
184 tableComposite
.setLayout(tableColumnLayout
);
186 // Corresponding table & style
187 Table table
= v
.getTable();
188 table
.setLinesVisible(true);
189 table
.setHeaderVisible(false);
190 CmsUiUtils
.markup(table
);
191 CmsUiUtils
.setItemHeight(table
, 26);
193 v
.setContentProvider(new BasicNodeListContentProvider());
194 // v.addDoubleClickListener(new
195 // JcrViewerDClickListener(systemWorkbenchService));
196 v
.addSelectionChangedListener(new ISelectionChangedListener() {
197 public void selectionChanged(SelectionChangedEvent event
) {
198 IStructuredSelection selection
= (IStructuredSelection
) event
.getSelection();
199 List
<?
> lst
= selection
.toList();
200 // if (lst != null && !lst.isEmpty())
201 // selectionService.setSelection(selection.toList());
203 // selectionService.setSelection(null);
209 // public void dispose() {
210 // JcrUtils.logoutQuietly(session);
213 public boolean setFocus() {
214 refreshFilteredList();
215 return super.setFocus();
216 // filterTxt.setFocus();
219 public void forceRefresh(Object object
) {
220 refreshFilteredList();
223 protected void refreshFilteredList() {
225 String filter
= filterTxt
.getText();
226 // Prevents the query on the full repository
227 // if (isEmpty(filter)) {
228 // entityViewer.setInput(null);
233 String xpathQueryStr
;
234 if (entityType
!= null)
235 xpathQueryStr
= entityType
.contains(":") ?
"//element(*, " + entityType
+ ")"
236 : "//element(*, " + EntityTypes
.ENTITY_ENTITY
+ ")[@entity:type='" + entityType
+ "']";
238 xpathQueryStr
= "//element(*, " + EntityTypes
.ENTITY_ENTITY
+ ")";
239 // String xpathQueryStr = "//element(*, " + ConnectTypes.CONNECT_ENTITY + ")";
240 String xpathFilter
= XPathUtils
.getFreeTextConstraint(filter
);
241 if (notEmpty(xpathFilter
))
242 xpathQueryStr
+= "[" + xpathFilter
+ "]";
244 long begin
= System
.currentTimeMillis();
245 // session.refresh(false);
246 Query xpathQuery
= XPathUtils
.createQuery(session
, xpathQueryStr
);
248 xpathQuery
.setLimit(ConnectUiConstants
.SEARCH_DEFAULT_LIMIT
);
249 QueryResult result
= xpathQuery
.execute();
251 NodeIterator nit
= result
.getNodes();
252 entityViewer
.setInput(JcrUtils
.nodeIteratorToList(nit
));
253 // if (log.isTraceEnabled()) {
254 // long end = System.currentTimeMillis();
255 // log.trace("Quick Search - Found: " + nit.getSize() + " in " + (end - begin)
256 // + " ms by executing XPath query (" + xpathQueryStr + ").");
258 } catch (RepositoryException e
) {
259 throw new IllegalStateException("Unable to list entities", e
);
263 class SingleEntityLabelProvider
extends ColumnLabelProvider
{