From 853dd8e7bb65983a0017232b25c09d18a98b4e12 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 12 Jan 2010 22:40:16 +0000
Subject: [PATCH] [LMS-1281] attached all generic and specific tabs to
 corresponding help page identifiers

SVN: 14263
---
 .../web/client/application/SearchWidget.java  |   8 +
 .../ShowRelatedDatasetsDialog.java            |   9 +
 .../framework/ComponentProvider.java          | 154 ++++++++++++++++++
 .../application/framework/DefaultTabItem.java |  83 +---------
 .../application/framework/ITabItem.java       |   7 -
 .../framework/ITabItemFactory.java            |   8 +
 .../application/framework/MainTabPanel.java   |  18 +-
 .../application/help/HelpPageIdentifier.java  |  62 +++++--
 .../ui/AuthorizationGroupGrid.java            |   9 +
 .../ui/attachment/AttachmentBrowser.java      |   8 +
 .../ui/data/DataSetReportGenerator.java       |   9 +
 .../ProjectSelectionTreeGridContainer.java    |   8 +
 .../application/ui/project/ProjectGrid.java   |  13 ++
 .../ui/vocabulary/VocabularyGrid.java         |   8 +
 .../web/server/HelpRedirectServlet.java       |   9 +-
 .../application/ClientPluginFactory.java      |  19 +++
 .../module/TopMenuItemDemoModuleMenu.java     |   6 +
 .../application/ClientPluginFactory.java      |  48 +++++-
 .../application/ClientPluginFactory.java      |  11 ++
 .../web/client/application/ProteinViewer.java |   6 +
 .../web/client/application/QueryMenu.java     |  26 +--
 .../etl/DropboxProcessingPluginYeastX.java    |  14 +-
 .../application/ClientPluginFactory.java      |  11 ++
 23 files changed, 416 insertions(+), 138 deletions(-)

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 78b86368cc4..60bf60fcb99 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
@@ -26,6 +26,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.EnterKeyListener;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.ButtonWithLoadingMask;
@@ -211,6 +214,11 @@ public final class SearchWidget extends LayoutContainer
                 {
                     return matchingEntitiesPanel.getId();
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SEARCH, HelpPageAction.ACTION);
+                }
             };
     }
 
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 6b23d6b4bfd..cb2fb7dfadf 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
@@ -27,6 +27,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.RelatedDataSetGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog;
@@ -65,6 +68,12 @@ public final class ShowRelatedDatasetsDialog extends
                 {
                     return "Related Data Sets";
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.RELATED_DATA_SETS,
+                            HelpPageAction.BROWSE);
+                }
             };
         DispatcherHelper.dispatchNaviEvent(tabFactory);
     }
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 5e057251e94..2ac7ed7562c 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
@@ -21,6 +21,9 @@ import com.extjs.gxt.ui.client.widget.Component;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AuthorizationGroupGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PersonGrid;
@@ -113,6 +116,11 @@ public final class ComponentProvider
                 {
                     return SampleBrowserGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -131,6 +139,11 @@ public final class ComponentProvider
                 {
                     return MaterialBrowserGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -148,6 +161,11 @@ public final class ComponentProvider
                 {
                     return GroupGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.GROUP, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -165,6 +183,12 @@ public final class ComponentProvider
                 {
                     return AuthorizationGroupGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.AUTHORIZATION_GROUPS,
+                            HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -182,6 +206,11 @@ public final class ComponentProvider
                 {
                     return RoleAssignmentGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.ROLES, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -199,6 +228,11 @@ public final class ComponentProvider
                 {
                     return PersonGrid.createBrowserId();
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.USERS, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -217,6 +251,11 @@ public final class ComponentProvider
                 {
                     return SampleRegistrationPanel.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -235,6 +274,12 @@ public final class ComponentProvider
                 {
                     return ExperimentRegistrationPanel.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
+                            HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -254,6 +299,11 @@ public final class ComponentProvider
                 {
                     return SampleBatchRegisterUpdatePanel.getId(update);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.IMPORT);
+                }
             };
     }
 
@@ -274,6 +324,12 @@ public final class ComponentProvider
                 {
                     return SampleBatchRegisterUpdatePanel.getId(update);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE,
+                            HelpPageAction.BATCH_UPDATE);
+                }
             };
     }
 
@@ -292,6 +348,11 @@ public final class ComponentProvider
                 {
                     return MaterialBatchRegistrationPanel.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.IMPORT);
+                }
             };
     }
 
