From 5a6436044e757046b2ac17f8b343085adfccf36d Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Thu, 16 Sep 2010 13:16:41 +0000
Subject: [PATCH] [LMS-1597] update title after every dispatch of navigation
 event (in both application and simple view mode)

SVN: 17874
---
 .../AbstractPluginViewContext.java            |   5 -
 .../client/application/CommonViewContext.java |  23 +-
 .../web/client/application/IViewContext.java  |   2 -
 .../web/client/application/SearchWidget.java  |   8 +-
 .../ShowRelatedDatasetsDialog.java            |   3 +-
 .../framework/AbstractTabItemFactory.java     |   5 +
 .../framework/ComponentProvider.java          | 272 +++++++++++++++---
 .../framework/DispatcherHelper.java           |   5 +
 .../locator/DataSetSearchLocatorResolver.java |   6 +
 .../locator/SampleSearchLocatorResolver.java  |   6 +
 .../menu/TabActionMenuItemFactory.java        |  11 +-
 .../ui/AuthorizationGroupGrid.java            |  13 +-
 .../ui/attachment/AttachmentBrowser.java      |   9 +-
 .../ui/data/DataSetReportGenerator.java       |  10 +-
 .../listener/OpenEntityDetailsTabAction.java  |   8 -
 .../listener/OpenEntityDetailsTabHelper.java  |   6 +-
 .../application/ui/project/ProjectGrid.java   |  11 +-
 .../ui/vocabulary/VocabularyGrid.java         |  12 +-
 .../application/ClientPluginFactory.java      |  25 +-
 .../module/TopMenuItemDemoModuleMenu.java     |  10 +-
 .../application/ClientPluginFactory.java      |  80 ++++--
 .../locator/QueryLocatorResolver.java         |   9 +-
 22 files changed, 424 insertions(+), 115 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
index 318f2ee6987..a951d4fcf51 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
@@ -102,11 +102,6 @@ public abstract class AbstractPluginViewContext<T extends IClientServiceAsync> i
         return commonViewContext.getPageController();
     }
 
-    public final String getBasicPageTitle()
-    {
-        return commonViewContext.getBasicPageTitle();
-    }
-
     public final IClientPluginFactoryProvider getClientPluginFactoryProvider()
     {
         return commonViewContext.getClientPluginFactoryProvider();
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 b7e179e2013..28a0549b9c5 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
@@ -48,15 +48,23 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
     {
         private static boolean simpleMode;
 
-        public static void init(final boolean isSimpleMode)
+        private static String pageTitleSuffix;
+
+        public static void init(final boolean isSimpleMode, final String aPageTitleSuffix)
         {
             simpleMode = isSimpleMode;
+            pageTitleSuffix = aPageTitleSuffix;
         }
 
         public static boolean isSimpleMode()
         {
             return simpleMode;
         }
+
+        public static String getPageTitleSuffix()
+        {
+            return pageTitleSuffix;
+        }
     }
 
     private static final String TECHNOLOGY_NAME = "common";
@@ -79,8 +87,6 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
 
     private final IProfilingTable profilingTable;
 
-    private final String basicPageTitle;
-
     CommonViewContext(final ICommonClientServiceAsync service,
             final IGenericImageBundle imageBundle, final IPageController pageController,
             boolean isLoggingEnabled, boolean isSimpleMode, String basicPageTitle)
@@ -89,12 +95,11 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
         this.imageBundle = imageBundle;
         this.pageController = pageController;
         this.profilingTable = ProfilingTable.create(isLoggingEnabled);
-        this.basicPageTitle = basicPageTitle;
         messageProvider = new CompositeMessageProvider();
         messageProvider.add(new DictonaryBasedMessageProvider(TECHNOLOGY_NAME));
         viewModel = new GenericViewModel();
         locatorHandlerRegistry = new ViewLocatorResolverRegistry();
-        ClientStaticState.init(isSimpleMode);
+        ClientStaticState.init(isSimpleMode, basicPageTitle);
     }
 
     final void setClientPluginFactoryProvider(
@@ -133,8 +138,7 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
     }
 
     private DisplaySettingsManager createDisplaySettingsManager(
-            final DisplaySettings displaySettings,
-            WebClientConfiguration webClientConfigurationDTO)
+            final DisplaySettings displaySettings, WebClientConfiguration webClientConfigurationDTO)
     {
         IDelegatedAction settingsUpdater = new IDelegatedAction()
             {
@@ -165,11 +169,6 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
         return pageController;
     }
 
-    public final String getBasicPageTitle()
-    {
-        return basicPageTitle;
-    }
-
     public final IClientPluginFactoryProvider getClientPluginFactoryProvider()
     {
         return clientPluginFactoryProvider;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
index 599de2071c6..4eafa948e3b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
@@ -48,8 +48,6 @@ public interface IViewContext<T extends IClientServiceAsync> extends IMessagePro
 
     public IPageController getPageController();
 
-    public String getBasicPageTitle();
-
     public IClientPluginFactoryProvider getClientPluginFactoryProvider();
 
     public ICommonClientServiceAsync getCommonService();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
index 19154300c7b..07f341fa0d3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
@@ -195,7 +195,7 @@ public final class SearchWidget extends LayoutContainer
     }
 
     private static AbstractTabItemFactory createTabFactory(
-            final MatchingEntitiesPanel matchingEntitiesPanel, String title,
+            final MatchingEntitiesPanel matchingEntitiesPanel, final String title,
             IViewContext<?> viewContext)
     {
         final ITabItem tab =
@@ -222,6 +222,12 @@ public final class SearchWidget extends LayoutContainer
                 {
                     return new HelpPageIdentifier(HelpPageDomain.SEARCH, HelpPageAction.ACTION);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return title;
+                }
             };
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
index be5ed22ea7b..412f4beb0d5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
@@ -66,7 +66,8 @@ public final class ShowRelatedDatasetsDialog extends
                     return RelatedDataSetGrid.BROWSER_ID + XDOM.getUniqueId();
                 }
 
