From c6abcd3327fdb081c8f89be72c670c8d7b7d603b Mon Sep 17 00:00:00 2001 From: Alexander Potochkin Date: Thu, 17 Sep 2009 19:08:15 +0400 Subject: [PATCH] 4833524: BasicTreeUI.isToggleSelectionEvent() does not properly handle popup triggers Reviewed-by: rupashka --- .../javax/swing/plaf/basic/BasicComboBoxUI.java | 2 +- .../javax/swing/plaf/basic/BasicComboPopup.java | 5 +++-- .../javax/swing/plaf/basic/BasicFileChooserUI.java | 3 ++- .../javax/swing/plaf/basic/BasicGraphicsUtils.java | 8 ++++++++ .../classes/javax/swing/plaf/basic/BasicListUI.java | 13 +++++++------ .../javax/swing/plaf/basic/BasicTableUI.java | 13 ++++++++----- .../classes/javax/swing/plaf/basic/BasicTreeUI.java | 8 ++++---- .../classes/javax/swing/text/DefaultCaret.java | 2 +- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java index 80b449ce7c5..3b2fa972e64 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java @@ -1766,7 +1766,7 @@ public class BasicComboBoxUI extends ComboBoxUI { } private boolean isTypeAheadKey( KeyEvent e ) { - return !e.isAltDown() && !e.isControlDown() && !e.isMetaDown(); + return !e.isAltDown() && !BasicGraphicsUtils.isMenuShortcutKeyDown(e); } // diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java index a9940321dfc..fca8b933ff4 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboPopup.java @@ -483,11 +483,12 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup { protected JList createList() { return new JList( comboBox.getModel() ) { public void processMouseEvent(MouseEvent e) { - if (e.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(e)) { // Fix for 4234053. Filter out the Control Key from the list. // ie., don't allow CTRL key deselection. + Toolkit toolkit = Toolkit.getDefaultToolkit(); e = new MouseEvent((Component)e.getSource(), e.getID(), e.getWhen(), - e.getModifiers() ^ InputEvent.CTRL_MASK, + e.getModifiers() ^ toolkit.getMenuShortcutKeyMask(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java index 44f99d6d3e3..7056676ae04 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java @@ -924,7 +924,8 @@ public class BasicFileChooserUI extends FileChooserUI { boolean isTrav = (selectedFile != null && chooser.isTraversable(selectedFile)); boolean isDirSelEnabled = chooser.isDirectorySelectionEnabled(); boolean isFileSelEnabled = chooser.isFileSelectionEnabled(); - boolean isCtrl = (e != null && (e.getModifiers() & ActionEvent.CTRL_MASK) != 0); + boolean isCtrl = (e != null && (e.getModifiers() & + Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0); if (isDir && isTrav && (isCtrl || !isDirSelEnabled)) { changeDirectory(selectedFile); diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java index 6d831493746..06830129574 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java @@ -33,7 +33,10 @@ import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Insets; import java.awt.Rectangle; +import java.awt.Toolkit; import java.awt.event.KeyEvent; +import java.awt.event.InputEvent; + import sun.swing.SwingUtilities2; @@ -303,4 +306,9 @@ public class BasicGraphicsUtils static boolean isLeftToRight( Component c ) { return c.getComponentOrientation().isLeftToRight(); } + + static boolean isMenuShortcutKeyDown(InputEvent event) { + return (event.getModifiers() & + Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0; + } } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java index 7704d10e102..1d3ee7b3509 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java @@ -2371,8 +2371,9 @@ public class BasicListUI extends ListUI JList src = (JList)e.getSource(); ListModel model = src.getModel(); - if (model.getSize() == 0 || e.isAltDown() || e.isControlDown() || e.isMetaDown() || - isNavigationKey(e)) { + if (model.getSize() == 0 || e.isAltDown() || + BasicGraphicsUtils.isMenuShortcutKeyDown(e) || + isNavigationKey(e)) { // Nothing to select return; } @@ -2665,7 +2666,7 @@ public class BasicListUI extends ListUI if (row != -1 && DragRecognitionSupport.mousePressed(e)) { dragPressDidSelection = false; - if (e.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(e)) { // do nothing for control - will be handled on release // or when drag starts return; @@ -2717,7 +2718,7 @@ public class BasicListUI extends ListUI anchorSelected = list.isSelectedIndex(anchorIndex); } - if (e.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(e)) { if (e.isShiftDown()) { if (anchorSelected) { list.addSelectionInterval(anchorIndex, row); @@ -2742,7 +2743,7 @@ public class BasicListUI extends ListUI } public void dragStarting(MouseEvent me) { - if (me.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(me)) { int row = SwingUtilities2.loc2IndexFileList(list, me.getPoint()); list.addSelectionInterval(row, row); } @@ -2758,7 +2759,7 @@ public class BasicListUI extends ListUI return; } - if (e.isShiftDown() || e.isControlDown()) { + if (e.isShiftDown() || BasicGraphicsUtils.isMenuShortcutKeyDown(e)) { return; } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java index 16ceab73ee2..7e85bee803f 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java @@ -1027,7 +1027,7 @@ public class BasicTableUI extends TableUI shouldStartTimer = table.isCellSelected(pressedRow, pressedCol) && !e.isShiftDown() && - !e.isControlDown() && + !BasicGraphicsUtils.isMenuShortcutKeyDown(e) && !outsidePrefSize; } @@ -1051,7 +1051,7 @@ public class BasicTableUI extends TableUI dragPressDidSelection = false; - if (e.isControlDown() && isFileList) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(e) && isFileList) { // do nothing for control - will be handled on release // or when drag starts return; @@ -1115,7 +1115,9 @@ public class BasicTableUI extends TableUI CellEditor editor = table.getCellEditor(); if (dragEnabled || editor == null || editor.shouldSelectCell(e)) { - table.changeSelection(pressedRow, pressedCol, e.isControlDown(), e.isShiftDown()); + table.changeSelection(pressedRow, pressedCol, + BasicGraphicsUtils.isMenuShortcutKeyDown(e), + e.isShiftDown()); } } @@ -1212,7 +1214,7 @@ public class BasicTableUI extends TableUI public void dragStarting(MouseEvent me) { dragStarted = true; - if (me.isControlDown() && isFileList) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(me) && isFileList) { table.getSelectionModel().addSelectionInterval(pressedRow, pressedRow); table.getColumnModel().getSelectionModel(). @@ -1251,7 +1253,8 @@ public class BasicTableUI extends TableUI return; } - table.changeSelection(row, column, e.isControlDown(), true); + table.changeSelection(row, column, + BasicGraphicsUtils.isMenuShortcutKeyDown(e), true); } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java index 8fdc88d946f..22fa61f00dc 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java @@ -2265,7 +2265,7 @@ public class BasicTreeUI extends TreeUI */ protected boolean isToggleSelectionEvent(MouseEvent event) { return (SwingUtilities.isLeftMouseButton(event) && - event.isControlDown()); + BasicGraphicsUtils.isMenuShortcutKeyDown(event)); } /** @@ -3255,7 +3255,7 @@ public class BasicTreeUI extends TreeUI // handle first letter navigation if(tree != null && tree.getRowCount()>0 && tree.hasFocus() && tree.isEnabled()) { - if (e.isAltDown() || e.isControlDown() || e.isMetaDown() || + if (e.isAltDown() || BasicGraphicsUtils.isMenuShortcutKeyDown(e) || isNavigationKey(e)) { return; } @@ -3511,7 +3511,7 @@ public class BasicTreeUI extends TreeUI dragPressDidSelection = false; - if (e.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(e)) { // do nothing for control - will be handled on release // or when drag starts return; @@ -3565,7 +3565,7 @@ public class BasicTreeUI extends TreeUI public void dragStarting(MouseEvent me) { dragStarted = true; - if (me.isControlDown()) { + if (BasicGraphicsUtils.isMenuShortcutKeyDown(me)) { tree.addSelectionPath(pressedPath); setAnchorSelectionPath(pressedPath); setLeadSelectionPath(pressedPath, true); diff --git a/jdk/src/share/classes/javax/swing/text/DefaultCaret.java b/jdk/src/share/classes/javax/swing/text/DefaultCaret.java index 80d06101b98..6adb54f7d80 100644 --- a/jdk/src/share/classes/javax/swing/text/DefaultCaret.java +++ b/jdk/src/share/classes/javax/swing/text/DefaultCaret.java @@ -510,7 +510,7 @@ public class DefaultCaret extends Rectangle implements Caret, FocusListener, Mou if ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0 && getDot() != -1) { moveCaret(e); - } else { + } else if (!e.isPopupTrigger()) { positionCaret(e); } }