diff --git a/applemenu/manifest.mf b/applemenu/manifest.mf --- a/applemenu/manifest.mf +++ b/applemenu/manifest.mf @@ -3,6 +3,6 @@ OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/applemenu/Bundle.properties OpenIDE-Module-Install: org/netbeans/modules/applemenu/Install.class OpenIDE-Module-Layer: org/netbeans/modules/applemenu/layer.xml -OpenIDE-Module-Specification-Version: 1.11 +OpenIDE-Module-Specification-Version: 1.12 OpenIDE-Module-Requires: org.openide.modules.os.MacOSX diff --git a/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java b/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java --- a/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java +++ b/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java @@ -43,10 +43,13 @@ import java.awt.AWTEvent; import java.awt.event.AWTEventListener; +import java.awt.event.FocusEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.lang.reflect.Field; import java.lang.reflect.Method; +import javax.swing.text.Caret; +import javax.swing.text.JTextComponent; /** * hack for issue #67799, on macosx with single button mouse, @@ -55,30 +58,48 @@ */ public class CtrlClickHack implements AWTEventListener { - /** Creates a new instance of CtrlClickHack */ - public CtrlClickHack() { - } - + private static final String CLIENT_PROP_CARET = "_caret"; public void eventDispatched(AWTEvent e) { - if (! (e instanceof MouseEvent)) { + if (!(e instanceof MouseEvent) && !(e instanceof FocusEvent)) { return; } - MouseEvent evt = (MouseEvent) e; - if (evt.getModifiers() != (InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK)) { - return; - } - try { - Field f1 = InputEvent.class.getDeclaredField("modifiers"); - Field f2 = MouseEvent.class.getDeclaredField("button"); - Method m = MouseEvent.class.getDeclaredMethod("setNewModifiers", new Class[] {}); - f1.setAccessible(true); - f1.setInt(evt, InputEvent.BUTTON3_MASK); - f2.setAccessible(true); - f2.setInt(evt, MouseEvent.BUTTON3); - m.setAccessible(true); - m.invoke(evt, new Object[] {}); - } catch (Exception ex) { - ex.printStackTrace(); + if (e instanceof MouseEvent) { + MouseEvent evt = (MouseEvent) e; + if (evt.getModifiers() != (InputEvent.BUTTON1_MASK | InputEvent.CTRL_MASK)) { + return; + } + try { + Field f1 = InputEvent.class.getDeclaredField("modifiers"); + Field f2 = MouseEvent.class.getDeclaredField("button"); + Method m = MouseEvent.class.getDeclaredMethod("setNewModifiers", new Class[] {}); + f1.setAccessible(true); + f1.setInt(evt, InputEvent.BUTTON3_MASK); + f2.setAccessible(true); + f2.setInt(evt, MouseEvent.BUTTON3); + m.setAccessible(true); + m.invoke(evt, new Object[] {}); + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + FocusEvent fe = (FocusEvent) e; + if (fe.getID() == FocusEvent.FOCUS_GAINED) { + if (fe.getOppositeComponent() instanceof JTextComponent) { + JTextComponent jtc = (JTextComponent) fe.getOppositeComponent(); + Caret c = jtc.getCaret(); + if (c != null) { + jtc.putClientProperty(CLIENT_PROP_CARET, c); + jtc.setCaret(null); + } + } + if (fe.getComponent() instanceof JTextComponent) { + JTextComponent jtc = (JTextComponent) fe.getComponent(); + Caret c = (Caret) jtc.getClientProperty(CLIENT_PROP_CARET); + if (c != null) { + jtc.setCaret (c); + } + } + } } } diff --git a/applemenu/src/org/netbeans/modules/applemenu/Install.java b/applemenu/src/org/netbeans/modules/applemenu/Install.java --- a/applemenu/src/org/netbeans/modules/applemenu/Install.java +++ b/applemenu/src/org/netbeans/modules/applemenu/Install.java @@ -55,9 +55,10 @@ public class Install extends ModuleInstall { private CtrlClickHack listener; + @Override public void restored () { listener = new CtrlClickHack(); - Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.MOUSE_EVENT_MASK); + Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK); if (System.getProperty("mrj.version") != null) { // NOI18N // FontReferenceQueue.install(); try { @@ -75,6 +76,7 @@ } } + @Override public void uninstalled () { if (listener != null) { Toolkit.getDefaultToolkit().removeAWTEventListener(listener);