-                private String getTabTitle()
+                @Override
+                public String getTabTitle()
                 {
                     return "Related Data Sets";
                 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AbstractTabItemFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AbstractTabItemFactory.java
index 599732b9080..109c7351b24 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AbstractTabItemFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/AbstractTabItemFactory.java
@@ -46,6 +46,11 @@ public abstract class AbstractTabItemFactory
      */
     public abstract HelpPageIdentifier getHelpPageIdentifier();
 
+    /**
+     * Returns a short description of contents of the tab that can be used in tab or page title.
+     */
+    public abstract String getTabTitle();
+
     /**
      * True if the tab should become active.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 324fca296b6..45d21d8d6d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -81,28 +81,26 @@ public final class ComponentProvider
         return viewContext.getMessage(key);
     }
 
-    private ITabItem createTab(String dictionaryMsgKey, IDisposableComponent component)
+    private ITabItem createTab(String title, IDisposableComponent component)
     {
-        String title = getMessage(dictionaryMsgKey);
         return DefaultTabItem.create(title, component, viewContext);
     }
 
     // creates a tab which requires confirmation before it can be closed
-    private ITabItem createRegistrationTab(final String titleMessageKey,
+    private ITabItem createRegistrationTab(final String title,
             DatabaseModificationAwareComponent component)
     {
-        return DefaultTabItem.create(getMessage(titleMessageKey), component, viewContext, true);
+        return DefaultTabItem.create(title, component, viewContext, true);
     }
 
     /**
      * Creates a tab with the specified component. The tab is unaware of database modifications and
      * will not be automatically refreshed if changes occur.
      */
-    private ITabItem createSimpleTab(String dictionaryMsgKey, Component component,
+    private ITabItem createSimpleTab(String title, Component component,
             boolean isCloseConfirmationNeeded)
     {
-        return DefaultTabItem.createUnaware(getMessage(dictionaryMsgKey), component,
-                isCloseConfirmationNeeded);
+        return DefaultTabItem.createUnaware(title, component, isCloseConfirmationNeeded);
     }
 
     public AbstractTabItemFactory getSampleBrowser(final String initialGroupOrNull,
@@ -116,7 +114,7 @@ public final class ComponentProvider
                     IDisposableComponent browser =
                             SampleBrowserGrid.create(viewContext, initialGroupOrNull,
                                     initialSampleTypeOrNull);
-                    return createTab(Dict.SAMPLE_BROWSER, browser);
+                    return createTab(getMessage(Dict.SAMPLE_BROWSER), browser);
                 }
 
                 @Override
@@ -130,6 +128,21 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    StringBuilder sb = new StringBuilder();
+                    if (initialGroupOrNull != null)
+                    {
+                        sb.append(getMessage(Dict.GROUP) + "=" + initialGroupOrNull);
+                    }
+                    if (initialSampleTypeOrNull != null)
+                    {
+                        sb.append("type=" + initialSampleTypeOrNull);
+                    }
+                    return getMessage(Dict.SAMPLE_BROWSER) + " " + sb.toString();
+                }
             };
     }
 
@@ -153,7 +166,7 @@ public final class ComponentProvider
                     IDisposableComponent browser =
                             MaterialBrowserGrid.createWithTypeChooser(viewContext,
                                     initialMaterialTypeOrNull);
-                    return createTab(Dict.MATERIAL_BROWSER, browser);
+                    return createTab(getMessage(Dict.MATERIAL_BROWSER), browser);
                 }
 
                 @Override
@@ -168,6 +181,17 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.BROWSE);
                 }
 