@@ -309,6 +370,12 @@ public final class ComponentProvider
                 {
                     return VocabularyRegistrationForm.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.VOCABULARY,
+                            HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -327,6 +394,11 @@ public final class ComponentProvider
                 {
                     return ProjectRegistrationForm.createId();
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -344,6 +416,11 @@ public final class ComponentProvider
                 {
                     return VocabularyGrid.GRID_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.VOCABULARY, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -361,6 +438,11 @@ public final class ComponentProvider
                 {
                     return ProjectGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -378,6 +460,11 @@ public final class ComponentProvider
                 {
                     return ExperimentBrowserGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -395,6 +482,12 @@ public final class ComponentProvider
                 {
                     return PropertyTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.PROPERTY_TYPE,
+                            HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -413,6 +506,12 @@ public final class ComponentProvider
                 {
                     return PropertyTypeRegistrationForm.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.PROPERTY_TYPE,
+                            HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -430,6 +529,11 @@ public final class ComponentProvider
                 {
                     return PropertyTypeAssignmentGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.ASSIGNMENT, HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -472,6 +576,12 @@ public final class ComponentProvider
                 {
                     return PropertyTypeAssignmentForm.createId(entityKind);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.ASSIGNMENT,
+                            HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -489,6 +599,11 @@ public final class ComponentProvider
                 {
                     return DataSetSearchHitGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.SEARCH);
+                }
             };
     }
 
@@ -506,6 +621,11 @@ public final class ComponentProvider
                 {
                     return SampleSearchHitGrid.SEARCH_BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.SEARCH);
+                }
             };
     }
 
@@ -523,6 +643,12 @@ public final class ComponentProvider
                 {
                     return SampleTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SAMPLE_TYPE, HelpPageAction.BROWSE);
+                }
+
             };
     }
 
@@ -540,6 +666,12 @@ public final class ComponentProvider
                 {
                     return MaterialTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.MATERIAL_TYPE,
+                            HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -557,6 +689,12 @@ public final class ComponentProvider
                 {
                     return ExperimentTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT_TYPE,
+                            HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -574,6 +712,12 @@ public final class ComponentProvider
                 {
                     return DataSetTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.DATA_SET_TYPE,
+                            HelpPageAction.BROWSE);
+                }
             };
     }
 
@@ -592,6 +736,11 @@ public final class ComponentProvider
                 {
                     return DataSetUploadForm.ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.REGISTER);
+                }
             };
     }
 
@@ -609,6 +758,11 @@ public final class ComponentProvider
                 {
                     return FileFormatTypeGrid.BROWSER_ID;
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.FILE_FORMAT, HelpPageAction.BROWSE);
+                }
             };
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
index 85e7546329b..e9742b9e71a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
@@ -21,7 +21,6 @@ import com.extjs.gxt.ui.client.widget.ContentPanel;
 import com.extjs.gxt.ui.client.widget.Header;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 
@@ -42,8 +41,6 @@ public class DefaultTabItem implements ITabItem
 
     private final LastModificationStateUpdater lastModificationStateUpdaterOrNull;
 
-    private final HelpPageIdentifier helpPageIdentifier;
-
     /**
      * Creates a tab with the specified {@link Component}. The tab is unaware of database
      * modifications and will not be automatically refreshed if changes occur.
@@ -51,8 +48,7 @@ public class DefaultTabItem implements ITabItem
     public static ITabItem createUnaware(final String title, final Component component,
             boolean isCloseConfirmationNeeded)
     {
-        return new DefaultTabItem(title, component, null, null, isCloseConfirmationNeeded,
-                defaultHelpPageIdentifierForTitle(title));
+        return new DefaultTabItem(title, component, null, null, isCloseConfirmationNeeded);
     }
 
     /**
@@ -63,8 +59,7 @@ public class DefaultTabItem implements ITabItem
             boolean isCloseConfirmationNeeded)
     {
         String title = getTabTitle(component);
-        return new DefaultTabItem(title, component, null, null, isCloseConfirmationNeeded,
-                defaultHelpPageIdentifierForTitle(title));
+        return new DefaultTabItem(title, component, null, null, isCloseConfirmationNeeded);
     }
 
     private static String getTabTitle(ContentPanel contentPanel)
@@ -101,67 +96,7 @@ public class DefaultTabItem implements ITabItem
         LastModificationStateUpdater updater =
                 new LastModificationStateUpdater(viewContext, modificationObserver);
         return new DefaultTabItem(title, component, updater, disposerActionOrNull,
-                isCloseConfirmationNeeded, defaultHelpPageIdentifierForTitle(title));
-    }
-
-    /**
-     * Compute a help page identifier based on the title. This should work in many cases.
-     */
-    private static HelpPageIdentifier defaultHelpPageIdentifierForTitle(String title)
-    {
-        String titleCapitalized = title.toUpperCase();
-        String domainPrefixes[] =
-                    { "DATA SET", "PROPERTY TYPE", "PROPERTY TYPES", "SAMPLE", "EXPERIMENT",
-                            "MATERIAL", "GROUP", "PROJECT", "VOCABULARY", "FILE TYPE",
-                            "AUTHORIZATION" };
-        String actionPrefixes[] =
-            { "BROWSE", "REGISTR", "IMPORT", "UPLOAD" };
-
-        String domainString = null;
-        String actionString = null;
-        HelpPageIdentifier.HelpPageDomain domain = null;
-        HelpPageIdentifier.HelpPageAction action = null;
-
-        // Try to recognize the domain from the title
-        for (String prefix : domainPrefixes)
-        {
-            if (titleCapitalized.startsWith(prefix))
-            {
-                domainString = prefix;
-                break;
-            }
-        }
-
-        if (domainString != null)
-        {
-            domainString = domainString.replace(' ', '_');
-            // correct this small anomaly
-            if ("PROPERTY_TYPES".equals(domainString))
-                domainString = "PROPERTY_TYPE";
-            domain = HelpPageIdentifier.HelpPageDomain.valueOf(domainString);
-
-            String remaining = titleCapitalized.substring(domainString.length() + 1);
-            // Try to recognize the action from the title
-            for (String prefix : actionPrefixes)
-            {
-                if (remaining.startsWith(prefix))
-                {
-                    actionString = prefix;
-                    break;
-                }
-            }
-        }
-
-        if (actionString != null)
-        {
-            actionString = actionString.replace(' ', '_');
-            // correct this small anomaly
-            if ("REGISTR".equals(actionString))
-                actionString = "REGISTER";
-            action = HelpPageIdentifier.HelpPageAction.valueOf(actionString);
-        }
-
-        return new HelpPageIdentifier(domain, action);
+                isCloseConfirmationNeeded);
     }
 
     private static IDelegatedAction createDisposer(final IDisposableComponent disposableComponent)
@@ -177,8 +112,7 @@ public class DefaultTabItem implements ITabItem
 
     private DefaultTabItem(final String initialTitle, final Component component,
             LastModificationStateUpdater lastModificationStateUpdaterOrNull,
-            IDelegatedAction disposerActionOrNull, boolean isCloseConfirmationNeeded,
-            HelpPageIdentifier helpPageIdentifier)
+            IDelegatedAction disposerActionOrNull, boolean isCloseConfirmationNeeded)
     {
         assert initialTitle != null : "Unspecified title.";
         assert component != null : "Unspecified component.";
@@ -190,7 +124,6 @@ public class DefaultTabItem implements ITabItem
         // relevant moments.
         // this.isCloseConfirmationNeeded = isCloseConfirmationNeeded;
         this.isCloseConfirmationNeeded = false;
-        this.helpPageIdentifier = helpPageIdentifier;
     }
 
     //
@@ -211,14 +144,6 @@ public class DefaultTabItem implements ITabItem
         return isCloseConfirmationNeeded;
     }
 
-    /**
-     * @return The unique identifier for the help page for this tab.
-     */
-    public HelpPageIdentifier getHelpPageIdentifier()
-    {
-        return helpPageIdentifier;
-    }
-
     public void onActivate()
     {
         if (lastModificationStateUpdaterOrNull != null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItem.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItem.java
index 60a3ca9fee6..91c29083bc1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItem.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItem.java
@@ -19,8 +19,6 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.TabItem;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
-
 /**
  * An interface which contains everything to create a {@link TabItem}.
  * 
@@ -33,11 +31,6 @@ public interface ITabItem
      */
     public TabTitleUpdater getTabTitleUpdater();
 
-    /**
-     * Returns the identifier the help page for this tab item.
-     */
-    public HelpPageIdentifier getHelpPageIdentifier();
-
     /**
      * Returns the {@link Component} which composes this tab item.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
index ef2ec126613..60f40b7955d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+
 /**
  * Creates {@link ITabItem} which consist of a description and a content of the tab.<br>
  * Allows to create a tab in a moment when it is needed.
@@ -36,4 +38,10 @@ public interface ITabItemFactory
      * </p>
      */
     public String getId();
+
+    /**
+     * Returns the identifier of the help page for this tab item.
+     */
+    public HelpPageIdentifier getHelpPageIdentifier();
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
index bb95db6ce7c..03b8841de90 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
@@ -82,7 +82,7 @@ public class MainTabPanel extends TabPanel
         layoutContainer.addText(createWelcomeText());
         final MainTabItem intro =
                 new MainTabItem(DefaultTabItem.createUnaware("&nbsp;", layoutContainer, false),
-                        layoutContainerId);
+                        layoutContainerId, null);
         intro.setClosable(false);
         return intro;
     }
@@ -115,11 +115,13 @@ public class MainTabPanel extends TabPanel
             setSelection(tab);
         } else
         {
-            String tabId = tabItemFactory.getId();
+            final String tabId = tabItemFactory.getId();
             // Note that if not set, is then automatically generated. So this is why we test for
             // 'ID_PREFIX'. We want the user to set an unique id.
             assert tabId.startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id.";
-            final MainTabItem newTab = new MainTabItem(tabItemFactory.create(), tabId);
+            final HelpPageIdentifier helpId = tabItemFactory.getHelpPageIdentifier();
+            assert helpId != null : "Unspecified help identifier";
+            final MainTabItem newTab = new MainTabItem(tabItemFactory.create(), tabId, helpId);
             add(newTab);
             openTabs.put(tabId, newTab);
             setSelection(newTab);
@@ -163,6 +165,8 @@ public class MainTabPanel extends TabPanel
                         HelpPageIdentifier helpPageId = selectedTab.getHelpPageIdentifier();
                         url.addParameter(GenericConstants.HELP_REDIRECT_PAGE_TITLE_KEY, helpPageId
                                 .getHelpPageTitle(viewContext));
+                        url.addParameter(GenericConstants.HELP_REDIRECT_SPECIFIC_KEY, Boolean
+                                .toString(helpPageId.isSpecific()));
                         WindowUtils.openWindow(URL.encode(url.toString()));
                     }
                 });
@@ -181,10 +185,14 @@ public class MainTabPanel extends TabPanel
 
         private final String idPrefix;
 
