From cc3c8a094eb0f3f150dba108cb3de8dee536d58d Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 16 Feb 2010 09:05:08 +0000
Subject: [PATCH] [LMS-1364] top menu extension for modules

SVN: 14751
---
 .../client/web/client/application/Dict.java   |  4 +-
 .../web/client/application/menu/TopMenu.java  | 53 +++++++++++++++++--
 .../DefaultClientPluginFactoryProvider.java   | 13 +++--
 .../client/application/plugin/IModule.java    | 33 ++++--------
 .../application/ClientPluginFactory.java      | 13 +++--
 .../client/application/module/DemoModule.java | 29 +++-------
 .../module/TopMenuItemDemoModuleMenu.java     |  6 +--
 .../client/web/client/application/Dict.java   | 33 ++++++++++++
 .../web/client/application/QueryModule.java   | 34 ++++--------
 .../client/web/public/query-dictionary.js     |  7 +++
 .../cisd/openbis/public/common-dictionary.js  |  4 +-
 .../client/application/PhosphoNetXModule.java | 32 +++--------
 .../web/client/application/QueryMenu.java     | 23 ++++----
 13 files changed, 165 insertions(+), 119 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/Dict.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 8a7b1109b4e..5161a0dc730 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -500,6 +500,8 @@ public abstract class Dict
 
     public static final String MENU_SAMPLE = "menu_sample";
 
+    public static final String MENU_MODULES = "menu_modules";
+
     public static final String MENU_COMPUTE = "menu_compute";
 
     //
@@ -742,7 +744,7 @@ public abstract class Dict
 
     public static final String RESET_USER_SETTINGS_CONFIRMATION_MSG =
             "reset_user_settings_confirmation_msg";
-    
+
     public static final String REAL_NUMBER_FORMATING_FIELDS = "real_number_formating_fields";
 
     public static final String SCIENTIFIC_FORMATING = "scientific_formating";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
index ea3e1c4e877..3efc2220bd9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
@@ -16,9 +16,12 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu;
 
+import java.util.List;
+
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
-import com.extjs.gxt.ui.client.widget.WidgetComponent;
 import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
+import com.extjs.gxt.ui.client.widget.menu.Menu;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
@@ -113,10 +116,14 @@ public class TopMenu extends LayoutContainer
         toolBar.add(new DataSetMenu(viewContext, componentProvider));
         toolBar.add(new MaterialMenu(viewContext, componentProvider));
         toolBar.add(new AdministrationMenu(viewContext, componentProvider));
+        // toolBar.add(new ModulesMenu(viewContext, viewContext.getClientPluginFactoryProvider()));
 
-        for (IModule m : viewContext.getClientPluginFactoryProvider().getModules())
+        TopMenuItem modulesMenuOrNull =
+                tryCreateModulesMenu(viewContext.getClientPluginFactoryProvider().getModules());
+        if (modulesMenuOrNull != null)
         {
-            toolBar.add(new WidgetComponent(m.getMenu()));
+            simplifyMenuIfNecessary(modulesMenuOrNull);
+            toolBar.add(modulesMenuOrNull);
         }
 
         toolBar.add(new FillToolItem());
@@ -126,6 +133,46 @@ public class TopMenu extends LayoutContainer
         toolBar.add(new LoggedUserMenu(viewContext, componentProvider));
     }
 
