From 1d2cf517d6e79f2e6ed50eeeb1e0e450db5b5194 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 9 Oct 2020 11:56:49 +0200 Subject: [PATCH] Use tabbed area. --- .../icons/types/16/close.png | Bin 0 -> 440 bytes .../icons/types/32/close.png | Bin 0 -> 603 bytes org.argeo.suite.ui/OSGI-INF/leadPane.xml | 1 - .../src/org/argeo/suite/ui/ArgeoSuiteApp.java | 102 ++++++++++++---- .../src/org/argeo/suite/ui/ArgeoSuiteUi.java | 113 ++++++++++-------- .../org/argeo/suite/ui/DefaultLeadPane.java | 16 +-- .../src/org/argeo/suite/ui/RecentItems.java | 77 +++++++++--- .../src/org/argeo/suite/ui/SuiteEvent.java | 15 ++- .../src/org/argeo/suite/ui/SuiteIcon.java | 2 +- .../src/org/argeo/suite/ui/SuiteStyle.java | 10 +- 10 files changed, 216 insertions(+), 120 deletions(-) create mode 100644 org.argeo.suite.theme.default/icons/types/16/close.png create mode 100644 org.argeo.suite.theme.default/icons/types/32/close.png 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 index 0000000000000000000000000000000000000000..29d82f5ec2c458d27fbd3140b753947472c5ae7a GIT binary patch literal 440 zcmV;p0Z0CcP)i_@&YDq*vR5*>LlEF^GKomvq8{O2<(h?K{)OKN58a4)X?MG1HPe?$F z{)y3_a81%3JBe{&sF=7zHq~n8xoJr|wr+gMEN14Oo0)eXF*E*C+W_G82Br|=-nMOM z+RpiSG+gD0W1U~E?sBD4IT??JE9!cEQwZTpDO*Aa*!IDrrfD73B!Q)rEdZ$1_5;hZ zjsyUgnQZ`&QX&WztuPGz$>p_K1Oq@6eeMBpiJ9T`25lmmGP4E%>6gss4^UylC`a{r zy)zySXOuKC&!o|4J}s9okWwDz!2m$%6jT$nR2Tq6T5xxJGh^m6BKpXIzf|~_L0r!O z-qHs|1k18s2?5u; zH;;kD7JB#GOIr}Vi65bU10w}{?OyF6@stvh^-GBQ(Qt6#0_gVokr3kT!NIesl=97JIQXW17wRuq!LI<{ z^E|@v3AI}7wXHVHp0BQoc|nJf-s*4zOGu(J~Y zoaw-!WD}~TbI#K;P0`8~FoA=4c9aU3!fhl91$5w2N@s~&0o}WOfB)&V5aQZJ;vWH% zV3ATDB}sCGLyB$)*rb|kl&fz-V|d!`B9Xoct>LZ`=?b)q2I;^}CFb)vtA2lP!fvmB z0lcz>t5p`|&E_t??_Z9Fg9tXCWD#)b3SZ5YyAoOWhCo)r7G5Ng2Z!P(S=4GBPJk;L pcxJ8!&}p>}8+qZRm4^SbegoQvxD&P - diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java index 3f1a8ce..436b0da 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteApp.java @@ -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 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 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 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) diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java index e30360c..e6f38a3 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/ArgeoSuiteUi.java @@ -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 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; } - } } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java index 48e6149..931f5a1 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java @@ -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 properties) { } - - public void setEventAdmin(EventAdmin eventAdmin) { - this.eventAdmin = eventAdmin; - } - } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java index d481f2b..e87dfc7 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java @@ -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 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); + } } } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java index 7d9bca7..cc68d40 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java @@ -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"; } diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java index 02f3114..10941cf 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java @@ -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 diff --git a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java index 75f2aeb..b49c0e0 100644 --- a/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java +++ b/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java @@ -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"; -- 2.30.2