001: /*
002: * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package sun.awt.motif;
027:
028: import java.awt.AWTException;
029: import java.awt.Component;
030: import java.awt.Container;
031: import java.awt.Window;
032: import java.awt.peer.ComponentPeer;
033: import sun.awt.X11InputMethod;
034: import sun.awt.SunToolkit;
035:
036: /**
037: * Input Method Adapter for XIM (with Motif)
038: *
039: * @version 1.10 05/05/07
040: * @author JavaSoft International
041: */
042: public class MInputMethod extends X11InputMethod {
043:
044: public MInputMethod() throws AWTException {
045: super ();
046: }
047:
048: protected boolean openXIM() {
049: return openXIMNative();
050: }
051:
052: protected boolean createXIC() {
053: MComponentPeer peer = (MComponentPeer) getPeer(clientComponentWindow);
054: if (peer == null) {
055: return false;
056: }
057: MComponentPeer tc = null;
058: if (peer instanceof MInputMethodControl) {
059: tc = ((MInputMethodControl) peer).getTextComponent();
060: }
061: if (!createXICNative(peer, tc)) {
062: return false;
063: }
064: if (peer instanceof MInputMethodControl) {
065: ((MInputMethodControl) peer).addInputMethod(this );
066: }
067: return true;
068: }
069:
070: protected void setXICFocus(ComponentPeer peer, boolean value,
071: boolean active) {
072: setXICFocusNative((MComponentPeer) peer, value, active);
073: }
074:
075: protected Container getParent(Component client) {
076: // SECURITY: Use _NoClientCode(), because this thread may
077: // be privileged
078: return MComponentPeer.getParent_NoClientCode(client);
079: }
080:
081: /**
082: * Returns peer of the given client component. If the given client component
083: * doesn't have peer, peer of the native container of the client is returned.
084: */
085: protected ComponentPeer getPeer(Component client) {
086: MComponentPeer peer = (MComponentPeer) MToolkit
087: .targetToPeer(client);
088: if (peer != null)
089: return peer;
090:
091: Container nativeContainer = MToolkit.getNativeContainer(client);
092: peer = (MComponentPeer) MToolkit.targetToPeer(nativeContainer);
093: return peer;
094: }
095:
096: /**
097: * Changes the status area configuration that is to be requested
098: * by Frame or Dialog.
099: */
100: void configureStatus() {
101: if (isDisposed()) {
102: return;
103: }
104:
105: MComponentPeer peer = (MComponentPeer) getPeer((Window) clientComponentWindow);
106: MComponentPeer tc = ((MInputMethodControl) peer)
107: .getTextComponent();
108: if (tc != null) {
109: configureStatusAreaNative(tc);
110: }
111: }
112:
113: /*
114: * Subclasses should override disposeImpl() instead of dispose(). Client
115: * code should always invoke dispose(), never disposeImpl().
116: */
117: protected synchronized void disposeImpl() {
118: if (clientComponentWindow != null) {
119: MComponentPeer peer = (MComponentPeer) getPeer(clientComponentWindow);
120: if (peer instanceof MInputMethodControl)
121: ((MInputMethodControl) peer).removeInputMethod(this );
122: clientComponentWindow = null;
123: }
124:
125: super .disposeImpl();
126: }
127:
128: /**
129: * @see java.awt.im.spi.InputMethod#removeNotify
130: */
131: public synchronized void removeNotify() {
132: if (MToolkit.targetToPeer(getClientComponent()) != null) {
133: dispose();
134: } else {
135: // We do not have to dispose XICs in case of lightweight component.
136: resetXIC();
137: }
138: }
139:
140: /**
141: * Changes the internal XIC configurations. This is required the
142: * case that addition or elimination of text components has
143: * happened in the containment hierarchy. This method is invoked
144: * by Frame or Dialog.
145: */
146: synchronized void reconfigureXIC(MInputMethodControl control) {
147: if (!isDisposed()) {
148: // Some IM servers require to reset XIC before destroying
149: // the XIC. I.e., Destroying XIC doesn't reset the internal
150: // state of the IM server. endComposition() takes care of
151: // resetting XIC and preedit synchronization. However,
152: // there is no client at this point. It is assumed that
153: // the previous client is still available for dispatching
154: // committed text which maintains client's composition
155: // context.
156: endComposition();
157: resetXICifneeded();
158: reconfigureXICNative((MComponentPeer) control, control
159: .getTextComponent());
160: }
161: }
162:
163: protected void awtLock() {
164: SunToolkit.awtLock();
165: }
166:
167: protected void awtUnlock() {
168: SunToolkit.awtUnlock();
169: }
170:
171: /*
172: * Native methods
173: */
174: private native boolean openXIMNative();
175:
176: private native boolean createXICNative(MComponentPeer peer,
177: MComponentPeer tc);
178:
179: private native void reconfigureXICNative(MComponentPeer peer,
180: MComponentPeer tc);
181:
182: private native void configureStatusAreaNative(MComponentPeer tc);
183:
184: private native void setXICFocusNative(MComponentPeer peer,
185: boolean value, boolean active);
186: }
|