1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn;
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.Activity;
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.AlertDialog;
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.Dialog;
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.DialogInterface;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Intent;
2459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.content.res.Configuration;
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.graphics.Color;
2659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.graphics.Paint.FontMetricsInt;
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Bundle;
2859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.text.TextPaint;
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.TextUtils;
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.Display;
3259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.Gravity;
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.Menu;
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.MenuItem;
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.MotionEvent;
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyEvent;
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.ViewGroup;
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.Window;
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.WindowManager;
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View.OnFocusChangeListener;
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View.OnTouchListener;
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.TableLayout;
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.TableRow;
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.TextView;
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.Toast;
47e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.widget.Button;
48e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
49e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport java.util.ArrayList;
50e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport java.util.Arrays;
51e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport java.util.Comparator;
52e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
553feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The abstract class for user dictionary tool.
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @author Copyright (C) 2009, OMRON SOFTWARE CO., LTD.  All Rights Reserved.
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic abstract class UserDictionaryToolsList extends Activity
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    implements View.OnClickListener, OnTouchListener, OnFocusChangeListener {
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The class name of the user dictionary tool */
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String  mListViewName;
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The class name of the user dictionary editor */
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String  mEditViewName;
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The package name of the user dictionary editor */
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String  mPackageName;
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the menu item (add) */
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MENU_ITEM_ADD = 0;
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the menu item (edit) */
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MENU_ITEM_EDIT = 1;
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the menu item (delete) */
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MENU_ITEM_DELETE = 2;
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the menu item (initialize) */
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MENU_ITEM_INIT = 3;
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the dialog control (confirm deletion) */
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int DIALOG_CONTROL_DELETE_CONFIRM = 0;
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** ID of the dialog control (confirm initialize) */
81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int DIALOG_CONTROL_INIT_CONFIRM = 1;
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The size of font*/
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int WORD_TEXT_SIZE = 16;
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
86e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The color of background (unfocused item) */
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int UNFOCUS_BACKGROUND_COLOR = 0xFF242424;
88e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The color of background (focused item) */
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int FOCUS_BACKGROUND_COLOR = 0xFFFF8500;
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The minimum count of registered words */
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MIN_WORD_COUNT = 0;
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The maximum count of registered words */
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int MAX_WORD_COUNT = 100;
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Maximum word count to display */
96e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private final int MAX_LIST_WORD_COUNT = 100;
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The threshold time of the double tapping */
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private final int DOUBLE_TAP_TIME = 300;
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Widgets which constitute this screen of activity */
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Menu mMenu;
103e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Table layout for the lists */
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private TableLayout mTableLayout;
105e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Focusing view */
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static View sFocusingView = null;
107e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Focusing pair view */
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static View sFocusingPairView = null;
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Objects which control state transitions */
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Intent mIntent;
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The number of the registered words */
114e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mWordCount = 0;
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
116e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The state of "Add" menu item */
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mAddMenuEnabled;
118e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The state of "Edit" menu item */
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mEditMenuEnabled;
120e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The state of "Delete" menu item */
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mDeleteMenuEnabled;
122e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The state of "Initialize" menu item */
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mInitMenuEnabled;
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** {@code true} if the menu option is initialized */
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mInitializedMenu = false;
1277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** {@code true} if one of word is selected */
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean mSelectedWords;
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The viewID which is selected */
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mSelectedViewID = -1;
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The viewID which was selected previously */
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static int sBeforeSelectedViewID = -1;
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The time of previous action */
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static long sJustBeforeActionTime = -1;
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
136e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** List of the words in the user dictionary */
137e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ArrayList<WnnWord> mWordList = null;
138e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
139e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Work area for sorting the word list */
140e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private WnnWord[] mSortData;
141e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
142e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether the view is initialized */
143e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mInit = false;
144e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
145e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Page left button */
146e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private Button mLeftButton = null;
147e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
148e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Page right button */
149e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private Button mRightButton = null;
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
15159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** for isXLarge */
15259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static boolean mIsXLarge = false;
15359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Send the specified event to IME
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param ev    The event object
1587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @return      {@code true} if this event is processed
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected abstract boolean sendEventToIME(OpenWnnEvent ev);
161e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Get the comparator for sorting the list */
162e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    protected abstract Comparator<WnnWord> getComparator();
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
16459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Show Dialog Num */
16559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mDialogShow = -1;
166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.app.Activity#onCreate */
168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override protected void onCreate(Bundle savedInstanceState) {
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onCreate(savedInstanceState);
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* create XML layout */
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setContentView(R.layout.user_dictionary_tools_list);
175e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mTableLayout = (TableLayout)findViewById(R.id.user_dictionary_tools_table);
176e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
177e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Button b = (Button)findViewById(R.id.user_dictionary_left_button);
178e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b.setOnClickListener(new View.OnClickListener() {
179e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
180e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    int pos = mWordCount - MAX_LIST_WORD_COUNT;
181e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (0 <= pos) {
182e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWordCount = pos;
183e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        updateWordList();
184e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mTableLayout.findViewById(1).requestFocus();
185e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
186e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
187e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
188e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mLeftButton = b;
189e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
190e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b = (Button)findViewById(R.id.user_dictionary_right_button);
191e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b.setOnClickListener(new View.OnClickListener() {
192e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
193e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    int pos = mWordCount + MAX_LIST_WORD_COUNT;
194e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (pos < mWordList.size()) {
195e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWordCount = pos;
196e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        updateWordList();
197e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mTableLayout.findViewById(1).requestFocus();
198e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
199e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
200e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
201e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mRightButton = b;
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    }
2043feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
2053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** @see android.app.Activity#onStart */
2063feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    @Override protected void onStart() {
2073feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        super.onStart();
20859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mDialogShow = -1;
2093feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        sBeforeSelectedViewID = -1;
2103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        sJustBeforeActionTime = -1;
211e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mWordList = getWords();
212e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
213e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        final TextView leftText = (TextView) findViewById(R.id.user_dictionary_tools_list_title_words_count);
214e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        leftText.setText(mWordList.size() + "/" + MAX_WORD_COUNT);
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
21659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsXLarge = ((getResources().getConfiguration().screenLayout &
21759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                      Configuration.SCREENLAYOUT_SIZE_MASK)
21859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                      == Configuration.SCREENLAYOUT_SIZE_XLARGE);
219e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        updateWordList();
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
22359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Called when the system is about to start resuming a previous activity.
22459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
22559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @see android.app.Activity#onPause
22659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
22759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    @Override protected void onPause() {
22859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
22959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mDialogShow == DIALOG_CONTROL_DELETE_CONFIRM) {
23059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            dismissDialog(DIALOG_CONTROL_DELETE_CONFIRM);
23159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mDialogShow = -1;
23259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else if (mDialogShow == DIALOG_CONTROL_INIT_CONFIRM){
23359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            dismissDialog(DIALOG_CONTROL_INIT_CONFIRM);
23459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mDialogShow = -1;
23559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
23659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
23759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        super.onPause();
23859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
23959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
24059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set parameters of table
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  w        The width of the table
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  h        The height of the table
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @return          The information of the layout
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private TableLayout.LayoutParams tableCreateParam(int w, int h) {
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return new TableLayout.LayoutParams(w, h);
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.app.Activity#onCreateOptionsMenu */
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onCreateOptionsMenu(Menu menu) {
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* initialize the menu */
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        menu.clear();
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* set the menu item enable/disable */
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setOptionsMenuEnabled();
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] add a word */
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        menu.add(0, MENU_ITEM_ADD, 0, R.string.user_dictionary_add)
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setIcon(android.R.drawable.ic_menu_add)
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setEnabled(mAddMenuEnabled);
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] edit a word */
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        menu.add(0, MENU_ITEM_EDIT, 0, R.string.user_dictionary_edit)
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setIcon(android.R.drawable.ic_menu_edit)
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setEnabled(mEditMenuEnabled);
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] delete a word */
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        menu.add(0, MENU_ITEM_DELETE, 0, R.string.user_dictionary_delete)
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setIcon(android.R.drawable.ic_menu_delete)
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setEnabled(mDeleteMenuEnabled);
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] clear the dictionary */
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        menu.add(1, MENU_ITEM_INIT, 0, R.string.user_dictionary_init)
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setIcon(android.R.drawable.ic_menu_delete)
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            .setEnabled(mInitMenuEnabled);
275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mMenu = menu;
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInitializedMenu = true;
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return super.onCreateOptionsMenu(menu);
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Change state of the option menus according to a current state of the list widget
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void setOptionsMenuEnabled() {
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] add a word */
290e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mWordList.size() >= MAX_WORD_COUNT) {
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* disable if the number of registered word exceeds MAX_WORD_COUNT */
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mAddMenuEnabled = false;
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mAddMenuEnabled = true;
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] edit a word/delete a word */
298e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mWordList.size() <= MIN_WORD_COUNT) {
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* disable if no word is registered or no word is selected */
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mEditMenuEnabled = false;
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mDeleteMenuEnabled = false;
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mEditMenuEnabled = true;
304e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mSelectedWords) {
305e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mDeleteMenuEnabled = true;
306e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
307e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mDeleteMenuEnabled = false;
308e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* [menu] clear the dictionary (always enabled) */
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mInitMenuEnabled = true;
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.app.Activity#onOptionsItemSelected */
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onOptionsItemSelected(MenuItem item) {
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean ret;
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (item.getItemId()) {
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case MENU_ITEM_ADD:
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* add a word */
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            wordAdd();
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case MENU_ITEM_EDIT:
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* edit the word (show dialog) */
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            wordEdit(sFocusingView, sFocusingPairView);
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case MENU_ITEM_DELETE:
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* delete the word (show dialog) */
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            showDialog(DIALOG_CONTROL_DELETE_CONFIRM);
33659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mDialogShow = DIALOG_CONTROL_DELETE_CONFIRM;
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case MENU_ITEM_INIT:
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* clear the dictionary (show dialog) */
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            showDialog(DIALOG_CONTROL_INIT_CONFIRM);
34359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mDialogShow = DIALOG_CONTROL_INIT_CONFIRM;
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = true;
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = false;
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.app.Activity#onKeyUp */
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override public boolean onKeyUp(int keyCode, KeyEvent event) {
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        /* open the menu if KEYCODE_DPAD_CENTER is pressed */
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            openOptionsMenu();
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return true;
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
3610470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa         return super.onKeyUp(keyCode, event);
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.app.Activity#onCreateDialog */
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    @Override protected Dialog onCreateDialog(int id) {
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (id) {
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case DIALOG_CONTROL_DELETE_CONFIRM:
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return new AlertDialog.Builder(UserDictionaryToolsList.this)
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setMessage(R.string.user_dictionary_delete_confirm)
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setNegativeButton(android.R.string.cancel, null)
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setPositiveButton(android.R.string.ok, mDialogDeleteWords)
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setCancelable(true)
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .create();
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case DIALOG_CONTROL_INIT_CONFIRM:
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return new AlertDialog.Builder(UserDictionaryToolsList.this)
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setMessage(R.string.dialog_clear_user_dictionary_message)
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setNegativeButton(android.R.string.cancel, null)
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setPositiveButton(android.R.string.ok, mDialogInitWords)
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .setCancelable(true)
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                .create();
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Log.e("OpenWnn", "onCreateDialog : Invaled Get DialogID. ID=" + id);
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return super.onCreateDialog(id);
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Process the event when the button on the "Delete word" dialog is pushed
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  dialog    The information of the dialog
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  button    The button that is pushed
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private DialogInterface.OnClickListener mDialogDeleteWords =
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        new DialogInterface.OnClickListener() {
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void onClick(DialogInterface dialog, int button) {
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
40259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mDialogShow = -1;
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                CharSequence focusString = ((TextView)sFocusingView).getText();
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                CharSequence focusPairString = ((TextView)sFocusingPairView).getText();
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                WnnWord wnnWordSearch = new WnnWord();
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
407e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mSelectedViewID > MAX_WORD_COUNT) {
408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    wnnWordSearch.stroke = focusPairString.toString();
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    wnnWordSearch.candidate = focusString.toString();
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    wnnWordSearch.stroke = focusString.toString();
412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    wnnWordSearch.candidate = focusPairString.toString();
413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                boolean deleted = deleteWord(wnnWordSearch);
415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (deleted) {
416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    Toast.makeText(getApplicationContext(),
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                   R.string.user_dictionary_delete_complete,
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                   Toast.LENGTH_LONG).show();
419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    Toast.makeText(getApplicationContext(),
421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                   R.string.user_dictionary_delete_fail,
422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                   Toast.LENGTH_LONG).show();
423e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return;
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
426e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWordList = getWords();
427e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                int size = mWordList.size();
428e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (size <= mWordCount) {
429e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    int newPos = (mWordCount - MAX_LIST_WORD_COUNT);
430e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mWordCount = (0 <= newPos) ? newPos : 0;
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
432e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                updateWordList();
433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                TextView leftText = (TextView) findViewById(R.id.user_dictionary_tools_list_title_words_count);
435e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                leftText.setText(size + "/" + MAX_WORD_COUNT);
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (mInitializedMenu) {
438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    onCreateOptionsMenu(mMenu);
439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        };
442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Process the event when the button on the "Initialize" dialog is pushed
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  dialog    The information of the dialog
447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  button    The button that is pushed
448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
449053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private DialogInterface.OnClickListener mDialogInitWords =
450053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        new DialogInterface.OnClickListener() {
451053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void onClick(DialogInterface dialog, int button) {
452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
45359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mDialogShow = -1;
454053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* clear the user dictionary */
455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                OpenWnnEvent ev = new OpenWnnEvent(OpenWnnEvent.INITIALIZE_USER_DICTIONARY, new WnnWord());
456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                sendEventToIME(ev);
458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* show the message */
459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                Toast.makeText(getApplicationContext(), R.string.dialog_clear_user_dictionary_done,
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                               Toast.LENGTH_LONG).show();
461e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWordList = new ArrayList<WnnWord>();
462e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWordCount = 0;
463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                updateWordList();
464e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TextView leftText = (TextView) findViewById(R.id.user_dictionary_tools_list_title_words_count);
465e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                leftText.setText(mWordList.size() + "/" + MAX_WORD_COUNT);
466e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
467e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mInitializedMenu) {
468e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    onCreateOptionsMenu(mMenu);
469e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        };
472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** @see android.view.View.OnClickListener#onClick */
475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void onClick(View arg0) {
476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see android.view.View.OnTouchListener#onTouch */
479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean onTouch(View v, MotionEvent e) {
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSelectedViewID = ((TextView)v).getId();
483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (e.getAction()) {
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case MotionEvent.ACTION_DOWN:
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* double tap handling */
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (sBeforeSelectedViewID != ((TextView)v).getId()) {
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                /* save the view id if the id is not same as previously selected one */
488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                sBeforeSelectedViewID = ((TextView)v).getId();
489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if ((e.getDownTime() - sJustBeforeActionTime) < DOUBLE_TAP_TIME) {
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    /* edit the word if double tapped */
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    sFocusingView = v;
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    sFocusingPairView = ((UserDictionaryToolsListFocus)v).getPairView();
494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    wordEdit(sFocusingView, sFocusingPairView);
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            /* save the action time */
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sJustBeforeActionTime = e.getDownTime();
499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return false;
503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** @see android.view.View.OnFocusChangeListener#onFocusChange */
506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void onFocusChange(View v, boolean hasFocus) {
507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mSelectedViewID = ((TextView)v).getId();
509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        sFocusingView = v;
510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        sFocusingPairView = ((UserDictionaryToolsListFocus)v).getPairView();
511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (hasFocus) {
512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ((TextView)v).setTextColor(Color.BLACK);
513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            v.setBackgroundColor(FOCUS_BACKGROUND_COLOR);
514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ((TextView)sFocusingPairView).setTextColor(Color.BLACK);
515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sFocusingPairView.setBackgroundColor(FOCUS_BACKGROUND_COLOR);
516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mSelectedWords = true;
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
518e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mSelectedWords = false;
519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ((TextView)v).setTextColor(Color.LTGRAY);
520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            v.setBackgroundColor(UNFOCUS_BACKGROUND_COLOR);
521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ((TextView)sFocusingPairView).setTextColor(Color.LTGRAY);
522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sFocusingPairView.setBackgroundColor(UNFOCUS_BACKGROUND_COLOR);
523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInitializedMenu) {
525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            onCreateOptionsMenu(mMenu);
526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Add the word
531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void wordAdd() {
533e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /** change to the edit window */
534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        screenTransition(Intent.ACTION_INSERT, mEditViewName);
535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Edit the specified word
539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusView       The information of view
541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusPairView   The information of pair of view
542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void wordEdit(View focusView, View focusPairView) {
5447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (mSelectedViewID > MAX_WORD_COUNT) {
5457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            createUserDictionaryToolsEdit(focusPairView, focusView);
546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
5477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            createUserDictionaryToolsEdit(focusView, focusPairView);
548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        screenTransition(Intent.ACTION_EDIT, mEditViewName);
550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * The internal process of editing the specified word
554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusView        The information of view
556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusPairView    The information of pair of view
557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
5587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    protected abstract UserDictionaryToolsEdit createUserDictionaryToolsEdit(View focusView, View focusPairView);
559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
560053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Delete the specified word
562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
56377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param  searchword   The information of searching
56477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          {@code true} if success; {@code false} if fail.
565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public boolean deleteWord(WnnWord searchword) {
567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        OpenWnnEvent event = new OpenWnnEvent(OpenWnnEvent.LIST_WORDS_IN_USER_DICTIONARY,
568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                              WnnEngine.DICTIONARY_TYPE_USER,
569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                              searchword);
570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean deleted = false;
572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        sendEventToIME(event);
573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for( int i=0; i < MAX_WORD_COUNT; i++) {
574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            WnnWord getword = new WnnWord();
575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            event = new OpenWnnEvent(OpenWnnEvent.GET_WORD,
576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                     getword);
577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            sendEventToIME(event);
578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            getword = event.word;
579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int len = getword.candidate.length();
580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (len == 0) {
581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (searchword.candidate.equals(getword.candidate)) {
584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                WnnWord delword = new WnnWord();
585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                delword.stroke = searchword.stroke;
586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                delword.candidate = searchword.candidate;
587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                delword.id = i;
588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                event = new OpenWnnEvent(OpenWnnEvent.DELETE_WORD,
589053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                         delword);
590053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                deleted = sendEventToIME(event);
591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mInitializedMenu) {
596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            onCreateOptionsMenu(mMenu);
597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return deleted;
600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Processing the transition of screen
605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  action       The string of action
607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  classname    The class name
608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void screenTransition(String action, String classname) {
610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
611053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (action.equals("")) {
612053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mIntent = new Intent();
613053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
614053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mIntent = new Intent(action);
615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mIntent.setClassName(mPackageName, classname);
617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        startActivity(mIntent);
618053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        finish();
619053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
622e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Get the list of words in the user dictionary.
623e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return The list of words
624053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
625e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ArrayList<WnnWord> getWords() {
626e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        WnnWord word = new WnnWord();
627e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        OpenWnnEvent event = new OpenWnnEvent(OpenWnnEvent.LIST_WORDS_IN_USER_DICTIONARY,
628e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                              WnnEngine.DICTIONARY_TYPE_USER,
629e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                              word);
630e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        sendEventToIME(event);
631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
632e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        ArrayList<WnnWord> list = new ArrayList<WnnWord>();
633e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < MAX_WORD_COUNT; i++) {
634e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            event = new OpenWnnEvent(OpenWnnEvent.GET_WORD, word);
635e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (!sendEventToIME(event)) {
636e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
638e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            list.add(event.word);
639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
640e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
641e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        compareTo(list);
642e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
643e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return list;
644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
647e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Sort the list of words
648e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param array The array list of the words
649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
650e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    protected void compareTo(ArrayList<WnnWord> array) {
651e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mSortData = new WnnWord[array.size()];
652e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        array.toArray(mSortData);
653e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Arrays.sort(mSortData, getComparator());
654e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
655e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
656e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
658e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Update the word list.
659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
660e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void updateWordList() {
661e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!mInit) {
662e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mInit = true;
663e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mSelectedViewID = 1;
664e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
665e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            Window window = getWindow();
666e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            WindowManager windowManager = window.getWindowManager();
667e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            Display display = windowManager.getDefaultDisplay();
668e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int system_width = display.getWidth();
669e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
67059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            UserDictionaryToolsListFocus dummy = new UserDictionaryToolsListFocus(this);
67159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            dummy.setTextSize(WORD_TEXT_SIZE);
67259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            TextPaint paint = dummy.getPaint();
67359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            FontMetricsInt fontMetrics = paint.getFontMetricsInt();
67459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int row_hight = (Math.abs(fontMetrics.top) + fontMetrics.bottom) * 2;
67559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
676e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int i = 1; i <= MAX_LIST_WORD_COUNT; i++) {
677e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TableRow row = new TableRow(this);
678e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                UserDictionaryToolsListFocus stroke = new UserDictionaryToolsListFocus(this);
679e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setId(i);
680e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setWidth(system_width/2);
681e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setTextSize(WORD_TEXT_SIZE);
682e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setTextColor(Color.LTGRAY);
683e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setBackgroundColor(UNFOCUS_BACKGROUND_COLOR);
684e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setSingleLine();
685e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setPadding(1,0,1,1);
686e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setEllipsize(TextUtils.TruncateAt.END);
687e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setClickable(true);
688e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setFocusable(true);
689e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setFocusableInTouchMode(true);
690e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setOnTouchListener(this);
691e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setOnFocusChangeListener(this);
69259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (isXLarge()) {
69359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    stroke.setHeight(row_hight);
69459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    stroke.setGravity(Gravity.CENTER_VERTICAL);
69559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
696e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
697e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                UserDictionaryToolsListFocus candidate = new UserDictionaryToolsListFocus(this);
698e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setId(i+MAX_WORD_COUNT);
699e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setWidth(system_width/2);
700e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setTextSize(WORD_TEXT_SIZE);
701e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setTextColor(Color.LTGRAY);
702e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setBackgroundColor(UNFOCUS_BACKGROUND_COLOR);
703e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setSingleLine();
704e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setPadding(1,0,1,1);
705e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setEllipsize(TextUtils.TruncateAt.END);
706e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setClickable(true);
707e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setFocusable(true);
708e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setFocusableInTouchMode(true);
709e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setOnTouchListener(this);
710e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setOnFocusChangeListener(this);
711e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
71259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (isXLarge()) {
71359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    candidate.setHeight(row_hight);
71459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    candidate.setGravity(Gravity.CENTER_VERTICAL);
71559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
716e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                stroke.setPairView(candidate);
717e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                candidate.setPairView(stroke);
718e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
719e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                row.addView(stroke);
720e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                row.addView(candidate);
7210f28cd7d2d4967ce9a796497387e8dbfd19666c6Romain Guy                mTableLayout.addView(row, tableCreateParam(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
722e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
723e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
724e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
725e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int size = mWordList.size();
726e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int start = mWordCount;
727e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
728e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView t = (TextView)findViewById(R.id.user_dictionary_position_indicator);
729e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (size <= MAX_LIST_WORD_COUNT) {
730e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            ((View)mLeftButton.getParent()).setVisibility(View.GONE);
731e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
732e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            ((View)mLeftButton.getParent()).setVisibility(View.VISIBLE);
733e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int last = (start + MAX_LIST_WORD_COUNT);
734e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            t.setText((start + 1) + " - " + Math.min(last, size));
735e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
736e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mLeftButton.setEnabled(start != 0);
737e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mRightButton.setEnabled(last < size);
738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
739e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
740e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int selectedId = mSelectedViewID - ((MAX_WORD_COUNT < mSelectedViewID) ? MAX_WORD_COUNT : 0);
741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
742e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < MAX_LIST_WORD_COUNT; i++) {
743e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if ((size - 1) < (start + i)) {
744e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if ((0 < i) && (selectedId == (i + 1))) {
745e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mTableLayout.findViewById(i).requestFocus();
746e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
747e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
748e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                ((View)(mTableLayout.findViewById(i + 1)).getParent()).setVisibility(View.GONE);
749e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                continue;
750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
751e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
752e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            WnnWord wnnWordGet;
753e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            wnnWordGet = mSortData[start + i];
754053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int len_stroke = wnnWordGet.stroke.length();
755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int len_candidate = wnnWordGet.candidate.length();
756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (len_stroke == 0 || len_candidate == 0) {
757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
760e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (selectedId == i + 1) {
761e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mTableLayout.findViewById(i + 1).requestFocus();
762e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
763e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
764e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            TextView text = (TextView)mTableLayout.findViewById(i + 1);
765e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            text.setText(wnnWordGet.stroke);
766e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            text = (TextView)mTableLayout.findViewById(i + 1 + MAX_WORD_COUNT);
767e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            text.setText(wnnWordGet.candidate);
768e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            ((View)text.getParent()).setVisibility(View.VISIBLE);
769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mTableLayout.requestLayout();
771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
77259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
77359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
77459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Whether the x large mode.
77559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
77659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return      {@code true} if x large; {@code false} if not x large.
77759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
77859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public static boolean isXLarge() {
77959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mIsXLarge;
78059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
78159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
783