blob: 86df2073d6d9167fd93e0abc2db265dd5be9b9da [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.awt.X11;
27
28import java.awt.AWTException;
29import java.awt.Component;
30import java.awt.Container;
31import java.awt.Rectangle;
32import java.awt.im.spi.InputMethodContext;
33import java.awt.peer.ComponentPeer;
34import sun.awt.X11InputMethod;
35
36import java.util.logging.*;
37
38/**
39 * Input Method Adapter for XIM (without Motif)
40 *
41 * @author JavaSoft International
42 */
43public class XInputMethod extends X11InputMethod {
44 private static final Logger log = Logger.getLogger("sun.awt.X11.XInputMethod");
45
46 public XInputMethod() throws AWTException {
47 super();
48 }
49
50 public void setInputMethodContext(InputMethodContext context) {
51 context.enableClientWindowNotification(this, true);
52 }
53
54 public void notifyClientWindowChange(Rectangle location) {
55 XComponentPeer peer = (XComponentPeer)getPeer(clientComponentWindow);
56 if (peer != null) {
57 adjustStatusWindow(peer.getContentWindow());
58 }
59 }
60
61 protected boolean openXIM() {
62 return openXIMNative(XToolkit.getDisplay());
63 }
64
65 protected boolean createXIC() {
66 XComponentPeer peer = (XComponentPeer)getPeer(clientComponentWindow);
67 if (peer == null) {
68 return false;
69 }
70 return createXICNative(peer.getContentWindow());
71 }
72
73
74 private static volatile long xicFocus = 0;
75
76 protected void setXICFocus(ComponentPeer peer,
77 boolean value, boolean active) {
78 if (peer == null) {
79 return;
80 }
81 xicFocus = ((XComponentPeer)peer).getContentWindow();
82 setXICFocusNative(((XComponentPeer)peer).getContentWindow(),
83 value,
84 active);
85 }
86
87 public static long getXICFocus() {
88 return xicFocus;
89 }
90
91/* XAWT_HACK FIX ME!
92 do NOT call client code!
93*/
94 protected Container getParent(Component client) {
95 return client.getParent();
96 }
97
98 /**
99 * Returns peer of the given client component. If the given client component
100 * doesn't have peer, peer of the native container of the client is returned.
101 */
102 protected ComponentPeer getPeer(Component client) {
103 XComponentPeer peer;
104
105 if (log.isLoggable(Level.FINE)) log.fine("Client is " + client);
106 peer = (XComponentPeer)XToolkit.targetToPeer(client);
107 while (client != null && peer == null) {
108 client = getParent(client);
109 peer = (XComponentPeer)XToolkit.targetToPeer(client);
110 }
111 log.log(Level.FINE, "Peer is {0}, client is {1}", new Object[] {peer, client});
112
113 if (peer != null)
114 return peer;
115
116 return null;
117 }
118
119 /*
120 * Subclasses should override disposeImpl() instead of dispose(). Client
121 * code should always invoke dispose(), never disposeImpl().
122 */
123 protected synchronized void disposeImpl() {
124 super.disposeImpl();
125 clientComponentWindow = null;
126 }
127
128 protected void awtLock() {
129 XToolkit.awtLock();
130 }
131
132 protected void awtUnlock() {
133 XToolkit.awtUnlock();
134 }
135
136 long getCurrentParentWindow() {
137 return (long)((XWindow)clientComponentWindow.getPeer()).getContentWindow();
138 }
139
140 /*
141 * Native methods
142 */
143 private native boolean openXIMNative(long display);
144 private native boolean createXICNative(long window);
145 private native void setXICFocusNative(long window,
146 boolean value, boolean active);
147 private native void adjustStatusWindow(long window);
148}