diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java index 4ce6c80d60e5..2de6e2bcc31d 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java @@ -32,6 +32,7 @@ import com.intellij.openapi.wm.WindowManager; import com.intellij.ui.*; import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.mac.MacMessages; +import com.intellij.ui.mac.foundation.MacUtil; import com.intellij.util.Alarm; import com.intellij.util.Function; import com.intellij.util.PairFunction; @@ -45,9 +46,7 @@ import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.JTextComponent; import javax.swing.text.html.HTMLEditorKit; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; +import java.awt.event.*; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -1025,6 +1024,7 @@ public class Messages { setButtonsAlignment(SwingConstants.CENTER); setDoNotAskOption(doNotAskOption); init(); + MacUtil.adjustFocusTraversal(myDisposable); } @NotNull diff --git a/platform/util/src/com/intellij/ui/mac/foundation/MacUtil.java b/platform/util/src/com/intellij/ui/mac/foundation/MacUtil.java index 64ddda5e3239..092a36b8b726 100644 --- a/platform/util/src/com/intellij/ui/mac/foundation/MacUtil.java +++ b/platform/util/src/com/intellij/ui/mac/foundation/MacUtil.java @@ -15,11 +15,18 @@ */ package com.intellij.ui.mac.foundation; +import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.SystemInfo; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.text.JTextComponent; import java.awt.*; +import java.awt.event.AWTEventListener; +import java.awt.event.KeyEvent; import static com.intellij.ui.mac.foundation.Foundation.invoke; import static com.intellij.ui.mac.foundation.Foundation.toStringViaUTF8; @@ -103,6 +110,31 @@ public class MacUtil { public static synchronized void startModal(JComponent component) { startModal(component, MAC_NATIVE_WINDOW_SHOWING); } - - + + public static boolean isFullKeyboardAccessEnabled() { + return SystemInfo.isMacOSSnowLeopard + && invoke(invoke("NSApplication", "sharedApplication"), "isFullKeyboardAccessEnabled").intValue() == 1; + } + + public static void adjustFocusTraversal(@NotNull Disposable disposable) { + if (!SystemInfo.isMacOSSnowLeopard) return; + final AWTEventListener listener = new AWTEventListener() { + @Override + public void eventDispatched(AWTEvent event) { + if (event instanceof KeyEvent + && ((KeyEvent)event).getKeyCode() == KeyEvent.VK_TAB + && (!(event.getSource() instanceof JTextComponent)) + && (!(event.getSource() instanceof JList)) + && !isFullKeyboardAccessEnabled()) + ((KeyEvent)event).consume(); + } + }; + Disposer.register(disposable, new Disposable() { + @Override + public void dispose() { + Toolkit.getDefaultToolkit().removeAWTEventListener(listener); + } + }); + Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK); + } }