Support Mac OS X 10.6+ keyboard setting "Full Keyboard Access" in sheets emulation.

This commit is contained in:
Vassiliy
2013-07-01 23:07:17 +04:00
parent 8c164a83b2
commit 2ea665bc64
2 changed files with 37 additions and 5 deletions
@@ -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
@@ -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);
}
}