X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=core%2Forg.argeo.suite.ui%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fui%2FSuiteApp.java;h=9a6208b7e0d86ef2e3a120a341e7124e87561e5f;hp=6082480304ba6b93e7b6f7aa2a21f5ad231d6069;hb=cbf5614674c1013fdcc4ba6f0b9fae700b5f3681;hpb=9ab716f8f45fc34f4848bd1a8b8c0a5e7783a5a9 diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java index 6082480..9a6208b 100644 --- a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java +++ b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java @@ -37,6 +37,7 @@ import org.argeo.entity.EntityConstants; import org.argeo.entity.EntityNames; import org.argeo.entity.EntityType; import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; import org.argeo.suite.RankedObject; import org.argeo.suite.SuiteUtils; import org.argeo.util.LangUtils; @@ -54,7 +55,9 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { public final static String PUBLIC_BASE_PATH_PROPERTY = "publicBasePath"; public final static String DEFAULT_UI_NAME_PROPERTY = "defaultUiName"; public final static String DEFAULT_THEME_ID_PROPERTY = "defaultThemeId"; + public final static String DEFAULT_LAYER_PROPERTY = "defaultLayer"; private final static String LOGIN = "login"; + private final static String HOME_STATE = "~"; private String publicBasePath = null; @@ -87,6 +90,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { defaultUiName = LangUtils.get(properties, DEFAULT_UI_NAME_PROPERTY); if (properties.containsKey(DEFAULT_THEME_ID_PROPERTY)) defaultThemeId = LangUtils.get(properties, DEFAULT_THEME_ID_PROPERTY); + if (properties.containsKey(DEFAULT_LAYER_PROPERTY)) + defaultLayerPid = LangUtils.get(properties, DEFAULT_LAYER_PROPERTY); publicBasePath = LangUtils.get(properties, PUBLIC_BASE_PATH_PROPERTY); if (properties.containsKey(Constants.SERVICE_PID)) { @@ -154,6 +159,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { CmsView cmsView = CmsView.getCmsView(parent); CmsUiProvider headerUiProvider = findUiProvider(headerPid); CmsUiProvider footerUiProvider = findUiProvider(footerPid); + CmsUiProvider leadPaneUiProvider = findUiProvider(leadPanePid); + Localized appTitle = null; if (headerUiProvider instanceof DefaultHeader) { appTitle = ((DefaultHeader) headerUiProvider).getTitle(); @@ -175,7 +182,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { state = null; CmsSession cmsSession = cmsView.getCmsSession(); if (ui.getUserDir() == null) { - if (cmsView.isAnonymous()) { + // FIXME NPE on CMSSession when logging in from anonymous + if (cmsSession == null || cmsView.isAnonymous()) { assert publicBasePath != null; ui.initSessions(getRepository(), publicBasePath); } else { @@ -201,7 +209,9 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { SuiteLayer layer = layersByPid.get(key).get(); ui.addLayer(key, layer); } - refreshPart(findUiProvider(leadPanePid), ui.getLeadPane(), context); + + if (leadPaneUiProvider != null) + refreshPart(leadPaneUiProvider, ui.getLeadPane(), context); if (footerUiProvider != null) refreshPart(footerUiProvider, ui.getFooter(), context); ui.layout(true, true); @@ -244,31 +254,34 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { try { // mixins Set types = new TreeSet<>(); - for (NodeType nodeType : context.getMixinNodeTypes()) { - String typeName = nodeType.getName(); - if (byType.containsKey(typeName)) { - types.add(typeName); + for (NodeType mixinType : context.getMixinNodeTypes()) { + String mixinTypeName = mixinType.getName(); + if (byType.containsKey(mixinTypeName)) { + types.add(mixinTypeName); + } + for (NodeType superType : mixinType.getDeclaredSupertypes()) { + if (byType.containsKey(superType.getName())) { + types.add(superType.getName()); + } } } // primary node type - { - NodeType nodeType = context.getPrimaryNodeType(); - String typeName = nodeType.getName(); - if (byType.containsKey(typeName)) { - types.add(typeName); - } - for (NodeType mixin : nodeType.getDeclaredSupertypes()) { - if (byType.containsKey(mixin.getName())) { - types.add(mixin.getName()); - } + NodeType primaryType = context.getPrimaryNodeType(); + String primaryTypeName = primaryType.getName(); + if (byType.containsKey(primaryTypeName)) { + types.add(primaryTypeName); + } + for (NodeType superType : primaryType.getDeclaredSupertypes()) { + if (byType.containsKey(superType.getName())) { + types.add(superType.getName()); } } // entity type if (context.isNodeType(EntityType.entity.get())) { if (context.hasProperty(EntityNames.ENTITY_TYPE)) { - String typeName = context.getProperty(EntityNames.ENTITY_TYPE).getString(); - if (byType.containsKey(typeName)) { - types.add(typeName); + String entityTypeName = context.getProperty(EntityNames.ENTITY_TYPE).getString(); + if (byType.containsKey(entityTypeName)) { + types.add(entityTypeName); } } } @@ -281,7 +294,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } if (types.size() == 0) - throw new IllegalArgumentException("No type found for " + context); + throw new IllegalArgumentException("No type found for " + context + " (" + listTypes(context) + ")"); String type = types.iterator().next(); if (!byType.containsKey(type)) throw new IllegalArgumentException("No component found for " + context + " with type " + type); @@ -291,6 +304,31 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { } } + private static String listTypes(Node context) { + try { + StringBuilder sb = new StringBuilder(); + sb.append(context.getPrimaryNodeType().getName()); + for (NodeType superType : context.getPrimaryNodeType().getDeclaredSupertypes()) { + sb.append(' '); + sb.append(superType.getName()); + } + + for (NodeType nodeType : context.getMixinNodeTypes()) { + sb.append(' '); + sb.append(nodeType.getName()); + if (nodeType.getName().equals(EntityType.local.get())) + sb.append('/').append(context.getProperty(EntityNames.ENTITY_TYPE).getString()); + for (NodeType superType : nodeType.getDeclaredSupertypes()) { + sb.append(' '); + sb.append(superType.getName()); + } + } + return sb.toString(); + } catch (RepositoryException e) { + throw new JcrException(e); + } + } + @Override public void setState(Composite parent, String state) { if (state == null) @@ -298,35 +336,33 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { if (!state.startsWith("/")) { if (parent instanceof SuiteUi) { SuiteUi ui = (SuiteUi) parent; - if (LOGIN.equals(state) || state.equals("~")) { + if (LOGIN.equals(state)) { String appTitle = ""; if (ui.getTitle() != null) appTitle = ui.getTitle().lead(); ui.getCmsView().stateChanged(state, appTitle); return; } - String currentLayerId = ui.getCurrentLayerId(); - if (state.equals(currentLayerId)) - return; // does nothing - else { - Map properties = new HashMap<>(); - properties.put(SuiteEvent.LAYER, state); - ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties); - } + Map properties = new HashMap<>(); + String layerId = HOME_STATE.equals(state) ? defaultLayerPid : state; + properties.put(SuiteEvent.LAYER, layerId); + properties.put(SuiteEvent.NODE_PATH, HOME_STATE); + ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties); } return; } SuiteUi suiteUi = (SuiteUi) parent; Node node = stateToNode(suiteUi, state); if (node == null) { - suiteUi.getCmsView().navigateTo("~"); + suiteUi.getCmsView().navigateTo(HOME_STATE); } else { suiteUi.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node)); suiteUi.getCmsView().sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node)); } } - private String nodeToState(Node node) { + // TODO move it to an internal package? + static String nodeToState(Node node) { return '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node); } @@ -403,12 +439,31 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { if (layerId != null) { // ui.switchToLayer(layerId, ui.getUserDir()); SuiteLayer suiteLayer = findLayer(layerId); + if (suiteLayer == null) + throw new IllegalArgumentException("No layer '" + layerId + "' available."); Localized layerTitle = suiteLayer.getTitle(); - ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir())); + // FIXME make sure we don't rebuild the work area twice + Composite workArea = ui.getCmsView().doAs(() -> ui.switchToLayer(layerId, ui.getUserDir())); String title = null; if (layerTitle != null) title = layerTitle.lead(); - ui.getCmsView().stateChanged(layerId, appTitle + title); + Node nodeFromState = getNode(ui, event); + if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) { + // default layer view is forced + String state = defaultLayerPid.equals(layerId) ? "~" : layerId; + ui.getCmsView().stateChanged(state, appTitle + title); + suiteLayer.view(null, workArea, nodeFromState); + } else { + Node layerCurrentContext = suiteLayer.getCurrentContext(workArea); + if (layerCurrentContext != null) { + // layer was already showing a context so we set the state to it + ui.getCmsView().stateChanged(nodeToState(layerCurrentContext), + appTitle + Jcr.getTitle(layerCurrentContext)); + } else { + // no context was shown + ui.getCmsView().stateChanged(layerId, appTitle + title); + } + } } else { Node node = getNode(ui, event); if (node != null) { @@ -426,6 +481,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler { private Node getNode(SuiteUi ui, Event event) { String nodePath = get(event, SuiteEvent.NODE_PATH); + if (nodePath != null && nodePath.equals(HOME_STATE)) + return ui.getUserDir(); String workspaceName = get(event, SuiteEvent.WORKSPACE); Session session = ui.getSession(workspaceName); Node node;