Use tabbed area.
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 9 Oct 2020 09:56:49 +0000 (11:56 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 9 Oct 2020 09:56:49 +0000 (11:56 +0200)
org.argeo.suite.theme.default/icons/types/16/close.png [new file with mode: 0644]
org.argeo.suite.theme.default/icons/types/32/close.png [new file with mode: 0644]
org.argeo.suite.ui/OSGI-INF/leadPane.xml
org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java
org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java
org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java
org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java

diff --git a/org.argeo.suite.theme.default/icons/types/16/close.png b/org.argeo.suite.theme.default/icons/types/16/close.png
new file mode 100644 (file)
index 0000000..29d82f5
Binary files /dev/null and b/org.argeo.suite.theme.default/icons/types/16/close.png differ
diff --git a/org.argeo.suite.theme.default/icons/types/32/close.png b/org.argeo.suite.theme.default/icons/types/32/close.png
new file mode 100644 (file)
index 0000000..acf7723
Binary files /dev/null and b/org.argeo.suite.theme.default/icons/types/32/close.png differ
index 997c5b36555a3559a4b250c9901f2dea5f428888..ebd348b9534fc8351ef230125c23809b2113b5cb 100644 (file)
@@ -5,5 +5,4 @@
       <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
    </service>
    <properties entry="config/leadPane.properties"/>
-   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
 </scr:component>
index 3f1a8cebbc8bbf4eb1b362e518b58918292854fe..436b0da4903f38a65ff1504298fd2018cc46f040 100644 (file)
@@ -22,6 +22,11 @@ import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.dialogs.CmsFeedback;
+import org.argeo.cms.ui.util.CmsEvent;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.entity.EntityNames;
+import org.argeo.entity.EntityTypes;
+import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
@@ -40,7 +45,7 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
        public final static String DASHBOARD_PID = PID_PREFIX + "dashboard";
        public final static String RECENT_ITEMS_PID = PID_PREFIX + "recentItems";
 
-       private final static String DEFAULT_UI_NAME = "work";
+       private final static String DEFAULT_UI_NAME = "app";
        private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
 
        private SortedMap<RankingKey, CmsUiProvider> uiProviders = Collections.synchronizedSortedMap(new TreeMap<>());
@@ -100,54 +105,80 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
        public void refreshUi(Composite parent, String state) {
                try {
                        Node context = null;
-                       ArgeoSuiteUi argeoSuiteUi = (ArgeoSuiteUi) parent;
-                       refreshPart(findUiProvider(HEADER_PID, context), argeoSuiteUi.getHeader(), context);
+                       ArgeoSuiteUi ui = (ArgeoSuiteUi) parent;
+                       refreshPart(findUiProvider(HEADER_PID, context), ui.getHeader(), context);
                        CmsView cmsView = CmsView.getCmsView(parent);
                        if (cmsView.isAnonymous()) {
-                               refreshPart(findUiProvider(LOGIN_SCREEN_PID, context), argeoSuiteUi.getDefaultBody(), context);
+                               ui.refreshBelowHeader(false);
+                               refreshPart(findUiProvider(LOGIN_SCREEN_PID, context), ui.getBelowHeader(), context);
                        } else {
                                try {
-                                       if (argeoSuiteUi.getSession() == null)
-                                               argeoSuiteUi.setSession(getRepository().login());
-                                       context = argeoSuiteUi.getSession().getRootNode();
+                                       if (ui.getSession() == null)
+                                               ui.setSession(getRepository().login());
+                                       context = ui.getSession().getRootNode();
 
                                } catch (RepositoryException e) {
                                        e.printStackTrace();
                                }
-                               refreshPart(findUiProvider(DASHBOARD_PID, context), argeoSuiteUi.getDefaultBody(), context);
+                               ui.refreshBelowHeader(true);
+
+                               ui.addLayer(ArgeoSuiteUi.DASHBOARD_LAYER);
+                               ui.addLayer("documents");
+                               ui.addLayer("locations");
+                               ui.addLayer("people");
+                               ui.switchToLayer(ArgeoSuiteUi.DASHBOARD_LAYER);
+
+                               refreshPart(findUiProvider(DASHBOARD_PID, context), ui.getTabbedArea().getCurrent(), context);
+                               refreshPart(findUiProvider(LEAD_PANE_PID, context), ui.getLeadPane(), context);
+                               refreshPart(findUiProvider(RECENT_ITEMS_PID, context), ui.getEntryArea(), context);
                        }
-                       refreshPart(findUiProvider(LEAD_PANE_PID, context), argeoSuiteUi.getLeadPane(), context);
-                       refreshPart(findUiProvider(RECENT_ITEMS_PID, context), argeoSuiteUi.getEntryArea(), context);
-                       argeoSuiteUi.layout(true, true);
+                       ui.layout(true, true);
                } catch (Exception e) {
                        CmsFeedback.show("Unexpected exception", e);
                }
        }
 
        private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) {
-               for (Control child : part.getChildren())
-                       child.dispose();
+               CmsUiUtils.clear(part);
                uiProvider.createUiPart(part, context);
        }
 
        private CmsUiProvider findUiProvider(String pid, Node context) {
+               CmsUiProvider found = null;
                if (pid != null) {
                        SortedMap<RankingKey, CmsUiProvider> subMap = uiProviders.subMap(RankingKey.minPid(pid),
                                        RankingKey.maxPid(pid));
-                       CmsUiProvider found = null;
                        providers: for (RankingKey key : subMap.keySet()) {
                                if (key.getPid() == null || !key.getPid().equals(pid))
                                        break providers;
                                found = subMap.get(key);
-                               log.debug(key);
                        }
-//                     if (uiProviders.containsKey(pid))
-//                             return uiProviders.get(pid);
+                       if (found != null)
+                               return found;
+               }
+
+               if (found == null && context != null) {
+                       SortedMap<RankingKey, CmsUiProvider> subMap = null;
+                       String dataType = null;
+                       if (Jcr.isNodeType(context, EntityTypes.ENTITY_ENTITY)) {
+                               dataType = Jcr.get(context, EntityNames.ENTITY_TYPE);
+                               subMap = uiProviders.subMap(RankingKey.minDataType(dataType), RankingKey.maxDataType(dataType));
+                       }
+                       providers: for (RankingKey key : subMap.keySet()) {
+                               if (key.getDataType() == null || !key.getDataType().equals(dataType))
+                                       break providers;
+                               found = subMap.get(key);
+                       }
+                       if (found == null)
+                               found = uiProviders.get(new RankingKey(null, null, null, dataType, null));
                        if (found != null)
                                return found;
                }
 
                // nothing
+               if (log.isWarnEnabled())
+                       log.warn("No UI provider found for" + (pid != null ? " pid " + pid : "")
+                                       + (context != null ? " " + context : ""));
                return new CmsUiProvider() {
 
                        @Override
@@ -187,7 +218,8 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
                                session = getRepository().login(workspace);
 
                                Node node = session.getNode(path);
-                               refreshEntityUi(node);
+
+                               refreshEntityUi(null, node);
                        }
                } catch (RepositoryException e) {
                        log.error("Cannot load state " + state, e);
@@ -197,8 +229,7 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
                }
        }
 