-        public MainTabItem(final ITabItem tabItem, final String idPrefix)
+        private final HelpPageIdentifier helpPageIdentifier;
+
+        public MainTabItem(final ITabItem tabItem, final String idPrefix,
+                final HelpPageIdentifier helpPageIdentifier)
         {
             this.tabItem = tabItem;
             this.idPrefix = idPrefix;
+            this.helpPageIdentifier = helpPageIdentifier;
             setId(idPrefix + TAB_SUFFIX);
             setClosable(true);
             setLayout(new FitLayout());
@@ -202,7 +210,7 @@ public class MainTabPanel extends TabPanel
 
         public HelpPageIdentifier getHelpPageIdentifier()
         {
-            return tabItem.getHelpPageIdentifier();
+            return helpPageIdentifier;
         }
 
         @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
index 871e5dc10f5..cf3c443b3ae 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
@@ -39,7 +39,11 @@ public class HelpPageIdentifier
     public static enum HelpPageDomain
     {
         // base domains (as in menu)
-        EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION,
+        EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION, SEARCH,
+
+        // entity types
+        EXPERIMENT_TYPE(EXPERIMENT), SAMPLE_TYPE(SAMPLE), DATA_SET_TYPE(DATA_SET), MATERIAL_TYPE(
+                MATERIAL),
 
         // administration subdomains
         GROUP(ADMINISTRATION),
@@ -59,7 +63,7 @@ public class HelpPageIdentifier
         USERS(AUTHORIZATION), ROLES(AUTHORIZATION), AUTHORIZATION_GROUPS(AUTHORIZATION),
 
         // other base domains
-        CHANGE_USER_SETTINGS;
+        RELATED_DATA_SETS, ATTACHMENTS, CHANGE_USER_SETTINGS, EXPERIMENT_STATISTICS;
 
         // could be used to create a hierarchy of help pages
         private HelpPageDomain superDomainOrNull;
@@ -107,18 +111,27 @@ public class HelpPageIdentifier
      */
     public static enum HelpPageAction
     {
-        BROWSE, REGISTER, IMPORT, UPLOAD, EDIT, SEARCH, ACTION
+        BROWSE, VIEW, REGISTER, IMPORT, EDIT, BATCH_UPDATE, REPORT, SEARCH, ACTION
     }
 
     private HelpPageDomain domain;
 
     private HelpPageAction action;
 
+    private boolean specific;
+
+    private String specificPageTitle;
+
     /**
-     * Create a new help page identifier for the given domain and action.
-     * 
-     * @param domain
-     * @param action
+     * Create a specific help page identifier with the given page title.
+     */
+    public static HelpPageIdentifier createSpecific(String pageTitle)
+    {
+        return new HelpPageIdentifier(pageTitle);
+    }
+
+    /**
+     * Creates a generic help page identifier for the given domain and action.
      */
     public HelpPageIdentifier(HelpPageDomain domain, HelpPageAction action)
     {
@@ -126,27 +139,47 @@ public class HelpPageIdentifier
         assert action != null;
         this.domain = domain;
         this.action = action;
+        this.specific = false;
     }
 
-    public HelpPageDomain getHelpPageDomain()
+    private HelpPageIdentifier(String pageTitle)
     {
+        this.specific = true;
+        this.specificPageTitle = pageTitle;
+    }
+
+    private HelpPageDomain getHelpPageDomain()
+    {
+        assert domain != null;
         return domain;
     }
 
-    public HelpPageAction getHelpPageAction()
+    private HelpPageAction getHelpPageAction()
     {
+        assert action != null;
         return action;
     }
 
+    public boolean isSpecific()
+    {
+        return specific;
+    }
+
     private static char PAGE_NAME_KEY_SEPARATOR = '.';
 
     public String getHelpPageTitle(IMessageProvider messageProvider)
     {
-        final String messageKey = getHelpPageTitleKey();
-        // If there is no message for the key return the key as the title,
-        // otherwise return the message.
-        return messageProvider.containsKey(messageKey) ? messageProvider.getMessage(messageKey)
-                : messageKey; // TODO 2010-01-12, Piotr Buczek: is it better to return null?
+        if (specific)
+        {
+            return specificPageTitle;
+        } else
+        {
+            final String messageKey = getHelpPageTitleKey();
+            // If there is no message for the key return the key as the title,
+            // otherwise return the message.
+            return messageProvider.containsKey(messageKey) ? messageProvider.getMessage(messageKey)
+                    : messageKey; // TODO 2010-01-12, Piotr Buczek: is it better to return null?
+        }
     }
 
     @Private
@@ -162,4 +195,5 @@ public class HelpPageIdentifier
 
         return messageKeyBuilder.toString();
     }
+
 }
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 21e1876374e..14af138e3cf 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
@@ -35,6 +35,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
@@ -212,6 +215,12 @@ public class AuthorizationGroupGrid extends AbstractSimpleBrowserGrid<Authorizat
                 {
                     return PersonGrid.createBrowserId(group);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.AUTHORIZATION_GROUPS,
+                            HelpPageAction.VIEW);
+                }
             };
         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 bb7ee8f66f3..295e66fe0e9 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
