Revision: 1793 http://svn.sourceforge.net/vexi/?rev=1793&view=rev Author: mkpg2 Date: 2007-04-08 00:25:35 -0700 (Sun, 08 Apr 2007)
Log Message: ----------- Feature. InputMethodListener (for languages which aren't trivial to type, chinese, japanese ...etc.) Modified Paths: -------------- core/trunk/org.vexi.core/src/org/vexi/plat/AWT.java Modified: core/trunk/org.vexi.core/src/org/vexi/plat/AWT.java =================================================================== --- core/trunk/org.vexi.core/src/org/vexi/plat/AWT.java 2007-04-08 07:18:44 UTC (rev 1792) +++ core/trunk/org.vexi.core/src/org/vexi/plat/AWT.java 2007-04-08 07:25:35 UTC (rev 1793) @@ -31,6 +31,8 @@ import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.InputEvent; +import java.awt.event.InputMethodEvent; +import java.awt.event.InputMethodListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; @@ -40,6 +42,8 @@ import java.awt.event.MouseWheelListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import java.awt.font.TextHitInfo; +import java.awt.im.InputMethodRequests; import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.awt.image.ImageObserver; @@ -47,6 +51,8 @@ import java.awt.image.PixelGrabber; import java.io.File; import java.io.InputStream; +import java.text.AttributedCharacterIterator; +import java.text.AttributedCharacterIterator.Attribute; import org.ibex.js.JS; import org.ibex.util.InputStreamToByteArray; @@ -319,7 +325,7 @@ protected static class AWTSurface extends Surface.DoubleBufferedSurface - implements MouseListener, MouseMotionListener, MouseWheelListener, KeyListener, ComponentListener, WindowListener { + implements MouseListener, MouseMotionListener, MouseWheelListener, KeyListener, ComponentListener, WindowListener, InputMethodListener { public void blit(PixelBuffer s, int sx, int sy, int dx, int dy, int dx2, int dy2) { discoverInsets(); @@ -375,6 +381,14 @@ refreshFromBackbuffer(r.x - leftInset, r.y - topInset, r.width, r.height); } + + public InputMethodRequests getInputMethodRequests() { + // REMARK - Inexplicatbly, in the case of SKIM on kubuntu + // - at least - this cannot be the same object each time as it + // causes the scim input window to close and reopen + // everytime a key is typed + return new IMRequests(); + } } class InnerWindow extends Window { @@ -386,8 +400,30 @@ Rectangle r = gr.getClipBounds(); refreshFromBackbuffer(r.x - leftInset, r.y - topInset, r.width, r.height); } + public InputMethodRequests getInputMethodRequests() { + // REMARK - Inexplicatbly, in the case of SKIM on kubuntu + // - at least - this cannot be the same object each time as it + // causes the scim input window to close and reopen + // everytime a key is typed + return new IMRequests();//imRequests; + } } - + + // REMARK + // A dummy implementation - doesn't do anything + // It is required for the InputMethodListening to work ... + //static InputMethodRequests imRequests = new IMRequests(); + + static class IMRequests implements InputMethodRequests{ + public AttributedCharacterIterator cancelLatestCommittedText(Attribute[] attributes) {return null;} + public AttributedCharacterIterator getCommittedText(int beginIndex, int endIndex, Attribute[] attributes) {return null;} + public int getCommittedTextLength() {return 0;} + public int getInsertPositionOffset() {return 0;} + public TextHitInfo getLocationOffset(int x, int y) {return null;} + public AttributedCharacterIterator getSelectedText(Attribute[] attributes) {return null;} + public Rectangle getTextLocation(TextHitInfo offset) {return null;} + } + private void discoverInsets() { Insets i = (frame == null ? window : frame).getInsets(); if (leftInset == i.left && topInset == i.top && bottomInset == i.bottom && rightInset == i.right) @@ -446,7 +482,10 @@ window.addMouseMotionListener(this); window.addMouseWheelListener(this); window.addWindowListener(this); - + window.addInputMethodListener(this); + window.getInputContext().setCompositionEnabled(false); + //window.add + // IMPORTANT: this must be called before render() to ensure // that our peer has been created makeVisible(); @@ -464,6 +503,7 @@ window.removeComponentListener(this); window.removeMouseMotionListener(this); window.removeWindowListener(this); + window.removeInputMethodListener(this); window.dispose(); } @@ -590,6 +630,39 @@ // TODO Auto-generated method stub throw new Error("FIXME: not yet implemented"); } + public void caretPositionChanged(InputMethodEvent event) {} + public void inputMethodTextChanged(InputMethodEvent event) { + AttributedCharacterIterator aci= event.getText(); + if(aci==null)return; + char c = aci.first(); + + int limit = event.getCommittedCharacterCount(); + // HACK - (skim on Kubuntu) the control that is pressed to + // initiate the input when it is released no event is ever + // sent as skim must be interfering with the keylistening + if(limit>=1){ + // TODO -Add a specific event type to do this ... + // as a single scheduled instance. + KeyReleased("control"); + KeyReleased("shift"); + } + for(int i=0; c!=aci.DONE && i<limit; i++){ + //System.out.println(c); + String s = ""+c; + //System.out.println(s); + KeyPressed(s); + KeyReleased(s); + c = aci.next(); + } + //System.out.println(window.getInputContext().getInputMethodControlObject().getClass()); + //while(aci.) + /*AttributedCharacterIterator aci = event.getText(); + for(int i=0; i<event.getCommittedCharacterCount(); i++){ + aci.setIndex(i); + System.out.println(aci.next()); + }*/ + //System.out.println(event.paramString()); + } } protected void _decodeJPEG(InputStream is, Picture p) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn