ptiteratorimpl.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 274 行

JAVA
274
字号
/* *   * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.chameleon.input;import com.sun.midp.io.Util;import javax.microedition.lcdui.Canvas;import com.sun.midp.i18n.Resource;import com.sun.midp.i18n.ResourceConstants;import com.sun.midp.log.Logging;import com.sun.midp.log.LogChannels;import java.util.Vector;/**  * Implements JAVA PTIterator using the simple logic. * */public class PTIteratorImpl implements PTIterator {    /** buffer accomulating user input */     private StringBuffer buffer;    /** selected option from the list */     private int selected;    /** symbols mapped to the digital keys get from resources */     private char[][] keyMap;    /** list of matches cached until word is increased/decreased */     private String[] list;    /** storage accomulating all word states until it's committed by the user */    private Vector states = new Vector();    /**      * Create a new iterator     */    public PTIteratorImpl() {        buffer = new StringBuffer();        String lowerInLine = Resource.getString(                          ResourceConstants.LCDUI_TF_ALPHA_KEY_MAP);        keyMap = getMapByLine(lowerInLine);    }    /**     * Converts the string to key map. The rows are separated each from other     * by '$'. The characters inside of one row follow each to other without     * any separator.     * @param line string combines all keys     * @return map of the keys in char[][] format     */    private char[][] getMapByLine(String line) {        char[] chars = line.toCharArray();        int rows = 1;        for (int i = chars.length - 1; i >= 0; i--) {            if (chars[i] == '$') rows++;        }        char[][] map = new char[rows][];        for (int start = 0, j = 0; start < chars.length; j++) {            int end = -1;            for (int k = start; k < chars.length && end == -1; k++) {                if (chars[k] == '$') {                    end = k;                }            }                        // if '$' is not found that means the end of string is reached            if (end == -1) end = chars.length;            map[j] = new char[end - start];            System.arraycopy(chars, start, map[j], 0, map[j].length);            start = end + 1;        }        return map;    }            /**      * Clear completion state     */    public void reset() {        if (buffer.length() > 0) {            buffer.delete(0, buffer.length());        }        states.removeAllElements();        selected = 0;        list = null;    }        /**      * Adds a key to current completion string     * @param keyCode char in the range '0'-'9', '#', or '*'     */    public void nextLevel(int keyCode) {        String[] ls = getList();        if (ls != null && ls.length > 0) {            states.addElement(ls[selected > 0 ? selected - 1 : 0]);        }        buffer.append((char)keyCode);        selected = 0;        list = null;    }        /**      * Backspace on key in current completion string.     */    public void prevLevel() {        if (states.size() > 0) {            states.removeElementAt(states.size() - 1);        }        if (buffer.length() > 0) {            buffer.deleteCharAt(buffer.length() - 1);        }        selected = 0;        list = null;    }        /**     * Returns true if the iteration has more elements. (In other words,     * returns <code>true</code> if <code>next</code> would return an     * element rather than throwing an exception.)     *     * @return true if the iterator has more elements.     */    public boolean hasNext() {        boolean ret = false;        String[] ls = getList();        if (ls != null && ls.length > 0) {            ret = selected < ls.length;        }        return ret;    }        /**      * Reverts to first possible completion.     * If next() has been called uptil hasNext() returns false, then after      * calling reviewCompletionOptions(), calling next() will return     * the 1st completion     */    public void resetNext() {        selected = 0;    }    /**     * Returns the next element in the iteration.     *     * @return next element in the iteration.     *     * @exception java.util.NoSuchElementException iteration has no more elements.     */    public String next() {        if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {            Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,                "[iter.nextCompletionOption] >>");        }        String ret = null;        ret = getList()[selected++];        if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {            Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,                "[iter.next] : " + ret);        }        return ret;    }    /**     * Get the list of matches. The list is cached until the word is decreased/     * increased by the user.     * @return the list of matches. Returns null if no matches are found     */    private String[] getList() {        if (list == null && buffer.length() > 0) {            char[] next = getCharOptions(buffer.charAt(buffer.length() - 1));            list = new String[next.length];            String base = new String();            if (states.size() > 0) {                base = (String)(states.elementAt(states.size() - 1));            }             for (int j = 0; j < next.length; j++) {                list[j] = base + next[j];                if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {                    Logging.report(Logging.INFORMATION, LogChannels.LC_HIGHUI,                        "[getList] next = " + list[j]);                }            }        }        return list;    }    /**     * Gets the possible matches for the key code     *     * @param lastKey the key code     *     * @return returns the set of options. Return null if matches are not found.     */    protected char[] getCharOptions(int lastKey) {        char[] chars = null;            switch (lastKey) {        case Canvas.KEY_NUM0:            chars = keyMap[0];            break;                  case Canvas.KEY_NUM1:            chars = keyMap[1];            break;        case Canvas.KEY_NUM2:            chars = keyMap[2];            break;        case Canvas.KEY_NUM3:            chars = keyMap[3];            break;        case Canvas.KEY_NUM4:            chars = keyMap[4];            break;        case Canvas.KEY_NUM5:            chars = keyMap[5];            break;        case Canvas.KEY_NUM6:            chars = keyMap[6];            break;        case Canvas.KEY_NUM7:            chars = keyMap[7];            break;        case Canvas.KEY_NUM8:            chars = keyMap[8];            break;        case Canvas.KEY_NUM9:            chars = keyMap[9];            break;        case Canvas.KEY_POUND:            chars = keyMap[10];            break;        case Canvas.KEY_STAR:            break;                        default:            // This can actually happen if the Timer went off without            // a pending key, which can sometimes happen.            break;        }               return chars;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?