@@ -50,6 +50,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.AttachmentVersionModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
@@ -307,6 +310,11 @@ public class AttachmentBrowser extends AbstractSimpleBrowserGrid<AttachmentVersi
                 {
                     return helper.createTabId();
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.ATTACHMENTS, HelpPageAction.VIEW);
+                }
             };
         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 4d1255831e4..47a210d2eea 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
@@ -26,6 +26,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReference;
@@ -82,6 +85,12 @@ public class DataSetReportGenerator
                     {
                         return DataSetReporterGrid.createId(tableModelReference.getResultSetKey());
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.DATA_SET,
+                                HelpPageAction.REPORT);
+                    }
                 };
             DispatcherHelper.dispatchNaviEvent(tabFactory);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
index 0b34faef21a..0a2bddc0dd7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
@@ -59,6 +59,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.NonHierarchicalBaseModelData;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
@@ -317,6 +320,11 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
                 {
                     return AbstractViewer.getTitle(viewContext, Dict.PROJECT, project);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.VIEW);
+                }
             };
         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 0b7f67a6125..ced4ead7882 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
@@ -36,6 +36,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
@@ -212,6 +215,11 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                     {
                         return AbstractViewer.getTitle(viewContext, Dict.PROJECT, project);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.VIEW);
+                    }
                 };
         } else
         {
@@ -234,6 +242,11 @@ public class ProjectGrid extends AbstractSimpleBrowserGrid<Project>
                         return AbstractRegistrationForm.getEditTitle(viewContext, Dict.PROJECT,
                                 project);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.PROJECT, HelpPageAction.EDIT);
+                    }
                 };
         }
         DispatcherHelper.dispatchNaviEvent(tabFactory);
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 a65c601b700..09a45204d0b 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
@@ -39,6 +39,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
@@ -228,6 +231,11 @@ public class VocabularyGrid extends AbstractSimpleBrowserGrid<Vocabulary>
                 {
                     return VocabularyTermGrid.createBrowserId(vocabulary);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.VOCABULARY, HelpPageAction.VIEW);
+                }
             };
         DispatcherHelper.dispatchNaviEvent(tabFactory);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/HelpRedirectServlet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/HelpRedirectServlet.java
index 8b0cd6de038..03e41e88022 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/HelpRedirectServlet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/HelpRedirectServlet.java
@@ -70,7 +70,6 @@ public class HelpRedirectServlet extends AbstractController
     protected ModelAndView handleRequestInternal(HttpServletRequest request,
             HttpServletResponse response) throws Exception
     {
-        System.err.println("got: " + getHelpPageAbsoluteURLForRequest(request));
         response.sendRedirect(getHelpPageAbsoluteURLForRequest(request));
         return null;
     }
@@ -79,12 +78,7 @@ public class HelpRedirectServlet extends AbstractController
     {
         final String isSpecificString =
                 request.getParameter(GenericConstants.HELP_REDIRECT_SPECIFIC_KEY);
-        boolean isSpecific = false;
-        if (isSpecificString != null)
-        {
-            final String isSpecificCompareString = isSpecificString.toUpperCase();
-            isSpecific = "TRUE".equals(isSpecificCompareString);
-        }
+        boolean isSpecific = new Boolean(isSpecificString);
         return isSpecific;
     }
 
@@ -142,7 +136,6 @@ public class HelpRedirectServlet extends AbstractController
     {
         final String helpPageTitle =
                 request.getParameter(GenericConstants.HELP_REDIRECT_PAGE_TITLE_KEY);
-        // helpPageTitle = helpPageTitle.replace("_", "+");
         return helpPageTitle;
     }
 
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 caf810f2979..560d6832f5b 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
@@ -30,6 +30,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DummyComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.ClientPluginAdapter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
@@ -126,6 +129,11 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<IDemo
                     {
                         return DemoSampleViewer.createId(sampleId);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.VIEW);
