From 5a8f656e5c5aef3585c409549e823e918baafc6a Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Mon, 17 Apr 2017 13:02:48 +0300 Subject: [PATCH] IDEA-165950 National keyboard layouts support --- .../KeyboardSettingsExternalizable.java | 2 - .../com/intellij/diagnostic/VMOptions.java | 20 +++++++--- .../src/com/intellij/ide/IdeEventQueue.java | 5 --- .../openapi/editor/impl/EditorImpl.java | 1 - ...ternationalizationNotificationManager.java | 8 ++-- .../openapi/keymap/impl/ui/KeymapPanel.java | 40 ++++++++++++------- .../src/messages/KeyMapBundle.properties | 2 +- .../util/resources/misc/registry.properties | 6 --- 8 files changed, 44 insertions(+), 40 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java b/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java index 129f1e51d60a..0cb39cdee1a8 100644 --- a/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java +++ b/platform/platform-api/src/com/intellij/openapi/keymap/KeyboardSettingsExternalizable.java @@ -39,8 +39,6 @@ public class KeyboardSettingsExternalizable implements PersistentStateComponent< private static final String [] supportedNonEnglishLanguages = {"de", "fr", "it", "uk"}; public static boolean isSupportedKeyboardLayout(@NotNull Component component) { - if (Registry.is("ide.keyboard.dvorak")) return true; - if (SystemInfo.isMac) return false; String keyboardLayoutLanguage = getLanguageForComponent(component); for (String language : supportedNonEnglishLanguages) { if (language.equals(keyboardLayoutLanguage)) { diff --git a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java index 0b5c694a73a2..577197ac46d9 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java @@ -97,6 +97,16 @@ public class VMOptions { } public static void writeOption(@NotNull MemoryKind option, int value) { + String optionValue = option.option + value + "m"; + writeGeneralOption(option.pattern, optionValue); + } + + public static void writeOption(@NotNull String option, @NotNull String separator, @NotNull String value) { + writeGeneralOption(Pattern.compile("-D" + option + separator + "(true|false)*([a-zA-Z]*)"), "-D" + option + separator + value); + } + + + private static void writeGeneralOption(@NotNull Pattern pattern, @NotNull String value) { File file = getWriteFile(); if (file == null) { LOG.warn("VM options file not configured"); @@ -106,22 +116,20 @@ public class VMOptions { try { String content = file.exists() ? FileUtil.loadFile(file) : read(); - String optionValue = option.option + value + "m"; - if (!StringUtil.isEmptyOrSpaces(content)) { - Matcher m = option.pattern.matcher(content); + Matcher m = pattern.matcher(content); if (m.find()) { StringBuffer b = new StringBuffer(); - m.appendReplacement(b, Matcher.quoteReplacement(optionValue)); + m.appendReplacement(b, Matcher.quoteReplacement(value)); m.appendTail(b); content = b.toString(); } else { - content = StringUtil.trimTrailing(content) + SystemProperties.getLineSeparator() + optionValue; + content = StringUtil.trimTrailing(content) + SystemProperties.getLineSeparator() + value; } } else { - content = optionValue; + content = value; } if (file.exists()) { diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index 2464ea3796df..bb7fca274405 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -348,8 +348,6 @@ public class IdeEventQueue extends EventQueue { return; } - e = fixNonEnglishKeyboardLayouts(e); - e = mapEvent(e); if (Registry.is("keymap.windows.as.meta")) { e = mapMetaState(e); @@ -427,9 +425,6 @@ public class IdeEventQueue extends EventQueue { private static AWTEvent fixNonEnglishKeyboardLayouts(@NotNull AWTEvent e) { if (!(e instanceof KeyEvent)) return e; - KeyboardSettingsExternalizable externalizable = KeyboardSettingsExternalizable.getInstance(); - if (!Registry.is("ide.non.english.keyboard.layout.fix") || externalizable == null || !externalizable.isNonEnglishKeyboardSupportEnabled()) return e; - KeyEvent ke = (KeyEvent)e; switch (ke.getID()) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 8081f9fdde73..166156375518 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -928,7 +928,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (e.getKeyCode() >= KeyEvent.VK_A && e.getKeyCode() <= KeyEvent.VK_Z) { myCharKeyPressed = true; } - KeyboardInternationalizationNotificationManager.showNotification(); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java index 97070efb5053..6a6dce00d1fb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/KeyboardInternationalizationNotificationManager.java @@ -38,7 +38,7 @@ public class KeyboardInternationalizationNotificationManager { private KeyboardInternationalizationNotificationManager() { } - public static void showNotification() { +/* public static void showNotification() { Window mostRecentFocusedWindow = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); if (notificationHasBeenShown || (mostRecentFocusedWindow != null && !KeyboardSettingsExternalizable.isSupportedKeyboardLayout(mostRecentFocusedWindow))) return; @@ -48,9 +48,9 @@ public class KeyboardInternationalizationNotificationManager { Notifications.Bus.notify(createNotification(LOCALIZATION_GROUP_DISPLAY_ID, listener)); notificationHasBeenShown = true; - } + }*/ - public static Notification createNotification(@NotNull final String groupDisplayId, @Nullable NotificationListener listener) { +/* public static Notification createNotification(@NotNull final String groupDisplayId, @Nullable NotificationListener listener) { Window recentFocusedWindow = WindowManagerEx.getInstanceEx().getMostRecentFocusedWindow(); @@ -71,7 +71,7 @@ public class KeyboardInternationalizationNotificationManager { text, NotificationType.INFORMATION, listener); - } + }*/ private static class MyNotificationListener implements NotificationListener { diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java index 225e97651b04..b16d4d17b940 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java @@ -16,6 +16,7 @@ package com.intellij.openapi.keymap.impl.ui; import com.intellij.CommonBundle; +import com.intellij.diagnostic.VMOptions; import com.intellij.icons.AllIcons; import com.intellij.ide.CommonActionsManager; import com.intellij.ide.DataManager; @@ -26,6 +27,7 @@ import com.intellij.openapi.actionSystem.ex.QuickList; import com.intellij.openapi.actionSystem.ex.QuickListsManager; import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.keymap.*; import com.intellij.openapi.keymap.ex.KeymapManagerEx; import com.intellij.openapi.keymap.impl.ActionShortcutRestrictions; @@ -63,6 +65,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; @@ -115,7 +118,7 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi private JButton myCopyButton; private JButton myDeleteButton; private JButton myResetToDefault; - private JCheckBox myNonEnglishKeyboardSupportOption; + private JCheckBox preferKeyPositionOverCharOption; private JLabel myBaseKeymapLabel; @@ -132,6 +135,25 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi JPanel keymapPanel = new JPanel(new BorderLayout()); keymapPanel.add(createKeymapListPanel(), BorderLayout.NORTH); keymapPanel.add(createKeymapSettingsPanel(), BorderLayout.CENTER); + + IdeFrame ideFrame = IdeFocusManager.getGlobalInstance().getLastFocusedFrame(); + if (ideFrame != null && KeyboardSettingsExternalizable.isSupportedKeyboardLayout(ideFrame.getComponent())) { + preferKeyPositionOverCharOption = new JCheckBox(new AbstractAction(" " + KeyMapBundle.message("prefer.key.position")) { + @Override + public void actionPerformed(ActionEvent e) { + VMOptions.writeOption("com.jetbrains.use.old.keyevent.processing", "=", + Boolean.toString(preferKeyPositionOverCharOption.isSelected())); + ApplicationManager.getApplication().invokeLater( + () -> ApplicationManager.getApplication().restart(), + ModalityState.NON_MODAL + ); + } + }); + //preferKeyPositionOverCharOption.setSelected(); + preferKeyPositionOverCharOption.setBorder(new EmptyBorder(0, 0, 0, 0)); + keymapPanel.add(preferKeyPositionOverCharOption, BorderLayout.SOUTH); + } + add(keymapPanel, BorderLayout.CENTER); addPropertyChangeListener(new PropertyChangeListener() { @Override @@ -269,18 +291,6 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi gc.weightx = 1; panel.add(myDeleteButton, gc); IdeFrame ideFrame = IdeFocusManager.getGlobalInstance().getLastFocusedFrame(); - if (ideFrame != null && KeyboardSettingsExternalizable.isSupportedKeyboardLayout(ideFrame.getComponent())) - { - String displayLanguage = ideFrame.getComponent().getInputContext().getLocale().getDisplayLanguage(); - myNonEnglishKeyboardSupportOption = new JCheckBox(new AbstractAction(displayLanguage + " " + KeyMapBundle.message("use.non.english.keyboard.layout.support")) { - @Override - public void actionPerformed(ActionEvent e) { - KeyboardSettingsExternalizable.getInstance().setNonEnglishKeyboardSupportEnabled(myNonEnglishKeyboardSupportOption.isSelected()); - } - }); - myNonEnglishKeyboardSupportOption.setSelected(KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()); - panel.add(myNonEnglishKeyboardSupportOption, gc); - } myResetToDefault.addActionListener(new ActionListener() { @Override @@ -663,8 +673,8 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi @Override public void reset() { - if (myNonEnglishKeyboardSupportOption != null) { - myNonEnglishKeyboardSupportOption.setSelected(KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()); + if (preferKeyPositionOverCharOption != null) { + preferKeyPositionOverCharOption.setSelected(KeyboardSettingsExternalizable.getInstance().isNonEnglishKeyboardSupportEnabled()); } Keymap activeKeymap = KeymapManagerEx.getInstanceEx().getActiveKeymap(); diff --git a/platform/platform-resources-en/src/messages/KeyMapBundle.properties b/platform/platform-resources-en/src/messages/KeyMapBundle.properties index d6982687ae8a..9074ac465884 100644 --- a/platform/platform-resources-en/src/messages/KeyMapBundle.properties +++ b/platform/platform-resources-en/src/messages/KeyMapBundle.properties @@ -46,7 +46,7 @@ remove.keymap.label=Remo&ve unnamed.list.display.name=unnamed copy.keymap.button=&Copy delete.keymap.button=De&lete -use.non.english.keyboard.layout.support=la&yout support +prefer.key.position=Prefer key position over key char with national layout parent.keymap.label=Parent keymap: disable.mnemonic.in.menu.check.box=Disable mnemonics in &menu diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 43c12b041e0a..ad9da2645a5b 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -450,12 +450,6 @@ ide.goto.rebuild.delay.description=How many milliseconds to wait before updating ide.structural.navigation.visit.fields=false ide.structural.navigation.visit.fields.description=Whether fields should be stopped at when navigating to the nex/previous structural member by Alt+Down/Up. -ide.non.english.keyboard.layout.fix=false -ide.non.english.keyboard.layout.fix.description=Enables a fix for key codes with non-English keyboard layouts - -ide.keyboard.dvorak=false -ide.keyboard.dvorak.description=Enables Dvorak layout support if ide.non.english.keyboard.layout.fix is enabled - ide.dfa.getters.with.side.effects= ide.dfa.getters.with.side.effects.description=A regex on qualified names of methods that look like getters but are not. For Constant Conditions & Exception inspection