import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Label;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.InputMethodEvent;
import java.awt.event.KeyEvent;
import java.awt.im.spi.InputMethod;
import java.awt.im.spi.InputMethodContext;
import java.awt.im.spi.InputMethodDescriptor;
import java.text.AttributedString;
import java.util.Locale;
public class SimpleInputMethod implements InputMethod {
private static Window statusWindow;
private InputMethodContext inputMethodContext;
private Locale locale;
public SimpleInputMethod() {
locale = new Locale("iw", "IL");
}
public void activate() {
if (!statusWindow.isVisible()) {
statusWindow.setVisible(true);
}
}
public void deactivate(boolean isTemporary) {
}
public void dispatchEvent(AWTEvent event) {
if (event.getID() == KeyEvent.KEY_TYPED) {
KeyEvent e = (KeyEvent) event;
if (handleCharacter(e.getKeyChar())) {
e.consume();
}
}
}
public void dispose() {
}
public void endComposition() {
}
public Object getControlObject() {
return null;
}
public Locale getLocale() {
return locale;
}
public void hideWindows() {
statusWindow.setVisible(false);
}
public boolean isCompositionEnabled() {
return true;
}
public void removeNotify() {
}
public void setCharacterSubsets(Character.Subset[] subsets) {
}
public void setCompositionEnabled(boolean enable) {
throw new UnsupportedOperationException();
}
public void notifyClientWindowChange(Rectangle location) {
}
public void reconvert() {
throw new UnsupportedOperationException();
}
public void setInputMethodContext(InputMethodContext context) {
inputMethodContext = context;
if (statusWindow == null) {
statusWindow = context.createInputMethodWindow("Simple Input Method", false);
Label label = new Label();
label.setText(locale.getDisplayName());
statusWindow.add(label);
label.setSize(200, 50);
statusWindow.add(label);
statusWindow.pack();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
statusWindow.setLocation(d.width - statusWindow.getWidth(), d.height
- statusWindow.getHeight());
}
}
public boolean setLocale(Locale locale) {
return (locale.equals(this.locale));
}
private boolean handleCharacter(char ch) {
switch (ch) {
case 'a':
write('\u05D0');
return true;
case 'b':
write('\u05D1');
return true;
}
return false;
}
private void write(char ch) {
AttributedString as = new AttributedString(String.valueOf(ch));
inputMethodContext.dispatchInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, as
.getIterator(), 1, null, null);
}
}
class SimpleInputMethodDescriptor implements InputMethodDescriptor {
private static Locale HEBREW = new Locale("iw", "IL");
public SimpleInputMethodDescriptor() {
}
public InputMethod createInputMethod() throws Exception {
return new SimpleInputMethod();
}
public Locale[] getAvailableLocales() {
Locale[] locales = { HEBREW };
return locales;
}
public boolean hasDynamicLocaleList() {
return false;
}
public String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) {
return "Hebrew Input Method";
}
public Image getInputMethodIcon(Locale inputLocale) {
return null;
}
}