+                @Override
+                public String getTabTitle()
+                {
+                    StringBuilder sb = new StringBuilder();
+                    if (initialMaterialTypeOrNull != null)
+                    {
+                        sb.append("type=" + initialMaterialTypeOrNull);
+                    }
+                    return getMessage(Dict.MATERIAL_BROWSER) + " " + sb.toString();
+                }
+
             };
     }
 
@@ -179,7 +203,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = GroupGrid.create(viewContext);
-                    return createTab(Dict.GROUP_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -193,6 +217,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.GROUP, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.GROUP_BROWSER);
+                }
             };
     }
 
@@ -204,7 +234,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = AuthorizationGroupGrid.create(viewContext);
-                    return createTab(Dict.AUTHORIZATION_GROUP_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -219,6 +249,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.AUTHORIZATION_GROUPS,
                             HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.AUTHORIZATION_GROUP_BROWSER);
+                }
             };
     }
 
@@ -230,7 +266,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = RoleAssignmentGrid.create(viewContext);
-                    return createTab(Dict.ROLE_ASSIGNMENT_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -244,6 +280,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.ROLES, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.ROLE_ASSIGNMENT_BROWSER);
+                }
             };
     }
 
@@ -255,7 +297,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = PersonGrid.create(viewContext);
-                    return createTab(Dict.PERSON_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -269,6 +311,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.USERS, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PERSON_BROWSER);
+                }
             };
     }
 
@@ -281,7 +329,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             SampleRegistrationPanel.create(viewContext, context);
-                    return createRegistrationTab(Dict.SAMPLE_REGISTRATION, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -295,6 +343,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SAMPLE_REGISTRATION);
+                }
             };
     }
 
@@ -312,7 +366,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             ExperimentRegistrationPanel.create(viewContext, context);
-                    return createRegistrationTab(Dict.EXPERIMENT_REGISTRATION, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -327,6 +381,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
                             HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.EXPERIMENT_REGISTRATION);
+                }
             };
     }
 
@@ -345,7 +405,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             SampleBatchRegisterUpdatePanel.create(viewContext, update);
-                    return createRegistrationTab(Dict.SAMPLE_BATCH_REGISTRATION, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -359,6 +419,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.IMPORT);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SAMPLE_BATCH_REGISTRATION);
+                }
             };
     }
 
@@ -373,7 +439,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             SampleBatchRegisterUpdatePanel.create(viewContext, true);
-                    return createRegistrationTab(Dict.SAMPLE_BATCH_UPDATE, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -388,6 +454,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE,
                             HelpPageAction.BATCH_UPDATE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SAMPLE_BATCH_UPDATE);
+                }
             };
     }
 
@@ -400,7 +472,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             DataSetBatchUpdatePanel.create(viewContext);
-                    return createRegistrationTab(Dict.DATA_SET_BATCH_UPDATE, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -415,6 +487,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.DATA_SET,
                             HelpPageAction.BATCH_UPDATE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.DATA_SET_BATCH_UPDATE);
+                }
             };
     }
 
@@ -427,7 +505,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             MaterialBatchRegistrationPanel.create(viewContext);
-                    return createRegistrationTab(Dict.MATERIAL_IMPORT, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -441,6 +519,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.IMPORT);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.MATERIAL_IMPORT);
+                }
             };
     }
 
@@ -452,7 +536,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     Component component = new VocabularyRegistrationForm(viewContext);
-                    return createSimpleTab(Dict.VOCABULARY_REGISTRATION, component, true);
+                    return createSimpleTab(getTabTitle(), component, true);
                 }
 
                 @Override
@@ -467,6 +551,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.VOCABULARY,
                             HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.VOCABULARY_REGISTRATION);
+                }
             };
     }
 
@@ -479,7 +569,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             ProjectRegistrationForm.create(viewContext);
-                    return createRegistrationTab(Dict.PROJECT_REGISTRATION, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -493,6 +583,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PROJECT_REGISTRATION);
+                }
             };
     }
 
@@ -504,7 +600,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = VocabularyGrid.create(viewContext);
-                    return createTab(Dict.VOCABULARY_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -518,6 +614,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.VOCABULARY, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.VOCABULARY_BROWSER);
+                }
             };
     }
 
@@ -529,7 +631,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = ProjectGrid.create(viewContext);
-                    return createTab(Dict.PROJECT_BROWSER, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -543,6 +645,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PROJECT_BROWSER);
+                }
             };
     }
 
@@ -557,7 +665,7 @@ public final class ComponentProvider
                     IDisposableComponent browser =
                             ExperimentBrowserGrid.create(viewContext, initialProjectOrNull,
                                     initialExperimentTypeOrNull);
-                    return createTab(Dict.EXPERIMENT_BROWSER, browser);
+                    return createTab(getTabTitle(), browser);
                 }
 
                 @Override
