--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Documents Folder">
+ <implementation class="org.argeo.documents.ui.DocumentsFolderUiProvider"/>
+ <service>
+ <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
+ </service>
+ <properties entry="config/documentsFolder.properties"/>
+ <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+</scr:component>
<service>
<provide interface="org.argeo.cms.ui.CmsUiProvider"/>
</service>
- <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
<properties entry="config/entryArea.properties"/>
+ <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+ <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
</scr:component>
Service-Component:\
OSGI-INF/entryArea.xml,\
-OSGI-INF/documentsLayer.xml
+OSGI-INF/documentsLayer.xml,\
+OSGI-INF/documentsFolder.xml
Import-Package:\
org.eclipse.swt,\
bin.includes = META-INF/,\
.,\
OSGI-INF/,\
- OSGI-INF/documentsLayer.xml
+ OSGI-INF/documentsLayer.xml,\
+ OSGI-INF/documentsFolder.xml
source.. = src/
--- /dev/null
+entity.type=nt:folder
\ No newline at end of file
service.pid=argeo.documents.ui.documentsLayer
+
+title=Documents
+icon=documents
\ No newline at end of file
--- /dev/null
+package org.argeo.documents.ui;
+
+import java.nio.file.spi.FileSystemProvider;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.fs.CmsFsUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** UI provider of a document folder. */
+public class DocumentsFolderUiProvider implements CmsUiProvider {
+ private FileSystemProvider nodeFileSystemProvider;
+
+ @Override
+ public Control createUi(Composite parent, Node context) throws RepositoryException {
+ CmsView cmsView = CmsView.getCmsView(parent);
+ DocumentsFolderComposite dfc = new DocumentsFolderComposite(parent, SWT.NONE, context);
+ dfc.setLayoutData(CmsUiUtils.fillAll());
+ dfc.populate(cmsView.doAs(() -> CmsFsUtils.getPath(nodeFileSystemProvider, context)));
+ return dfc;
+ }
+
+ public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
+ this.nodeFileSystemProvider = nodeFileSystemProvider;
+ }
+
+}
package org.argeo.documents.ui;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.spi.FileSystemProvider;
+import java.util.HashMap;
+import java.util.Map;
import javax.jcr.Node;
+import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import org.argeo.api.NodeUtils;
import org.argeo.cms.fs.CmsFsUtils;
import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
import org.argeo.cms.ui.util.CmsUiUtils;
import org.argeo.eclipse.ui.fs.FsTreeViewer;
+import org.argeo.jcr.Jcr;
+import org.argeo.suite.ui.SuiteEvent;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
/** Tree view of a user root folders. */
public class DocumentsTreeUiProvider implements CmsUiProvider {
private FileSystemProvider nodeFileSystemProvider;
+ private Repository repository;
@Override
public Control createUi(Composite parent, Node context) throws RepositoryException {
fsTreeViewer.configureDefaultSingleColumnTable(500);
Node homeNode = NodeUtils.getUserHome(context.getSession());
Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
+ CmsView cmsView = CmsView.getCmsView(parent);
+ fsTreeViewer.addSelectionChangedListener((e) -> {
+ IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+ if (selection.isEmpty())
+ return;
+ else {
+ Path newSelected = (Path) selection.getFirstElement();
+ if (Files.isDirectory(newSelected)) {
+ Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+ parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(SuiteEvent.NODE_ID, Jcr.getIdentifier(folderNode));
+ properties.put(SuiteEvent.WORKSPACE, Jcr.getWorkspaceName(folderNode));
+ cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties);
+ }
+ }
+ });
+ fsTreeViewer.addDoubleClickListener((e) -> {
+ IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+ if (selection.isEmpty())
+ return;
+ else {
+ Path newSelected = (Path) selection.getFirstElement();
+ if (Files.isDirectory(newSelected)) {
+ Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+ parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(SuiteEvent.NODE_ID, Jcr.getIdentifier(folderNode));
+ properties.put(SuiteEvent.WORKSPACE, Jcr.getWorkspaceName(folderNode));
+ cmsView.sendEvent(SuiteEvent.openNewPart.topic(), properties);
+ }
+ }
+ });
fsTreeViewer.setPathsInput(homePath);
fsTreeViewer.getControl().setLayoutData(CmsUiUtils.fillAll());
fsTreeViewer.getControl().getParent().layout(true, true);
this.nodeFileSystemProvider = nodeFileSystemProvider;
}
+ public void setRepository(Repository repository) {
+ this.repository = repository;
+ }
+
}
<property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
argeo.documents.ui.documentsLayer
</property>
+ <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
</scr:component>
-service.pid=argeo.suite.ui.dashboardLayer
\ No newline at end of file
+service.pid=argeo.suite.ui.dashboardLayer
+
+title=Dashboard
+icon=dashboard
\ No newline at end of file
}
@Override
- public void view(Composite workArea, Node context) {
+ public void view(CmsUiProvider uiProvider, Composite workArea, Node context) {
TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
- CmsUiProvider uiProvider = null;
tabbedArea.view(uiProvider, context);
}
@Override
- public void open(Composite workArea, Node context) {
+ public void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
TabbedArea tabbedArea = ((DefaultEditionArea) workArea).getTabbedArea();
- CmsUiProvider uiProvider = null;
tabbedArea.open(uiProvider, context);
}
package org.argeo.suite.ui;
+import java.util.Collections;
import java.util.Map;
+import java.util.TreeMap;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.argeo.cms.ui.CmsView;
import org.argeo.cms.ui.util.CmsIcon;
import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.suite.RankedObject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
+import org.osgi.framework.Constants;
/** Side pane listing various perspectives. */
public class DefaultLeadPane implements CmsUiProvider {
defaultLayers;
}
+ private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
private String[] defaultLayers;
@Override
Button first = null;
for (String layerId : defaultLayers) {
- Button b = createButton(parent, layerId, SuiteMsg.dashboard, SuiteIcon.dashboard);
- if (first == null)
- first = b;
+ if (layers.containsKey(layerId)) {
+ RankedObject<SuiteLayer> layerObj = layers.get(layerId);
+
+ // TODO deal with i10n
+ String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name());
+ Localized title = null;
+ if (titleStr != null)
+ title = new Localized.Untranslated(titleStr);
+
+ String iconName = (String) layerObj.getProperties().get(SuiteLayer.Property.icon.name());
+ SuiteIcon icon = null;
+ if (iconName != null)
+ icon = SuiteIcon.valueOf(iconName);
+
+ Button b = createButton(parent, layerId, title, icon);
+ if (first == null)
+ first = b;
+ }
}
// Button dashboardB = createButton(parent, SuiteMsg.dashboard.name(), SuiteMsg.dashboard, SuiteIcon.dashboard);
CmsTheme theme = CmsTheme.getCmsTheme(parent);
Button button = new Button(parent, SWT.PUSH);
CmsUiUtils.style(button, SuiteStyle.leadPane);
- button.setImage(icon.getBigIcon(theme));
+ if (icon != null)
+ button.setImage(icon.getBigIcon(theme));
button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
// button.setToolTipText(msg.lead());
- Label lbl = new Label(parent, SWT.NONE);
- CmsUiUtils.style(lbl, SuiteStyle.leadPane);
- lbl.setText(msg.lead());
- lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+ if (msg != null) {
+ Label lbl = new Label(parent, SWT.NONE);
+ CmsUiUtils.style(lbl, SuiteStyle.leadPane);
+ lbl.setText(msg.lead());
+ lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+ }
CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
return button;
}
if (log.isDebugEnabled())
log.debug("Default layers: " + defaultLayers);
}
+
+ public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
+ if (properties.containsKey(Constants.SERVICE_PID)) {
+ String pid = (String) properties.get(Constants.SERVICE_PID);
+ RankedObject.putIfHigherRank(layers, pid, layer, properties);
+ }
+ }
+
}
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+import java.util.TreeSet;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeUtils;
import org.argeo.cms.ui.AbstractCmsApp;
import org.argeo.cms.ui.CmsTheme;
import org.argeo.cms.ui.CmsUiProvider;
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.EntityConstants;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrUtils;
import org.argeo.suite.RankedObject;
private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
+ private Map<String, RankedObject<CmsUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
// TODO make more optimal or via CmsSession/CmsView
throw new IllegalArgumentException("No UI provider registered as " + pid);
return uiProvidersByPid.get(pid).get();
}
+
+ private CmsUiProvider findUiProvider(Node context) {
+ try {
+ Set<String> types = new TreeSet<>();
+ for (NodeType nodeType : context.getMixinNodeTypes()) {
+ String typeName = nodeType.getName();
+ if (uiProvidersByType.containsKey(typeName)) {
+ types.add(typeName);
+ }
+ }
+ NodeType nodeType = context.getPrimaryNodeType();
+ String typeName = nodeType.getName();
+ if (uiProvidersByType.containsKey(typeName)) {
+ types.add(typeName);
+ }
+// if (context.getPath().equals("/")) {// root node
+// types.add("nt:folder");
+// }
+ if (NodeUtils.isUserHome(context)) {// home node
+ types.add("nt:folder");
+ }
+
+ if (types.size() == 0)
+ throw new IllegalArgumentException("No UI provider found for " + context);
+ return uiProvidersByType.get(types.iterator().next()).get();
+ } catch (RepositoryException e) {
+ throw new IllegalStateException(e);
+ }
+ }
// private CmsUiProvider findUiProvider(String pid, Node context) {
// CmsUiProvider found = null;
// if (pid != null) {
*/
public void addUiProvider(CmsUiProvider uiProvider, Map<String, Object> properties) {
-// RankingKey partKey = new RankingKey(properties);
-// if (partKey.getPid() != null || partKey.getDataType() != null) {
-// uiProvidersByPid.put(partKey, uiProvider);
-// if (log.isDebugEnabled())
-// log.debug("Added UI provider " + partKey + " (" + uiProvider.getClass().getName() + ") to CMS app.");
-// }
-
if (properties.containsKey(Constants.SERVICE_PID)) {
String pid = (String) properties.get(Constants.SERVICE_PID);
RankedObject.putIfHigherRank(uiProvidersByPid, pid, uiProvider, properties);
-// RankedObject<CmsUiProvider> rankedObject = new RankedObject<>(uiProvider, properties);
-// if (!uiProvidersByPid.containsKey(pid)) {
-// uiProvidersByPid.put(pid, rankedObject);
-// if (log.isDebugEnabled())
-// log.debug("Added UI provider " + pid + " as " + uiProvider.getClass().getName() + " with rank "
-// + rankedObject.getRank());
-// } else {
-// RankedObject<CmsUiProvider> current = uiProvidersByPid.get(pid);
-// if (current.getRank() <= rankedObject.getRank()) {
-// uiProvidersByPid.put(pid, rankedObject);
-// if (log.isDebugEnabled())
-// log.debug("Replaced UI provider " + pid + " by " + uiProvider.getClass().getName()
-// + " with rank " + rankedObject.getRank());
-// }
-// }
+ }
+ if (properties.containsKey(EntityConstants.TYPE)) {
+ // TODO manage String arrays as well
+ String type = (String) properties.get(EntityConstants.TYPE);
+ RankedObject.putIfHigherRank(uiProvidersByType, type, uiProvider, properties);
}
}
String currentLayerId = ui.getCurrentLayerId();
SuiteLayer layer = layers.get(currentLayerId).get();
if (isTopic(event, SuiteEvent.refreshPart)) {
- Node node = Jcr.getNodeById(ui.getSysSession(), get(event, SuiteEvent.NODE_ID));
- layer.view(ui.getCurrentWorkArea(), node);
+ String nodeId = get(event, SuiteEvent.NODE_ID);
+ String workspace = get(event, SuiteEvent.WORKSPACE);
+ Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+ CmsUiProvider uiProvider = findUiProvider(node);
+ layer.view(uiProvider, ui.getCurrentWorkArea(), node);
// ui.getTabbedArea().view(findUiProvider(DASHBOARD_PID), node);
// ui.layout(true, true);
} else if (isTopic(event, SuiteEvent.openNewPart)) {
- Node node = Jcr.getNodeById(ui.getSysSession(), get(event, SuiteEvent.NODE_ID));
- layer.open(ui.getCurrentWorkArea(), node);
+ String nodeId = get(event, SuiteEvent.NODE_ID);
+ String workspace = get(event, SuiteEvent.WORKSPACE);
+ Node node = Jcr.getNodeById(ui.getSession(workspace), nodeId);
+ CmsUiProvider uiProvider = findUiProvider(node);
+ layer.open(uiProvider, ui.getCurrentWorkArea(), node);
// ui.getTabbedArea().open(findUiProvider(DASHBOARD_PID), node);
// ui.layout(true, true);
} else if (isTopic(event, SuiteEvent.switchLayer)) {
public final static String LAYER = "layer";
public final static String NODE_ID = "nodeId";
+ public final static String WORKSPACE = "workspace";
public String getTopicBase() {
return "argeo/suite/ui";
/** An UI layer for the main work area. */
public interface SuiteLayer extends CmsUiProvider {
- void view(Composite workArea, Node context);
+ static enum Property {
+ title,icon;
+ }
+
+ void view(CmsUiProvider uiProvider, Composite workArea, Node context);
- default void open(Composite workArea, Node context) {
- view(workArea, context);
+ default void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
+ view(uiProvider, workArea, context);
}
}
return sysSession;
}
+ Session getSession(String workspaceName) {
+ if (workspaceName == null)
+ return sysSession;
+ if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
+ return sysSession;
+ else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
+ return homeSession;
+ else
+ throw new IllegalArgumentException("Unknown workspace " + workspaceName);
+ }
+
}
argeo.node.init=../../init
-argeo.i18n.locales=en,fr,de,ar
+argeo.i18n.locales=en,fr
argeo.i18n.defaultLocale=en
#tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
argeo.node.init=../../init
-argeo.i18n.locales=en,fr,de,ar
+argeo.i18n.locales=en,fr
argeo.i18n.defaultLocale=en
#tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml