This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 190890 - Cmd+U temporarily disables all actions -- defers to parent JScrollPane
Summary: Cmd+U temporarily disables all actions -- defers to parent JScrollPane
Status: RESOLVED FIXED
Alias: None
Product: editor
Classification: Unclassified
Component: Actions/Menu/Toolbar (show other bugs)
Version: 6.x
Hardware: Macintosh (x86) Mac OS X
: P2 normal (vote)
Assignee: Miloslav Metelka
URL:
Keywords:
: 89893 191691 (view as bug list)
Depends on:
Blocks:
 
Reported: 2010-10-11 07:08 UTC by emi
Modified: 2010-11-14 19:47 UTC (History)
3 users (show)

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description emi 2010-10-11 07:08:34 UTC
Duplicating this bug is rather straightforward, at least on OSX, where I first noticed it:

1. Open some editor with multiple lines (so you have a vertical scrollbar).
2. Press Command-U (that would be Meta+U for Java).
3. Press UP/DOWN arrows and notice how the cursor isn't moving, but the scrollbar is moving up/down.
4. Press Command-U again
4. Press UP/DOWN arrow keys and notice how the cursor is moving properly inside the editor.

As far as I see, what happens is that after Cmd-U, the delegate Keymap (in MultiKeymap) is almost empty and all actions are sent to the JEditorPane *parents*.

This is how the UP/DOWN KeyEvents end up being handled by JScrollPane which ends up scrolling up/down.

An annotated stacktrace would be:

"AWT-EventQueue-0"
  javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1600) 

  javax.swing.JComponent.processKeyBinding(JComponent.java:2851) -- HERE IT'S JSCROLLPANE

  javax.swing.JComponent.processKeyBindings(JComponent.java:2897) -- here it's JEditorPane and DOESN'T FIND A KEYBINDING for key up/down on this editor after Cmd+U

  javax.swing.JComponent.processKeyEvent(JComponent.java:2814)

  java.awt.Component.processEvent(Component.java:6125)  --- here it's JEditorPane
  ...

The events (as printed via a quick btrace script which I can provide is needed) are printed at the end of the bug report.

If anyone could point me towards the right direction I could probably figure out the bug myself, but I though I could do this quicker if I get some input for you guys.

PS: According to http://netbeans.org/kb/articles/mac.html, Cmd-U is part of the "Cutting, Copying, Pasting, and Deleting Text" shortcuts, but as far as I can see no text is actually altered.

--emi


BTrace code successfuly deployed
===========================================================
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=85,keyText=U,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

org.netbeans.editor.MultiKeymap$KeymapSetContextAction@17fd8d42
javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
java.awt.Component.processEvent(Component.java:6125)
java.awt.Container.processEvent(Container.java:2085)
java.awt.Component.dispatchEventImpl(Component.java:4714)
java.awt.Container.dispatchEventImpl(Container.java:2143)
java.awt.Component.dispatchEvent(Component.java:4544)
java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
java.awt.Component.dispatchEventImpl(Component.java:4586)
java.awt.Container.dispatchEventImpl(Container.java:2143)
java.awt.Window.dispatchEventImpl(Window.java:2478)
java.awt.Component.dispatchEvent(Component.java:4544)
java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:137)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=85,keyText=U,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=40,keyText=↓,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

javax.swing.plaf.basic.BasicScrollPaneUI$Actions@67e874c9
javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
javax.swing.JComponent.processKeyBindings(JComponent.java:2897)
javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
java.awt.Component.processEvent(Component.java:6125)
java.awt.Container.processEvent(Container.java:2085)
java.awt.Component.dispatchEventImpl(Component.java:4714)
java.awt.Container.dispatchEventImpl(Container.java:2143)
java.awt.Component.dispatchEvent(Component.java:4544)
java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
java.awt.Component.dispatchEventImpl(Component.java:4586)
java.awt.Container.dispatchEventImpl(Container.java:2143)
java.awt.Window.dispatchEventImpl(Window.java:2478)
java.awt.Component.dispatchEvent(Component.java:4544)
java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:137)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=40,keyText=↓,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=85,keyText=U,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=85,keyText=U,keyChar='u',modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

MultiKeymap.EMPTY_ACTION

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

MultiKeymap.EMPTY_ACTION

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=38,keyText=↑,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

AlwaysEnabledAction:
delegate: org.netbeans.editor.BaseKit$UpAction@42fd3cc8
maporg.netbeans.core.startup.layers.BinaryFS$FileMap@1314f3a1

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=38,keyText=↑,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_PRESSED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,modifiers=⌘,extModifiers=⌘,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

java.awt.event.KeyEvent[KEY_RELEASED,keyCode=157,keyText=⌘,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame1

===========================================================
Application exited: 0
Comment 1 Miloslav Metelka 2010-10-21 13:55:22 UTC
Reproduced. Command+U is a common shortcut prefix for several actions e.g. "Cmd+U S" is switch case on selection etc. It seems that the context switching is not properly set back upon cursor keys. I'll fix it.
Comment 2 David Strupl 2010-11-05 15:19:59 UTC
*** Bug 89893 has been marked as a duplicate of this bug. ***
Comment 3 David Strupl 2010-11-05 15:21:49 UTC
Please don't forget about the same effect of Esc key in emacs profile (as reported in 89893 which I have just marked a duplicate of this one).
Comment 4 Miloslav Metelka 2010-11-10 17:04:02 UTC
So the situation is like this:

1. Ctrl+U (Cmd+U on Mac) gets pressed which is a prefix of several editor's actions (like to-upper-case etc.) in MultiKeymap.
2. When certain keys VK_UP, DOWN, LEFT, RIGHT, HOME, END, PAGE_UP, PAGE_DOWN
are pressed the MultiKeymap (which is in Ctrl+U-pressed context) does not resolve them.
3. However
    boolean processKeyBindings(KeyEvent e, boolean pressed) in JComponent
  calls
	      if(((JComponent)parent).processKeyBinding(ks, e,
			       WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed))
		  return true;
 which first consults JViewport's InputMap and then JScrollPane's InputMap which contains handling for the above shortcuts.

I see only two solutions:
a) Consume particular key in MultiKeymap. However since there may be IDE-level shortcuts (handled by NbKeymap in o.n.core) this would disable them since MultiKeymap has currently no knowledge of IDE shortcuts.

b) Clear JScrollPane's InputMap i.e.
scrollPane.setInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
This is solution that I've chosen.

http://hg.netbeans.org/jet-main/rev/32ce8b47b246
Comment 5 Miloslav Metelka 2010-11-10 17:12:03 UTC
Additional fix:
http://hg.netbeans.org/jet-main/rev/e046b0e70f7d
Comment 6 Miloslav Metelka 2010-11-14 19:47:24 UTC
*** Bug 191691 has been marked as a duplicate of this bug. ***