diff -r aa8735651b81 applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java --- a/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java Wed Mar 12 16:17:46 2008 -0700 +++ b/applemenu/src/org/netbeans/modules/applemenu/CtrlClickHack.java Mon Aug 03 23:44:06 2009 -0400 @@ -43,43 +43,70 @@ 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.ref.Reference; +import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.Method; +import javax.swing.text.JTextComponent; /** * hack for issue #67799, on macosx with single button mouse, * make Ctrl-Click work as right click on multiselections - * @author ttran + * + * Also handles issue #90371 - on Macintosh, JTextComponents + * are never sent focus lost events, resulting in multiple + * blinking caret.s + * + * @author ttran, tboudreau */ public class CtrlClickHack implements AWTEventListener { - - /** Creates a new instance of CtrlClickHack */ - public CtrlClickHack() { + private Reference lastFocusedTextComponent = null; + public void eventDispatched(AWTEvent e) { + if (!(e instanceof MouseEvent) && !(e instanceof FocusEvent)) { + return; + } + 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 { + System.err.println("Handling focus event"); + FocusEvent fe = (FocusEvent) e; + if (fe.getID() == FocusEvent.FOCUS_GAINED) { + if (fe.getOppositeComponent() instanceof JTextComponent) { + JTextComponent jtc = (JTextComponent) fe.getOppositeComponent(); + jtc.getCaret().setVisible(false); + } else { + JTextComponent jtc = lastFocusedTextComponent == null ? null : + lastFocusedTextComponent.get(); + if (jtc != null) { + jtc.getCaret().setVisible(false); + } + } + if (fe.getComponent() instanceof JTextComponent) { + JTextComponent jtc = (JTextComponent) fe.getComponent(); + lastFocusedTextComponent = new WeakReference(jtc); + jtc.getCaret().setVisible(true); + } + } + } } - public void eventDispatched(AWTEvent e) { - if (! (e instanceof MouseEvent)) { - 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(); - } - } - } diff -r aa8735651b81 applemenu/src/org/netbeans/modules/applemenu/Install.java --- a/applemenu/src/org/netbeans/modules/applemenu/Install.java Wed Mar 12 16:17:46 2008 -0700 +++ b/applemenu/src/org/netbeans/modules/applemenu/Install.java Mon Aug 03 23:44:06 2009 -0400 @@ -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 { @@ -74,7 +75,8 @@ } } } - + + @Override public void uninstalled () { if (listener != null) { Toolkit.getDefaultToolkit().removeAWTEventListener(listener); diff -r aa8735651b81 applemenu/src/org/netbeans/modules/applemenu/MinimizeWindowAction.java --- a/applemenu/src/org/netbeans/modules/applemenu/MinimizeWindowAction.java Wed Mar 12 16:17:46 2008 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common - * Development and Distribution License("CDDL") (collectively, the - * "License"). You may not use this file except in compliance with the - * License. You can obtain a copy of the License at - * http://www.netbeans.org/cddl-gplv2.html - * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the - * specific language governing permissions and limitations under the - * License. When distributing the software, include this License Header - * Notice in each file and include the License file at - * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the GPL Version 2 section of the License file that - * accompanied this code. If applicable, add the following below the - * License Header, with the fields enclosed by brackets [] replaced by - * your own identifying information: - * "Portions Copyrighted [year] [name of copyright owner]" - * - * Contributor(s): - * - * The Original Software is NetBeans. The Initial Developer of the Original - * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun - * Microsystems, Inc. All Rights Reserved. - * - * If you wish your version of this file to be governed by only the CDDL - * or only the GPL Version 2, indicate your decision by adding - * "[Contributor] elects to include this software in this distribution - * under the [CDDL or GPL Version 2] license." If you do not indicate a - * single choice of license, a recipient has the option to distribute - * your version of this file under either the CDDL, the GPL Version 2 or - * to extend the choice of license to its licensees as provided above. - * However, if you add GPL Version 2 code and therefore, elected the GPL - * Version 2 license, then the option applies only if the new code is - * made subject to such option by the copyright holder. - */ - -package org.netbeans.modules.applemenu; - -import java.awt.Frame; -import java.awt.event.ActionEvent; -import javax.swing.AbstractAction; -import org.openide.windows.WindowManager; - -/** - * JDK on Mac ignores Meta-M shortcut to minimize the main window, so we need - * to define our own shortcut and assign shortcut to it. - * - * @author S. Aubrecht - */ -public class MinimizeWindowAction extends AbstractAction { - - public MinimizeWindowAction() { - } - - public void actionPerformed(ActionEvent arg0) { - WindowManager.getDefault().getMainWindow().setExtendedState(Frame.ICONIFIED); - } - -}