bug 411266: Allow context menus on all FormFields 

https://bugs.eclipse.org/bugs/show_bug.cgi?id=411266

Tooling support for the new context menus.
diff --git a/org.eclipse.scout.sdk.ui/resources/sdkPropertyViewConfig.xml b/org.eclipse.scout.sdk.ui/resources/sdkPropertyViewConfig.xml
index 4c5bd0a..342f52d 100644
--- a/org.eclipse.scout.sdk.ui/resources/sdkPropertyViewConfig.xml
+++ b/org.eclipse.scout.sdk.ui/resources/sdkPropertyViewConfig.xml
@@ -24,6 +24,20 @@
 		<config name="getConfiguredPercent" type="Advanced" category="Appearance" />
 		<config name="getConfiguredMultiplier" type="Advanced" category="Appearance" />
 	</type>
+	<type name="org.eclipse.scout.rt.client.ui.action.menu.AbstractMenu">
+		<config name="getConfiguredMenuTypes" type="Normal" category="Behavior" />
+	</type>
+	<type name="org.eclipse.scout.rt.client.ui.action.AbstractAction">
+		<config name="getConfiguredText" type="Normal" category="Appearance" />
+		<config name="getConfiguredKeyStroke" type="Normal" category="Behavior" />
+		<config name="getConfiguredTooltipText" type="Advanced" category="Appearance" />
+		<config name="getConfiguredEnabled" type="Advanced" category="Behavior" />
+		<config name="getConfiguredVisible" type="Advanced" category="Appearance" />
+		<config name="getConfiguredInheritAccessibility" type="Normal" category="Behavior" />
+		<config name="getConfiguredToggleAction" type="Advanced" category="Behavior" />
+		<config name="getConfiguredSeparator" type="Normal" category="Behavior" />
+		<config name="getConfiguredIconId" type="Advanced" category="Appearance" />
+	</type>
 	<type name="org.eclipse.scout.rt.client.ui.desktop.bookmark.menu.AbstractBookmarkMenu">
 		<config name="getConfiguredText" type="Advanced" category="Appearance" />
 		<config name="getConfiguredBookmarkForm" type="Advanced" category="Data" />
@@ -245,6 +259,7 @@
 		<config name="getConfiguredCacheBounds" type="Advanced" category="Behavior" />
 		<config name="getConfiguredAskIfNeedSave" type="Normal" category="Behavior" />
 		<config name="getConfiguredIconId" type="Advanced" category="Appearance" />
+		<config name="getConfiguredToolbarLocation" type="Advanced" category="Appearance" />
 		<config name="execInitForm" type="Normal" category="BusinessLogic" />
 		<config name="execFormActivated" type="Advanced" category="BusinessLogic" />
 		<config name="execDataChanged" type="Advanced" category="BusinessLogic" />
@@ -259,6 +274,7 @@
 		<config name="execTimer" type="Advanced" category="BusinessLogic" />
 		<config name="execAddSearchTerms" type="Advanced" category="BusinessLogic" />
 		<config name="execResetSearchFilter" type="Advanced" category="BusinessLogic" />
+		<config name="execCreateFormData" type="Advanced" category="BusinessLogic" />
 	</type>
 	<type name="org.eclipse.scout.rt.client.ui.form.fields.AbstractFormField">
 		<config name="getConfiguredLabel" type="Normal" category="Appearance" />
@@ -685,6 +701,7 @@
 		<config name="execResolveVirtualChildNode" type="Advanced" category="BusinessLogic" />
 	</type>
 	<type name="org.eclipse.scout.rt.client.ui.form.fields.AbstractValueField">