+    private TopMenuItem tryCreateModulesMenu(List<IModule> modules)
+    {
+        TopMenuItem modulesMenu = new TopMenuItem("Utilities");
+
+        Menu submenu = new Menu();
+        for (IModule module : modules)
+        {
+            for (MenuItem menuItem : module.getMenuItems())
+            {
+                submenu.add(menuItem);
+            }
+        }
+        if (submenu.getItems().size() == 0)
+        {
+            return null;
+        }
+        modulesMenu.setMenu(submenu);
+        return modulesMenu;
+    }
+
+    /**
+     * If there is only one item in the specified <var>topMenu</var> and that item has a sub menu
+     * than 'pull up' this one item into top menu.
+     */
+    private void simplifyMenuIfNecessary(TopMenuItem topMenu)
+    {
+        if (topMenu.getMenu().getItemCount() == 1)
+        {
+            MenuItem menuItem = (MenuItem) topMenu.getMenu().getItem(0);
+            if (menuItem.getSubMenu() != null)
+            {
+                topMenu.setText(menuItem.getText());
+                topMenu.setMenu(menuItem.getSubMenu());
+            }
+        } else
+        {
+            return; // nothing to simplify
+        }
+    }
+
     @Override
     protected void onRender(final Element parent, final int pos)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
index b85bfabd15a..f47aed73818 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/DefaultClientPluginFactoryProvider.java
@@ -18,8 +18,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
@@ -35,6 +37,8 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.Cli
  */
 public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryProvider
 {
+    private final Set<IClientPluginFactory> pluginFactories = new HashSet<IClientPluginFactory>();
+
     private final Map<EntityKindAndTypeCode, IClientPluginFactory> pluginFactoryByEntityKindAndTypeCode =
             new HashMap<EntityKindAndTypeCode, IClientPluginFactory>();
 
@@ -51,14 +55,17 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         // Automatically generated part - START
-        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.ClientPluginFactory(originalViewContext));
-        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.ClientPluginFactory(originalViewContext));
+        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.ClientPluginFactory(
+                originalViewContext));
+        registerPluginFactory(new ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.ClientPluginFactory(
+                originalViewContext));
         // Automatically generated part - END
     }
 
     protected final void registerPluginFactory(final IClientPluginFactory pluginFactory)
     {
         assert pluginFactory != null : "Unspecified client plugin factory.";
+        pluginFactories.add(pluginFactory);
         for (final EntityKind entityKind : EntityKind.values())
         {
             for (final String entityType : pluginFactory.getEntityTypeCodes(entityKind))
@@ -100,7 +107,7 @@ public class DefaultClientPluginFactoryProvider implements IClientPluginFactoryP
     public final List<IModule> getModules()
     {
         ArrayList<IModule> modules = new ArrayList<IModule>();
-        for (IClientPluginFactory factory : pluginFactoryByEntityKindAndTypeCode.values())
+        for (IClientPluginFactory factory : pluginFactories)
         {
             IModule m = factory.tryGetModule();
             if (m != null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModule.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModule.java
index 7fb20e77dd6..cea18e85e01 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModule.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/plugin/IModule.java
@@ -18,15 +18,12 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin;
 
 import java.util.List;
 
-import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Widget;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
 
 /**
  * Plugin that does not depend on entity kind and type. All methods except
- * {@link #initialize(AsyncCallback)} is invoked after invocation of the call back of the
+ * {@link #initialize(AsyncCallback)} are invoked after invocation of the call back of the
  * initialization method.
  * 
  * @author Izabela Adamczyk
@@ -39,25 +36,15 @@ public interface IModule
      * {@link AsyncCallback#onFailure(Throwable)} is invoked.
      */
     void initialize(AsyncCallback<Void> callback);
-    
-    /**
-     * Returns a widget that will be used as a top menu element.
-     * <p>
-     * Note that although any widget may be returned by the method, the height of the top menu will
-     * not be adjusted automatically, so make sure that your widget is not too high.
-     * </p>
-     * <p>
-     * {@link TopMenuItem} should be used for standard menus.
-     * </p>
-     */
-    Widget getMenu();
-    
-    String getModuleName();
-    
-    String getModuleDescription();
+
+	/**
+     * Returns user friendly name of the module.
+	 */
+    String getName();
 
     /**
-     * Returns a list with menu items. The list empty if this module isn't applicable. 
+     * Returns a list with menu items (they can be complex submenus or single menu items). The list
+     * should be empty if this module isn't applicable.
      */
-    List<Component> getMenuItems();
+    List<? extends MenuItem> getMenuItems();
 }
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 0126cfc31e4..de4de73face 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
@@ -36,12 +36,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 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;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.module.DemoModule;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleRegistrationForm;
 
@@ -216,9 +218,10 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoV
         return DefaultTabItem.createUnaware(identifier, component, false);
     }
 
-    // @Override
-    // public IModule tryGetModule()
-    // {
-    // return new DemoModule(getViewContext());
-    // }
+    // FIXME
+    @Override
+    public IModule tryGetModule()
+    {
+        return new DemoModule(getViewContext());
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/DemoModule.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/DemoModule.java
index 5bba0a7335b..775abbc30ed 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/DemoModule.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/module/DemoModule.java
@@ -16,15 +16,16 @@
 
 package ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.module;
 
+import java.util.Collections;
 import java.util.List;
 
-import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.IDemoClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.Dict;
 
 /**
  * Simple demo module.
@@ -46,34 +47,20 @@ public class DemoModule implements IModule
         return viewContext;
     }
 
-    public Widget getMenu()
+    public List<? extends MenuItem> getMenuItems()
     {
-        return new TopMenuItemDemoModuleMenu(getViewContext());
+        return Collections.singletonList(new TopMenuItemDemoModuleMenu(getViewContext()));
         // Uncomment to see customized top menu .
         // return new CustomizedWidgetDemoModuleMenu(getViewContext());
     }
 
-    public List<Component> getMenuItems()
+    public String getName()
     {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getModuleDescription()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public String getModuleName()
-    {
-        // TODO Auto-generated method stub
-        return null;
+        return viewContext.getMessage(Dict.MODULE_MENU_TITLE);
     }
 
     public void initialize(AsyncCallback<Void> callback)
     {
-        // TODO Auto-generated method stub
-        
+        callback.onSuccess(null);
     }
 }
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 f9249f3608b..4e118449f35 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
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.module;
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
@@ -26,7 +27,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 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;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.IDemoClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.Dict;
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.application.Dict;
  * 
  * @author Izabela Adamczyk
  */
-public class TopMenuItemDemoModuleMenu extends TopMenuItem
+public class TopMenuItemDemoModuleMenu extends MenuItem
 {
     public static final String ID = GenericConstants.ID_PREFIX;
 
@@ -89,6 +89,6 @@ public class TopMenuItemDemoModuleMenu extends TopMenuItem
         Menu submenu = new Menu();
         submenu.add(new ActionMenu(ActionMenuKind.STATISTICS, viewContext,
                 new ExperimentStatisticsTabItemFactory(viewContext)));
-        setMenu(submenu);
+        setSubMenu(submenu);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/Dict.java
new file mode 100644
index 00000000000..18a98c71ac6
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/Dict.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.query.client.web.client.application;
+
+/**
+ * An {@link ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict} extension for
+ * <i>query</i> specific message keys.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class Dict extends ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict
+{
+    public static final String MODULE_MENU_TITLE = "module_menu_title";
+
+    private Dict()
+    {
+        // Can not be instantiated.
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
index 7b764037d25..81db342044a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryModule.java
@@ -16,20 +16,17 @@
 
 package ch.systemsx.cisd.openbis.plugin.query.client.web.client.application;
 
+import java.util.Collections;
 import java.util.List;
 
-import com.extjs.gxt.ui.client.widget.Component;
-import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class QueryModule implements IModule
@@ -40,34 +37,23 @@ public class QueryModule implements IModule
     {
         this.viewContext = viewContext;
     }
-    
-    public Widget getMenu()
-    {
-        return new Button("hello");
-    }
-
-    public List<Component> getMenuItems()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
-    public String getModuleDescription()
+    public List<? extends MenuItem> getMenuItems()
     {
-        // TODO Auto-generated method stub
-        return null;
+        // return Collections.emptyList();
+		// FIXME
+        return Collections.singletonList(new MenuItem("hello"));
     }
 
-    public String getModuleName()
+    public String getName()
     {
-        // TODO Auto-generated method stub
-        return null;
+        return viewContext.getMessage(Dict.MODULE_MENU_TITLE);
     }
 
     public void initialize(AsyncCallback<Void> callback)
     {
-        // TODO Auto-generated method stub
-        
+        // FIXME
+        callback.onSuccess(null);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/public/query-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/public/query-dictionary.js
index a702491d85e..06d55e9743e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/public/query-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/public/query-dictionary.js
@@ -1,6 +1,13 @@
 // Query dictionary
 var query = {
 
+
+	//
+	// Module
+	//
+	
+	module_menu_title: "Queries",
+
   // LAST LINE: KEEP IT AT THE END
   lastline: "" // we need a line without a comma
 };
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index cfc990986f1..8ec1de3961e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -321,7 +321,9 @@ var common = {
     
   menu_compute: "Perform",
   COMPUTE_MENU_QUERIES: "Query",
-  COMPUTE_MENU_PROCESSING: "Processing",
+  COMPUTE_MENU_PROCESSING: "Processing",
+  
+  menu_modules: "Utilities",
     
   //
   // Tab Titles
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/PhosphoNetXModule.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/PhosphoNetXModule.java
index b74192cacee..6c8f0c5c251 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/PhosphoNetXModule.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/PhosphoNetXModule.java
@@ -16,57 +16,41 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application;
 
+import java.util.Collections;
 import java.util.List;
 
-import com.extjs.gxt.ui.client.widget.Component;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class PhosphoNetXModule implements IModule
 {
     private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext;
-    
+
     public PhosphoNetXModule(IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
     {
         this.viewContext = viewContext;
     }
-        
-    public Widget getMenu()
-    {
-        return new QueryMenu(viewContext);
-    }
-
-    public List<Component> getMenuItems()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
-    public String getModuleDescription()
+    public List<? extends MenuItem> getMenuItems()
     {
-        // TODO Auto-generated method stub
-        return null;
+        return Collections.singletonList(new QueryMenu(viewContext));
     }
 
-    public String getModuleName()
+    public String getName()
     {
-        // TODO Auto-generated method stub
-        return null;
+        return viewContext.getMessage(Dict.QUERY_MENU_TITLE);
     }
 
     public void initialize(AsyncCallback<Void> callback)
     {
-        // TODO Auto-generated method stub
-        
+        callback.onSuccess(null);
     }
 
 }
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 2d3ccbd44d6..c7f3df38b92 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
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application;
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
+import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
@@ -34,21 +35,21 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNet
 /**
  * @author Franz-Josef Elmer
  */
-public class QueryMenu extends TopMenuItem
+public class QueryMenu extends MenuItem
 {
     public static final String ID = GenericConstants.ID_PREFIX + "-phosphonetx-";
 
     private static enum ActionMenuKind implements IActionMenuItem
     {
-//        ALL_PROTEINS_OF_AN_EXPERIMENT()
-//        {
-//            @Override
-//            IDisposableComponent createComponent(
-//                    IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
-//            {
-//                return ProteinByExperimentBrowserGrid.create(viewContext);
-//            }
-//        },
+        // ALL_PROTEINS_OF_AN_EXPERIMENT()
+        // {
+        // @Override
+        // IDisposableComponent createComponent(
+        // IViewContext<IPhosphoNetXClientServiceAsync> viewContext)
+        // {
+        // return ProteinByExperimentBrowserGrid.create(viewContext);
+        // }
+        // },
         ALL_RAW_DATA_SAMPLES()
         {
             @Override
@@ -111,6 +112,6 @@ public class QueryMenu extends TopMenuItem
         {
             submenu.add(actionMenuKind.createActionMenu(viewContext));
         }
-        setMenu(submenu);
+        setSubMenu(submenu);
     }
 }
-- 
GitLab