/*
* @(#)InputContext.java 1.15 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*
*/
package sun.awt.im;
import java.awt.Component;
import java.util.Locale;
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.ComponentEvent;
//import sun.awt.SunToolkit;
/**
* An InputContext object manages the communication between text editing
* components and input methods. It dispatches events between them, and
* forwards requests for information from the input method to the text
* editing component.
*
* <p>
* By default, one InputContext instance is created per Window instance,
* and this input context is shared by all components within the window's
* container hierarchy. However, this means that only one text input
* operation is possible at any one time within a window, and that the
* text needs to be committed when moving the focus from one text component
* to another. If this is not desired, text components can create their
* own input context instances.
*
* @see java.awt.Component#getInputContext
* @version 1.10, 08/19/02
* @author Sun Microsystems, Inc.
*/
public class InputContext extends java.awt.im.InputContext {
private InputMethod inputMethod;
private boolean inputMethodCreationFailed;
private Component currentClientComponent;
/**
* Constructs an InputContext.
*/
protected InputContext() {}
/**
* Dispatches an event to the active input method. Called by AWT.
*
* @param event The event
*/
public synchronized void dispatchEvent(AWTEvent event) {
InputMethod inputMethod = getInputMethod();
int id = event.getID();
switch (id) {
case ComponentEvent.COMPONENT_HIDDEN:
dispose();
currentClientComponent = null;
break;
case FocusEvent.FOCUS_GAINED:
activate((Component) event.getSource());
if (inputMethod != null)
inputMethod.dispatchEvent(event);
break;
case FocusEvent.FOCUS_LOST:
if (inputMethod != null)
inputMethod.dispatchEvent(event);
deactivate((Component) event.getSource());
break;
default:
if (inputMethod != null)
inputMethod.dispatchEvent(event);
}
}
/**
* Activates input context for the given component. If the input
* context previously was active for a different component and there
* is uncommitted text for that component, the text is committed.
* Called by AWT when the keyboard focus moves to the component.
*
* @param client The client component into which text is entered.
*/
synchronized void activate(Component client) {
currentClientComponent = client;
if (inputMethod != null) {
if (inputMethod instanceof InputMethodAdapter) {
((InputMethodAdapter) inputMethod).setClientComponent(client);
}
inputMethod.activate();
}
}
/**
* Deactivates input context for the given component. Called by AWT
* when the keyboard focus moves away from the component.
*
* @param target The component into which text was entered.
*/
synchronized void deactivate(Component client) {
if (inputMethod != null) {
inputMethod.deactivate();
}
currentClientComponent = null;
}
/**
* Returns the client component.
*/
Component getClientComponent() {
Component client = currentClientComponent;
return client;
}
/**
* Disposes of the input context and release the resources used by it.
* Called by AWT.
*/
public void dispose() {
if (inputMethod != null) {
inputMethod.dispose();
inputMethod = null;
}
}
InputMethod getInputMethod() {
if (inputMethod != null) {
return inputMethod;
}
if (inputMethodCreationFailed) {
return null;
}
inputMethodCreationFailed = true;
/***
** try {
** Toolkit toolkit = Toolkit.getDefaultToolkit();
** inputMethod = ((SunToolkit) toolkit).getInputMethodAdapter();
** } catch (Exception e) {
** // there are a number of bad things that can happen while creating
** // the input method. In any case, we just continue without an
** // input method.
** inputMethodCreationFailed = true;
** }
** if (inputMethod != null) {
** inputMethod.setInputContext((InputMethodContext)this);
** }
***/
return inputMethod;
}
public boolean selectInputMethod(Locale locale) {
if (locale == null)
throw new NullPointerException("Locale is null");
return false;
}
boolean compositionEnabled = false;
public void setCompositionEnabled(boolean enable) {
compositionEnabled = enable;
}
public boolean isCompositionEnabled() {
return compositionEnabled;
}
public void removeNotify(Component client) {
if (client == null)
throw new NullPointerException("Component is null");
}
}