/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.keymap;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.registry.Registry;
import com.sun.istack.internal.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.awt.im.InputContext;
import java.util.Locale;
/**
* @author Denis Fokin
*/
@State(
name = "KeyboardSettings",
storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/keyboard.xml")}
)
public class KeyboardSettingsExternalizable implements PersistentStateComponent<KeyboardSettingsExternalizable.OptionSet> {
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)) {
return true;
}
}
return false;
}
@Nullable
public static String getLanguageForComponent(@NotNull Component component) {
final Locale locale = getLocaleForComponent(component);
return locale == null ? null : locale.getLanguage();
}
@Nullable
protected static Locale getLocaleForComponent(@NotNull Component component) {
final InputContext context = component.getInputContext();
return context == null ? null : context.getLocale();
}
@Nullable
public static String getDisplayLanguageNameForComponent(@NotNull Component component) {
final Locale locale = getLocaleForComponent(component);
return locale == null ? null : locale.getDisplayLanguage();
}
public static final class OptionSet {
public boolean USE_NON_ENGLISH_KEYBOARD = false;
}
private OptionSet myOptions = new OptionSet();
public static KeyboardSettingsExternalizable getInstance() {
if (ApplicationManager.getApplication().isDisposed()) {
return new KeyboardSettingsExternalizable();
}
else {
return ServiceManager.getService(KeyboardSettingsExternalizable.class);
}
}
@Nullable
@Override
public OptionSet getState() {
return myOptions;
}
@Override
public void loadState(OptionSet state) {
myOptions = state;
}
public boolean isUkrainianKeyboard (Component c) {
return c!=null && "uk".equals(c.getInputContext().getLocale().getLanguage());
}
public boolean isNonEnglishKeyboardSupportEnabled () {
return myOptions.USE_NON_ENGLISH_KEYBOARD;
}
public void setNonEnglishKeyboardSupportEnabled (boolean enabled) {
myOptions.USE_NON_ENGLISH_KEYBOARD = enabled;
}
}