From 1847f011ba9b93452eb4417a297bd54a28a0e760 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 4 May 2015 08:02:21 +0000 Subject: [PATCH] - Window title based on JCR - Navigation when exception git-svn-id: https://svn.argeo.org/commons/trunk@8085 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/cms/AbstractCmsEntryPoint.java | 58 +++++++++++++++---- .../src/org/argeo/cms/CmsApplication.java | 13 +++-- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java index 7b32b00f8..1a08b6e5b 100644 --- a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java +++ b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java @@ -1,9 +1,12 @@ package org.argeo.cms; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import java.util.ResourceBundle; import javax.jcr.Node; +import javax.jcr.Property; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -19,9 +22,11 @@ import org.argeo.cms.i18n.Msg; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.AbstractEntryPoint; +import org.eclipse.rap.rwt.client.WebClient; import org.eclipse.rap.rwt.client.service.BrowserNavigation; import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent; import org.eclipse.rap.rwt.client.service.BrowserNavigationListener; +import org.eclipse.rap.rwt.client.service.JavaScriptExecutor; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; @@ -35,6 +40,7 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements private Repository repository; private String workspace; private Session session; + private final Map factoryProperties; // current state private Node node; @@ -42,11 +48,15 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements private String page; private Throwable exception; - private BrowserNavigation history; + // Client services + private final JavaScriptExecutor jsExecutor; + private final BrowserNavigation browserNavigation; - public AbstractCmsEntryPoint(Repository repository, String workspace) { + public AbstractCmsEntryPoint(Repository repository, String workspace, + Map factoryProperties) { this.repository = repository; this.workspace = workspace; + this.factoryProperties = new HashMap(factoryProperties); // Initial login try { @@ -65,9 +75,11 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements } authChange(); - history = RWT.getClient().getService(BrowserNavigation.class); - if (history != null) - history.addBrowserNavigationListener(new CmsNavigationListener()); + jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class); + browserNavigation = RWT.getClient().getService(BrowserNavigation.class); + if (browserNavigation != null) + browserNavigation + .addBrowserNavigationListener(new CmsNavigationListener()); // RWT.setLocale(Locale.FRANCE); } @@ -115,12 +127,16 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements return NodeType.NT_FOLDER; } + protected String getBaseTitle() { + return factoryProperties.get(WebClient.PAGE_TITLE); + } + public void navigateTo(String state) { exception = null; - setState(state); + String title = setState(state); refreshBody(); - if (history != null) - history.pushState(state, state); + if (browserNavigation != null) + browserNavigation.pushState(state, title); } @Override @@ -169,12 +185,14 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements } /** Sets the state of the entry point and retrieve the related JCR node. */ - protected synchronized void setState(String newState) { + protected synchronized String setState(String newState) { String previousState = this.state; node = null; page = null; this.state = newState; + if (newState.equals("~")) + this.state = ""; try { int firstSlash = state.indexOf('/'); @@ -222,12 +240,28 @@ abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements page = state; } + // Title + String title; + if (node.isNodeType(NodeType.MIX_TITLE) + && node.hasProperty(Property.JCR_TITLE)) + title = node.getProperty(Property.JCR_TITLE).getString() + + " - " + getBaseTitle(); + else + title = getBaseTitle(); + jsExecutor.execute("document.title = \"" + title + "\""); + if (log.isTraceEnabled()) log.trace("node=" + node + ", state=" + state + " (page=" - + page); + + page + ", title=" + title + ")"); - } catch (RepositoryException e) { - throw new CmsException("Cannot retrieve node", e); + return title; + + } catch (Exception e) { + if (previousState.equals("")) + previousState = "~"; + navigateTo(previousState); + throw new CmsException("Unexpected issue when accessing #" + + newState, e); } } diff --git a/org.argeo.cms/src/org/argeo/cms/CmsApplication.java b/org.argeo.cms/src/org/argeo/cms/CmsApplication.java index 74b3b6b03..2f2697d5a 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsApplication.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsApplication.java @@ -122,7 +122,8 @@ public class CmsApplication implements CmsConstants, ApplicationConfiguration, // ADD ENTRY POINT // application.addEntryPoint("/" + page, new CmsEntryPointFactory( - pages.get(page), repository, workspace), properties); + pages.get(page), repository, workspace, properties), + properties); log.info("Registered entry point /" + page); } @@ -258,18 +259,20 @@ public class CmsApplication implements CmsConstants, ApplicationConfiguration, private final CmsUiProvider page; private final Repository repository; private final String workspace; + private final Map properties; public CmsEntryPointFactory(CmsUiProvider page, Repository repository, - String workspace) { + String workspace, Map properties) { this.page = page; this.repository = repository; this.workspace = workspace; + this.properties = properties; } @Override public EntryPoint create() { CmsEntryPoint entryPoint = new CmsEntryPoint(repository, workspace, - page); + page, properties); entryPoint.setState(""); CmsSession.current.set(entryPoint); return entryPoint; @@ -283,8 +286,8 @@ public class CmsApplication implements CmsConstants, ApplicationConfiguration, private final CmsUiProvider uiProvider; public CmsEntryPoint(Repository repository, String workspace, - CmsUiProvider uiProvider) { - super(repository, workspace); + CmsUiProvider uiProvider, Map factoryProperties) { + super(repository, workspace, factoryProperties); this.uiProvider = uiProvider; } -- 2.30.2