Merge remote-tracking branch 'github/3.8'

Conflicts:
	org.eclipse.scout.rt.ui.rap.incubator.filechooser.feature/feature.xml
	org.eclipse.scout.rt.ui.rap.incubator.filechooser/META-INF/MANIFEST.MF
	org.eclipse.scout.rt.ui.rap.incubator.filechooser/src/org/eclipse/scout/rt/ui/rap/form/fields/filechooserfield/RwtScoutFileUploadField.java
diff --git a/org.eclipse.scout.rt.ui.rap.incubator.filechooser/META-INF/MANIFEST.MF b/org.eclipse.scout.rt.ui.rap.incubator.filechooser/META-INF/MANIFEST.MF
index 3939f73..8b765bc 100644
--- a/org.eclipse.scout.rt.ui.rap.incubator.filechooser/META-INF/MANIFEST.MF
+++ b/org.eclipse.scout.rt.ui.rap.incubator.filechooser/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
 Bundle-SymbolicName: org.eclipse.scout.rt.ui.rap.incubator.filechooser;singleton:=true
 Bundle-Version: 3.9.0.qualifier
 Bundle-Activator: org.eclipse.scout.rt.ui.rap.Activator
-Require-Bundle: org.eclipse.scout.rt.ui.rap;bundle-version="3.8.0",
+Require-Bundle: org.eclipse.scout.rt.ui.rap;bundle-version="3.8.2",
  org.eclipse.rap.rwt.supplemental.fileupload;bundle-version="1.5.0",
  org.eclipse.rap.rwt.supplemental.filedialog;bundle-version="1.5.0"
 Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.scout.rt.ui.rap.incubator.filechooser/src/org/eclipse/scout/rt/ui/rap/form/fields/filechooserfield/RwtScoutFileUploadField.java b/org.eclipse.scout.rt.ui.rap.incubator.filechooser/src/org/eclipse/scout/rt/ui/rap/form/fields/filechooserfield/RwtScoutFileUploadField.java
index be29b1c..f8362d5 100644
--- a/org.eclipse.scout.rt.ui.rap.incubator.filechooser/src/org/eclipse/scout/rt/ui/rap/form/fields/filechooserfield/RwtScoutFileUploadField.java
+++ b/org.eclipse.scout.rt.ui.rap.incubator.filechooser/src/org/eclipse/scout/rt/ui/rap/form/fields/filechooserfield/RwtScoutFileUploadField.java
@@ -60,6 +60,7 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.ProgressBar;
 
 public class RwtScoutFileUploadField extends RwtScoutValueFieldComposite<IFileChooserField> implements IRwtScoutFileUploadField {
@@ -124,10 +125,6 @@
     m_contextMenu.addMenuListener(new P_ContextMenuListener());
     getUiBrowseButton().setMenu(m_contextMenu);
 
-    // listener
-//    P_RwtBrowseButtonListener browseButtonListener = new P_RwtBrowseButtonListener();
-//    getUiBrowseButton().addSelectionListener(browseButtonListener);
-
     // layout
     container.setLayout(new LogicalGridLayout(1, 0));
 
@@ -170,6 +167,10 @@
       @Override
       public void widgetSelected(SelectionEvent event) {
         String filename = getUiBrowseButton().getFileName();
+        if (filename == null) {
+          return;
+        }
+
         getUiField().setText(filename);
         handleUpload();
       }
@@ -315,6 +316,9 @@
     if (!doit) {
       return;
     }
+    if (m_uploadedFile == null) {
+      return;
+    }
     // only handle if text has changed
     if (CompareUtility.equals(m_uploadedFile, getScoutObject().getDisplayText()) && getScoutObject().getErrorStatus() == null) {
       return;
@@ -365,7 +369,10 @@
     if (m_uploadedFile != null) {
       return false;
     }
-    m_handler.removeUploadListener(m_uploadListener);
+    if (m_uploadListener != null) {
+      m_handler.removeUploadListener(m_uploadListener);
+      m_uploadListener = null;
+    }
     m_handler.dispose();
     getUiBrowseButton().dispose();
     getUiProgressBar().dispose();
@@ -395,18 +402,16 @@
     }
 
     @Override
-    protected Menu getContextMenu() {
-      return m_contextMenu;
-    }
-
-    @Override
-    protected void setContextMenu(Menu contextMenu) {
-      m_contextMenu = contextMenu;
-    }
-
-    @Override
     public void menuShown(MenuEvent e) {
       super.menuShown(e);
+      /*
+       * Since the FileUpload widget does fire a MouseEvent when it is clicked on, we do not know if the right mouse button has been clicked or not.
+       * Therefore, a MenuDetect listener cannot be attached. The creation of the menu is done once after initialization.
+       * While handling the menuShown, the menu (event source) might already contain contributed Scout menus from the previous right mouse click. To
+       * avoid the menus being added several times, the menu items are removed first before the Scout menus are contributed.
+       */
+      Menu contextMenu = (Menu) e.getSource();
+      cleanUpMenuItems(contextMenu);
 
       final AtomicReference<IMenu[]> scoutMenusRef = new AtomicReference<IMenu[]>();
       Runnable t = new Runnable() {
@@ -426,9 +431,26 @@
       // grab the actions out of the job, when the actions are providden within
       // the scheduled time the popup will be handled.
       if (scoutMenusRef.get() != null) {
-        RwtMenuUtility.fillContextMenu(scoutMenusRef.get(), RwtScoutFileUploadField.this.getUiEnvironment(), m_contextMenu);
+        RwtMenuUtility.fillContextMenu(scoutMenusRef.get(), RwtScoutFileUploadField.this.getUiEnvironment(), contextMenu);
       }
     }
+
+    protected void cleanUpMenuItems(Menu menu) {
+      for (MenuItem menuItem : menu.getItems()) {
+        disposeMenuItem(menuItem);
+      }
+    }
+
+    protected void disposeMenuItem(MenuItem item) {
+      Menu menu = item.getMenu();
+      if (menu != null) {
+        for (MenuItem childItem : menu.getItems()) {
+          disposeMenuItem(childItem);
+        }
+        menu.dispose();
+      }
+      item.dispose();
+    }
   } // end class P_ContextMenuListener
 
   private class P_FileUploadListener implements FileUploadListener {