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;
+ }
+
}