From 1dd481efc4672942db6e26c5ea921e479f4a0872 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Tue, 22 Mar 2011 13:18:00 +0000
Subject: [PATCH] LMS-2153 1. introduce "simple embedded view" to remove
 toolbar and footer 2. remove the blinking welcome page when a URL from SVM is
 accessed.

SVN: 20446
---
 .../client/web/client/application/Client.java | 28 +++++---------
 .../client/application/CommonViewContext.java | 11 +++---
 .../client/application/GenericViewModel.java  | 14 ++++++-
 .../client/application/UrlParamsHelper.java   | 21 ++++++++--
 .../client/application/framework/AppView.java | 38 ++++++++++++++-----
 .../application/framework/MainPagePanel.java  |  6 ++-
 .../application/locator/OpenViewAction.java   |  6 +++
 .../locator/ViewLocatorResolverRegistry.java  | 16 ++++++++
 .../generic/shared/basic/ViewMode.java        |  9 ++++-
 .../application/locator/OpenViewCommand.java  |  2 +-
 10 files changed, 109 insertions(+), 42 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Client.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Client.java
index 4cf767cc565..552ff114366 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Client.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Client.java
@@ -42,11 +42,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.Br
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.GlobalSearchLocatorResolver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.HomeLocatorResolver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.MaterialLocatorResolver;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.OpenViewAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.PermlinkLocatorResolver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ProjectLocatorResolver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.SearchLocatorResolver;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocatorResolverRegistry;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.DefaultClientPluginFactoryProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider;
@@ -180,7 +178,6 @@ public class Client implements EntryPoint, ValueChangeHandler<String>
             viewContext = createViewContext(openUrlController);
             initializeControllers(openUrlController);
         }
-        final ViewLocator locator = createViewLocator(History.getToken());
         History.addValueChangeHandler(this); // both modes
 
         final IClientServiceAsync service = getServiceForRetrievingApplicationInfo(viewContext);
@@ -194,18 +191,20 @@ public class Client implements EntryPoint, ValueChangeHandler<String>
                 @Override
                 public final void process(final ApplicationInfo info)
                 {
-                    setViewMode(info);
-                    viewContext.getModel().setApplicationInfo(info);
+                    ViewMode viewMode = findViewMode(info);
+                    ClientStaticState.setViewMode(viewMode);
+                    GenericViewModel model = viewContext.getModel();
+                    model.setApplicationInfo(info);
+                    model.setViewMode(viewMode);
                     // the callback sets the SessionContext and redirects to the login page or the
                     // initial page and may additionaly open an initial tab
                     SessionContextCallback sessionContextCallback =
                             new SessionContextCallback((CommonViewContext) viewContext,
-                                    new OpenViewAction(viewContext.getLocatorResolverRegistry(),
-                                            locator));
+                                    UrlParamsHelper.createNavigateToCurrentUrlAction(viewContext));
                     service.tryToGetCurrentSessionContext(sessionContextCallback);
                 }
 
-                private void setViewMode(ApplicationInfo info)
+                private ViewMode findViewMode(ApplicationInfo info)
                 {
                     // if view mode is specified in the URL it should override the default one
                     final ViewMode userViewModeOrNull = tryGetUrlViewMode();
@@ -213,8 +212,7 @@ public class Client implements EntryPoint, ValueChangeHandler<String>
                             userViewModeOrNull != null ? userViewModeOrNull : info
                                     .getWebClientConfiguration().getDefaultViewMode();
                     viewContext.log("viewMode = " + viewMode);
-                    final boolean simpleMode = viewMode == ViewMode.SIMPLE;
-                    ClientStaticState.setSimpleMode(simpleMode);
+                    return viewMode;
                 }
 
                 private ViewMode tryGetUrlViewMode()
@@ -235,11 +233,6 @@ public class Client implements EntryPoint, ValueChangeHandler<String>
             });
     }
 
