1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.inputmethod.pinyin; 18 19import android.graphics.drawable.Drawable; 20 21/** 22 * Class for soft keys which defined in the keyboard xml file. A soft key can be 23 * a basic key or a toggling key. 24 * 25 * @see com.android.inputmethod.pinyin.SoftKeyToggle 26 */ 27public class SoftKey { 28 protected static final int KEYMASK_REPEAT = 0x10000000; 29 protected static final int KEYMASK_BALLOON = 0x20000000; 30 31 /** 32 * For a finger touch device, after user presses a key, there will be some 33 * consequent moving events because of the changing in touching pressure. If 34 * the moving distance in x is within this threshold, the moving events will 35 * be ignored. 36 */ 37 public static final int MAX_MOVE_TOLERANCE_X = 0; 38 39 /** 40 * For a finger touch device, after user presses a key, there will be some 41 * consequent moving events because of the changing in touching pressure. If 42 * the moving distance in y is within this threshold, the moving events will 43 * be ignored. 44 */ 45 public static final int MAX_MOVE_TOLERANCE_Y = 0; 46 47 /** 48 * Used to indicate the type and attributes of this key. the lowest 8 bits 49 * should be reserved for SoftkeyToggle. 50 */ 51 protected int mKeyMask; 52 53 protected SoftKeyType mKeyType; 54 55 protected Drawable mKeyIcon; 56 57 protected Drawable mKeyIconPopup; 58 59 protected String mKeyLabel; 60 61 protected int mKeyCode; 62 63 /** 64 * If this value is not 0, this key can be used to popup a sub soft keyboard 65 * when user presses it for some time. 66 */ 67 public int mPopupSkbId; 68 69 public float mLeftF; 70 public float mRightF; 71 public float mTopF; 72 public float mBottomF; 73 public int mLeft; 74 public int mRight; 75 public int mTop; 76 public int mBottom; 77 78 public void setKeyType(SoftKeyType keyType, Drawable keyIcon, 79 Drawable keyIconPopup) { 80 mKeyType = keyType; 81 mKeyIcon = keyIcon; 82 mKeyIconPopup = keyIconPopup; 83 } 84 85 // The caller guarantees that all parameters are in [0, 1] 86 public void setKeyDimensions(float left, float top, float right, 87 float bottom) { 88 mLeftF = left; 89 mTopF = top; 90 mRightF = right; 91 mBottomF = bottom; 92 } 93 94 public void setKeyAttribute(int keyCode, String label, boolean repeat, 95 boolean balloon) { 96 mKeyCode = keyCode; 97 mKeyLabel = label; 98 99 if (repeat) { 100 mKeyMask |= KEYMASK_REPEAT; 101 } else { 102 mKeyMask &= (~KEYMASK_REPEAT); 103 } 104 105 if (balloon) { 106 mKeyMask |= KEYMASK_BALLOON; 107 } else { 108 mKeyMask &= (~KEYMASK_BALLOON); 109 } 110 } 111 112 public void setPopupSkbId(int popupSkbId) { 113 mPopupSkbId = popupSkbId; 114 } 115 116 // Call after setKeyDimensions(). The caller guarantees that the 117 // keyboard with and height are valid. 118 public void setSkbCoreSize(int skbWidth, int skbHeight) { 119 mLeft = (int) (mLeftF * skbWidth); 120 mRight = (int) (mRightF * skbWidth); 121 mTop = (int) (mTopF * skbHeight); 122 mBottom = (int) (mBottomF * skbHeight); 123 } 124 125 public Drawable getKeyIcon() { 126 return mKeyIcon; 127 } 128 129 public Drawable getKeyIconPopup() { 130 if (null != mKeyIconPopup) { 131 return mKeyIconPopup; 132 } 133 return mKeyIcon; 134 } 135 136 public int getKeyCode() { 137 return mKeyCode; 138 } 139 140 public String getKeyLabel() { 141 return mKeyLabel; 142 } 143 144 public void changeCase(boolean upperCase) { 145 if (null != mKeyLabel) { 146 if (upperCase) 147 mKeyLabel = mKeyLabel.toUpperCase(); 148 else 149 mKeyLabel = mKeyLabel.toLowerCase(); 150 } 151 } 152 153 public Drawable getKeyBg() { 154 return mKeyType.mKeyBg; 155 } 156 157 public Drawable getKeyHlBg() { 158 return mKeyType.mKeyHlBg; 159 } 160 161 public int getColor() { 162 return mKeyType.mColor; 163 } 164 165 public int getColorHl() { 166 return mKeyType.mColorHl; 167 } 168 169 public int getColorBalloon() { 170 return mKeyType.mColorBalloon; 171 } 172 173 public boolean isKeyCodeKey() { 174 if (mKeyCode > 0) return true; 175 return false; 176 } 177 178 public boolean isUserDefKey() { 179 if (mKeyCode < 0) return true; 180 return false; 181 } 182 183 public boolean isUniStrKey() { 184 if (null != mKeyLabel && mKeyCode == 0) return true; 185 return false; 186 } 187 188 public boolean needBalloon() { 189 return (mKeyMask & KEYMASK_BALLOON) != 0; 190 } 191 192 public boolean repeatable() { 193 return (mKeyMask & KEYMASK_REPEAT) != 0; 194 } 195 196 public int getPopupResId() { 197 return mPopupSkbId; 198 } 199 200 public int width() { 201 return mRight - mLeft; 202 } 203 204 public int height() { 205 return mBottom - mTop; 206 } 207 208 public boolean moveWithinKey(int x, int y) { 209 if (mLeft - MAX_MOVE_TOLERANCE_X <= x 210 && mTop - MAX_MOVE_TOLERANCE_Y <= y 211 && mRight + MAX_MOVE_TOLERANCE_X > x 212 && mBottom + MAX_MOVE_TOLERANCE_Y > y) { 213 return true; 214 } 215 return false; 216 } 217 218 @Override 219 public String toString() { 220 String str = "\n"; 221 str += " keyCode: " + String.valueOf(mKeyCode) + "\n"; 222 str += " keyMask: " + String.valueOf(mKeyMask) + "\n"; 223 str += " keyLabel: " + (mKeyLabel == null ? "null" : mKeyLabel) + "\n"; 224 str += " popupResId: " + String.valueOf(mPopupSkbId) + "\n"; 225 str += " Position: " + String.valueOf(mLeftF) + ", " 226 + String.valueOf(mTopF) + ", " + String.valueOf(mRightF) + ", " 227 + String.valueOf(mBottomF) + "\n"; 228 return str; 229 } 230} 231