17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/*
27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License.
67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at
77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and
147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License.
157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin;
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.graphics.drawable.Drawable;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class for soft keys which defined in the keyboard xml file. A soft key can be
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * a basic key or a toggling key.
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project *
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @see com.android.inputmethod.pinyin.SoftKey
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class SoftKeyToggle extends SoftKey {
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The current state number is stored in the lowest 8 bits of mKeyMask, this
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * mask is used to get the state number. If the current state is 0, the
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * normal state is enabled; if the current state is more than 0, a toggle
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * state in the toggle state chain will be enabled.
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private static final int KEYMASK_TOGGLE_STATE = 0x000000ff;
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private ToggleState mToggleState;
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getToggleStateId() {
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return (mKeyMask & KEYMASK_TOGGLE_STATE);
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // The state id should be valid, and less than 255.
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // If resetIfNotFound is true and there is no such toggle state with the
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // given id, the key state will be reset.
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // If the key state is newly changed (enabled to the given state, or
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // reseted) and needs re-draw, return true.
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean enableToggleState(int stateId, boolean resetIfNotFound) {
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE);
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (oldStateId == stateId) return false;
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mKeyMask &= (~KEYMASK_TOGGLE_STATE);
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (stateId > 0) {
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mKeyMask |= (KEYMASK_TOGGLE_STATE & stateId);
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (getToggleState() == null) {
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mKeyMask &= (~KEYMASK_TOGGLE_STATE);
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (!resetIfNotFound && oldStateId > 0) {
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    mKeyMask |= (KEYMASK_TOGGLE_STATE & oldStateId);
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return resetIfNotFound;
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return true;
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        } else {
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return true;
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // The state id should be valid, and less than 255.
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // If resetIfNotFound is true and there is no such toggle state with the
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // given id, the key state will be reset.
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // If the key state is newly changed and needs re-draw, return true.
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean disableToggleState(int stateId, boolean resetIfNotFound) {
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE);
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (oldStateId == stateId) {
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mKeyMask &= (~KEYMASK_TOGGLE_STATE);
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return stateId != 0;
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (resetIfNotFound) {
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mKeyMask &= (~KEYMASK_TOGGLE_STATE);
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return oldStateId != 0;
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return false;
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // Clear any toggle state. If the key needs re-draw, return true.
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean disableAllToggleStates() {
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE);
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mKeyMask &= (~KEYMASK_TOGGLE_STATE);
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return oldStateId != 0;
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getKeyIcon() {
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) return state.mKeyIcon;
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.getKeyIcon();
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getKeyIconPopup() {
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (null != state.mKeyIconPopup) {
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return state.mKeyIconPopup;
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return state.mKeyIcon;
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.getKeyIconPopup();
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getKeyCode() {
1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) return state.mKeyCode;
1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyCode;
1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public String getKeyLabel() {
1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) return state.mKeyLabel;
1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyLabel;
1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getKeyBg() {
1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyType) {
1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return state.mKeyType.mKeyBg;
1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyType.mKeyBg;
1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getKeyHlBg() {
1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyType) {
1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return state.mKeyType.mKeyHlBg;
1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyType.mKeyHlBg;
1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getColor() {
1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyType) {
1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return state.mKeyType.mColor;
1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyType.mColor;
1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getColorHl() {
1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyType) {
1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return state.mKeyType.mColorHl;
1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyType.mColorHl;
1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getColorBalloon() {
1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyType) {
1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return state.mKeyType.mColorBalloon;
1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mKeyType.mColorBalloon;
1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean isKeyCodeKey() {
1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (state.mKeyCode > 0) return true;
1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.isKeyCodeKey();
1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean isUserDefKey() {
1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (state.mKeyCode < 0) return true;
1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.isUserDefKey();
1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean isUniStrKey() {
1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (null != state.mKeyLabel && state.mKeyCode == 0) {
1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return true;
1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return false;
2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.isUniStrKey();
2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean needBalloon() {
2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return (state.mIdAndFlags & KEYMASK_BALLOON) != 0;
2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.needBalloon();
2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean repeatable() {
2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state) {
2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return (state.mIdAndFlags & KEYMASK_REPEAT) != 0;
2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.repeatable();
2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void changeCase(boolean lowerCase) {
2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = getToggleState();
2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != state && null != state.mKeyLabel) {
2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (lowerCase)
2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                state.mKeyLabel = state.mKeyLabel.toLowerCase();
2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            else
2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                state.mKeyLabel = state.mKeyLabel.toUpperCase();
2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public ToggleState createToggleState() {
2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return new ToggleState();
2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean setToggleStates(ToggleState rootState) {
2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == rootState) return false;
2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mToggleState = rootState;
2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private ToggleState getToggleState() {
2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int stateId = (mKeyMask & KEYMASK_TOGGLE_STATE);
2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (0 == stateId) return null;
2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        ToggleState state = mToggleState;
2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        while ((null != state)
2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                && (state.mIdAndFlags & KEYMASK_TOGGLE_STATE) != stateId) {
2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            state = state.mNextState;
2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return state;
2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public class ToggleState {
2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // The id should be bigger than 0;
2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        private int mIdAndFlags;
2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public SoftKeyType mKeyType;
2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public int mKeyCode;
2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public Drawable mKeyIcon;
2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public Drawable mKeyIconPopup;
2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public String mKeyLabel;
2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public ToggleState mNextState;
2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void setStateId(int stateId) {
2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mIdAndFlags |= (stateId & KEYMASK_TOGGLE_STATE);
2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        public void setStateFlags(boolean repeat, boolean balloon) {
2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (repeat) {
2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mIdAndFlags |= KEYMASK_REPEAT;
2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mIdAndFlags &= (~KEYMASK_REPEAT);
2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (balloon) {
2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mIdAndFlags |= KEYMASK_BALLOON;
2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            } else {
2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                mIdAndFlags &= (~KEYMASK_BALLOON);
2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
284