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 {