@@ -571,6 +679,13 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT, HelpPageAction.BROWSE);
                 }
+
+                // FIXME
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.EXPERIMENT_BROWSER);
+                }
             };
     }
 
@@ -587,7 +702,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = PropertyTypeGrid.create(viewContext);
-                    return createTab(Dict.PROPERTY_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -602,6 +717,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.PROPERTY_TYPE,
                             HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PROPERTY_TYPES);
+                }
             };
     }
 
@@ -614,7 +735,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             PropertyTypeRegistrationForm.create(viewContext);
-                    return createRegistrationTab(Dict.PROPERTY_TYPE_REGISTRATION, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -629,6 +750,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.PROPERTY_TYPE,
                             HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PROPERTY_TYPE_REGISTRATION);
+                }
             };
     }
 
@@ -640,7 +767,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = PropertyTypeAssignmentGrid.create(viewContext);
-                    return createTab(Dict.PROPERTY_TYPE_ASSIGNMENTS, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -654,6 +781,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.ASSIGNMENT, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.PROPERTY_TYPE_ASSIGNMENTS);
+                }
             };
     }
 
@@ -681,7 +814,7 @@ public final class ComponentProvider
     }
 
     private AbstractTabItemFactory getPropertyTypeAssignmentForm(final EntityKind entityKind,
-            final String messageKey)
+            final String tabTitleMessageKey)
     {
         return new AbstractTabItemFactory()
             {
@@ -690,7 +823,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             PropertyTypeAssignmentForm.create(viewContext, entityKind);
-                    return createRegistrationTab(messageKey, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -705,6 +838,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.ASSIGNMENT,
                             HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(tabTitleMessageKey);
+                }
             };
     }
 
@@ -716,7 +855,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent browser = DataSetSearchHitGrid.create(viewContext);
-                    return createTab(Dict.DATA_SET_SEARCH, browser);
+                    return createTab(getTabTitle(), browser);
                 }
 
                 @Override
@@ -730,6 +869,13 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.SEARCH);
                 }
+
+                // FIXME
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.DATA_SET_SEARCH);
+                }
             };
     }
 
@@ -741,7 +887,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent browser = SampleSearchHitGrid.create(viewContext);
-                    return createTab(Dict.SAMPLE_SEARCH, browser);
+                    return createTab(getTabTitle(), browser);
                 }
 
                 @Override
@@ -755,6 +901,13 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.SEARCH);
                 }
+
+                // FIXME
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SAMPLE_SEARCH);
+                }
             };
     }
 
@@ -766,7 +919,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = SampleTypeGrid.create(viewContext);
-                    return createTab(Dict.SAMPLE_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -781,6 +934,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.SAMPLE_TYPE, HelpPageAction.BROWSE);
                 }
 
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SAMPLE_TYPES);
+                }
+
             };
     }
 
@@ -792,7 +951,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = MaterialTypeGrid.create(viewContext);
-                    return createTab(Dict.MATERIAL_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -807,6 +966,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.MATERIAL_TYPE,
                             HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.MATERIAL_TYPES);
+                }
             };
     }
 
@@ -818,7 +983,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = ExperimentTypeGrid.create(viewContext);
-                    return createTab(Dict.EXPERIMENT_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -833,6 +998,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT_TYPE,
                             HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.EXPERIMENT_TYPES);
+                }
             };
     }
 
@@ -844,7 +1015,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = DataSetTypeGrid.create(viewContext);
-                    return createTab(Dict.DATA_SET_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -859,6 +1030,12 @@ public final class ComponentProvider
                     return new HelpPageIdentifier(HelpPageDomain.DATA_SET_TYPE,
                             HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.DATA_SET_TYPES);
+                }
             };
     }
 
@@ -871,7 +1048,7 @@ public final class ComponentProvider
                 {
                     DatabaseModificationAwareComponent component =
                             DataSetUploadForm.create(viewContext);
-                    return createRegistrationTab(Dict.DATA_SET_UPLOAD, component);
+                    return createRegistrationTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -885,6 +1062,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.REGISTER);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.DATA_SET_UPLOAD);
+                }
             };
     }
 
@@ -896,7 +1079,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent component = FileFormatTypeGrid.create(viewContext);
-                    return createTab(Dict.FILE_FORMAT_TYPES, component);
+                    return createTab(getTabTitle(), component);
                 }
 
                 @Override
@@ -910,6 +1093,12 @@ public final class ComponentProvider
                 {
                     return new HelpPageIdentifier(HelpPageDomain.FILE_TYPE, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.FILE_FORMAT_TYPES);
+                }
             };
     }
 
