Improve localisation.
[gpl/argeo-suite.git] / org.argeo.suite.ui / src / org / argeo / suite / ui / SuiteApp.java
index 799fb9181d7d1248f4160c4acf3ab3e10c7c71cf..b4ba8d270f12e70c751a49db3230957454e0597d 100644 (file)
@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -22,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.CmsUserManager;
+import org.argeo.cms.LocaleUtils;
 import org.argeo.cms.auth.CmsSession;
 import org.argeo.cms.ui.AbstractCmsApp;
 import org.argeo.cms.ui.CmsTheme;
@@ -30,6 +32,7 @@ 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.eclipse.ui.specific.UiContext;
 import org.argeo.entity.EntityConstants;
 import org.argeo.entity.EntityNames;
 import org.argeo.entity.EntityType;
@@ -131,8 +134,8 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                refreshPart(findUiProvider(LOGIN_SCREEN_PID), ui.getBelowHeader(), context);
                                ui.layout(true, true);
                        } else {
+                               CmsSession cmsSession = cmsView.getCmsSession();
                                if (ui.getUserDir() == null) {
-                                       CmsSession cmsSession = cmsView.getCmsSession();
                                        Session adminSession = null;
                                        try {
                                                adminSession = NodeUtils.openDataAdminSession(getRepository(), null);
@@ -142,6 +145,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                                Jcr.logout(adminSession);
                                        }
                                }
+                               initLocale(cmsSession);
                                context = stateToNode(ui, state);
                                if (context == null)
                                        context = ui.getUserDir();
@@ -160,6 +164,13 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                }
        }
 
+       private void initLocale(CmsSession cmsSession) {
+               Locale locale = cmsSession.getLocale();
+               UiContext.setLocale(locale);
+               LocaleUtils.setThreadLocale(locale);
+
+       }
+
        private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) {
                CmsUiUtils.clear(part);
                uiProvider.createUiPart(part, context);
@@ -226,8 +237,22 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
 
        @Override
        public void setState(Composite parent, String state) {
-               if (state == null || !state.startsWith("/"))
+               if (state == null || state.equals("~"))
                        return;
+               if (!state.startsWith("/") && !state.equals("~")) {
+                       if (parent instanceof SuiteUi) {
+                               SuiteUi ui = (SuiteUi) parent;
+                               String currentLayerId = ui.getCurrentLayerId();
+                               if (state.equals(currentLayerId))
+                                       return; // does nothing
+                               else {
+                                       Map<String, Object> properties = new HashMap<>();
+                                       properties.put(SuiteEvent.LAYER, state);
+                                       ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties);
+                               }
+                       }
+                       return;
+               }
                SuiteUi suiteUi = (SuiteUi) parent;
                Node node = stateToNode(suiteUi, state);
                if (node == null) {
@@ -245,7 +270,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
        private Node stateToNode(SuiteUi suiteUi, String state) {
                if (suiteUi == null)
                        return null;
-               if (state == null)
+               if (state == null || !state.startsWith("/"))
                        return null;
 
                String path = state.substring(1);
@@ -293,7 +318,7 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
                                SuiteLayer layer = findByType(layersByType, node);
                                ui.switchToLayer(layer, node);
-                               layer.view(uiProvider, ui.getCurrentWorkArea(), node);
+                               ui.getCmsView().runAs(() -> layer.view(uiProvider, ui.getCurrentWorkArea(), node));
                                ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node));
                        } else if (isTopic(event, SuiteEvent.openNewPart)) {
                                Node node = getNode(ui, event);
@@ -302,18 +327,19 @@ public class SuiteApp extends AbstractCmsApp implements EventHandler {
                                CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
                                SuiteLayer layer = findByType(layersByType, node);
                                ui.switchToLayer(layer, node);
-                               layer.open(uiProvider, ui.getCurrentWorkArea(), node);
+                               ui.getCmsView().runAs(() -> layer.open(uiProvider, ui.getCurrentWorkArea(), node));
                                ui.getCmsView().stateChanged(nodeToState(node), Jcr.getTitle(node));
                        } else if (isTopic(event, SuiteEvent.switchLayer)) {
                                String layerId = get(event, SuiteEvent.LAYER);
                                if (layerId != null) {
-                                       ui.switchToLayer(layerId, ui.getUserDir());
-                                       // ui.getCmsView().navigateTo("~");
+//                                     ui.switchToLayer(layerId, ui.getUserDir());
+                                       ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir()));
+                                       ui.getCmsView().navigateTo(layerId);
                                } else {
                                        Node node = getNode(ui, event);
                                        if (node != null) {
                                                SuiteLayer layer = findByType(layersByType, node);
-                                               ui.switchToLayer(layer, node);
+                                               ui.getCmsView().runAs(() -> ui.switchToLayer(layer, node));
                                        }
                                }
                        }