/** * Copyright (C) 2009 Michael A. MacDonald */ package android.androidVNC; import java.util.ArrayList; import java.util.HashMap; import com.antlersoft.android.dbimpl.NewInstance; import android.view.KeyEvent; /** * @author Michael A. MacDonald * */ class MetaKeyBean extends AbstractMetaKeyBean implements Comparable<MetaKeyBean> { static final ArrayList<MetaKeyBase> allKeys; static final String[] allKeysNames; static final HashMap<Integer,MetaKeyBase> keysByKeyCode; static final HashMap<Integer,MetaKeyBase> keysByMouseButton; static final HashMap<Integer,MetaKeyBase> keysByKeySym; static final MetaKeyBean keyCtrlAltDel; static final MetaKeyBean keyArrowLeft; static final MetaKeyBean keyArrowRight; static final MetaKeyBean keyArrowUp; static final MetaKeyBean keyArrowDown; static final NewInstance<MetaKeyBean> NEW; static { allKeys = new ArrayList<MetaKeyBase>(); allKeys.add(new MetaKeyBase("Hangul", 0xff31)); allKeys.add(new MetaKeyBase("Hangul_Start", 0xff32)); allKeys.add(new MetaKeyBase("Hangul_End", 0xff33)); allKeys.add(new MetaKeyBase("Hangul_Hanja", 0xff34)); allKeys.add(new MetaKeyBase("Kana_Shift", 0xff2e)); allKeys.add(new MetaKeyBase("Right_Alt", 0xffea)); allKeys.add(new MetaKeyBase(VncCanvas.MOUSE_BUTTON_LEFT,"Mouse Left")); allKeys.add(new MetaKeyBase(VncCanvas.MOUSE_BUTTON_MIDDLE,"Mouse Middle")); allKeys.add(new MetaKeyBase(VncCanvas.MOUSE_BUTTON_RIGHT,"Mouse Right")); allKeys.add(new MetaKeyBase(VncCanvas.MOUSE_BUTTON_SCROLL_DOWN, "Mouse Scroll Down")); allKeys.add(new MetaKeyBase(VncCanvas.MOUSE_BUTTON_SCROLL_UP, "Mouse Scroll Up")); allKeys.add(new MetaKeyBase("Home", 0xFF50)); allKeys.add(new MetaKeyBase("Arrow Left", 0xFF51)); allKeys.add(new MetaKeyBase("Arrow Up", 0xFF52)); allKeys.add(new MetaKeyBase("Arrow Right", 0xFF53)); allKeys.add(new MetaKeyBase("Arrow Down", 0xFF54)); allKeys.add(new MetaKeyBase("Page Up", 0xFF55)); allKeys.add(new MetaKeyBase("Page Down", 0xFF56)); allKeys.add(new MetaKeyBase("End", 0xFF57)); allKeys.add(new MetaKeyBase("Insert", 0xFF63)); allKeys.add(new MetaKeyBase("Delete", 0xFFFF, KeyEvent.KEYCODE_DEL)); allKeys.add(new MetaKeyBase("Num Lock", 0xFF7F)); allKeys.add(new MetaKeyBase("Break", 0xFF6b)); allKeys.add(new MetaKeyBase("Scroll Lock", 0xFF14)); allKeys.add(new MetaKeyBase("Print Scrn", 0xFF15)); allKeys.add(new MetaKeyBase("Escape", 0xFF1B)); allKeys.add(new MetaKeyBase("Enter", 0xFF0D, KeyEvent.KEYCODE_ENTER)); allKeys.add(new MetaKeyBase("Tab", 0xFF09, KeyEvent.KEYCODE_TAB)); allKeys.add(new MetaKeyBase("BackSpace", 0xFF08)); allKeys.add(new MetaKeyBase("Space", 0x020, KeyEvent.KEYCODE_SPACE)); StringBuilder sb = new StringBuilder(" "); for (int i=0; i<26; i++) { sb.setCharAt(0, (char)('A' + i)); allKeys.add(new MetaKeyBase(sb.toString(), 'a' + i, KeyEvent.KEYCODE_A + i)); } for (int i=0; i<10; i++) { sb.setCharAt(0, (char)('0' + i)); allKeys.add(new MetaKeyBase(sb.toString(), '0' + i, KeyEvent.KEYCODE_0 + i)); } for (int i=0; i<12; i++) { sb.setLength(0); sb.append('F'); if (i<9) sb.append(' '); sb.append(Integer.toString(i+1)); allKeys.add(new MetaKeyBase(sb.toString(), 0xFFBE + i)); } java.util.Collections.sort(allKeys); allKeysNames = new String[allKeys.size()]; keysByKeyCode = new HashMap<Integer,MetaKeyBase>(); keysByMouseButton = new HashMap<Integer,MetaKeyBase>(); keysByKeySym = new HashMap<Integer,MetaKeyBase>(); for (int i=0; i<allKeysNames.length; ++i) { MetaKeyBase b=allKeys.get(i); allKeysNames[i] = b.name; if (b.isKeyEvent) keysByKeyCode.put(b.keyEvent,b); if (b.isMouse) keysByMouseButton.put(b.mouseButtons,b); else keysByKeySym.put(b.keySym,b); } NEW = new NewInstance<MetaKeyBean>() { /* (non-Javadoc) * @see com.antlersoft.android.dbimpl.NewInstance#get() */ @Override public MetaKeyBean get() { return new MetaKeyBean(); } }; keyCtrlAltDel = new MetaKeyBean(0,VncCanvas.CTRL_MASK|VncCanvas.ALT_MASK,keysByKeyCode.get(KeyEvent.KEYCODE_DEL)); keyArrowLeft = new MetaKeyBean(0,0,keysByKeySym.get(0xFF51)); keyArrowUp = new MetaKeyBean(0,0,keysByKeySym.get(0xFF52)); keyArrowRight = new MetaKeyBean(0,0,keysByKeySym.get(0xFF53)); keyArrowDown = new MetaKeyBean(0,0,keysByKeySym.get(0xFF54)); } private boolean _regenDesc; MetaKeyBean() { } MetaKeyBean(MetaKeyBean toCopy) { _regenDesc = true; if (toCopy.isMouseClick()) setMouseButtons(toCopy.getMouseButtons()); else setKeySym(toCopy.getKeySym()); setMetaListId(toCopy.getMetaListId()); setMetaFlags(toCopy.getMetaFlags()); } MetaKeyBean(long listId, int metaFlags, MetaKeyBase base) { setMetaListId(listId); setKeyBase(base); setMetaFlags(metaFlags); _regenDesc = true; } /* (non-Javadoc) * @see android.androidVNC.AbstractMetaKeyBean#getKeyDesc() */ @Override public String getKeyDesc() { if (_regenDesc) { synchronized(this) { if (_regenDesc) { StringBuilder sb=new StringBuilder(); int meta=getMetaFlags(); if (0 != (meta & VncCanvas.SHIFT_MASK)) { sb.append("Shift"); } if (0 != (meta & VncCanvas.CTRL_MASK)) { if (sb.length()>0) sb.append('-'); sb.append("Ctrl"); } if (0 != (meta & VncCanvas.ALT_MASK)) { if (sb.length()>0) sb.append('-'); sb.append("Alt"); } if (sb.length()>0) sb.append(' '); MetaKeyBase base; if (isMouseClick()) base=keysByMouseButton.get(getMouseButtons()); else base=keysByKeySym.get(getKeySym()); sb.append(base.name); setKeyDesc(sb.toString()); } } } return super.getKeyDesc(); } /* (non-Javadoc) * @see android.androidVNC.AbstractMetaKeyBean#setKeyDesc(java.lang.String) */ @Override public void setKeyDesc(String arg_keyDesc) { super.setKeyDesc(arg_keyDesc); _regenDesc = false; } /* (non-Javadoc) * @see android.androidVNC.AbstractMetaKeyBean#setKeySym(int) */ @Override public void setKeySym(int arg_keySym) { if (arg_keySym!=getKeySym() || isMouseClick()) { setMouseClick(false); _regenDesc=true; super.setKeySym(arg_keySym); } } /* (non-Javadoc) * @see android.androidVNC.AbstractMetaKeyBean#setMetaFlags(int) */ @Override public void setMetaFlags(int arg_metaFlags) { if (arg_metaFlags != getMetaFlags()) { _regenDesc = true; super.setMetaFlags(arg_metaFlags); } } /* (non-Javadoc) * @see android.androidVNC.AbstractMetaKeyBean#setMouseButtons(int) */ @Override public void setMouseButtons(int arg_mouseButtons) { if (arg_mouseButtons!=getMouseButtons() || ! isMouseClick()) { setMouseClick(true); _regenDesc = true; super.setMouseButtons(arg_mouseButtons); } } void setKeyBase(MetaKeyBase base) { if (base.isMouse) { setMouseButtons(base.mouseButtons); } else { setKeySym(base.keySym); } } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (o instanceof MetaKeyBean) { return getKeyDesc().equals(((MetaKeyBean)o).getKeyDesc()); } return false; } /* (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(MetaKeyBean another) { return getKeyDesc().compareTo(another.getKeyDesc()); } }