-       private void refreshEntityUi(Node node) {
-
+       private void refreshEntityUi(Composite parent, Node context) {
        }
 
        /*
@@ -211,9 +242,11 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
 //             if (servicePid == null) {
 //                     log.error("No service pid found for " + uiProvider.getClass() + ", " + properties);
 //             } else {
-               uiProviders.put(partKey, uiProvider);
-               if (log.isDebugEnabled())
-                       log.debug("Added UI provider " + partKey + " to CMS app.");
+               if (partKey.getPid() != null || partKey.getDataType() != null) {
+                       uiProviders.put(partKey, uiProvider);
+                       if (log.isDebugEnabled())
+                               log.debug("Added UI provider " + partKey + " (" + uiProvider.getClass().getName() + ") to CMS app.");
+               }
 //             }
 
        }
@@ -227,13 +260,30 @@ public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
 
        @Override
        public void handleEvent(Event event) {
-               if (event.getTopic().equals(SuiteEvent.switchLayer.topic())) {
-                       String layer = get(event, SuiteEvent.LAYER_PARAM);
-                       managedUis.get(get(event, CMS_VIEW_UID_PROPERTY)).switchToLayer(layer);
+
+               // Specific UI related events
+               ArgeoSuiteUi ui = getRelatedUi(event);
+               if (isTopic(event, SuiteEvent.refreshPart)) {
+                       Node node = Jcr.getNodeById(ui.getSession(), get(event, SuiteEvent.NODE_ID));
+                       ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID, node), node);
+               } else if (isTopic(event, SuiteEvent.openNewPart)) {
+                       Node node = Jcr.getNodeById(ui.getSession(), get(event, SuiteEvent.NODE_ID));
+                       ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID, node), node);
+               } else if (isTopic(event, SuiteEvent.switchLayer)) {
+                       String layer = get(event, SuiteEvent.LAYER);
+                       ui.switchToLayer(layer);
                }
 
        }
 
+       private ArgeoSuiteUi getRelatedUi(Event event) {
+               return managedUis.get(get(event, CMS_VIEW_UID_PROPERTY));
+       }
+
+       private static boolean isTopic(Event event, CmsEvent cmsEvent) {
+               return event.getTopic().equals(cmsEvent.topic());
+       }
+
        private static String get(Event event, String key) {
                Object value = event.getProperty(key);
                if (value == null)
index e30360c092dbb3d21c565f2227eae6f6a6648183..e6f38a3451e876a27e7fc4a6cd69f6b3119128a6 100644 (file)
@@ -1,7 +1,5 @@
 package org.argeo.suite.ui;
 
-import static org.argeo.suite.ui.SuiteIcon.dashboard;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -10,21 +8,18 @@ import javax.jcr.Session;
 import org.argeo.cms.ui.CmsTheme;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.widgets.TabbedArea;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.custom.SashForm;
 import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
 
 /** The {@link CmsView} for the work ergonomics of Argeo Suite. */
 public class ArgeoSuiteUi extends Composite {
        private static final long serialVersionUID = 6207018859086689108L;
 
+       public final static String DASHBOARD_LAYER = "dashboard";
        private Composite header;
        private Composite belowHeader;
        private Composite leadPane;
@@ -35,7 +30,7 @@ public class ArgeoSuiteUi extends Composite {
        private Session session;
 
        private Map<String, WorkLayer> layers = new HashMap<>();
-       private String currentLayer = "dashboard";
+       private String currentLayer = DASHBOARD_LAYER;
 
        public ArgeoSuiteUi(Composite parent, int style) {
                super(parent, style);
@@ -48,28 +43,39 @@ public class ArgeoSuiteUi extends Composite {
 
                belowHeader = new Composite(this, SWT.NONE);
                belowHeader.setLayoutData(CmsUiUtils.fillAll());
-               belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+       }
 
-               if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                       dynamicArea = new Composite(belowHeader, SWT.NONE);
-                       leadPane = new Composite(belowHeader, SWT.NONE);
-               } else {
-                       leadPane = new Composite(belowHeader, SWT.NONE);
-                       dynamicArea = new Composite(belowHeader, SWT.NONE);
-               }
-               leadPane.setLayoutData(CmsUiUtils.fillHeight());
-               CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
-               dynamicArea.setLayoutData(CmsUiUtils.fillAll());
+       public void refreshBelowHeader(boolean initApp) {
+               CmsUiUtils.clear(belowHeader);
+               int style = getStyle();
+               if (initApp) {
+                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                       } else {
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                       }
+                       leadPane.setLayoutData(CmsUiUtils.fillHeight());
+                       CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
+                       dynamicArea.setLayoutData(CmsUiUtils.fillAll());
 
-               dynamicArea.setLayout(new FormLayout());
+                       dynamicArea.setLayout(new FormLayout());
 
-               layers.put("dashboard", new WorkLayer(dynamicArea, style));
-               layers.put("documents", new WorkLayer(dynamicArea, style));
-               layers.put("locations", new WorkLayer(dynamicArea, style));
-               layers.put("people", new WorkLayer(dynamicArea, style));
+               } else {
+                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout());
+               }
        }
 
+       /*
+        * LAYERS
+        */
+
        Composite getCurrentLayer() {
+               if (currentLayer == null)
+                       throw new IllegalStateException("No current layer");
                return layers.get(currentLayer).getArea();
        }
 
@@ -89,6 +95,11 @@ public class ArgeoSuiteUi extends Composite {
                return toShow;
        }
 
+       void addLayer(String layer) {
+               WorkLayer workLayer = new WorkLayer(dynamicArea, getStyle());
+               layers.put(layer, workLayer);
+       }
+
        /*
         * GETTERS / SETTERS
         */
@@ -109,8 +120,8 @@ public class ArgeoSuiteUi extends Composite {
                return layers.get(currentLayer).getEntryArea();
        }
 
-       Composite getDefaultBody() {
-               return layers.get(currentLayer).getDefaultBody();
+       TabbedArea getTabbedArea() {
+               return layers.get(currentLayer).getTabbedArea();
        }
 
        Session getSession() {
@@ -125,9 +136,7 @@ public class ArgeoSuiteUi extends Composite {
                private SashForm area;
                private Composite entryArea;
                private Composite editorArea;
-               private CTabFolder editorTabFolder;
-
-               private Composite defaultBody;
+               private TabbedArea tabbedArea;
 
                WorkLayer(Composite parent, int style) {
                        area = new SashForm(parent, SWT.HORIZONTAL);
@@ -144,25 +153,28 @@ public class ArgeoSuiteUi extends Composite {
                        area.setWeights(weights);
                        editorArea.setLayout(new GridLayout());
 
-                       editorTabFolder = new CTabFolder(editorArea, SWT.NONE);
-                       editorTabFolder.setLayoutData(CmsUiUtils.fillAll());
+                       tabbedArea = new TabbedArea(editorArea, SWT.NONE);
+                       tabbedArea.setTabStyle(SuiteStyle.mainTab.toStyleClass());
+                       tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.toStyleClass());
+                       tabbedArea.setCloseIcon(SuiteIcon.close.getSmallIcon(theme));
+                       tabbedArea.setLayoutData(CmsUiUtils.fillAll());
 
                        // TODO make it dynamic
-                       Composite buttons = new Composite(editorTabFolder, SWT.NONE);
-                       buttons.setLayout(CmsUiUtils.noSpaceGridLayout());
-                       ToolBar toolBar = new ToolBar(buttons, SWT.NONE);
-                       toolBar.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));
-                       ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
-                       deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
-                       deleteItem.setEnabled(false);
-                       editorTabFolder.setTopRight(buttons);
-
-                       CTabItem defaultTab = new CTabItem(editorTabFolder, SWT.NONE);
-                       // defaultTab.setText("Home");
-                       defaultTab.setImage(dashboard.getSmallIcon(theme));
-                       defaultBody = new Composite(editorTabFolder, SWT.NONE);
-                       defaultTab.setControl(defaultBody);
-                       editorTabFolder.setSelection(defaultTab);
+//                     Composite buttons = new Composite(editorTabFolder, SWT.NONE);
+//                     buttons.setLayout(CmsUiUtils.noSpaceGridLayout());
+//                     ToolBar toolBar = new ToolBar(buttons, SWT.NONE);
+//                     toolBar.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));
+//                     ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
+//                     deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
+//                     deleteItem.setEnabled(false);
+//                     editorTabFolder.setTopRight(buttons);
+//
+//                     CTabItem defaultTab = new CTabItem(editorTabFolder, SWT.NONE);
+//                     // defaultTab.setText("Home");
+//                     defaultTab.setImage(dashboard.getSmallIcon(theme));
+//                     defaultBody = new Composite(editorTabFolder, SWT.NONE);
+//                     defaultTab.setControl(defaultBody);
+//                     editorTabFolder.setSelection(defaultTab);
 
                }
 
@@ -174,14 +186,9 @@ public class ArgeoSuiteUi extends Composite {
                        return entryArea;
                }
 
-               CTabFolder getEditorTabFolder() {
-                       return editorTabFolder;
-               }
-
-               Composite getDefaultBody() {
-                       return defaultBody;
+               TabbedArea getTabbedArea() {
+                       return tabbedArea;
                }
-
        }
 
 }
index 48e6149d6af6aba132523a1b28e4cacf0356f890..931f5a1ec1f8590c30de95e78ff9ac885e4e271f 100644 (file)
@@ -1,6 +1,5 @@
 package org.argeo.suite.ui;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import javax.jcr.Node;
@@ -14,19 +13,15 @@ import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsIcon;
 import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.Selected;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventAdmin;
 
 /** Side pane listing various perspectives. */
 public class DefaultLeadPane implements CmsUiProvider {
        private final static Log log = LogFactory.getLog(DefaultLeadPane.class);
-       private EventAdmin eventAdmin;
 
        @Override
        public Control createUi(Composite parent, Node node) throws RepositoryException {
@@ -40,8 +35,8 @@ public class DefaultLeadPane implements CmsUiProvider {
 
                Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard);
                if (!cmsView.isAnonymous()) {
-                       createButton(parent, SuiteMsg.documents.name(), SuiteMsg.documents, SuiteIcon.documents);
-                       createButton(parent, SuiteMsg.people.name(), SuiteMsg.people, SuiteIcon.people);
+//                     createButton(parent, SuiteMsg.documents.name(), SuiteMsg.documents, SuiteIcon.documents);
+//                     createButton(parent, SuiteMsg.people.name(), SuiteMsg.people, SuiteIcon.people);
                        createButton(parent, SuiteMsg.locations.name(), SuiteMsg.locations, SuiteIcon.location);
                }
                return dashboardB;
@@ -53,16 +48,11 @@ public class DefaultLeadPane implements CmsUiProvider {
                CmsUiUtils.style(button, SuiteStyle.leadPane);
                button.setToolTipText(msg.lead());
                button.setImage(icon.getBigIcon(theme));
-               CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER_PARAM, layer);
+               CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
                return button;
        }
 
        public void init(Map<String, String> properties) {
 
        }
-
-       public void setEventAdmin(EventAdmin eventAdmin) {
-               this.eventAdmin = eventAdmin;
-       }
-
 }
index d481f2b0eda0a278ce5963017d11419a5978f149..e87dfc76a9bb5a919037b9a927543f4dc3aac0f7 100644 (file)
@@ -2,7 +2,6 @@ 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;
@@ -15,23 +14,26 @@ import javax.jcr.observation.EventListener;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
 
+import org.argeo.api.NodeConstants;
 import org.argeo.cms.ui.CmsTheme;
 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.EntityNames;
 import org.argeo.entity.EntityTypes;
+import org.argeo.jcr.Jcr;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.jface.layout.TableColumnLayout;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.ColumnWeightData;
+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.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
@@ -79,10 +81,11 @@ public class RecentItems implements CmsUiProvider {
        }
 
        public void init(Map<String, String> properties) {
-               entityType = properties.get(EntityNames.ENTITY_TYPE);
+               entityType = properties.get(NodeConstants.DATA_TYPE);
        }
 
        class SingleEntityViewer extends Composite {
+               private static final long serialVersionUID = -4712523256962131370L;
                Text filterTxt;
                TableViewer entityViewer;
                Session session;
@@ -175,35 +178,75 @@ public class RecentItems implements CmsUiProvider {
                                        | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
                        tableComposite.setLayoutData(gd);
 
-                       TableViewer v = new TableViewer(tableComposite);
-                       v.setLabelProvider(labelProvider);
+                       TableViewer viewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+                       viewer.setLabelProvider(labelProvider);
 
-                       TableColumn singleColumn = new TableColumn(v.getTable(), SWT.V_SCROLL);
+                       TableColumn singleColumn = new TableColumn(viewer.getTable(), SWT.V_SCROLL);
                        TableColumnLayout tableColumnLayout = new TableColumnLayout();
                        tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(85));
                        tableComposite.setLayout(tableColumnLayout);
 
                        // Corresponding table & style
-                       Table table = v.getTable();
+                       Table table = viewer.getTable();
+//                     Listener[] mouseDownListeners = table.getListeners(SWT.MouseDown);
+//                     for (Listener listener :  table.getListeners(SWT.MouseDown))
+//                             table.removeListener(SWT.MouseDown, listener);
+//                     for (Listener listener :  table.getListeners(SWT.MouseUp))
+//                             table.removeListener(SWT.MouseUp, listener);
+//                     for (Listener listener :  table.getListeners(SWT.MouseDoubleClick))
+//                             table.removeListener(SWT.MouseDoubleClick, listener);
+//                     
+//                     table.addMouseListener(new MouseListener() {
+//
+//                             @Override
+//                             public void mouseUp(MouseEvent e) {
+//                                     System.out.println("Mouse up: "+e);
+//                             }
+//
+//                             @Override
+//                             public void mouseDown(MouseEvent e) {
+//                                     System.out.println("Mouse down: "+e);
+//                             }
+//
+//                             @Override
+//                             public void mouseDoubleClick(MouseEvent e) {
+//                                     System.out.println("Mouse double: "+e);
+//
+//                             }
+//                     });
                        table.setLinesVisible(true);
                        table.setHeaderVisible(false);
                        CmsUiUtils.markup(table);
                        CmsUiUtils.setItemHeight(table, 26);
 
-                       v.setContentProvider(new BasicNodeListContentProvider());
+                       viewer.setContentProvider(new BasicNodeListContentProvider());
+                       viewer.addDoubleClickListener(new IDoubleClickListener() {
+
+                               @Override
+                               public void doubleClick(DoubleClickEvent event) {
+                                       Node node = (Node) viewer.getStructuredSelection().getFirstElement();
+                                       if (node != null)
+                                               CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.NODE_ID,
+                                                               Jcr.getIdentifier(node));
+
+                               }
+                       });
                        // v.addDoubleClickListener(new
                        // JcrViewerDClickListener(systemWorkbenchService));
-                       v.addSelectionChangedListener(new ISelectionChangedListener() {
+                       viewer.addSelectionChangedListener(new ISelectionChangedListener() {
                                public void selectionChanged(SelectionChangedEvent event) {
-                                       IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                                       List<?> lst = selection.toList();
+//                                     IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+                                       Node node = (Node) viewer.getStructuredSelection().getFirstElement();
+                                       if (node != null)
+                                               CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.NODE_ID,
+                                                               Jcr.getIdentifier(node));
 //                             if (lst != null && !lst.isEmpty())
 //                                     selectionService.setSelection(selection.toList());
 //                             else
 //                                     selectionService.setSelection(null);
                                }
                        });
-                       return v;
+                       return viewer;
                }
 
 //     public void dispose() {
@@ -241,7 +284,7 @@ public class RecentItems implements CmsUiProvider {
                                if (notEmpty(xpathFilter))
                                        xpathQueryStr += "[" + xpathFilter + "]";
 
-                               long begin = System.currentTimeMillis();
+//                             long begin = System.currentTimeMillis();
                                // session.refresh(false);
                                Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
 
@@ -261,6 +304,12 @@ public class RecentItems implements CmsUiProvider {
                }
 
                class SingleEntityLabelProvider extends ColumnLabelProvider {
+                       private static final long serialVersionUID = -2209337675781795677L;
+
+                       @Override
+                       public String getText(Object element) {
+                               return Jcr.getTitle((Node) element);
+                       }
 
                }
        }
index 7d9bca73cc0e3ff086e43b3647b62d4e93ed83d6..cc68d4085941ee92828c4fe05f3b23606444b990 100644 (file)
@@ -1,16 +1,15 @@
 package org.argeo.suite.ui;
 
-/** Events specific to Argeo Suite. */
-public enum SuiteEvent {
-       switchLayer;
+import org.argeo.cms.ui.util.CmsEvent;
 
-       public final static String LAYER_PARAM = "layer";
+/** Events specific to Argeo Suite. */
+public enum SuiteEvent implements CmsEvent {
+       openNewPart, refreshPart, switchLayer;
 
-       String topic() {
-               return getTopicBase() + "/" + name();
-       }
+       public final static String LAYER = "layer";
+       public final static String NODE_ID = "nodeId";
 
-       String getTopicBase() {
+       public String getTopicBase() {
                return "argeo/suite/ui";
        }
 
index 02f3114220aff67785573fa5f2ec00be2f4d3ed0..10941cf3fb05e3e1c63d627e45db15ed400021e7 100644 (file)
@@ -4,7 +4,7 @@ import org.argeo.cms.ui.util.CmsIcon;
 
 /** Icon names used by Argeo Suite. */
 public enum SuiteIcon implements CmsIcon {
-       add, save, search, delete, logout, dashboard,
+       add, save, close, search, delete, logout, dashboard,
        // people
        people, person, organisation,
        // library
index 75f2aeb0f24ff6242dee4522073604e72a58db48..b49c0e074c3f459a3f1438595c8895c1cf2ee132 100644 (file)
@@ -5,20 +5,22 @@ import org.argeo.cms.ui.util.CmsStyle;
 /** Styles used by Argeo Suite work UI. */
 public enum SuiteStyle implements CmsStyle {
        // Header
-       header,headerTitle,headerMenu,headerMenuItem,
+       header, headerTitle, headerMenu, headerMenuItem,
        // Recent items
        recentItems,
        // Lead pane
-       leadPane,leadPaneItem,
+       leadPane, leadPaneItem,
        // Group composite
-       titleContainer,titleLabel,subTitleLabel,
+       titleContainer, titleLabel, subTitleLabel,
        // Forms elements
        simpleLabel, simpleText,
        // table
        titleCell,
+       // tabbed area
+       mainTabSelected, mainTab,
        // Buttons
        inlineButton;
-       
+
        @Override
        public String getClassPrefix() {
                return "argeo-suite";