+                    }
                 };
         }
 
@@ -161,6 +169,11 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<IDemo
                     {
                         return DummyComponent.ID;
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.EDIT);
+                    }
                 };
         }
 
@@ -188,6 +201,12 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<IDemo
                     {
                         return DummyComponent.ID;
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
+                                HelpPageAction.VIEW);
+                    }
                 };
         }
     }
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 28e3fe60bca..f9249f3608b 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
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
@@ -58,6 +59,11 @@ public class TopMenuItemDemoModuleMenu extends TopMenuItem
         {
             return StatisticsWidget.ID;
         }
+
+        public HelpPageIdentifier getHelpPageIdentifier()
+        {
+            return HelpPageIdentifier.createSpecific("Experiment Statistics");
+        }
     }
 
     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 0c109c8b6e7..21e58bf5158 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
@@ -29,6 +29,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.ClientPluginAdapter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
@@ -154,6 +157,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericSampleViewer.createId(identifiable);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.VIEW);
+                    }
                 };
         }
 
@@ -191,6 +199,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericSampleEditForm.createId(identifiable, EntityKind.SAMPLE);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.SAMPLE, HelpPageAction.EDIT);
+                    }
                 };
         }
 
@@ -224,6 +237,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericMaterialViewer.createId(techId);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.VIEW);
+                    }
                 };
         }
 
@@ -245,6 +263,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericMaterialEditForm.createId(identifiable, EntityKind.MATERIAL);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.MATERIAL, HelpPageAction.EDIT);
+                    }
                 };
         }
     }
@@ -274,6 +297,12 @@ public final class ClientPluginFactory extends
                     {
                         return GenericExperimentViewer.createId(identifiable);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
+                                HelpPageAction.VIEW);
+                    }
                 };
         }
 
@@ -301,7 +330,14 @@ public final class ClientPluginFactory extends
 
                     public String getId()
                     {
-                        return GenericDataSetEditForm.createId(identifiable, EntityKind.EXPERIMENT);
+                        return GenericExperimentEditForm.createId(identifiable,
+                                EntityKind.EXPERIMENT);
+                    }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.EXPERIMENT,
+                                HelpPageAction.EDIT);
                     }
                 };
         }
@@ -327,6 +363,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericDataSetViewer.createId(identifiable);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.VIEW);
+                    }
                 };
         }
 
@@ -347,6 +388,11 @@ public final class ClientPluginFactory extends
                     {
                         return GenericDataSetEditForm.createId(identifiable, EntityKind.DATA_SET);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return new HelpPageIdentifier(HelpPageDomain.DATA_SET, HelpPageAction.EDIT);
+                    }
                 };
         }
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
index 24b596658eb..316a52d8ab6 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DummyComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
@@ -110,6 +111,11 @@ public class ClientPluginFactory extends
                     {
                         return "phosphonetx-viewer-" + sampleId;
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return HelpPageIdentifier.createSpecific("PhosphoNetX Sample Viewer");
+                    }
                 };
         }
 
@@ -144,6 +150,11 @@ public class ClientPluginFactory extends
                     {
                         return DummyComponent.ID;
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return HelpPageIdentifier.createSpecific("PhosphoNetX Sample Edition");
+                    }
                 };
         }
 
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
index edbdfcf3572..9396c0dd122 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.StringUtils;
@@ -92,6 +93,11 @@ public class ProteinViewer extends AbstractViewer<IEntityInformationHolder> impl
                             Dict.PROTEIN_IN_EXPERIMENT_TAB_LABEL, description, identifier), c,
                             viewContext, false);
                 }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return HelpPageIdentifier.createSpecific("Protein Viewer");