@@ -930,8 +1119,7 @@ public final class ComponentProvider
                 @Override
                 public ITabItem create()
                 {
-                    return createSimpleTab(Dict.LOGGING_CONSOLE,
-                            LoggingConsole.create(viewContext), false);
+                    return createSimpleTab(getTabTitle(), LoggingConsole.create(viewContext), false);
                 }
 
                 @Override
@@ -948,6 +1136,12 @@ public final class ComponentProvider
                     return LoggingConsole.ID;
                 }
 
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.LOGGING_CONSOLE);
+                }
+
             };
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DispatcherHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DispatcherHelper.java
index 3a2715792cb..66a55ecaf1b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DispatcherHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DispatcherHelper.java
@@ -19,6 +19,9 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework
 import com.extjs.gxt.ui.client.event.EventType;
 import com.extjs.gxt.ui.client.mvc.AppEvent;
 import com.extjs.gxt.ui.client.mvc.Dispatcher;
+import com.google.gwt.user.client.Window;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.CommonViewContext;
 
 /**
  * A helper for using {@link Dispatcher}.
@@ -49,6 +52,8 @@ public final class DispatcherHelper
     {
         AppEvent event = createEvent(AppEvents.NAVI_EVENT, tabItemFactory);
         Dispatcher.get().dispatch(event);
+        Window.setTitle(tabItemFactory.getTabTitle() + " "
+                + CommonViewContext.ClientStaticState.getPageTitleSuffix());
     }
 
     private final static AppEvent createEvent(EventType eventType, Object data)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
index 39d1dd8ea1a..c0aabb40622 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
@@ -97,5 +97,11 @@ public class DataSetSearchLocatorResolver
         {
             return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.SEARCH);
         }
+
+        @Override
+        public String getTabTitle()
+        {
+            return getMessage(Dict.DATA_SET_SEARCH);
+        }
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleSearchLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleSearchLocatorResolver.java
index 67db7058358..87a6c54fe90 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleSearchLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/SampleSearchLocatorResolver.java
@@ -155,5 +155,11 @@ public class SampleSearchLocatorResolver
         {
             return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.SEARCH);
         }
+
+        @Override
+        public String getTabTitle()
+        {
+            return getMessage(Dict.SAMPLE_SEARCH);
+        }
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TabActionMenuItemFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TabActionMenuItemFactory.java
index 69607940a1a..bc853a2fe90 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TabActionMenuItemFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TabActionMenuItemFactory.java
@@ -25,8 +25,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class TabActionMenuItemFactory
@@ -59,8 +57,7 @@ public class TabActionMenuItemFactory
                 @Override
                 public ITabItem create()
                 {
-                    String tabItemText = viewContext.getMessage(tabLabelKey);
-                    return DefaultTabItem.create(tabItemText, definition
+                    return DefaultTabItem.create(getTabTitle(), definition
                             .createComponent(viewContext), viewContext, false);
                 }
 
@@ -69,6 +66,12 @@ public class TabActionMenuItemFactory
                 {
                     return HelpPageIdentifier.createSpecific(definition.getHelpPageTitle());
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return viewContext.getMessage(tabLabelKey);
+                }
             });
 
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
index 97df485249d..45d062708ba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
@@ -202,7 +202,8 @@ public class AuthorizationGroupGrid extends AbstractSimpleBrowserGrid<Authorizat
     }
 
     @Override
-    protected void showEntityViewer(final AuthorizationGroup group, boolean editMode, boolean inBackground)
+    protected void showEntityViewer(final AuthorizationGroup group, boolean editMode,
+            boolean inBackground)
     {
         final AbstractTabItemFactory tabFactory = new AbstractTabItemFactory()
             {
@@ -211,9 +212,7 @@ public class AuthorizationGroupGrid extends AbstractSimpleBrowserGrid<Authorizat
                 {
                     IDisposableComponent component =
                             PersonGrid.createForAuthorizationGroup(viewContext, group);
-                    String tabTitle =
-                            viewContext.getMessage(Dict.AUTHORIZATION_GROUP_USERS, group.getCode());
-                    return DefaultTabItem.create(tabTitle, component, viewContext);
+                    return DefaultTabItem.create(getTabTitle(), component, viewContext);
                 }
 
                 @Override
@@ -228,6 +227,12 @@ public class AuthorizationGroupGrid extends AbstractSimpleBrowserGrid<Authorizat
                     return new HelpPageIdentifier(HelpPageDomain.AUTHORIZATION_GROUPS,
                             HelpPageAction.VIEW);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return viewContext.getMessage(Dict.AUTHORIZATION_GROUP_USERS, group.getCode());
+                }
             };
         tabFactory.setInBackground(inBackground);
         DispatcherHelper.dispatchNaviEvent(tabFactory);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
index 076d72f5422..90068f0dca6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
@@ -296,9 +296,8 @@ public class AttachmentBrowser extends AbstractSimpleBrowserGrid<AttachmentVersi
                 @Override
                 public ITabItem create()
                 {
-                    final String tabTitle = helper.createTabTitle();
                     final Component component = helper.createVersionsPanel(versions);
-                    return DefaultTabItem.createUnaware(tabTitle, component, false);
+                    return DefaultTabItem.createUnaware(getTabTitle(), component, false);
                 }
 
                 @Override
@@ -312,6 +311,12 @@ public class AttachmentBrowser extends AbstractSimpleBrowserGrid<AttachmentVersi
                 {
                     return new HelpPageIdentifier(HelpPageDomain.ATTACHMENTS, HelpPageAction.VIEW);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return helper.createTabTitle();
+                }
             };
         tabFactory.setInBackground(inBackground);
         DispatcherHelper.dispatchNaviEvent(tabFactory);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetReportGenerator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetReportGenerator.java
index 9c271d76735..41255f6c68f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetReportGenerator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetReportGenerator.java
@@ -85,9 +85,7 @@ public class DataSetReportGenerator
                             @Override
                             public ITabItem create()
                             {
-                                final String reportTitle =
-                                        service.getLabel() + " (" + reportDate + ")";
-                                return DefaultTabItem.create(reportTitle, reportComponent,
+                                return DefaultTabItem.create(getTabTitle(), reportComponent,
                                         viewContext);
                             }
 
@@ -105,6 +103,12 @@ public class DataSetReportGenerator
                                         HelpPageAction.REPORT);
                             }
 
+                            @Override
+                            public String getTabTitle()
+                            {
+                                return service.getLabel() + " (" + reportDate + ")";
+                            }
+
                         };
                     DispatcherHelper.dispatchNaviEvent(tabFactory);
                 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabAction.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabAction.java
index 324aa455cfb..3f0161c93c0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabAction.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabAction.java
@@ -16,8 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener;
 
-import com.google.gwt.user.client.Window;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
@@ -69,12 +67,6 @@ public final class OpenEntityDetailsTabAction implements IDelegatedAction
                 createClientPlugin.createEntityViewer(entityType, entity);
         tabView.setInBackground(keyPressed);
 
-        if (viewContext.isSimpleMode())
-        {
-            Window.setTitle(entityKind.getDescription() + ": " + entity.getCode() + " ["
-                    + entityType + "]" + " - " + viewContext.getBasicPageTitle());
-        }
-
         DispatcherHelper.dispatchNaviEvent(tabView);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
index 1e6e5f6e951..81d5db2fb89 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
@@ -102,7 +102,7 @@ public class OpenEntityDetailsTabHelper
                 {
                     final DatabaseModificationAwareComponent viewer =
                             ProjectViewer.create(viewContext.getCommonViewContext(), projectId);
-                    return DefaultTabItem.create(getViewerTitle(), viewer, viewContext, false);
+                    return DefaultTabItem.create(getTabTitle(), viewer, viewContext, false);
                 }
 
                 @Override
@@ -111,7 +111,8 @@ public class OpenEntityDetailsTabHelper
                     return ProjectViewer.createId(projectId);
                 }
 
-                private String getViewerTitle()
+                @Override
+                public String getTabTitle()
                 {
                     return AbstractViewer.getTitle(viewContext, Dict.PROJECT, project);
                 }
@@ -121,6 +122,7 @@ public class OpenEntityDetailsTabHelper
                 {
                     return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.VIEW);
                 }
+
             };
         tabFactory.setInBackground(keyPressed);
         DispatcherHelper.dispatchNaviEvent(tabFactory);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectGrid.java
index 306211ba148..00e65a442cc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectGrid.java
@@ -207,7 +207,7 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                     {
                         final DatabaseModificationAwareComponent viewer =
                                 ProjectViewer.create(viewContext, projectId);
-                        return DefaultTabItem.create(getViewerTitle(), viewer, viewContext, false);
+                        return DefaultTabItem.create(getTabTitle(), viewer, viewContext, false);
                     }
 
                     @Override
@@ -216,7 +216,8 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                         return ProjectViewer.createId(projectId);
                     }
 
-                    private String getViewerTitle()
+                    @Override
+                    public String getTabTitle()
                     {
                         return AbstractViewer.getTitle(viewContext, Dict.PROJECT, project);
                     }
@@ -226,6 +227,7 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                     {
                         return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.VIEW);
                     }
+
                 };
         } else
         {
@@ -236,7 +238,7 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                     {
                         DatabaseModificationAwareComponent component =
                                 ProjectEditForm.create(viewContext, projectId);
-                        return DefaultTabItem.create(getEditTitle(), component, viewContext, true);
+                        return DefaultTabItem.create(getTabTitle(), component, viewContext, true);
                     }
 
                     @Override
@@ -245,7 +247,8 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                         return ProjectEditForm.createId(projectId);
                     }
 
-                    private String getEditTitle()
+                    @Override
+                    public String getTabTitle()
                     {
                         return AbstractRegistrationForm.getEditTitle(viewContext, Dict.PROJECT,
                                 project);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyGrid.java
index da26f99e68b..6b58b11c341 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyGrid.java
@@ -227,10 +227,7 @@ public class VocabularyGrid extends AbstractSimpleBrowserGrid<Vocabulary>
                 {
                     IDisposableComponent component =
                             VocabularyTermGrid.create(viewContext, vocabulary);
-                    String tabTitle =
-                            viewContext.getMessage(Dict.VOCABULARY_TERMS_BROWSER, vocabulary
-                                    .getCode());
-                    return DefaultTabItem.create(tabTitle, component, viewContext);
+                    return DefaultTabItem.create(getTabTitle(), component, viewContext);
                 }
 
                 @Override
@@ -244,6 +241,13 @@ public class VocabularyGrid extends AbstractSimpleBrowserGrid<Vocabulary>
                 {
                     return new HelpPageIdentifier(HelpPageDomain.TERM, HelpPageAction.BROWSE);
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return viewContext.getMessage(Dict.VOCABULARY_TERMS_BROWSER, vocabulary
+                            .getCode());
+                }
             };
         tabFactory.setInBackground(inBackground);
         DispatcherHelper.dispatchNaviEvent(tabFactory);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
index 45cd81773cf..b707d2c17fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
@@ -124,8 +124,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                     {
                         final DemoSampleViewer sampleViewer =
                                 new DemoSampleViewer(getViewContext(), sampleId);
-                        return DefaultTabItem.createUnaware(identifiable.getCode(), sampleViewer,
-                                false);
+                        return DefaultTabItem.createUnaware(getTabTitle(), sampleViewer, false);
                     }
 
                     @Override
@@ -139,6 +138,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                     {
                         return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return identifiable.getCode();
+                    }
                 };
         }
 
@@ -168,7 +173,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                     @Override
                     public ITabItem create()
                     {
-                        return createDummyTab(identifiable.getCode());
+                        return createDummyTab(getTabTitle());
                     }
 
                     @Override
@@ -182,6 +187,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                     {
                         return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.EDIT);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return identifiable.getCode();
+                    }
                 };
         }
 
@@ -204,7 +215,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                     @Override
                     public ITabItem create()
                     {
-                        return createDummyTab(identifiable.getCode());
+                        return createDummyTab(getTabTitle());
                     }
 
                     @Override
@@ -219,6 +230,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
                         return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
                                 HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return identifiable.getCode();
+                    }
                 };
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/TopMenuItemDemoModuleMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/TopMenuItemDemoModuleMenu.java
index e325c242a6c..f070c4212ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/TopMenuItemDemoModuleMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/TopMenuItemDemoModuleMenu.java
@@ -52,8 +52,8 @@ public class TopMenuItemDemoModuleMenu extends MenuItem
         @Override
         public ITabItem create()
         {
-            return DefaultTabItem.create(viewContext.getMessage(Dict.STATISTICS_DEMO_TAB_HEADER),
-                    StatisticsWidget.create(viewContext), viewContext, false);
+            return DefaultTabItem.create(getTabTitle(), StatisticsWidget.create(viewContext),
+                    viewContext, false);
         }
 
         @Override
@@ -67,6 +67,12 @@ public class TopMenuItemDemoModuleMenu extends MenuItem
         {
             return HelpPageIdentifier.createSpecific("Experiment Statistics");
         }
+
+        @Override
+        public String getTabTitle()
+        {
+            return viewContext.getMessage(Dict.STATISTICS_DEMO_TAB_HEADER);
+        }
     }
 
     public static enum ActionMenuKind implements IActionMenuItem
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
index fa453092490..817f51f127d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
@@ -154,8 +154,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         final DatabaseModificationAwareComponent sampleViewer =
                                 GenericSampleViewer.create(getViewContext(), identifiable);
-                        return DefaultTabItem.create(getViewerTitle(Dict.SAMPLE, identifiable),
-                                sampleViewer, getViewContext(), false);
+                        return DefaultTabItem.create(getTabTitle(), sampleViewer, getViewContext(),
+                                false);
                     }
 
                     @Override
@@ -169,6 +169,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getViewerTitle(Dict.SAMPLE, identifiable);
+                    }
                 };
         }
 
@@ -199,8 +205,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         DatabaseModificationAwareComponent component =
                                 GenericSampleEditForm.create(getViewContext(), identifiable);
-                        String title = getEditorTitle(Dict.SAMPLE, identifiable);
-                        return DefaultTabItem.create(title, component, getViewContext(), true);
+                        return DefaultTabItem.create(getTabTitle(), component, getViewContext(),
+                                true);
                     }
 
                     @Override
@@ -214,6 +220,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.EDIT);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getEditorTitle(Dict.SAMPLE, identifiable);
+                    }
                 };
         }
 
@@ -241,8 +253,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         final DatabaseModificationAwareComponent materialViewer =
                                 GenericMaterialViewer.create(getViewContext(), techId);
-                        return DefaultTabItem.create(getViewerTitle(Dict.MATERIAL, identifiable),
-                                materialViewer, getViewContext(), false);
+                        return DefaultTabItem.create(getTabTitle(), materialViewer,
+                                getViewContext(), false);
                     }
 
                     @Override
@@ -256,6 +268,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getViewerTitle(Dict.MATERIAL, identifiable);
+                    }
                 };
         }
 
@@ -270,8 +288,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                         DatabaseModificationAwareComponent component =
                                 GenericMaterialEditForm
                                         .create(getViewContext(), identifiable, true);
-                        String title = getEditorTitle(Dict.MATERIAL, identifiable);
-                        return DefaultTabItem.create(title, component, getViewContext(), true);
+                        return DefaultTabItem.create(getTabTitle(), component, getViewContext(),
+                                true);
                     }
 
                     @Override
@@ -285,6 +303,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.EDIT);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getEditorTitle(Dict.MATERIAL, identifiable);
+                    }
                 };
         }
     }
@@ -309,8 +333,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                         final DatabaseModificationAwareComponent experimentViewer =
                                 GenericExperimentViewer.create(getViewContext(), experimentType,
                                         experimentId);
-                        return DefaultTabItem.create(getViewerTitle(Dict.EXPERIMENT, experimentId),
-                                experimentViewer, getViewContext(), false);
+                        return DefaultTabItem.create(getTabTitle(), experimentViewer,
+                                getViewContext(), false);
                     }
 
                     @Override
@@ -325,6 +349,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                         return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
                                 HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getViewerTitle(Dict.EXPERIMENT, experimentId);
+                    }
                 };
         }
 
@@ -347,8 +377,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         DatabaseModificationAwareComponent component =
                                 GenericExperimentEditForm.create(getViewContext(), identifiable);
-                        String title = getEditorTitle(Dict.EXPERIMENT, identifiable);
-                        return DefaultTabItem.create(title, component, getViewContext(), true);
+                        return DefaultTabItem.create(getTabTitle(), component, getViewContext(),
+                                true);
                     }
 
                     @Override
@@ -364,6 +394,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                         return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
                                 HelpPageAction.EDIT);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getEditorTitle(Dict.EXPERIMENT, identifiable);
+                    }
                 };
         }
     }
@@ -383,8 +419,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         final DatabaseModificationAwareComponent dataSetViewer =
                                 GenericDataSetViewer.create(getViewContext(), identifiable);
-                        return DefaultTabItem.create(getViewerTitle(Dict.DATA_SET, identifiable),
-                                dataSetViewer, getViewContext(), false);
+                        return DefaultTabItem.create(getTabTitle(), dataSetViewer,
+                                getViewContext(), false);
                     }
 
                     @Override
@@ -398,6 +434,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.VIEW);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getViewerTitle(Dict.DATA_SET, identifiable);
+                    }
                 };
         }
 
@@ -411,8 +453,8 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         DatabaseModificationAwareComponent component =
                                 GenericDataSetEditForm.create(getViewContext(), identifiable);
-                        String title = getEditorTitle(Dict.DATA_SET, identifiable);
-                        return DefaultTabItem.create(title, component, getViewContext(), true);
+                        return DefaultTabItem.create(getTabTitle(), component, getViewContext(),
+                                true);
                     }
 
                     @Override
@@ -426,6 +468,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Gener
                     {
                         return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.EDIT);
                     }
+
+                    @Override
+                    public String getTabTitle()
+                    {
+                        return getEditorTitle(Dict.DATA_SET, identifiable);
+                    }
                 };
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
index 9b849f96be9..84a4c9842ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/locator/QueryLocatorResolver.java
@@ -73,8 +73,7 @@ public class QueryLocatorResolver extends AbstractViewLocatorResolver
                 @Override
                 public ITabItem create()
                 {
-                    String tabItemText = viewContext.getMessage(tabLabelKey);
-                    return DefaultTabItem.create(tabItemText, component, viewContext, false);
+                    return DefaultTabItem.create(getTabTitle(), component, viewContext, false);
                 }
 
                 @Override
@@ -82,6 +81,12 @@ public class QueryLocatorResolver extends AbstractViewLocatorResolver
                 {
                     return HelpPageIdentifier.createSpecific(definition.getHelpPageTitle());
                 }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return viewContext.getMessage(tabLabelKey);
+                }
             };
         DispatcherHelper.dispatchNaviEvent(tabItemFactory);
     }
-- 
GitLab