475716: Swing: Paste context menu does not work when inline-editing in a
table cell 


Change-Id: I8cd6f444c333b96bc2db9e7bc472f414abc3b861
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=475716
Signed-off-by: Adrian Sacchi <adrian.sacchi@bsiag.com>
Reviewed-on: https://git.eclipse.org/r/54740
Tested-by: Hudson CI
diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingPopupWorker.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingPopupWorker.java
index 8025015..2813dc2 100644
--- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingPopupWorker.java
+++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingPopupWorker.java
@@ -20,10 +20,13 @@
 import javax.swing.JScrollPane;
 import javax.swing.JViewport;
 import javax.swing.SwingUtilities;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 
 import org.eclipse.scout.commons.logger.IScoutLogger;
 import org.eclipse.scout.commons.logger.ScoutLogManager;
 import org.eclipse.scout.rt.client.ui.action.menu.IMenu;
+import org.eclipse.scout.rt.ui.swing.ext.JTextFieldEx;
 
 /**
  * a swing runnable that can be enqueued into the awt event queue when run it
@@ -52,6 +55,10 @@
 
   @Override
   public void run() {
+    if (SwingPopupWorker.this.getTarget() instanceof JTextFieldEx) {
+      JTextFieldEx field = (JTextFieldEx) SwingPopupWorker.this.getTarget();
+      field.showingPopup(true);
+    }
     if (m_scoutMenus == null || m_scoutMenus.length == 0) {
       return;
     }
@@ -125,6 +132,24 @@
 
         p = r.getLocation();
         p.translate(-compLocationOnScreen.x, -compLocationOnScreen.y);
+        pop.addPopupMenuListener(new PopupMenuListener() {
+
+          @Override
+          public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+          }
+
+          @Override
+          public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+            if (SwingPopupWorker.this.getTarget() instanceof JTextFieldEx) {
+              JTextFieldEx field = (JTextFieldEx) SwingPopupWorker.this.getTarget();
+              field.showingPopup(false);
+            }
+          }
+
+          @Override
+          public void popupMenuCanceled(PopupMenuEvent e) {
+          }
+        });
         pop.show(m_target, p.x, p.y);
       }
     }
@@ -136,4 +161,8 @@
   public void enqueue() {
     m_env.invokeSwingLater(this);
   }
+
+  public Component getTarget() {
+    return m_target;
+  }
 }
diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingUtility.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingUtility.java
index f79afe3..cccfd82 100644
--- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingUtility.java
+++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/SwingUtility.java
@@ -68,6 +68,8 @@
 import javax.swing.SwingConstants;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 import javax.swing.plaf.basic.BasicHTML;
 import javax.swing.text.JTextComponent;
 
@@ -92,6 +94,7 @@
 import org.eclipse.scout.rt.ui.swing.dnd.FileListTransferable;
 import org.eclipse.scout.rt.ui.swing.dnd.JVMLocalObjectTransferable;
 import org.eclipse.scout.rt.ui.swing.dnd.TextTransferable;
+import org.eclipse.scout.rt.ui.swing.ext.JTextFieldEx;
 import org.eclipse.scout.rt.ui.swing.form.fields.htmlfield.SwingScoutHtmlField;
 import org.eclipse.scout.rt.ui.swing.form.fields.labelfield.SwingScoutLabelField;
 import org.eclipse.scout.rt.ui.swing.simulator.SimulatorAction;
@@ -1343,7 +1346,11 @@
       }
     }
 
-    private void onSwingPopup(MouseEvent e, boolean pasteEnabled) {
+    private void onSwingPopup(final MouseEvent e, boolean pasteEnabled) {
+      if (e.getSource() instanceof JTextFieldEx) {
+        JTextFieldEx field = (JTextFieldEx) e.getSource();
+        field.showingPopup(true);
+      }
       JPopupMenu pop = new JPopupMenu();
 
       if (pasteEnabled) {
@@ -1397,6 +1404,24 @@
 
       m_comp.requestFocus();
       m_comp.setComponentPopupMenu(pop);
+      pop.addPopupMenuListener(new PopupMenuListener() {
+
+        @Override
+        public void popupMenuWillBecomeVisible(PopupMenuEvent e1) {
+        }
+
+        @Override
+        public void popupMenuWillBecomeInvisible(PopupMenuEvent e1) {
+          if (e.getSource() instanceof JTextFieldEx) {
+            JTextFieldEx field = (JTextFieldEx) e.getSource();
+            field.showingPopup(false);
+          }
+        }
+
+        @Override
+        public void popupMenuCanceled(PopupMenuEvent e1) {
+        }
+      });
       pop.show(m_comp, e.getX(), e.getY());
     }
 
@@ -1411,10 +1436,10 @@
 
     }
   }// end class
-  
-    /**
+
+  /**
    * Replaces 3 digit CSS colors with 6 digit colors: (e.g. #fff with #ffffff)
-   *
+   * 
    * @param rawHtml
    *          may be <code>null</code>
    */
@@ -1446,6 +1471,5 @@
     sb.append(rawHtml.substring(matchEndIndex, rawHtml.length()));
     return sb.toString();
   }
-  
 
 }
diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/basic/table/celleditor/SwingScoutTableCellEditor.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/basic/table/celleditor/SwingScoutTableCellEditor.java
index 3ffb0da..b687d0d 100644
--- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/basic/table/celleditor/SwingScoutTableCellEditor.java
+++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/basic/table/celleditor/SwingScoutTableCellEditor.java
@@ -54,6 +54,7 @@
 import org.eclipse.scout.rt.ui.swing.basic.table.ISwingScoutTable;
 import org.eclipse.scout.rt.ui.swing.basic.table.SwingTableColumn;
 import org.eclipse.scout.rt.ui.swing.ext.JPanelEx;
+import org.eclipse.scout.rt.ui.swing.ext.JTextFieldEx;
 import org.eclipse.scout.rt.ui.swing.focus.SwingScoutFocusTraversalPolicy;
 
 public class SwingScoutTableCellEditor {
@@ -396,6 +397,11 @@
   private final class P_SwingInputVerifyListener implements ISwingInputVerifyListener {
     @Override
     public void verify(JComponent input) {
+      if (input instanceof JTextFieldEx) {
+        if (((JTextFieldEx) input).isShowingPopup()) {
+          return;
+        }
+      }
       saveEditorFromSwing();
     }
   }
diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/ext/JTextFieldEx.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/ext/JTextFieldEx.java
index 6ceee90..2bb7071 100644
--- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/ext/JTextFieldEx.java
+++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/ext/JTextFieldEx.java
@@ -39,6 +39,8 @@
 
   private OnFieldLabelDecorator m_onFieldLabelHandler;
 
+  private boolean m_isShowingPopup = false;
+
   public JTextFieldEx() {
     super();
     SwingUtility.installDefaultFocusHandling(this);
@@ -108,4 +110,16 @@
   public Point getToolTipLocation(MouseEvent e) {
     return SwingUtility.getAdjustedToolTipLocation(e, this, getTopLevelAncestor());
   }
+
+  /**
+   * @param b
+   */
+  public void showingPopup(boolean b) {
+    m_isShowingPopup = b;
+  }
+
+  public boolean isShowingPopup() {
+    return m_isShowingPopup;
+  }
+
 }