Major refactoring of Argeo CMS UI
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / RecentItems.java
index 0ab37c5041fa1016cf9247ee21f80feb12428d9d..66f2dc5b05e1d169fb17c11c5163458ca05b5c04 100644 (file)
@@ -2,6 +2,7 @@ package org.argeo.suite.ui;
 
 import static org.argeo.eclipse.ui.EclipseUiUtils.notEmpty;
 
+import java.util.List;
 import java.util.Map;
 
 import javax.jcr.Node;
@@ -14,19 +15,15 @@ import javax.jcr.observation.EventListener;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
 
-import org.argeo.cms.ui.CmsTheme;
+import org.argeo.api.cms.CmsTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
 import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.connect.ui.ConnectUiConstants;
-import org.argeo.connect.ui.util.BasicNodeListContentProvider;
-import org.argeo.connect.ui.widgets.DelayedText;
-import org.argeo.connect.util.XPathUtils;
 import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.entity.EntityConstants;
-import org.argeo.entity.EntityTypes;
+import org.argeo.entity.EntityType;
 import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.suite.ui.widgets.DelayedText;
+import org.argeo.suite.util.XPathUtils;
 import org.eclipse.jface.layout.TableColumnLayout;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.ColumnWeightData;
@@ -34,8 +31,10 @@ import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.KeyListener;
@@ -53,14 +52,20 @@ import org.eclipse.swt.widgets.ToolItem;
 
 /** List recent items. */
 public class RecentItems implements CmsUiProvider {
-//     private final static int SEARCH_TEXT_DELAY = 800;
+       private final static int SEARCH_TEXT_DELAY = 800;
+       private final static int SEARCH_DEFAULT_LIMIT = 100;
+
        private CmsTheme theme;
 
        private String entityType;
 
+       static enum Property {
+               entityTypes;
+       }
+
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
-               theme = CmsTheme.getCmsTheme(parent);
+               theme = CmsSwtUtils.getCmsTheme(parent);
                parent.setLayout(new GridLayout());
 //             parent.setLayout(CmsUiUtils.noSpaceGridLayout());
                parent.setLayout(new GridLayout());
@@ -83,11 +88,11 @@ public class RecentItems implements CmsUiProvider {
                        return null;
                SingleEntityViewer entityViewer = new SingleEntityViewer(parent, SWT.NONE, context.getSession());
                entityViewer.createUi();
-               entityViewer.getViewer().getTable().setLayoutData(CmsUiUtils.fillAll());
+               entityViewer.getViewer().getTable().setLayoutData(CmsSwtUtils.fillAll());
 
                Composite bottom = new Composite(parent, SWT.NONE);
-               bottom.setLayoutData(CmsUiUtils.fillWidth());
-               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
+               bottom.setLayoutData(CmsSwtUtils.fillWidth());
+               bottom.setLayout(CmsSwtUtils.noSpaceGridLayout());
                ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
                bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
                ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
@@ -102,8 +107,8 @@ public class RecentItems implements CmsUiProvider {
                        public void doubleClick(DoubleClickEvent event) {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null)
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.NODE_ID,
-                                                       Jcr.getIdentifier(node));
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
+                                                       SuiteEvent.eventProperties(node));
 
                        }
                });
@@ -111,8 +116,8 @@ public class RecentItems implements CmsUiProvider {
                        public void selectionChanged(SelectionChangedEvent event) {
                                Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
                                if (node != null) {
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.NODE_ID,
-                                                       Jcr.getIdentifier(node));
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
+                                                       SuiteEvent.eventProperties(node));
                                        deleteItem.setEnabled(true);
                                } else {
                                        deleteItem.setEnabled(false);
@@ -125,7 +130,8 @@ public class RecentItems implements CmsUiProvider {
        }
 
        public void init(Map<String, String> properties) {
-               entityType = properties.get(EntityConstants.TYPE);
+               // TODO manage multiple entities
+               entityType = properties.get(Property.entityTypes.name());
        }
 
        class SingleEntityViewer {
@@ -166,7 +172,7 @@ public class RecentItems implements CmsUiProvider {
                        // Use a delayed text: the query won't be done until the user stop
                        // typing for 800ms
                        int style = SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL;
-                       DelayedText delayedText = new DelayedText(parent, style, ConnectUiConstants.SEARCH_TEXT_DELAY);
+                       DelayedText delayedText = new DelayedText(parent, style, SEARCH_TEXT_DELAY);
                        filterTxt = delayedText.getText();
                        filterTxt.setLayoutData(EclipseUiUtils.fillWidth());
 
@@ -260,8 +266,8 @@ public class RecentItems implements CmsUiProvider {
 //                     });
                        table.setLinesVisible(true);
                        table.setHeaderVisible(false);
-                       CmsUiUtils.markup(table);
-                       CmsUiUtils.setItemHeight(table, 26);
+                       // CmsUiUtils.markup(table);
+                       // CmsUiUtils.setItemHeight(table, 26);
 
                        viewer.setContentProvider(new BasicNodeListContentProvider());
                        return viewer;
@@ -287,11 +293,17 @@ public class RecentItems implements CmsUiProvider {
 
                                // XPATH Query
                                String xpathQueryStr;
-                               if (entityType != null)
-                                       xpathQueryStr = entityType.contains(":") ? "//element(*, " + entityType + ")"
-                                                       : "//element(*, " + EntityTypes.ENTITY_ENTITY + ")[@entity:type='" + entityType + "']";
-                               else
-                                       xpathQueryStr = "//element(*, " + EntityTypes.ENTITY_ENTITY + ")";
+                               if (entityType != null) {
+                                       int indexColumn = entityType.indexOf(':');
+                                       if (indexColumn > 0) {// JCR node type
+                                               xpathQueryStr = "//element(*, " + entityType + ") order by @jcr:created descending";
+                                       } else {
+                                               xpathQueryStr = entityType.contains(":") ? "//element(*, " + entityType + ")"
+                                                               : "//element(*, " + EntityType.entity.get() + ")[@entity:type='" + entityType + "']";
+                                       }
+                               } else {
+                                       xpathQueryStr = "//element(*, " + EntityType.entity.get() + ")";
+                               }
 //                     String xpathQueryStr = "//element(*, " + ConnectTypes.CONNECT_ENTITY + ")";
                                String xpathFilter = XPathUtils.getFreeTextConstraint(filter);
                                if (notEmpty(xpathFilter))
@@ -301,7 +313,7 @@ public class RecentItems implements CmsUiProvider {
                                // session.refresh(false);
                                Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
 
-                               xpathQuery.setLimit(ConnectUiConstants.SEARCH_DEFAULT_LIMIT);
+                               xpathQuery.setLimit(SEARCH_DEFAULT_LIMIT);
                                QueryResult result = xpathQuery.execute();
 
                                NodeIterator nit = result.getNodes();
@@ -329,5 +341,25 @@ public class RecentItems implements CmsUiProvider {
                        }
 
                }
+
+               class BasicNodeListContentProvider implements IStructuredContentProvider {
+                       private static final long serialVersionUID = 1L;
+                       // keep a cache of the Nodes in the content provider to be able to
+                       // manage long request
+                       private List<Node> nodes;
+
+                       public void dispose() {
+                       }
+
+                       /** Expects a list of nodes as a new input */
+                       @SuppressWarnings("unchecked")
+                       public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+                               nodes = (List<Node>) newInput;
+                       }
+
+                       public Object[] getElements(Object arg0) {
+                               return nodes.toArray();
+                       }
+               }
        }
 }