-    public static ViewLocator createViewLocator(String historyToken)
-    {
-        return new ViewLocator(historyToken);
-    }
-
     protected IClientServiceAsync getServiceForRetrievingApplicationInfo(
             IViewContext<ICommonClientServiceAsync> context)
     {
@@ -379,10 +372,7 @@ public class Client implements EntryPoint, ValueChangeHandler<String>
 
     public void onValueChange(ValueChangeEvent<String> event)
     {
-        ViewLocatorResolverRegistry resolver = viewContext.getLocatorResolverRegistry();
-        ViewLocator viewLocator = createViewLocator(History.getToken());
-        OpenViewAction openViewAction = new OpenViewAction(resolver, viewLocator);
-        openViewAction.execute();
+        UrlParamsHelper.createNavigateToCurrentUrlAction(viewContext).execute();
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
index 01cf8943605..fccaa445533 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDele
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.IProfilingTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.ProfilingTable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ViewMode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebClientConfiguration;
 
@@ -46,7 +47,7 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
      */
     public final static class ClientStaticState
     {
-        private static boolean simpleViewMode;
+        private static ViewMode viewMode;
 
         private static String pageTitleSuffix;
 
@@ -61,12 +62,12 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
         @Deprecated
         public static boolean isSimpleMode()
         {
-            return simpleViewMode;
+            return viewMode != ViewMode.NORMAL;
         }
 
-        public static void setSimpleMode(boolean simpleMode)
+        public static void setViewMode(ViewMode viewModeParam)
         {
-            simpleViewMode = simpleMode;
+            viewMode = viewModeParam;
         }
 
         public static String getPageTitleSuffix()
@@ -134,7 +135,7 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
     {
         return AbstractPluginViewContext.getPropertyOrNull(this, key);
     }
-    
+
     public final GenericViewModel getModel()
     {
         return viewModel;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericViewModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericViewModel.java
index 863fc6ed04a..78b2c11134b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericViewModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/GenericViewModel.java
@@ -18,11 +18,12 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ApplicationInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ViewMode;
 
 /**
  * The view model.
  * 
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public class GenericViewModel
 {
@@ -30,6 +31,8 @@ public class GenericViewModel
 
     private SessionContext sessionContext;
 
+    private ViewMode viewMode;
+
     public final ApplicationInfo getApplicationInfo()
     {
         return applicationInfo;
@@ -50,4 +53,13 @@ public class GenericViewModel
         this.sessionContext = sessionContext;
     }
 
+    public ViewMode getViewMode()
+    {
+        return viewMode;
+    }
+
+    public void setViewMode(ViewMode viewMode)
+    {
+        this.viewMode = viewMode;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/UrlParamsHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/UrlParamsHelper.java
index 05691e74716..353aef46a70 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/UrlParamsHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/UrlParamsHelper.java
@@ -16,6 +16,11 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
+import com.google.gwt.user.client.History;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.OpenViewAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocatorResolverRegistry;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
@@ -34,14 +39,22 @@ public final class UrlParamsHelper
         URLMethodWithParameters methodWithParameters =
                 new URLMethodWithParameters(GenericConstants.TEMPLATE_SERVLET_NAME);
         methodWithParameters.addParameter(GenericConstants.ENTITY_KIND_KEY_PARAMETER, kind.name());
-        methodWithParameters.addParameter(GenericConstants.ENTITY_TYPE_KEY_PARAMETER, type
-                .getCode());
+        methodWithParameters.addParameter(GenericConstants.ENTITY_TYPE_KEY_PARAMETER,
+                type.getCode());
         methodWithParameters.addParameter(GenericConstants.AUTO_GENERATE, withCodes);
         methodWithParameters.addParameter(GenericConstants.WITH_EXPERIMENTS, withExperiments);
-        methodWithParameters.addParameter(GenericConstants.BATCH_OPERATION_KIND, operationKind
-                .name());
+        methodWithParameters.addParameter(GenericConstants.BATCH_OPERATION_KIND,
+                operationKind.name());
         methodWithParameters.addParameter("timestamp", Long.toString(System.currentTimeMillis()));
         return methodWithParameters.toString();
     }
 
+    /** Creates an action which opens a page pointed by the current URL. */
+    public static OpenViewAction createNavigateToCurrentUrlAction(IViewContext<?> viewContext)
+    {
+        ViewLocatorResolverRegistry resolver = viewContext.getLocatorResolverRegistry();
+        ViewLocator viewLocator = new ViewLocator(History.getToken());
+        OpenViewAction openViewAction = new OpenViewAction(resolver, viewLocator);
+        return openViewAction;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AppView.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AppView.java
index c5616d5a550..efd59d415f5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AppView.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AppView.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Footer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SimpleModeHeader;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ViewMode;
 
 /**
  * Main application view.
@@ -46,8 +47,6 @@ final class AppView extends View
 
     private IMainPanel mainPanel;
 
-    private LayoutContainer north;
-
     private ComponentProvider componentProvider;
 
     AppView(final Controller controller, final CommonViewContext viewContext)
@@ -79,15 +78,31 @@ final class AppView extends View
 
     private final void createNorth()
     {
-        if (viewContext.isSimpleMode())
+        LayoutContainer north;
+        ViewMode viewMode = getViewMode();
+        if (viewMode == ViewMode.SIMPLE)
         {
             north = new SimpleModeHeader(viewContext, componentProvider);
-        } else
+        } else if (viewMode == ViewMode.NORMAL)
         {
             north = new TopMenu(viewContext, componentProvider);
+        } else if (viewMode == ViewMode.SIMPLE_EMBEDDED)
+        {
+            north = null;
+        } else
+        {
+            throw new IllegalStateException("Unknown view mode " + viewMode);
+        }
+        if (north != null)
+        {
+            final BorderLayoutData data = new BorderLayoutData(LayoutRegion.NORTH, 30);
+            viewport.add(north, data);
         }
-        final BorderLayoutData data = new BorderLayoutData(LayoutRegion.NORTH, 30);
-        viewport.add(north, data);
+    }
+
+    private ViewMode getViewMode()
+    {
+        return viewContext.getModel().getViewMode();
     }
 
     private final void createCenter()
@@ -100,9 +115,12 @@ final class AppView extends View
 
     private final void createSouth()
     {
-        final Footer footer = new Footer(viewContext);
-        final BorderLayoutData data = new BorderLayoutData(LayoutRegion.SOUTH, 20);
-        viewport.add(footer, data);
+        if (getViewMode() != ViewMode.SIMPLE_EMBEDDED)
+        {
+            final Footer footer = new Footer(viewContext);
+            final BorderLayoutData data = new BorderLayoutData(LayoutRegion.SOUTH, 20);
+            viewport.add(footer, data);
+        }
     }
 
     //
@@ -124,7 +142,7 @@ final class AppView extends View
         } else if (event.getType() == AppEvents.NAVI_EVENT)
         {
             activate(getData(event));
-        } 
+        }
     }
 
     private static IMainPanel createMainPanel(IViewContext<ICommonClientServiceAsync> viewContext)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainPagePanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainPagePanel.java
index 7c0afa8bbc0..dd50c7b9548 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainPagePanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainPagePanel.java
@@ -24,6 +24,7 @@ import com.google.gwt.user.client.ui.Widget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.UrlParamsHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
 
 /**
@@ -47,7 +48,10 @@ public class MainPagePanel extends ContentPanel implements IMainPanel
         setBodyBorder(false);
         setBorders(false);
         setHeaderVisible(false);
-        add(createWelcomePanel());
+        if (UrlParamsHelper.createNavigateToCurrentUrlAction(viewContext).isEmpty())
+        {
+            add(createWelcomePanel());
+        }
     }
 
     private final Component createWelcomePanel()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewAction.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewAction.java
index dfbe529fa0f..7cd2629760d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewAction.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewAction.java
@@ -38,6 +38,12 @@ public class OpenViewAction implements IDelegatedAction
         this.viewLocator = viewLocator;
     }
 
+    /** @return true if executing this action would not result in opening any view */
+    public boolean isEmpty()
+    {
+        return registry.canResolve(viewLocator) == false;
+    }
+
     public void execute()
     {
         openView();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocatorResolverRegistry.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocatorResolverRegistry.java
index 6a8d0401f47..496ed85fdf3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocatorResolverRegistry.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/ViewLocatorResolverRegistry.java
@@ -60,4 +60,20 @@ public class ViewLocatorResolverRegistry
         }
     }
 
+    /**
+     * @return true if the locator can be resolved by one of the handlers.
+     * @exception UserFailureException Might be thrown by the handler.
+     */
+    public boolean canResolve(ViewLocator locator) throws UserFailureException
+    {
+        for (IViewLocatorResolver handler : handlers)
+        {
+            if (handler.canHandleLocator(locator))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/ViewMode.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/ViewMode.java
index 2c5456aecee..0ac26951d04 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/ViewMode.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/ViewMode.java
@@ -23,5 +23,12 @@ import com.google.gwt.user.client.rpc.IsSerializable;
  */
 public enum ViewMode implements IsSerializable
 {
-    SIMPLE, NORMAL;
+    SIMPLE,
+    /**
+     * Embedded mode is a simple view mode which has less widgets (e.g. top toolbar and footer are
+     * invisible) to allow embedding the application on other web sites.
+     */
+    SIMPLE_EMBEDDED,
+
+    NORMAL;
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewCommand.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewCommand.java
index 851c55577e7..a7f107ecd65 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewCommand.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/OpenViewCommand.java
@@ -35,7 +35,7 @@ public class OpenViewCommand extends AbstractDefaultTestCommand
     {
         super();
         this.client = client;
-        this.locator = Client.createViewLocator(urlParams);
+        this.locator = new ViewLocator(urlParams);
     }
 
     public void execute()
-- 
GitLab