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;
00055
00056
00057
00058
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
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)
00228 for (Component c2 : ((Container)c).getComponents())
00229 register(c2);
00230 }
00231 }