VisClient/org/hfbk/vis/visnode/VisKeyboard.java

Go to the documentation of this file.
00001 package org.hfbk.vis.visnode;
00002 
00003 import java.awt.AWTEvent;
00004 import java.awt.AWTException;
00005 import java.awt.Component;
00006 import java.awt.Container;
00007 import java.awt.Frame;
00008 import java.awt.Robot;
00009 import java.awt.event.KeyEvent;
00010 import java.awt.event.MouseAdapter;
00011 import java.awt.event.MouseEvent;
00012 import java.awt.event.MouseListener;
00013 import java.util.HashMap;
00014 import java.util.List;
00015 
00016 import org.dronus.gl.GLFont;
00017 import org.dronus.gl.GLTextPanel;
00018 import org.dronus.gl.GLUtil;
00019 import org.hfbk.vis.Prefs;
00020 import org.lwjgl.opengl.GL11;
00021 import org.lwjgl.util.vector.Vector3f;
00022 
00044 public class VisKeyboard extends VisNode implements VisUI{
00045 
00052         Component focus;
00053         
00054         Robot keybot; //for key automation on OS layer.
00055                                 //this is much more convenient than
00056                                 //using the internal message system 
00057                                 //as the keys-to-char mapping is 
00058                                 //quite complicated and OS governed.
00059 
00060         public boolean enabled=true;
00061         
00062         boolean registered=false;       
00063         
00067         class VisKey extends VisNodeMousable{
00068 
00069                 GLTextPanel tp;
00070                 int keycode;
00071                 public VisKey(String key, int keycode, Vector3f position) {
00072                         super(null, position);
00073                         tp=new GLTextPanel(key,0,0);
00074                         w=Math.max(1f,tp.w/2); h=1;
00075                         this.keycode=keycode;                   
00076                 }
00077                 
00078                 void handleEvent(VisMouseEvent evt) {
00079                         //if (evt.getID()==MouseEvent.MOUSE_CLICKED || evt.getID()==MouseEvent.MOUSE_DRAGGED)
00080                         if (evt.getID()==MouseEvent.MOUSE_CLICKED )
00081                                 handleKey(keycode);
00082                 }
00083 
00084                 void renderSelf() {
00085                         
00086                         GL11.glDisable(GL11.GL_TEXTURE_2D);
00087                         GL11.glColor4f(.3f,.3f,.3f,.9f);
00088                         GL11.glPolygonOffset(1, 1);
00089                         GLUtil.renderQuad(-w/2, -h/2,w/2,h/2);
00090                         
00091                         GL11.glPolygonOffset(0, 0);                     
00092                         GL11.glColor3f(1,1,1);                  
00093                         GLFont.getDefault().render();                   
00094                         GL11.glTranslatef(-tp.w/4,-tp.h/3,0);
00095                         GL11.glScalef(.4f,.8f,.4f);                     
00096                         tp.render();
00097                 }
00098                 
00099         }
00100         
00101 
00103         static final int NEXTROW=-1;
00104         
00106         static int[] keylayout=new int[]{
00107                         KeyEvent.VK_ESCAPE,     KeyEvent.VK_1, KeyEvent.VK_2, KeyEvent.VK_3, KeyEvent.VK_4,KeyEvent.VK_5, 
00108                                 KeyEvent.VK_6, KeyEvent.VK_7,   KeyEvent.VK_8, KeyEvent.VK_9,KeyEvent.VK_0,
00109                                 KeyEvent.VK_BACK_SPACE, NEXTROW,
00110         
00111                         KeyEvent.VK_TAB, KeyEvent.VK_Q, KeyEvent.VK_W,  KeyEvent.VK_E,  KeyEvent.VK_R,  KeyEvent.VK_T,  KeyEvent.VK_Z,
00112                                 KeyEvent.VK_U,  KeyEvent.VK_I,  KeyEvent.VK_O,  KeyEvent.VK_P,  KeyEvent.VK_PLUS, NEXTROW,
00113                         
00114                         KeyEvent.VK_CAPS_LOCK,KeyEvent.VK_A,KeyEvent.VK_S,KeyEvent.VK_D,KeyEvent.VK_F,KeyEvent.VK_G,KeyEvent.VK_H,
00115                                 KeyEvent.VK_J,KeyEvent.VK_K,KeyEvent.VK_L,KeyEvent.VK_ENTER,NEXTROW,
00116                         
00117                         KeyEvent.VK_LESS,KeyEvent.VK_Y, KeyEvent.VK_X,  KeyEvent.VK_C,  KeyEvent.VK_V,  KeyEvent.VK_B, KeyEvent.VK_N,
00118                                 KeyEvent.VK_M,  KeyEvent.VK_COMMA,      KeyEvent.VK_PERIOD,     KeyEvent.VK_MINUS, NEXTROW,
00119                         
00120                         KeyEvent.VK_SPACE
00121         };
00124         static HashMap <Integer,String> keytexts= new HashMap<Integer,String>();
00125         static{
00126                 keytexts.put(KeyEvent.VK_TAB,"|<-->|");
00127                 keytexts.put(KeyEvent.VK_LESS,"< >");
00128                 keytexts.put(KeyEvent.VK_ENTER,"ENTER");
00129                 keytexts.put(KeyEvent.VK_PLUS,"+ *");
00130                 keytexts.put(KeyEvent.VK_BACK_SPACE,"<-");              
00131                 keytexts.put(KeyEvent.VK_COMMA,",");
00132                 keytexts.put(KeyEvent.VK_PERIOD,".");
00133                 keytexts.put(KeyEvent.VK_MINUS,"-");
00134                 keytexts.put(KeyEvent.VK_CAPS_LOCK,"^");
00135                 keytexts.put(KeyEvent.VK_SPACE,"                                           ");
00136         }
00137         
00138         public VisKeyboard() {
00139                 super(null, new Vector3f(-6,3,-13));
00140                 try {
00141                         keybot=new Robot();
00142                 } catch (AWTException e) {                      
00143                         e.printStackTrace();
00144                 }               
00145         }
00146 
00150         public void buildKeys(){
00151                 float x=0,y=0;
00152                 for (int i=0; i<keylayout.length; i++){
00153 
00154                         if (keylayout[i]==NEXTROW){
00155                                 x=0; y+=1.2;
00156                                 continue;
00157                         }
00158                         
00159                         String text=keytexts.get(keylayout[i]);
00160                         if (text==null)
00161                                 text=KeyEvent.getKeyText(keylayout[i]);
00162                         
00163                         VisKey key=new VisKey(text, keylayout[i], new Vector3f(x,-y,0));
00164                         add(key);       
00165                         key.position.x+=key.w/2;
00166                         x+=.2f+key.w;
00167                 }                       
00168         }
00169         
00176         public void handleKey(int keycode) {
00177                 if (focus!=null)
00178                         focus.requestFocus();
00179                 
00180                 keybot.keyPress(keycode);
00181                 keybot.keyRelease(keycode);
00182                 
00183                 if (keycode==KeyEvent.VK_ENTER || keycode==KeyEvent.VK_ESCAPE)
00184                         enabled=false;
00185                 
00186         }
00187 
00188 
00189         void renderSelf() {}
00190         
00191         public void render(List<AWTEvent> events) {
00192                 
00193                 if(!registered) {
00194                         Component c=getRoot().client.panel;
00195                         while(!(c instanceof Frame)) c=c.getParent();
00196                         register(c);
00197                         registered=true;
00198                 }
00199                 
00200                 if (enabled && Prefs.current.osk) {
00201                         if (children.size()==0)
00202                                 buildKeys();
00203                         super.render(events);
00204                 }
00205         }
00206         
00207 
00212         MouseListener clickListener=new MouseAdapter(){
00213                 public void mouseClicked(MouseEvent e) {
00214                         Component source=e.getComponent();
00215                         if (source!=getRoot().client.panel){
00216                                 focus=source;
00217                                 enabled=true;
00218                         }
00219                 }
00220         }; 
00221         
00225         public void register(Component c) {
00226                 c.addMouseListener(clickListener);
00227                 if (c instanceof Container)  //if this contains further elements register them as well
00228                         for (Component c2 : ((Container)c).getComponents())
00229                                 register(c2);           
00230         }
00231 }

Generated on Tue Apr 7 17:57:21 2009 for visclient by  doxygen 1.5.1