+		<config name="getConfiguredAutoAddDefaultMenus" type="Advanced" category="Behavior" />
 		<config name="getConfiguredAutoDisplayText" type="Advanced" category="Behavior" />
 		<config name="execValidateValue" type="Normal" category="BusinessLogic" />
 		<config name="execChangedValue" type="Normal" category="BusinessLogic" />
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/dialog/MenuTypeDialog.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/dialog/MenuTypeDialog.java
new file mode 100644
index 0000000..41c25de
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/dialog/MenuTypeDialog.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.internal.dialog;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.scout.sdk.ScoutSdkCore;
+import org.eclipse.scout.sdk.Texts;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.ui.fields.bundletree.CheckableTree;
+import org.eclipse.scout.sdk.ui.fields.bundletree.ICheckStateListener;
+import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNode;
+import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNodeFilter;
+import org.eclipse.scout.sdk.ui.fields.bundletree.TreeNode;
+import org.eclipse.scout.sdk.ui.fields.bundletree.TreeUtility;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.util.UiUtility;
+import org.eclipse.scout.sdk.util.signature.SignatureCache;
+import org.eclipse.scout.sdk.util.type.TypeComparators;
+import org.eclipse.scout.sdk.util.type.TypeFilters;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.scout.sdk.util.typecache.ICachedTypeHierarchy;
+import org.eclipse.scout.sdk.workspace.type.config.parser.MenuTypesConfig;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * <h3>{@link MenuTypeDialog}</h3>
+ * 
+ * @author Matthias Villiger
+ * @since 4.0.0 03.06.2014
+ */
+@SuppressWarnings("restriction")
+public class MenuTypeDialog extends TitleAreaDialog {
+
+  private static final String TREE_NODE_TYPE = "type";
+  private static final String TREE_NODE_ENUM = "enum";
+
+  private final MenuTypesConfig m_config;
+  private final IType m_menu;
+  private CheckableTree m_tree;
+
+  public MenuTypeDialog(Shell parentShell, MenuTypesConfig config, IType menu) {
+    super(parentShell);
+    m_config = config;
+    m_menu = menu;
+    setShellStyle(getShellStyle() | SWT.RESIZE);
+    setHelpAvailable(false);
+  }
+
+  @Override
+  protected Control createDialogArea(Composite parent) {
+    getShell().setText(Texts.get("ChooseMenuTypes"));
+    setTitle(Texts.get("ChooseMenuTypes"));
+    setMessage(Texts.get("ChooseTheTypesForMenu", m_menu.getFullyQualifiedName('.')));
+    Composite rootArea = new Composite(parent, SWT.BORDER);
+
+    ITreeNode root = createTree();
+    m_tree = new CheckableTree(rootArea, root);
+    m_tree.setChecked(TreeUtility.findNodes(root, new ITreeNodeFilter() {
+      @Override
+      public boolean accept(ITreeNode node) {
+        if (TREE_NODE_ENUM.equals(node.getType())) {
+          IField f = (IField) node.getData();
+          IType enumType = (IType) node.getParent().getData();
+          return m_config.getValuesFor(enumType).contains(f.getElementName());
+        }
+        return false;
+      }
+    }));
+    m_tree.addCheckSelectionListener(new ICheckStateListener() {
+      @Override
+      public void fireNodeCheckStateChanged(ITreeNode node, boolean checkState) {
+        IType enumType = (IType) node.getParent().getData();
+        IField f = (IField) node.getData();
+        if (checkState) {
+          m_config.add(enumType, f.getElementName());
+        }
+        else {
+          m_config.remove(enumType, f.getElementName());
+        }
+      }
+    });
+
+    if (parent.getLayout() instanceof GridLayout) {
+      rootArea.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL));
+    }
+    rootArea.setLayout(new GridLayout(1, true));
+    m_tree.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_VERTICAL));
+
+    return rootArea;
+  }
+
+  private ITreeNode createTree() {
+    ITreeNode rootNode = new TreeNode(CheckableTree.TYPE_ROOT, "root");
+    rootNode.setVisible(false);
+
+    ICachedTypeHierarchy menuTypeHierarchy = ScoutSdkCore.getHierarchyCache().getPrimaryTypeHierarchy(TypeUtility.getType(IRuntimeClasses.IMenuType));
+    IType[] menuTypeEnums = menuTypeHierarchy.getAllTypes(TypeFilters.getEnumTypesFilter(), TypeComparators.getTypeNameComparator());
+    int i = 0;
+    for (IType m : menuTypeEnums) {
+      ITreeNode typeNode = TreeUtility.createNode(rootNode, TREE_NODE_TYPE, m.getElementName(), UiUtility.getTypeImageDescriptor(m, false), i++, m, false, false);
+      String enumSig = SignatureCache.createTypeSignature(m.getFullyQualifiedName());
+      try {
+        for (IField f : m.getFields()) {
+          if (f.getTypeSignature().equals(enumSig)) {
+            int flags = f.getFlags();
+            if (Flags.isPublic(flags) && Flags.isStatic(flags) && Flags.isFinal(flags) && !Flags.isDeprecated(flags)) {
+              TreeUtility.createNode(typeNode, TREE_NODE_ENUM, f.getElementName(), JavaElementImageProvider.getFieldImageDescriptor(false, flags), i++, f, false, true);
+            }
+          }
+        }
+      }
+      catch (CoreException e) {
+        ScoutSdkUi.logError("Unable to get the available menu types", e);
+      }
+    }
+
+    return rootNode;
+  }
+
+  public MenuTypesConfig openDialog() {
+    if (open() == OK) {
+      return m_config;
+    }
+    return null;
+  }
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigDecimalFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigDecimalFieldNodePage.java
index b9c4bc6..8904cb1 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigDecimalFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigDecimalFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.BIG_DECIMAL_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigIntegerFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigIntegerFieldNodePage.java
index d1f7a97..19782d2 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigIntegerFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BigIntegerFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.BIG_INTEGER_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BooleanFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BooleanFieldNodePage.java
index 615571e..d6d9496 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BooleanFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/BooleanFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.BOOLEAN_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ButtonNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ButtonNodePage.java
index 173c23c..d79d22b 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ButtonNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ButtonNodePage.java
@@ -35,9 +35,9 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
-    new KeyStrokeTablePage(this, getType());
+  protected void loadChildrenImpl() {
     new MenuTablePage(this, getType());
+    new KeyStrokeTablePage(this, getType());
   }
 
   @Override
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/CheckBoxNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/CheckBoxNodePage.java
index 614e58b..9c6ca72 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/CheckBoxNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/CheckBoxNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.CHECK_BOX_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DateFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DateFieldNodePage.java
index 8a5b02e..8560852 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DateFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DateFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.DATE_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DoubleFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DoubleFieldNodePage.java
index 9aa9faf..fae1dff 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DoubleFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/DoubleFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.DOUBLE_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/FileChooserFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/FileChooserFieldNodePage.java
index 2d40b08..2d73c33 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/FileChooserFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/FileChooserFieldNodePage.java
@@ -30,9 +30,9 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
-    new KeyStrokeTablePage(this, getType());
+  protected void loadChildrenImpl() {
     new MenuTablePage(this, getType());
+    new KeyStrokeTablePage(this, getType());
   }
 
   @Override
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ImageFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ImageFieldNodePage.java
index 30f72d9..8730723 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ImageFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ImageFieldNodePage.java
@@ -30,9 +30,9 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
-    new KeyStrokeTablePage(this, getType());
+  protected void loadChildrenImpl() {
     new MenuTablePage(this, getType());
+    new KeyStrokeTablePage(this, getType());
   }
 
   @Override
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/IntegerFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/IntegerFieldNodePage.java
index f2e28d1..2db7e69 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/IntegerFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/IntegerFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -26,6 +27,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.INTEGER_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LabelFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LabelFieldNodePage.java
index d86c6cc..d0abea7 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LabelFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LabelFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.LABEL_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ListBoxNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ListBoxNodePage.java
index 5aa4879..b643d55 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ListBoxNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ListBoxNodePage.java
@@ -15,6 +15,7 @@
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
 import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.KeyStrokeTablePage;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.table.TableNodePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
@@ -32,7 +33,8 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
     new KeyStrokeTablePage(this, getType());
     IType[] tables = ScoutTypeUtility.getTables(getType());
     if (tables.length > 0) {
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LongFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LongFieldNodePage.java
index bb9acb5..d076e10 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LongFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/LongFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.LONG_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ProposalFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ProposalFieldNodePage.java
index a61996c..24a6082 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ProposalFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/ProposalFieldNodePage.java
@@ -30,9 +30,9 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
-    new KeyStrokeTablePage(this, getType());
+  protected void loadChildrenImpl() {
     new MenuTablePage(this, getType());
+    new KeyStrokeTablePage(this, getType());
   }
 
   @Override
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/RadioButtonGroupNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/RadioButtonGroupNodePage.java
index b64ef87..f8b4830 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/RadioButtonGroupNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/RadioButtonGroupNodePage.java
@@ -17,6 +17,7 @@
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.action.rename.FormFieldRenameAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 
 /**
@@ -38,7 +39,7 @@
 
   @Override
   protected void loadChildrenImpl() {
-    // TODO check only subtypes of IRadioButton
+    new MenuTablePage(this, getType());
     super.loadChildrenImpl();
   }
 
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/SmartFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/SmartFieldNodePage.java
index 655c25f..d60956c 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/SmartFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/SmartFieldNodePage.java
@@ -31,9 +31,9 @@
   }
 
   @Override
-  public void loadChildrenImpl() {
-    new KeyStrokeTablePage(this, getType());
+  protected void loadChildrenImpl() {
     new MenuTablePage(this, getType());
+    new KeyStrokeTablePage(this, getType());
   }
 
   @Override
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/StringFieldNodePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/StringFieldNodePage.java
index 71cde07..324778d 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/StringFieldNodePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/outline/pages/project/client/form/field/StringFieldNodePage.java
@@ -13,6 +13,7 @@
 import org.eclipse.scout.sdk.ui.action.IScoutHandler;
 import org.eclipse.scout.sdk.ui.action.delete.FormFieldDeleteAction;
 import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.view.outline.pages.project.client.MenuTablePage;
 import org.eclipse.scout.sdk.ui.view.outline.pages.IScoutPageConstants;
 import org.eclipse.scout.sdk.ui.view.outline.pages.project.client.ui.form.field.AbstractFormFieldNodePage;
 
@@ -23,6 +24,11 @@
   }
 
   @Override
+  protected void loadChildrenImpl() {
+    new MenuTablePage(this, getType());
+  }
+
+  @Override
   public String getPageId() {
     return IScoutPageConstants.STRING_FIELD_NODE_PAGE;
   }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/FontPresenter.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/FontPresenter.java
index ab3a19d..ed5f3cd 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/FontPresenter.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/FontPresenter.java
@@ -10,8 +10,6 @@
  ******************************************************************************/
 package org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single;
 
-import java.util.StringTokenizer;
-
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.scout.commons.CompareUtility;
 import org.eclipse.scout.sdk.jobs.OperationJob;
@@ -21,7 +19,6 @@
 import org.eclipse.scout.sdk.ui.view.properties.presenter.single.AbstractValuePresenter;
 import org.eclipse.scout.sdk.util.SdkProperties;
 import org.eclipse.scout.sdk.workspace.type.config.ConfigPropertyUpdateOperation;
-import org.eclipse.scout.sdk.workspace.type.config.PropertyMethodSourceUtility;
 import org.eclipse.scout.sdk.workspace.type.config.parser.FontPropertySourceParser;
 import org.eclipse.scout.sdk.workspace.type.config.parser.IPropertySourceParser;
 import org.eclipse.scout.sdk.workspace.type.config.property.FontSpec;
@@ -37,8 +34,7 @@
 import org.eclipse.swt.widgets.Control;
 
 /**
- * <h3>StringPresenter</h3> Representing a plain text property method. References like 'm_value' or
- * 'IConstants.ASTRING' are handled.
+ * <h3>FontPresenter</h3>
  */
 public class FontPresenter extends AbstractValuePresenter<FontSpec> {
 
@@ -147,46 +143,17 @@
 
   @Override
   protected FontSpec parseSourceInput(String input) throws CoreException {
-    String value = PropertyMethodSourceUtility.parseReturnParameterString(input, getMethod().peekMethod(), getMethod().getSuperTypeHierarchy());
-    if (value == null) {
-      value = "";
+    if (input.equals("")) {
+      return getDefaultValue();
     }
-    return parseDisplayInput(value);
+    else {
+      return getParser().parseSourceValue(input, getMethod().peekMethod(), getMethod().getSuperTypeHierarchy());
+    }
   }
 
   @Override
   protected FontSpec parseDisplayInput(String input) throws CoreException {
-    FontSpec fontSpec = new FontSpec();
-    StringTokenizer tok = new StringTokenizer(input, "-_,/.;");
-    while (tok.hasMoreTokens()) {
-      String nextToken = tok.nextToken();
-      String s = nextToken.toUpperCase();
-      // styles
-      if (s.equals("PLAIN")) {
-        fontSpec.addStyle(SWT.NORMAL);
-        // nop
-      }
-      else if (s.equals("BOLD")) {
-        fontSpec.addStyle(SWT.BOLD);
-      }
-      else if (s.equals("ITALIC")) {
-        fontSpec.addStyle(SWT.ITALIC);
-      }
-      else {
-        // size or name
-        try {
-
-          // size
-          int size = Integer.parseInt(s);
-          fontSpec.setHeight(size);
-        }
-        catch (NumberFormatException nfe) {
-          // name
-          fontSpec.setName(nextToken);
-        }
-      }
-    }
-    return fontSpec;
+    return parseSourceInput(input);
   }
 
   @Override
@@ -211,8 +178,7 @@
       job.schedule();
     }
     catch (Exception e) {
-      ScoutSdkUi.logError("could not parse default value of method '" + getMethod().getMethodName() + "' in type '" + getMethod().getType().getFullyQualifiedName() + "'.", e);
+      ScoutSdkUi.logError("could not update method '" + getMethod().getMethodName() + "' in type '" + getMethod().getType().getFullyQualifiedName() + "'.", e);
     }
   }
-
 }
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/MenuTypePresenter.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/MenuTypePresenter.java
new file mode 100644
index 0000000..4e76b17
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/view/properties/presenter/single/MenuTypePresenter.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.scout.commons.CompareUtility;
+import org.eclipse.scout.sdk.jobs.OperationJob;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.dialog.MenuTypeDialog;
+import org.eclipse.scout.sdk.ui.view.properties.PropertyViewFormToolkit;
+import org.eclipse.scout.sdk.ui.view.properties.presenter.single.AbstractValuePresenter;
+import org.eclipse.scout.sdk.util.SdkProperties;
+import org.eclipse.scout.sdk.workspace.type.config.ConfigPropertyUpdateOperation;
+import org.eclipse.scout.sdk.workspace.type.config.parser.IPropertySourceParser;
+import org.eclipse.scout.sdk.workspace.type.config.parser.MenuTypeParsers;
+import org.eclipse.scout.sdk.workspace.type.config.parser.MenuTypesConfig;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * <h3>{@link MenuTypePresenter}</h3>
+ * 
+ * @author Matthias Villiger
+ * @since 4.0.0 03.06.2014
+ */
+public class MenuTypePresenter extends AbstractValuePresenter<MenuTypesConfig> {
+
+  private Button m_chooserButton;
+  private IPropertySourceParser<MenuTypesConfig> m_parser;
+
+  public MenuTypePresenter(PropertyViewFormToolkit toolkit, Composite parent) {
+    super(toolkit, parent, null);
+    m_parser = new MenuTypeParsers();
+  }
+
+  public IPropertySourceParser<MenuTypesConfig> getParser() {
+    return m_parser;
+  }
+
+  @Override
+  protected Control createContent(Composite container) {
+    Composite rootPane = getToolkit().createComposite(container);
+    super.createContent(rootPane);
+
+    m_chooserButton = getToolkit().createButton(rootPane, "", SWT.PUSH);
+    m_chooserButton.setImage(ScoutSdkUi.getImage(ScoutSdkUi.ToolMagnifier));
+    m_chooserButton.addSelectionListener(new SelectionAdapter() {
+      @Override
+      public void widgetSelected(SelectionEvent e) {
+        showDialog();
+      }
+    });
+
+    // layout
+    GridLayout gLayout = new GridLayout(3, false);
+    gLayout.horizontalSpacing = 3;
+    gLayout.marginHeight = 0;
+    gLayout.marginWidth = 0;
+    rootPane.setLayout(gLayout);
+    getTextComponent().setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL));
+    getTextComponent().setEditable(false);
+    m_chooserButton.setLayoutData(new GridData(SdkProperties.TOOL_BUTTON_SIZE, SdkProperties.TOOL_BUTTON_SIZE));
+    return rootPane;
+  }
+
+  private void showDialog() {
+    MenuTypeDialog menuTypesDialog = new MenuTypeDialog(getContainer().getShell(), getCurrentSourceValue().clone(), getMethod().getType());
+    MenuTypesConfig menuTypesSpec = menuTypesDialog.openDialog();
+    if (menuTypesSpec != null) {
+      try {
+        if (!CompareUtility.equals(getCurrentSourceValue(), menuTypesSpec)) {
+          storeValue(menuTypesSpec);
+        }
+      }
+      catch (CoreException e1) {
+        ScoutSdkUi.logWarning("could not parse menu types: " + menuTypesSpec, e1);
+      }
+    }
+  }
+
+  @Override
+  public void setEnabled(boolean enabled) {
+    if (!isDisposed()) {
+      m_chooserButton.setEnabled(enabled);
+    }
+    super.setEnabled(enabled);
+  }
+
+  @Override
+  public boolean isMultiLine() {
+    return true;
+  }
+
+  @Override
+  protected String formatDisplayValue(MenuTypesConfig value) throws CoreException {
+    if (value == null) {
+      return "";
+    }
+    else {
+      return getParser().formatSourceValue(value, null, null).replace(", ", "\r\n");
+    }
+  }
+
+  @Override
+  protected MenuTypesConfig parseSourceInput(String input) throws CoreException {
+    if (input.equals("")) {
+      return getDefaultValue();
+    }
+    else {
+      return getParser().parseSourceValue(input, getMethod().peekMethod(), getMethod().getSuperTypeHierarchy());
+    }
+  }
+
+  @Override
+  protected MenuTypesConfig parseDisplayInput(String input) throws CoreException {
+    return parseSourceInput(input);
+  }
+
+  @Override
+  protected void storeValue(MenuTypesConfig value) throws CoreException {
+    try {
+      ConfigPropertyUpdateOperation<MenuTypesConfig> updateOp = new ConfigPropertyUpdateOperation<MenuTypesConfig>(getMethod(), getParser());
+      updateOp.setValue(value);
+      OperationJob job = new OperationJob(updateOp);
+      job.setDebug(true);
+      job.schedule();
+    }
+    catch (Exception e) {
+      ScoutSdkUi.logError("could update method '" + getMethod().getMethodName() + "' in type '" + getMethod().getType().getFullyQualifiedName() + "'.", e);
+    }
+  }
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/outline/pages/AbstractScoutTypePage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/outline/pages/AbstractScoutTypePage.java
index 50282e9..0ed53d0 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/outline/pages/AbstractScoutTypePage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/outline/pages/AbstractScoutTypePage.java
@@ -90,7 +90,6 @@
   public boolean handleDoubleClickedDelegate() {
     try {
       IEditorPart editor = JavaUI.openInEditor(getType());
-      // JavaUI.revealInEditor(editor, (IJavaElement)jdtMember);
       if (editor instanceof ITextEditor) {
         ITextEditor textEditor = (ITextEditor) editor;
         IRegion reg = textEditor.getHighlightRange();
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/part/singlepage/JdtTypePropertyPart.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/part/singlepage/JdtTypePropertyPart.java
index a8ca62f..7204430 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/part/singlepage/JdtTypePropertyPart.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/part/singlepage/JdtTypePropertyPart.java
@@ -61,6 +61,7 @@
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.LookupServiceProposalPresenter;
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.MasterFieldPresenter;
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.MenuProposalPresenter;
+import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.MenuTypePresenter;
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.MultiLineStringPresenter;
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.NlsTextPresenter;
 import org.eclipse.scout.sdk.ui.internal.view.properties.presenter.single.OutlineRootPagePresenter;
@@ -488,6 +489,10 @@
       presenter = new GroupBoxBodyGridPresenter(getFormToolkit(), parent);
       presenter.setMethod(method);
     }
+    else if ("MENU_TYPE".equals(propertyType)) {
+      presenter = new MenuTypePresenter(getFormToolkit(), parent);
+      presenter.setMethod(method);
+    }
     else {
       // fall back for all other property types
       presenter = new ExecMethodPresenter(getFormToolkit(), parent);
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractJavaElementListPresenter.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractJavaElementListPresenter.java
index 6aaada5..7905774 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractJavaElementListPresenter.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractJavaElementListPresenter.java
@@ -14,9 +14,12 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.ui.JavaUI;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
@@ -110,7 +113,18 @@
     m_viewer.addDoubleClickListener(new IDoubleClickListener() {
       @Override
       public void doubleClick(DoubleClickEvent event) {
-        // TODO select the current oultine in the outline view
+        if (event.getSelection() instanceof IStructuredSelection) {
+          IStructuredSelection s = (IStructuredSelection) event.getSelection();
+          if (s.getFirstElement() instanceof IType) {
+            IType outline = (IType) s.getFirstElement();
+            try {
+              JavaUI.openInEditor(outline);
+            }
+            catch (Exception ex) {
+              ScoutSdkUi.logWarning("could not open java element '" + outline.getFullyQualifiedName() + "' in editor.", ex);
+            }
+          }
+        }
       }
     });
 
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractMethodPresenter.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractMethodPresenter.java
index 74b51e4..19c5bca 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractMethodPresenter.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractMethodPresenter.java
@@ -126,8 +126,11 @@
     linkCompData.widthHint = 180;
     m_linkComposite.setLayoutData(linkCompData);
 
-    GridData contentData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
     if (content != null) {
+      GridData contentData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+      if (isMultiLine()) {
+        contentData.heightHint = 100;
+      }
       content.setLayoutData(contentData);
     }
 
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractValuePresenter.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractValuePresenter.java
index 91c8e32..0be27fd 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractValuePresenter.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/view/properties/presenter/single/AbstractValuePresenter.java
@@ -90,7 +90,6 @@
     String initialText = formatDisplayValue(getCurrentSourceValue());
     m_textComponent.setText(initialText);
     m_textComponent.setEnabled(true);
-
   }
 
   /**
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeFilters.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeFilters.java
index 17d53ad..fb43bb3 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeFilters.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeFilters.java
@@ -73,6 +73,19 @@
       return !TypeUtility.isGenericType(type);
     }
   };
+  private static final ITypeFilter ENUM_TYPE_FILTER = new ITypeFilter() {
+    @Override
+    public boolean accept(IType type) {
+      try {
+        int flags = type.getFlags();
+        return Flags.isEnum(flags) && !Flags.isDeprecated(flags) && !Flags.isAbstract(flags);
+      }
+      catch (JavaModelException e) {
+        SdkUtilActivator.logWarning("could not evalutate flags of type '" + type.getFullyQualifiedName() + "'.", e);
+        return false;
+      }
+    }
+  };
 
   protected TypeFilters() {
   }
@@ -350,6 +363,13 @@
     return NO_GENERIC_FILTER;
   }
 
+  /**
+   * @return An {@link ITypeFilter} that accepts all non-abstract and non-deprecated {@link Enum}s.
+   */
+  public static ITypeFilter getEnumTypesFilter() {
+    return ENUM_TYPE_FILTER;
+  }
+  
   public static ITypeFilter getMultiTypeFilterOr(final ITypeFilter... filters) {
     return new ITypeFilter() {
       @Override
diff --git a/org.eclipse.scout.sdk/resources/texts/Texts.properties b/org.eclipse.scout.sdk/resources/texts/Texts.properties
index 5c67ec5..275cbb5 100644
--- a/org.eclipse.scout.sdk/resources/texts/Texts.properties
+++ b/org.eclipse.scout.sdk/resources/texts/Texts.properties
@@ -66,7 +66,9 @@
 ChooseATemplateForYourSequenceBox=Choose a Template for your Sequence Box.
 ChooseATemplateForYourTableColumn=Choose a Template for your Table Column.
 ChooseATemplateForYourToolButton=Choose a Template for your Tool Button.
+ChooseMenuTypes=Choose Menu Types
 ChooseProducts=Choose the preferred products.
+ChooseTheTypesForMenu=Choose the types for menu '{0}'.
 ClientBundleMissing=Client Bundle missing
 ClientDownloadLocation=Client Download Location
 ClientProductToInclude=Client Product to include
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/extensions/runtime/classes/IRuntimeClasses.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/extensions/runtime/classes/IRuntimeClasses.java
index 015ec1a..c67d9df 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/extensions/runtime/classes/IRuntimeClasses.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/extensions/runtime/classes/IRuntimeClasses.java
@@ -94,6 +94,9 @@
   String ResourceServlet = "org.eclipse.scout.rt.server.ResourceServlet"; // NO_UCD
   String UserAgentUtility = "org.eclipse.scout.rt.shared.ui.UserAgentUtility"; // NO_UCD
   String CollectionUtility = "org.eclipse.scout.commons.CollectionUtility"; // NO_UCD
+  String TableMenuType = "org.eclipse.scout.rt.client.ui.action.menu.TableMenuType"; // NO_UCD
+  String TreeMenuType = "org.eclipse.scout.rt.client.ui.action.menu.TreeMenuType"; // NO_UCD
+  String ValueFieldMenuType = "org.eclipse.scout.rt.client.ui.action.menu.ValueFieldMenuType"; // NO_UCD
 
   String AbstractFormData = "org.eclipse.scout.rt.shared.data.form.AbstractFormData"; // NO_UCD
   String AbstractFormFieldData = "org.eclipse.scout.rt.shared.data.form.fields.AbstractFormFieldData"; // NO_UCD
@@ -186,6 +189,7 @@
   String ITextProviderService = "org.eclipse.scout.rt.shared.services.common.text.ITextProviderService"; // NO_UCD
   String IDocumentationTextProviderService = "org.eclipse.scout.rt.shared.services.common.text.IDocumentationTextProviderService"; // NO_UCD
   String IMenu = "org.eclipse.scout.rt.client.ui.action.menu.IMenu"; // NO_UCD
+  String IMenuType = "org.eclipse.scout.rt.client.ui.action.menu.IMenuType"; // NO_UCD
   String IOutline = "org.eclipse.scout.rt.client.ui.desktop.outline.IOutline"; // NO_UCD
   String IPage = "org.eclipse.scout.rt.client.ui.desktop.outline.pages.IPage"; // NO_UCD
   String IPageWithNodes = "org.eclipse.scout.rt.client.ui.desktop.outline.pages.IPageWithNodes"; // NO_UCD
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/MenuNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/MenuNewOperation.java
index b7da33d..ba05c7f 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/MenuNewOperation.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/MenuNewOperation.java
@@ -67,7 +67,7 @@
   @Override
   public void validate() throws IllegalArgumentException {
     if (getDeclaringType() == null) {
-      throw new IllegalArgumentException("declaring type can not be null.");
+      throw new IllegalArgumentException("declaring type cannot be null.");
     }
     if (StringUtility.isNullOrEmpty(getTypeName())) {
       throw new IllegalArgumentException("type name is null or empty.");
@@ -88,17 +88,33 @@
       menuNewOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder);
     }
     final boolean isNewFormHandler = getFormHandler() != null && getFormHandler().getElementName().matches("^New.*");
+    final ITypeHierarchy superTypeHierarchy = ScoutTypeUtility.getSuperTypeHierarchy(getDeclaringType());
     if (isNewFormHandler) {
-      // getConfiguredEmptySpaceAction method
-      IMethodSourceBuilder getConfiguredEmptySpaceActionBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(menuNewOp.getSourceBuilder(), "getConfiguredEmptySpaceAction");
-      getConfiguredEmptySpaceActionBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createSimpleMethodBody("return true;"));
-      menuNewOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredEmptySpaceActionBuilder), getConfiguredEmptySpaceActionBuilder);
+      // getConfiguredMenuTypes
+      IMethodSourceBuilder getConfiguredMenuTypes = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(menuNewOp.getSourceBuilder(), "getConfiguredMenuTypes");
+      getConfiguredMenuTypes.setMethodBodySourceBuilder(new IMethodBodySourceBuilder() {
+        @Override
+        public void createSource(IMethodSourceBuilder methodBuilder, StringBuilder source, String lineDelimiter, IJavaProject ownerProject, IImportValidator validator) throws CoreException {
+          String collUtilityName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.CollectionUtility));
+          String iMenuTypeName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.IMenuType));
+          String tableMenuTypeName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.TableMenuType));
+          String treeMenuTypeName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.TreeMenuType));
+          String valueFieldMenuTypeName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.ValueFieldMenuType));
 
