FileDocCategorySizeDatePackage
DefaultInputMethodHandler_ja.javaAPI DocJ2ME MIDP 2.09713Thu Nov 07 12:02:22 GMT 2002com.sun.midp.lcdui.i18n

DefaultInputMethodHandler_ja.java

/*
 * @(#)DefaultInputMethodHandler_ja.java	1.23 02/07/24 @(#)
 *
 * Copyright (c) 2000-2002 Sun Microsystems, Inc.  All rights reserved.
 * PROPRIETARY/CONFIDENTIAL
 * Use is subject to license terms.
 */

package com.sun.midp.lcdui.i18n;

import com.sun.midp.lcdui.DefaultInputMethodHandler;
import com.sun.midp.lcdui.InputMethodClient;

/**
 * The Japanese implementation of the of the InputMethodHandler interface.
 * @author unattributed
 * @version 1.23 07/24/02
 */
public class DefaultInputMethodHandler_ja extends DefaultInputMethodHandler {

    /** Hiragana Input Method. */
    protected static final int IM_HIRAGANA      = IM_SYMBOL + 1;

    /** Kana Input Method. */
    protected static final int IM_HWKATAKANA    = IM_SYMBOL + 2;

    /** The Halfwidth Katakana character set symbol table. */
    protected char hwKatakanaKeyMap[][] = {
        /*   wa        wo        wn */ 
        {'\uff9c', '\uff66', '\uff9d',
         /* DAKU       PU      KUTEN */
         '\uff9e', '\uff9f', '\uff61',
         /* SEP       LBRA      RBRA     TOUTEN */
         '\uff65', '\uff62', '\uff63', '\uff64'},
        /*    A       I       U       E       O  */
        {'\uff71', '\uff72', '\uff73', '\uff74', '\uff75',
         /*    a       i       u       e       o  */
         '\uff67', '\uff68', '\uff69', '\uff6a', '\uff6b'},
        /*   KA      KI      KU      KE      KO */
        {'\uff76', '\uff77', '\uff78', '\uff79', '\uff7a'},
        /*   SA      SI      SU      SE      SO */
        {'\uff7b', '\uff7c', '\uff7d', '\uff7e', '\uff7f'},
        /*   TA      TI      TU      TE      TO      tu */
        {'\uff80', '\uff81', '\uff82', '\uff83', '\uff84', '\uff6f'},
        /*   NA      NI      NU      NE      NO */
        {'\uff85', '\uff86', '\uff87', '\uff88', '\uff89'},
        /*   HA      HI      HU      HE      HO */
        {'\uff8a', '\uff8b', '\uff8c', '\uff8d', '\uff8e'},
        /*   MA      MI      MU      ME      MO */
        {'\uff8f', '\uff90', '\uff91', '\uff92', '\uff93'},
        /*   YA      YU      YO      ya      yu      yo */
        {'\uff94', '\uff95', '\uff96', '\uff6c', '\uff6d', '\uff6e'},
        /*   RA      RI      RU      RE      RO */
        {'\uff97', '\uff98', '\uff99', '\uff9a', '\uff9b'},
        /* null */
        {'\0'},
        /* SPACE */
        {' '}
    };

    /** The Hiragana character set symbol table. */
    protected char hiraganaKeyMap[][] = {
        /*   WA      WO      WN  */
        {'\u308f', '\u3092', '\u3093',
        /*   SP  TOUTEN   KUTEN   QUEST  EXCLAM */
         '\u3000', '\u3001', '\u3002', '\uff1f', '\uff01',
        /*  SEP   COLON  SEMICOL QUOTEDBL   YEN */
         '\u30fb', '\uff1a', '\uff1b', '\u201d', '\uffe5',
        /* AMPERSAND ASTERISK */
         '\uff06', '\uff0a'},
        /*    A       I       U       E       O  */
        {'\u3042', '\u3044', '\u3046', '\u3048', '\u304a',
         /*   a       i       u       e       o */
         '\u3041', '\u3043', '\u3045', '\u3047', '\u3049'},
        /*   KA      KI      KU      KE      KO */
        {'\u304b', '\u304d', '\u304f', '\u3051', '\u3053',
         /*   GA      GI      GU      GE      GO */
         '\u304c', '\u304e', '\u3050', '\u3052', '\u3054'},
        /*   SA      SI      SU      SE      SO */
        {'\u3055', '\u3057', '\u3059', '\u305b', '\u305d',
         /*   ZA      ZI      ZU      ZE      ZO */
         '\u3056', '\u3058', '\u305a', '\u305c', '\u305e'},
        /*   TA      TI      TU      TE      TO      tu */
        {'\u305f', '\u3061', '\u3064', '\u3066', '\u3068', '\u3063',
         /*   DA      DI      DU      DE      DO */
         '\u3060', '\u3062', '\u3065', '\u3067', '\u3069'},
        /*   NA      NI      NU      NE      NO */
        {'\u306a', '\u306b', '\u306c', '\u306d', '\u306e'},
        /*   HA      HI      HU      HE      HO */
        {'\u306f', '\u3072', '\u3075', '\u3078', '\u307b',
         /*   BA      BI      BU      BE      BO */
         '\u3070', '\u3073', '\u3076', '\u3079', '\u307c',
         /*   PA      PI      PU      PE      PO */
         '\u3071', '\u3074', '\u3077', '\u307a', '\u307d'},
        /*   MA      MI      ME      ME      MO */
        {'\u307e', '\u307f', '\u3080', '\u3081', '\u3082'},
        /*   YA      YU      YO      ya      yu      yo */
        {'\u3084', '\u3086', '\u3088', '\u3083', '\u3085', '\u3087'},
        /*   RA      RI      RU      RE      RO */
        {'\u3089', '\u308a', '\u308b', '\u308c', '\u308d'},
        /* null */
        {'\0'},
        /* SPACE */
        {'\u3000'}
    };