+                }
             };
     }
 
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/QueryMenu.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/QueryMenu.java
index 8c32c533cfe..19ad724e358 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/QueryMenu.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/QueryMenu.java
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
@@ -31,14 +32,12 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class QueryMenu extends TopMenuItem
 {
     public static final String ID = GenericConstants.ID_PREFIX + "-phosphonetx-";
-    
+
     private static enum ActionMenuKind implements IActionMenuItem
     {
         ALL_PROTEINS_OF_AN_EXPERIMENT()
@@ -58,8 +57,7 @@ public class QueryMenu extends TopMenuItem
             {
                 return RawDataSampleGrid.create(viewContext);
             }
-        }
-        ;
+        };
 
         public String getMenuId()
         {
@@ -70,12 +68,12 @@ public class QueryMenu extends TopMenuItem
         {
             return messageProvider.getMessage(this.name() + "_menu_item");
         }
-        
+
         String getTabLabelKey()
         {
             return this.name() + "_tab_label";
         }
-        
+
         ActionMenu createActionMenu(final IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
         {
             return new ActionMenu(this, viewContext, new ITabItemFactory()
@@ -91,17 +89,23 @@ public class QueryMenu extends TopMenuItem
                         return DefaultTabItem.create(menuItemText, createComponent(viewContext),
                                 viewContext);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return HelpPageIdentifier.createSpecific(getMenuText(viewContext));
+                    }
                 });
         }
-        
-        abstract IDisposableComponent createComponent(IViewContext<IPhosphoNetXClientServiceAsync> viewContext);
+
+        abstract IDisposableComponent createComponent(
+                IViewContext<IPhosphoNetXClientServiceAsync> viewContext);
     }
-    
+
     public QueryMenu(IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
     {
         super(viewContext.getMessage(Dict.QUERY_MENU_TITLE));
         setIconStyle(TopMenuItem.ICON_STYLE);
-        
+
         Menu submenu = new Menu();
         for (ActionMenuKind actionMenuKind : ActionMenuKind.values())
         {
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/DropboxProcessingPluginYeastX.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/DropboxProcessingPluginYeastX.java
index 723c350b0a6..abafb0f0733 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/DropboxProcessingPluginYeastX.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/etl/DropboxProcessingPluginYeastX.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDrop
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 
 /**
- * A dropbox processing plugin that gets its dropbox directory from properties.  
+ * A dropbox processing plugin that gets its dropbox directory from properties.
  * 
  * @author Tomasz Pylak
  */
@@ -34,8 +34,6 @@ public class DropboxProcessingPluginYeastX extends AbstractDropboxProcessingPlug
 
     private static final long serialVersionUID = 1L;
 
-    private final String description;
-    
     public DropboxProcessingPluginYeastX()
     {
         this(null, null);
@@ -44,12 +42,6 @@ public class DropboxProcessingPluginYeastX extends AbstractDropboxProcessingPlug
     public DropboxProcessingPluginYeastX(Properties properties, File storeRoot)
     {
         super(properties, storeRoot, new DatasetDropboxHandler(properties));
-        if (properties != null && properties.get(DROPBOX_INCOMING_DIRECTORY_PROPERTY) != null)
-        {
-            description = "COPYTO " + properties.get(DROPBOX_INCOMING_DIRECTORY_PROPERTY);
-        } else {
-            description = "COPYTO <unknown location>";
-        }
     }
 
     private static final class DatasetDropboxHandler extends AbstractDatasetDropboxHandlerYeastX
@@ -82,8 +74,4 @@ public class DropboxProcessingPluginYeastX extends AbstractDropboxProcessingPlug
         }
     }
 
-    public String getDescription()
-    {
-        return description;
-    }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
index 0cff7e845cf..d9794f6a26d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
@@ -133,6 +134,11 @@ public final class ClientPluginFactory extends
                     {
                         return GeneMaterialViewer.createId(materialId);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return HelpPageIdentifier.createSpecific("Gene Material Viewer");
+                    }
                 };
         }
     }
@@ -161,6 +167,11 @@ public final class ClientPluginFactory extends
                         final TechId sampleId = TechId.create(identifiable);
                         return PlateSampleViewer.createId(sampleId);
                     }
+
+                    public HelpPageIdentifier getHelpPageIdentifier()
+                    {
+                        return HelpPageIdentifier.createSpecific("Plate Sample Viewer");
+                    }
                 };
         }
     }
-- 
GitLab