home *** CD-ROM | disk | FTP | other *** search
- package sun.awt.im;
-
- import java.awt.Canvas;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Point;
- import java.awt.Rectangle;
- import java.awt.Toolkit;
- import java.awt.Window;
- import java.awt.event.InputMethodEvent;
- import java.awt.event.InputMethodListener;
- import java.awt.font.TextHitInfo;
- import java.awt.font.TextLayout;
- import java.awt.im.InputMethodRequests;
- import java.text.AttributedCharacterIterator;
-
- public class CompositionArea extends Canvas implements InputMethodListener {
- private CompositionAreaHandler handler;
- private TextLayout composedTextLayout;
- private TextHitInfo caret = null;
- private Window compositionWindow;
- private static final int TEXT_ORIGIN_X = 5;
- private static final int TEXT_ORIGIN_Y = 15;
-
- CompositionArea() {
- String var1 = Toolkit.getProperty("AWT.CompositionWindowTitle", "Input Window");
- this.compositionWindow = InputMethodContext.createInputMethodWindow(var1, (InputContext)null);
- ((Component)this).setSize(480, 18);
- ((Component)this).setForeground(Color.black);
- ((Component)this).setBackground(Color.white);
- ((Component)this).enableInputMethods(true);
- ((Component)this).enableEvents(8L);
- this.compositionWindow.add(this);
- this.compositionWindow.addWindowListener(new FrameWindowAdapter(this));
- ((Component)this).addInputMethodListener(this);
- this.compositionWindow.enableInputMethods(false);
- this.compositionWindow.pack();
- Dimension var2 = this.compositionWindow.getSize();
- Dimension var3 = ((Component)this).getToolkit().getScreenSize();
- this.compositionWindow.setLocation(var3.width - var2.width - 20, var3.height - var2.height - 100);
- this.compositionWindow.setVisible(false);
- }
-
- synchronized void setHandlerInfo(CompositionAreaHandler var1, InputContext var2) {
- this.handler = var1;
- ((InputMethodWindow)this.compositionWindow).setInputContext(var2);
- }
-
- public InputMethodRequests getInputMethodRequests() {
- return this.handler;
- }
-
- private Rectangle getCaretRectangle(TextHitInfo var1) {
- int var2 = 0;
- TextLayout var3 = this.composedTextLayout;
- if (var3 != null) {
- var2 = Math.round(var3.getCaretInfo(var1)[0]);
- }
-
- Graphics var4 = ((Component)this).getGraphics();
- Object var5 = null;
-
- try {
- var10 = var4.getFontMetrics();
- } finally {
- var4.dispose();
- }
-
- return new Rectangle(5 + var2, 15 - var10.getAscent(), 0, var10.getAscent() + var10.getDescent());
- }
-
- public void paint(Graphics var1) {
- super.paint(var1);
- var1.setColor(((Component)this).getForeground());
- TextLayout var2 = this.composedTextLayout;
- if (var2 != null) {
- var2.draw((Graphics2D)var1, 5.0F, 15.0F);
- }
-
- if (this.caret != null) {
- Rectangle var3 = this.getCaretRectangle(this.caret);
- var1.setXORMode(((Component)this).getBackground());
- var1.fillRect(var3.x, var3.y, 1, var3.height);
- var1.setPaintMode();
- }
-
- }
-
- public void inputMethodTextChanged(InputMethodEvent var1) {
- this.handler.inputMethodTextChanged(var1);
- }
-
- public void caretPositionChanged(InputMethodEvent var1) {
- this.handler.caretPositionChanged(var1);
- }
-
- void setText(AttributedCharacterIterator var1, TextHitInfo var2) {
- this.composedTextLayout = null;
- if (var1 == null) {
- this.compositionWindow.setVisible(false);
- this.caret = null;
- } else {
- Graphics var3 = ((Component)this).getGraphics();
- Object var4 = null;
-
- try {
- var16 = ((Graphics2D)var3).getFontRenderContext();
- } finally {
- var3.dispose();
- }
-
- this.composedTextLayout = new TextLayout(var1, var16);
- this.caret = var2;
- this.updateWindowLocation();
- if (!this.compositionWindow.isVisible()) {
- this.compositionWindow.setVisible(true);
- }
-
- var3 = ((Component)this).getGraphics();
-
- try {
- this.paint(var3);
- } finally {
- var3.dispose();
- }
- }
-
- }
-
- void setCaret(TextHitInfo var1) {
- this.caret = var1;
- if (this.compositionWindow.isVisible()) {
- Graphics var2 = ((Component)this).getGraphics();
-
- try {
- this.paint(var2);
- } finally {
- var2.dispose();
- }
- }
-
- }
-
- void updateWindowLocation() {
- InputMethodRequests var1 = this.handler.getClientInputMethodRequests();
- if (var1 != null) {
- Point var2 = new Point();
- Rectangle var3 = var1.getTextLocation((TextHitInfo)null);
- Dimension var4 = Toolkit.getDefaultToolkit().getScreenSize();
- Dimension var5 = this.compositionWindow.getSize();
- if (var3.x + var5.width > var4.width) {
- var2.x = var4.width - var5.width;
- } else {
- var2.x = var3.x;
- }
-
- if (var3.y + var3.height + 2 + var5.height > var4.height) {
- var2.y = var3.y - 2 - var5.height;
- } else {
- var2.y = var3.y + var3.height + 2;
- }
-
- this.compositionWindow.setLocation(var2);
- }
- }
-
- Rectangle getTextLocation(TextHitInfo var1) {
- Rectangle var2 = this.getCaretRectangle(var1);
- Point var3 = ((Component)this).getLocationOnScreen();
- var2.translate(var3.x, var3.y);
- return var2;
- }
-
- TextHitInfo getLocationOffset(int var1, int var2) {
- TextLayout var3 = this.composedTextLayout;
- if (var3 == null) {
- return null;
- } else {
- Point var4 = ((Component)this).getLocationOnScreen();
- var1 -= var4.x + 5;
- var2 -= var4.y + 15;
- return var3.getBounds().contains((double)var1, (double)var2) ? var3.hitTestChar((float)var1, (float)var2) : null;
- }
- }
- }
-