-      // getConfiguredSingleSelectionAction method
-      IMethodSourceBuilder getConfiguredSingleSelectionActionBuilder = MethodSourceBuilderFactory.createOverrideMethodSourceBuilder(menuNewOp.getSourceBuilder(), "getConfiguredSingleSelectionAction");
-      getConfiguredSingleSelectionActionBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createSimpleMethodBody("return false;"));
-      menuNewOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredSingleSelectionActionBuilder), getConfiguredSingleSelectionActionBuilder);
-
+          source.append("return ").append(collUtilityName).append(".<").append(iMenuTypeName).append("> hashSet(");
+          if (superTypeHierarchy.contains(TypeUtility.getType(IRuntimeClasses.ITable))) {
+            source.append(tableMenuTypeName).append(".EmptySpace");
+          }
+          else if (superTypeHierarchy.contains(TypeUtility.getType(IRuntimeClasses.ITree))) {
+            source.append(treeMenuTypeName).append(".EmptySpace");
+          }
+          else if (superTypeHierarchy.contains(TypeUtility.getType(IRuntimeClasses.IValueField))) {
+            source.append(valueFieldMenuTypeName).append(".NotNull");
+          }
+          source.append(");");
+        }
+      });
+      menuNewOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(getConfiguredMenuTypes), getConfiguredMenuTypes);
     }
     if (getFormToOpen() != null) {
       //     execAction method
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypeParsers.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypeParsers.java
new file mode 100644
index 0000000..296dcfc
--- /dev/null
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypeParsers.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.workspace.type.config.parser;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.scout.sdk.ScoutSdkCore;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.util.signature.IImportValidator;
+import org.eclipse.scout.sdk.util.signature.SignatureCache;
+import org.eclipse.scout.sdk.util.type.TypeComparators;
+import org.eclipse.scout.sdk.util.type.TypeFilters;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.scout.sdk.util.typecache.ICachedTypeHierarchy;
+
+/**
+ * <h3>{@link MenuTypeParsers}</h3>
+ * 
+ * @author Matthias Villiger
+ * @since 4.0.0 03.06.2014
+ */
+public class MenuTypeParsers implements IPropertySourceParser<MenuTypesConfig> {
+
+  @Override
+  public MenuTypesConfig parseSourceValue(String source, IMethod context, ITypeHierarchy superTypeHierarchy) throws CoreException {
+    ICachedTypeHierarchy menuTypeHierarchy = ScoutSdkCore.getHierarchyCache().getPrimaryTypeHierarchy(TypeUtility.getType(IRuntimeClasses.IMenuType));
+    IType[] menuTypeEnums = menuTypeHierarchy.getAllTypes(TypeFilters.getEnumTypesFilter(), TypeComparators.getTypeNameComparator());
+    MenuTypesConfig ret = new MenuTypesConfig();
+    for (IType menuType : menuTypeEnums) {
+      String fqn = menuType.getFullyQualifiedName('.');
+      String simpleName = Signature.getSimpleName(fqn);
+      String qualifier = Signature.getQualifier(fqn);
+
+      Pattern p = Pattern.compile("(?:" + qualifier.replace(".", "\\.") + "\\.)?" + simpleName + "\\.([a-zA-Z0-9_]+)");
+      Matcher m = p.matcher(source);
+      while (m.find()) {
+        String curVal = m.group(1);
+        ret.add(menuType, curVal);
+      }
+    }
+
+    return ret;
+  }
+
+  @Override
+  public String formatSourceValue(MenuTypesConfig value, String lineDelimiter, IImportValidator validator) throws CoreException {
+    StringBuilder source = new StringBuilder();
+    if (validator != null) {
+      String iMenuTypeName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.IMenuType));
+      String collUtilityName = validator.getTypeName(SignatureCache.createTypeSignature(IRuntimeClasses.CollectionUtility));
+      source.append(collUtilityName).append(".<").append(iMenuTypeName).append("> hashSet(");
+    }
+
+    boolean itemFound = false;
+    Map<IType, Set<String>> all = value.getAll();
+    for (Entry<IType, Set<String>> entry : all.entrySet()) {
+      for (String enumVal : entry.getValue()) {
+        itemFound = true;
+        String typeName = null;
+        if (validator != null) {
+          typeName = validator.getTypeName(SignatureCache.createTypeSignature(entry.getKey().getFullyQualifiedName()));
+        }
+        else {
+          typeName = entry.getKey().getElementName();
+        }
+        source.append(typeName).append('.').append(enumVal).append(", ");
+      }
+    }
+
+    if (itemFound) {
+      source.delete(source.length() - 2, source.length());
+    }
+    if (validator != null) {
+      source.append(")");
+    }
+
+    return source.toString();
+  }
+
+}
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypesConfig.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypesConfig.java
new file mode 100644
index 0000000..e802e75
--- /dev/null
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/config/parser/MenuTypesConfig.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.workspace.type.config.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.eclipse.jdt.core.IType;
+
+/**
+ * <h3>{@link MenuTypesConfig}</h3>
+ * 
+ * @author Matthias Villiger
+ * @since 4.0.0 03.06.2014
+ */
+public class MenuTypesConfig implements Cloneable {
+  private final Map<IType, Set<String>> m_activeMenuTypes;
+
+  public MenuTypesConfig() {
+    this(new HashMap<IType, Set<String>>());
+  }
+
+  private MenuTypesConfig(Map<IType, Set<String>> data) {
+    m_activeMenuTypes = data;
+  }
+
+  @Override
+  public MenuTypesConfig clone() {
+    return new MenuTypesConfig(getAll());
+  }
+
+  public void add(IType menuType, String val) {
+    Set<String> set = m_activeMenuTypes.get(menuType);
+    if (set == null) {
+      set = new TreeSet<String>();
+      m_activeMenuTypes.put(menuType, set);
+    }
+    set.add(val);
+  }
+
+  public void remove(IType menuType, String val) {
+    Set<String> set = m_activeMenuTypes.get(menuType);
+    if (set != null) {
+      set.remove(val);
+    }
+  }
+
+  public Set<String> getValuesFor(IType menuType) {
+    Set<String> set = m_activeMenuTypes.get(menuType);
+    if (set != null) {
+      return new TreeSet<String>(set);
+    }
+    else {
+      return new TreeSet<String>();
+    }
+  }
+
+  public Map<IType, Set<String>> getAll() {
+    Map<IType, Set<String>> ret = new HashMap<IType, Set<String>>(m_activeMenuTypes.size());
+    for (Entry<IType, Set<String>> entry : m_activeMenuTypes.entrySet()) {
+      ret.put(entry.getKey(), new TreeSet<String>(entry.getValue()));
+    }
+    return ret;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((m_activeMenuTypes == null) ? 0 : m_activeMenuTypes.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (!(obj instanceof MenuTypesConfig)) {
+      return false;
+    }
+    MenuTypesConfig other = (MenuTypesConfig) obj;
+    if (m_activeMenuTypes == null) {
+      if (other.m_activeMenuTypes != null) {
+        return false;
+      }
+    }
+    else if (!m_activeMenuTypes.equals(other.m_activeMenuTypes)) {
+      return false;
+    }
+    return true;
+  }
+}