    // Japanese specific symbol table characters
    // protected char jaSymbolTableChars[] = {
    //     '|',  '\uff62', '\uff63', '\uff64',  '{',  '}', 
    // 
    //     '_',	'$',	'(',	')',	'\\', '\uff65', 
    // 
    //     '~',	'"',	'\'',	'/',	'&',  '\uff61',
    // 
    //     '*',	'@',	'.',	'?',	'!',  '`', 
    // 
    //     '#',	'-',	',',	':',	';',  '^', 
    // 
    //     '%',	'=',	'+',	'<',	'>'};

    /** Character Subset values for additional Japanese input modes. */
    protected String jaCharSubset[] = {
        "UCB_HIRAGANA",
        "IS_HALFWIDTH_KATAKANA",
        "UCB_BASIC_LATIN",
        "IS_LATIN",
        "IS_LATIN_DIGITS",
        "MIDP_UPPERCASE_LATIN",
        "MIDP_LOWERCASE_LATIN",        
        "LATIN",
        "LATIN_DIGITS",
    };
    /**
     * values for default supported input modes.
     */
    protected int jaSupportedInputModes[] = {
        IM_HIRAGANA,
        IM_HWKATAKANA,
        IM_ROMAN_CAPS,
        IM_ROMAN_SMALL,
        IM_NUMERIC,
        IM_SYMBOL,
    };


    /** The Japanese input mode conversion table. */
    protected Object jaInputModeConvTable[][] = {
        {"UCB_HIRAGANA",          new Integer(IM_HIRAGANA)},
        {"IS_HALFWIDTH_KATAKANA", new Integer(IM_HWKATAKANA)},
        {"UCB_BASIC_LATIN",       new Integer(IM_ROMAN_CAPS)},
        {"UCB_BASIC_LATIN",       new Integer(IM_ROMAN_SMALL)},
        {"UCB_BASIC_LATIN",       new Integer(IM_NUMERIC)},
        {"UCB_BASIC_LATIN",       new Integer(IM_SYMBOL)},
        {"IS_LATIN",              new Integer(IM_ROMAN_CAPS)},
        {"IS_LATIN",              new Integer(IM_ROMAN_SMALL)},
        {"IS_LATIN",              new Integer(IM_NUMERIC)},
        {"IS_LATIN",              new Integer(IM_SYMBOL)},
        {"IS_LATIN_DIGITS",       new Integer(IM_NUMERIC)},
        {"MIDP_UPPERCASE_LATIN",  new Integer(IM_ROMAN_CAPS)},
        {"MIDP_LOWERCASE_LATIN",  new Integer(IM_ROMAN_SMALL)},
        {"LATIN",                 new Integer(IM_ROMAN_CAPS)},
        {"LATIN",                 new Integer(IM_ROMAN_SMALL)},
        {"LATIN_DIGITS",          new Integer(IM_NUMERIC)},
        {"LATIN",                 new Integer(IM_SYMBOL)},
    };

    /**
     * Constructs a new DefaultInputMethodHandler_ja object
     * to handle japanese input modes.
     */
    public DefaultInputMethodHandler_ja() {
        NUM_INPUT_MODES = 7; // override the super class value
        allowedModes = new int[NUM_INPUT_MODES];
        super.supportedCharSubset = jaCharSubset;
        super.supportedInputModes = jaSupportedInputModes;
        super.inputModeConvTable = jaInputModeConvTable;
        // Japanese specific symbol table
        // super.symbolTableChars = jaSymbolTableChars;
        // super.defaultSymbolCursorPos = 20;
    }

    /**
     * Set the focus of this handler.
     * Overrides DefaultInputMethodHandler.setFocus
     * The difference here is that after SYM mode, it returns to HIRAGANA
     * mode (as opposed to abc mode.
     *
     * @param focus If True, this handler should take focus
     */
/*
    public void setFocus(boolean focus) {
        //
        // Note that setFocus() is always called when Display is
        // changed.  
        //
        if (imc == null) {
            return;
        }
        if (focus) {
            if (hasSymbolTable) {
                if (bufLen > 0) {
                    handleCharInput();
                }
                setInputMode(nextInputMode());
                hasSymbolTable = false;
            } else {
                setInputMode(defaultMode);
            }
        } else {
            if (!hasSymbolTable) {
                setInputMode(IM_NONE);
            }
        }
    }
*/

    /**
     * Set the input method client.
     * @param imc The Input method to use.
     */
    public void setInputMethodClient(InputMethodClient imc) {
        super.setInputMethodClient(imc);

        if (capWord || capSentence) {
            // INITIAL_CAPS_WORD or INITIAL_CAPS_SENTENCE is not supported for
            // Japanese input method.
            capWord = capSentence = false;

            // Need to re-do the input mode and constraint after setting
            // capWord and capSentence to false.
            // setConstraint();
            // inputMode = defaultMode;
        }

        // initial the keyMap
        // setKeyMap(inputMode); 
    }

    /** 
     * Set the appropriate keypad mapping according to the input mode.
     * Override super class to add hiragana and katakana support.
     *
     * @param mode The new input mode to use
     * @param constraints the constraints to use
     * @return true if keyMap is set.
     */
    protected boolean setKeyMap(int mode, int constraints) {
        if (super.setKeyMap(mode, constraints)) {
            return true;
        }

        switch (mode) {
        case IM_HWKATAKANA:
            keyMap = hwKatakanaKeyMap;
            break;
        case IM_HIRAGANA:
            keyMap = hiraganaKeyMap;
            break;
        default:
            return false;
        }
        
        imc.showInputMode(mode);

        return true;
    } 
}