📄 inputcontext.java
字号:
/* InputContext.java -- provides the context for text input Copyright (C) 2002, 2003 Free Software Foundation, Inc.This file is part of GNU Classpath.GNU Classpath is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Classpath is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Classpath; see the file COPYING. If not, write to theFree Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307 USA.Linking this library statically or dynamically with other modules ismaking a combined work based on this library. Thus, the terms andconditions of the GNU General Public License cover the wholecombination.As a special exception, the copyright holders of this library give youpermission to link this library with independent modules to produce anexecutable, regardless of the license terms of these independentmodules, and to copy and distribute the resulting executable underterms of your choice, provided that you also meet, for each linkedindependent module, the terms and conditions of the license of thatmodule. An independent module is a module which is not derived fromor based on this library. If you modify this library, you may extendthis exception to your version of the library, but you are notobligated to do so. If you do not wish to do so, delete thisexception statement from your version. */package java.awt.im;import java.awt.AWTEvent;import java.awt.AWTException;import java.awt.Component;import java.awt.im.spi.InputMethod;import java.awt.im.spi.InputMethodDescriptor;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.IOException;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.Enumeration;import java.util.HashMap;import java.util.Locale;import gnu.java.util.EmptyEnumeration;/** * Provides a context for controlling input methods and keyboard layouts. * This class provides the communication layer between the client component, * and the various locale-dependent text entry input methods that can be used * for the client. By default, there is one instance per Window, shared among * all components, but this limits text entry to one component at a time. * Thus, text components can create their own instance to allow text entry * in multiple components at a time. * * <p>By using the interfaces of {@link java.awt.im.spi}, you can install * extensions which allow additional input methods. Some of these may use * platform native input methods, or keyboard layouts provided by the platform. * Input methods are unavailable if none have been installed and the platform * has no underlying native input methods. Extensions are installed as jar * files, usually accessed in the default extension location or specified by * the -extdir VM flag. The jar must contain a file named * "META_INF/services/java.awt.im.spi.InputMethodDescriptor" which lists, * one entry per line in UTF-8 encoding, each class in the jar that implements * java.awt.im.spi.InputMethodDescriptor. * * @author Eric Blake <ebb9@email.byu.edu> * @see Component#getInputContext() * @see Component#enableInputMethods(boolean) * @since 1.2 * @status updated to 1.4, but unverified */public class InputContext{ /** * The list of installed input method descriptors. */ private static final ArrayList descriptors = new ArrayList(); static { Enumeration enum; try { enum = ClassLoader.getSystemResources ("META_INF/services/java.awt.im.spi.InputMethodDescriptor"); } catch (IOException ex) { // XXX Should we do something else? enum = EmptyEnumeration.getInstance(); } while (enum.hasMoreElements()) { URL url = (URL) enum.nextElement(); BufferedReader in; String line; try { in = new BufferedReader (new InputStreamReader(url.openConnection().getInputStream(), "UTF-8")); line = in.readLine().trim(); } catch (IOException ignored) { continue; } outer: while (line != null) { try { if (line.charAt(0) != '#') { Class c = Class.forName(line); descriptors.add((InputMethodDescriptor) c.newInstance()); } line = in.readLine().trim(); } catch (IOException e) { continue outer; } catch (Exception ignored) { } } } } /** The current input method; null if no input methods are installed. */ private InputMethod im; /** Map of locales to the most recently selected input method. */ private final HashMap recent = new HashMap(); /** The list of acceptable character subsets. */ private Character.Subset[] subsets; /** * Construct an InputContext. This is protected, so clients must use * {@link #getInstance()} instead. */ protected InputContext() { } /** * Returns a new InputContext. * * @return a new instance, initialized to the default locale if available */ public static InputContext getInstance() { InputContext ic = new InputContext(); ic.selectInputMethod(Locale.getDefault()); return ic; } /** * Attempts to select an input method or keyboard layout which supports the * given locale. This returns true if a locale is available and was selected. * The following steps are taken in choosing an input method:<ul> * <li>If the currently selected input method or keyboard layout supports * the requested locale, it remains selected.</li> * <li>If there is no input method or keyboard layout available that * supports the requested locale, the current input method or keyboard * layout remains selected.</li> * <li>If the user has previously selected an input method or keyboard * layout for the requested locale from the user interface, then the most * recently selected such input method or keyboard layout is reselected.</li> * <li>Otherwise, an input method or keyboard layout that supports the * requested locale is selected in an implementation dependent way. This * implementation chooses the first input method which supports the requested * locale based on the InputMethodDescriptors loaded from the extensions * installed on the CLASSPATH.</li> * </ul> * * <p>Before switching away from an input method, any currently uncommitted * text is committed. Not all host operating systems provide API to * determine the locale of the currently selected native input method or * keyboard layout, and to select a native input method or keyboard layout * by locale. For host operating systems that don't provide such API, * selectInputMethod assumes that native input methods or keyboard layouts * provided by the host operating system support only the system's default * locale. * * <p>An example of where this may be called is in a multi-language document, * when moving the insertion point between sections of different locale, so * that the user may use the input method appropriate to that section of the * document. * * @param locale the desired new locale * @return true if the new locale is active * @throws NullPointerException if locale is null */ public boolean selectInputMethod(Locale locale) { if (im != null && im.setLocale(locale)) { recent.put(locale, im); return true; } InputMethod next = (InputMethod) recent.get(locale); outer: if (next != null) for (int i = 0, limit = descriptors.size(); i < limit; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -