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
1959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport java.nio.channels.Selector;
207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport java.util.ArrayList;
2159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport java.util.LinkedList;
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Context;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences;
247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.content.res.Resources;
2559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.content.res.Configuration;
2659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.graphics.drawable.Drawable;
2759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.graphics.Rect;
2859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.media.AudioManager;
2959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.os.Handler;
3059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.os.Message;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Vibrator;
3259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.preference.PreferenceManager;
33e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.TextUtils;
34e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.TextPaint;
35e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.SpannableString;
36e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.Spanned;
37e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.style.ImageSpan;
38e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.style.DynamicDrawableSpan;
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
40e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.util.DisplayMetrics;
4159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.util.TypedValue;
427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.view.Gravity;
4359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.KeyEvent;
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.MotionEvent;
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.ViewGroup;
47e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.View.OnClickListener;
48e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.View.OnLongClickListener;
497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.view.GestureDetector;
50e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.LayoutInflater;
517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.Button;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.LinearLayout;
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.ScrollView;
547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.TextView;
557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.EditText;
560470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawaimport android.widget.AbsoluteLayout;
57e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.widget.ImageView;
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
603feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The default candidates view manager class using {@link EditText}.
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
6259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @author Copyright (C) 2009-2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
6459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmapublic class TextCandidatesViewManager extends CandidatesViewManager implements GestureDetector.OnGestureListener {
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of lines to display (Portrait) */
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int LINE_NUM_PORTRAIT       = 2;
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of lines to display (Landscape) */
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int LINE_NUM_LANDSCAPE      = 1;
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
707b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Maximum lines */
713feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private static final int DISPLAY_LINE_MAX_COUNT = 1000;
72e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Maximum number of displaying candidates par one line (full view mode) */
73e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int FULL_VIEW_DIV = 4;
7459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Maximum number of displaying candidates par one line (full view mode)(symbol)(portrait) */
7559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int FULL_VIEW_SYMBOL_DIV_PORT = 6;
7659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Maximum number of displaying candidates par one line (full view mode)(symbol)(landscape) */
7759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int FULL_VIEW_SYMBOL_DIV_LAND = 10;
7859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Delay of set candidate */
7959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int SET_CANDIDATE_DELAY = 50;
8059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** First line count */
8159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int SET_CANDIDATE_FIRST_LINE_COUNT = 7;
8259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Delay line count */
8359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int SET_CANDIDATE_DELAY_LINE_COUNT = 1;
8459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
8559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Focus is none now */
8659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int FOCUS_NONE = -1;
8759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Handler for focus Candidate */
8859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int MSG_MOVE_FOCUS = 0;
8959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Handler for set  Candidate */
9059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int MSG_SET_CANDIDATES = 1;
9159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Handler for select Candidate */
9259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int MSG_SELECT_CANDIDATES = 2;
9359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
9459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** NUmber of Candidate display lines */
9559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int SETTING_NUMBER_OF_LINEMAX = 5;
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Body view of the candidates list */
9859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private ViewGroup  mViewBody = null;
9959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
10059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** The view of the Symbol Tab */
10159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private TextView mViewTabSymbol;
10259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** The view of the Emoticon Tab */
10359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private TextView mViewTabEmoticon;
1047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Scroller of {@code mViewBodyText} */
1057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private ScrollView mViewBodyScroll;
106e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Base of {@code mViewCandidateList1st}, {@code mViewCandidateList2nd} */
107e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ViewGroup mViewCandidateBase;
108e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Button displayed bottom of the view when there are more candidates. */
109e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ImageView mReadMoreButton;
110e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout for the candidates list on normal view */
111e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private LinearLayout mViewCandidateList1st;
112e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout for the candidates list on full view */
1130470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private AbsoluteLayout mViewCandidateList2nd;
11459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** View for symbol tab */
11559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private LinearLayout mViewCandidateListTab;
1167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** {@link OpenWnn} instance using this manager */
1177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private OpenWnn mWnn;
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** View type (VIEW_TYPE_NORMAL or VIEW_TYPE_FULL or VIEW_TYPE_CLOSE) */
1197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mViewType;
1207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Portrait display({@code true}) or landscape({@code false}) */
1217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mPortrait;
1227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Width of the view */
1247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mViewWidth;
1250470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /** Minimum width of a candidate (density support) */
1260470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private int mCandidateMinimumWidth;
1270470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /** Maximum width of a candidate (density support) */
1280470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private int mCandidateMinimumHeight;
12959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Minimum height of the category candidate view */
13059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mCandidateCategoryMinimumHeight;
13159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Left align threshold of the candidate view */
13259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mCandidateLeftAlignThreshold;
13359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Height of keyboard */
13459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mKeyboardHeight;
13559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Height of symbol keyboard */
13659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mSymbolKeyboardHeight;
13759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Height of symbol keyboard tab */
13859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mSymbolKeyboardTabHeight;
13959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether being able to use Emoticon */
14059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mEnableEmoticon = false;
14159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
14259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether hide the view if there is no candidate */
14359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mAutoHideMode = true;
14459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** The converter to get candidates from and notice the selected candidate to. */
1457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private WnnEngine mConverter;
1467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Limitation of displaying candidates */
1477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mDisplayLimit;
1487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Vibrator for touch vibration */
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Vibrator mVibrator = null;
15159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** AudioManager for click sound */
15259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private AudioManager mSound = null;
15359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
15459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Number of candidates displaying for 1st */
15559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mWordCount1st;
15659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Number of candidates displaying for 2nd */
15759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mWordCount2nd;
15859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** List of candidates for 1st */
15959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private ArrayList<WnnWord> mWnnWordArray1st = new ArrayList<WnnWord>();
16059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** List of candidates for 2nd */
16159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private ArrayList<WnnWord> mWnnWordArray2nd = new ArrayList<WnnWord>();
16259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** List of select candidates */
16359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private LinkedList<WnnWord> mWnnWordSelectedList = new LinkedList<WnnWord>();
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Gesture detector */
1667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private GestureDetector mGestureDetector;
1673feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** Character width of the candidate area */
1687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mLineLength = 0;
169e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of lines displayed */
170e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mLineCount = 1;
1717b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1723feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** {@code true} if the full screen mode is selected */
1737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mIsFullView = false;
1747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1753feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** The event object for "touch" */
1767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private MotionEvent mMotionEvent = null;
1777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** The offset when the candidates is flowed out the candidate window */
1797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mDisplayEndOffset = 0;
1803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** {@code true} if there are more candidates to display. */
1813feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private boolean mCanReadMore = false;
182e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Color of the candidates */
183e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mTextColor = 0;
184e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Template object for each candidate and normal/full view change button */
185e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView mViewCandidateTemplate;
186e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of candidates in full view */
187e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewWordCount;
188e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of candidates in the current line (in full view) */
189e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewOccupyCount;
190e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** View of the previous candidate (in full view) */
191e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView mFullViewPrevView;
192e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Id of the top line view (in full view) */
193e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewPrevLineTopId;
194e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout of the previous candidate (in full view) */
1950470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private ViewGroup.LayoutParams mFullViewPrevParams;
19659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether all candidates are displayed */
197e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mCreateCandidateDone;
198e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of lines in normal view */
199e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mNormalViewWordCountOfLine;
200e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
20159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** List of textView for CandiData List 1st for Symbol mode */
20259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private ArrayList<TextView> mTextViewArray1st = new ArrayList<TextView>();
20359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** List of textView for CandiData List 2st for Symbol mode */
20459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private ArrayList<TextView> mTextViewArray2nd = new ArrayList<TextView>();
20559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Now focus textView index */
20659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mCurrentFocusIndex = FOCUS_NONE;
20759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Focused View */
20859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private View mFocusedView = null;
20959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Focused View Background */
21059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private Drawable mFocusedViewBackground = null;
21159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Axis to find next TextView for Up/Down */
21259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mFocusAxisX = 0;
21359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Now focused TextView in mTextViewArray1st */
21459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mHasFocusedArray1st = true;
21559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
21659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Portrait Number of Lines from Preference */
21759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mPortraitNumberOfLine = LINE_NUM_PORTRAIT;
21859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Landscape Number of Lines from Preference */
21959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mLandscapeNumberOfLine = LINE_NUM_LANDSCAPE;
22059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
22159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Coordinates of line */
22259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mLineY = 0;
22359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
22459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** {@code true} if the candidate is selected */
22559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mIsSymbolSelected = false;
22659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
22759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether candidates is symbol */
22859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mIsSymbolMode = false;
22959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
23059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Symbol mode */
23159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mSymbolMode = OpenWnnJAJP.ENGINE_MODE_SYMBOL;
23259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
23359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Text size of candidates */
23459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private float mCandNormalTextSize;
23559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
23659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Text size of category */
23759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private float mCandCategoryTextSize;
23859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
23959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** HardKeyboard hidden({@code true}) or disp({@code false}) */
24059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mHardKeyboardHidden = true;
24159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
24259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Minimum height of the candidate 1line view */
24359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int mCandidateOneLineMinimumHeight;
24459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
24559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Whether candidates long click enable */
24659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean mEnableCandidateLongClick = true;
24759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
24859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Keyboard vertical gap value */
24959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final float KEYBOARD_VERTICAL_GAP = 0.009f;
25059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
25159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Keyboard vertical gap count */
25259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private static final int KEYBOARD_VERTICAL_GAP_COUNT = 3;
25359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
25459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** {@code Handler} Handler for focus Candidate wait delay */
25559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private Handler mHandler = new Handler() {
25659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            @Override public void handleMessage(Message msg) {
25759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                switch (msg.what) {
25859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case MSG_MOVE_FOCUS:
25959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    moveFocus(msg.arg1, msg.arg2 == 1);
26059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
26159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
26259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case MSG_SET_CANDIDATES:
26359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mViewType == CandidatesViewManager.VIEW_TYPE_FULL && mIsSymbolMode) {
26459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        displayCandidates(mConverter, false, SET_CANDIDATE_DELAY_LINE_COUNT);
265e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
26659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
267e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
26859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case MSG_SELECT_CANDIDATES:
269e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    WnnWord word = null;
27059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    while ((word = mWnnWordSelectedList.poll()) != null) {
27159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        selectCandidate(word);
27259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
27359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
27459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
27559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                default:
27659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
277e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
278e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
279e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        };
280e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
28159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Event listener for touching a candidate for 1st */
28259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private OnClickListener mCandidateOnClick1st = new OnClickListener() {
28359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        public void onClick(View v) {
28459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            onClickCandidate(v, mWnnWordArray1st);
28559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
28659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    };
287e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
28859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Event listener for touching a candidate for 2nd */
28959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private OnClickListener mCandidateOnClick2nd = new OnClickListener() {
29059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        public void onClick(View v) {
29159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            onClickCandidate(v, mWnnWordArray2nd);
29259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
29359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    };
29459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
29559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Event listener for long-clicking a candidate for 1st */
29659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private OnLongClickListener mCandidateOnLongClick1st = new OnLongClickListener() {
29759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        public boolean onLongClick(View v) {
29859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return onLongClickCandidate(v, mWnnWordArray1st);
29959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
30059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    };
30159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
30259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Event listener for long-clicking a candidate for for 2nd */
30359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private OnLongClickListener mCandidateOnLongClick2nd = new OnLongClickListener() {
30459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        public boolean onLongClick(View v) {
30559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return onLongClickCandidate(v, mWnnWordArray2nd);
30659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
30759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    };
308e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
30959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** Event listener for click a symbol tab */
31059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private OnClickListener mTabOnClick = new OnClickListener() {
31159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        public void onClick(View v) {
31259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (!v.isShown()) {
31359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return;
31459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
31559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            playSoundAndVibration();
31659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
31759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (v instanceof TextView) {
31859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                TextView text = (TextView)v;
31959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                switch (text.getId()) {
32059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case R.id.candview_symbol:
32159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL) {
32259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
32359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                      OpenWnnJAJP.ENGINE_MODE_SYMBOL));
324e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
32559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
32659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
32759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                case R.id.candview_emoticon:
32859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
32959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CHANGE_MODE,
33059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                OpenWnnJAJP.ENGINE_MODE_SYMBOL));
33159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
33259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
33359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
33459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                default:
33559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
336e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
337e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
33859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
33959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    };
340e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
3413feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public TextCandidatesViewManager() {
3453feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        this(-1);
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param displayLimit      The limit of display
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public TextCandidatesViewManager(int displayLimit) {
35459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mDisplayLimit = displayLimit;
35559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
35659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
35759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
35859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Handle a click event on the candidate.
35959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param v  View
36059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param list  List of candidates
36159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
36259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void onClickCandidate(View v, ArrayList<WnnWord> list) {
36359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!v.isShown()) {
36459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
36559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
36659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        playSoundAndVibration();
36759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
36859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (v instanceof TextView) {
36959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            TextView text = (TextView)v;
37059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int wordcount = text.getId();
37159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            WnnWord word = list.get(wordcount);
37259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
37359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mHandler.hasMessages(MSG_SET_CANDIDATES)) {
37459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mWnnWordSelectedList.add(word);
37559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return;
37659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
37759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            clearFocusCandidate();
37859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            selectCandidate(word);
37959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
38059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
38159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
38259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
38359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Handle a long click event on the candidate.
38459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param v  View
38559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param list  List of candidates
38659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
38759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public boolean onLongClickCandidate(View v, ArrayList<WnnWord> list) {
38859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mViewLongPressDialog == null) {
38959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return false;
39059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
39159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
39259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode) {
39359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return false;
39459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
39559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
39659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mEnableCandidateLongClick) {
39759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return false;
39859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
39959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
40059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!v.isShown()) {
40159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
40259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
40359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
40459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Drawable d = v.getBackground();
40559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (d != null) {
40659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if(d.getState().length == 0){
40759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
40859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
40959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
41059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
41159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int wordcount = ((TextView)v).getId();
41259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWord = list.get(wordcount);
41359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        clearFocusCandidate();
41459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        displayDialog(v, mWord);
41559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
41659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return true;
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set auto-hide mode.
42177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param hide      {@code true} if the view will hidden when no candidate exists;
42277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     *                  {@code false} if the view is always shown.
423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setAutoHide(boolean hide) {
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mAutoHideMode = hide;
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
42859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** @see CandidatesViewManager#initView */
429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public View initView(OpenWnn parent, int width, int height) {
430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mWnn = parent;
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mViewWidth = width;
432e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Resources r = mWnn.getResources();
43359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidateMinimumWidth = r.getDimensionPixelSize(R.dimen.cand_minimum_width);
43459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidateMinimumHeight = r.getDimensionPixelSize(R.dimen.cand_minimum_height);
43559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.isXLarge()) {
43659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCandidateOneLineMinimumHeight = r.getDimensionPixelSize(R.dimen.candidate_layout_height);
43759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
43859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidateCategoryMinimumHeight = r.getDimensionPixelSize(R.dimen.cand_category_minimum_height);
43959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandidateLeftAlignThreshold = r.getDimensionPixelSize(R.dimen.cand_left_align_threshold);
44059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mKeyboardHeight = r.getDimensionPixelSize(R.dimen.keyboard_height);
44159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.isXLarge()) {
44259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mKeyboardHeight += Math.round(height * KEYBOARD_VERTICAL_GAP)
44359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                * KEYBOARD_VERTICAL_GAP_COUNT;
44459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
44559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mSymbolKeyboardHeight = r.getDimensionPixelSize(R.dimen.symbol_keyboard_height);
44659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Drawable d = r.getDrawable(R.drawable.tab_no_select);
44759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mSymbolKeyboardTabHeight = d.getMinimumHeight();
44859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
44959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mPortrait =
45059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            (r.getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE);
45159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
45259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandNormalTextSize = r.getDimensionPixelSize(R.dimen.cand_normal_text_size);
45359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCandCategoryTextSize = r.getDimensionPixelSize(R.dimen.cand_category_text_size);
4547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
455e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        LayoutInflater inflater = parent.getLayoutInflater();
456e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewBody = (ViewGroup)inflater.inflate(R.layout.candidates, null);
4577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
45859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mViewTabSymbol = (TextView)mViewBody.findViewById(R.id.candview_symbol);
45959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mViewTabEmoticon = (TextView)mViewBody.findViewById(R.id.candview_emoticon);
46059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mViewBodyScroll = (ScrollView)mViewBody.findViewById(R.id.candview_scroll);
462e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
463e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateBase = (ViewGroup)mViewBody.findViewById(R.id.candview_base);
464e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
46559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        setNumeberOfDisplayLines();
466e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        createNormalCandidateView();
4670470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        mViewCandidateList2nd = (AbsoluteLayout)mViewBody.findViewById(R.id.candidates_2nd_view);
468e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
469e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mTextColor = r.getColor(R.color.candidate_text);
47059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
47159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mReadMoreButton = (ImageView)mViewBody.findViewById(R.id.read_more_button);
472e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButton.setOnTouchListener(new View.OnTouchListener() {
473e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public boolean onTouch(View v, MotionEvent event) {
47459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    int resid = 0;
475e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    switch (event.getAction()) {
476e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    case MotionEvent.ACTION_DOWN:
477e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (mIsFullView) {
47859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            resid = R.drawable.cand_up_press;
479e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        } else {
48059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            resid = R.drawable.cand_down_press;
481e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
48259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        break;
483e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    case MotionEvent.ACTION_UP:
484e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (mIsFullView) {
48559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            resid = R.drawable.cand_up;
486e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        } else {
48759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                            resid = R.drawable.cand_down;
488e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
489e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        break;
490e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    default:
491e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        break;
492e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
49359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
49459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (resid != 0) {
49559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mReadMoreButton.setImageResource(resid);
49659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
497e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return false;
498e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
499e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
500e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButton.setOnClickListener(new View.OnClickListener() {
501e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
502e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (!v.isShown()) {
503e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        return;
504e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
50559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    playSoundAndVibration();
506e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
507e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mIsFullView) {
508e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mIsFullView = false;
509e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
510e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    } else {
511e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mIsFullView = true;
512e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
513e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
514e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
515e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
5163feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE);
518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mGestureDetector = new GestureDetector(this);
520e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
52159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mViewLongPressDialog = (View)inflater.inflate(R.layout.candidate_longpress_dialog, null);
522e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
523e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* select button */
52459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Button longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_select);
52559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
526e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
52759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    playSoundAndVibration();
52859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    clearFocusCandidate();
529e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    selectCandidate(mWord);
53059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    closeDialog();
531e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
532e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
533e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
534e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* cancel button */
53559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        longPressDialogButton = (Button)mViewLongPressDialog.findViewById(R.id.candidate_longpress_dialog_cancel);
53659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        longPressDialogButton.setOnClickListener(new View.OnClickListener() {
537e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
53859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    playSoundAndVibration();
53959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
540e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.UPDATE_CANDIDATE));
54159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    closeDialog();
542e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
543e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
544e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
545053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewBody;
546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
548e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
549e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Create the normal candidate view
550e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
551e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void createNormalCandidateView() {
552e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateList1st = (LinearLayout)mViewBody.findViewById(R.id.candidates_1st_view);
55359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mViewCandidateList1st.setOnClickListener(mCandidateOnClick1st);
554e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
55559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mViewCandidateListTab = (LinearLayout)mViewBody.findViewById(R.id.candview_tab);
55659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        TextView tSymbol = mViewTabSymbol;
55759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tSymbol.setOnClickListener(mTabOnClick);
55859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        TextView tEmoticon = mViewTabEmoticon;
55959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tEmoticon.setOnClickListener(mTabOnClick);
56059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
56159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int line = SETTING_NUMBER_OF_LINEMAX;
562e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int width = mViewWidth;
563e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < line; i++) {
564e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = new LinearLayout(mViewBodyScroll.getContext());
565e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            lineView.setOrientation(LinearLayout.HORIZONTAL);
56659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            LinearLayout.LayoutParams layoutParams =
5670f28cd7d2d4967ce9a796497387e8dbfd19666c6Romain Guy                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
568e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                              ViewGroup.LayoutParams.WRAP_CONTENT);
569e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            lineView.setLayoutParams(layoutParams);
570e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int j = 0; j < (width / getCandidateMinimumWidth()); j++) {
571e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TextView tv = createCandidateView();
572e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                lineView.addView(tv);
573e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
574e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
575e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (i == 0) {
576e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TextView tv = createCandidateView();
577e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
578e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                             ViewGroup.LayoutParams.WRAP_CONTENT);
579e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams.weight = 0;
580e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams.gravity = Gravity.RIGHT;
581e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                tv.setLayoutParams(layoutParams);
582e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
583e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                lineView.addView(tv);
584e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateTemplate = tv;
585e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
586e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.addView(lineView);
587e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
588e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
589e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
5907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getCurrentView */
591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public View getCurrentView() {
592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewBody;
593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#setViewType */
596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setViewType(int type) {
5977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        boolean readMore = setViewLayout(type);
598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
5997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (readMore) {
6007b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            displayCandidates(this.mConverter, false, -1);
60159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
60277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            if (type == CandidatesViewManager.VIEW_TYPE_NORMAL) {
6037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = false;
60477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (mDisplayEndOffset > 0) {
6053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    int maxLine = getMaxLine();
6063feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    displayCandidates(this.mConverter, false, maxLine);
60777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                } else {
60877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    setReadMore();
60977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
61077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            } else {
61177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (mViewBody.isShown()) {
612e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mWnn.setCandidatesViewShown(false);
61377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
61477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
6157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
6167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
6177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
6187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
6197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Set the view layout
6207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     *
62177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param type      View type
62277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          {@code true} if display is updated; {@code false} if otherwise
6237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
6247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean setViewLayout(int type) {
62559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
62659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        ViewGroup.LayoutParams params;
62759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int line = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
62859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
62959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if ((mViewType == CandidatesViewManager.VIEW_TYPE_FULL)
63059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                && (type == CandidatesViewManager.VIEW_TYPE_NORMAL)) {
63159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            clearFocusCandidate();
63259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
63359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
6347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mViewType = type;
63577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
636e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        switch (type) {
637e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_CLOSE:
63859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
63959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                   getCandidateMinimumHeight() * line);
64059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.setLayoutParams(params);
64159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewCandidateListTab.setVisibility(View.GONE);
642e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(-1);
64359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHandler.removeMessages(MSG_SET_CANDIDATES);
644e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return false;
645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
646e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_NORMAL:
64759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
64859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                   getCandidateMinimumHeight() * line);
64959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.setLayoutParams(params);
650e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewBodyScroll.scrollTo(0, 0);
65159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewCandidateListTab.setVisibility(View.GONE);
652e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.setVisibility(View.VISIBLE);
653e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList2nd.setVisibility(View.GONE);
654e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(-1);
655e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return false;
656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
657e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_FULL:
658e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        default:
65959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
66059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                                   getCandidateViewHeight());
66159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.setLayoutParams(params);
66259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mIsSymbolMode) {
66359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                updateSymbolType();
66459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewCandidateListTab.setVisibility(View.VISIBLE);
66559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
66659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewCandidateListTab.setVisibility(View.GONE);
66759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
668e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList2nd.setVisibility(View.VISIBLE);
66959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewCandidateBase.setMinimumHeight(-1);
670e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return true;
671e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
6747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getViewType */
675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int getViewType() {
676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewType;
677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
6797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#displayCandidates */
680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void displayCandidates(WnnEngine converter) {
681e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
68259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHandler.removeMessages(MSG_SET_CANDIDATES);
68359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
68459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolSelected) {
68559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mIsSymbolSelected = false;
68659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mSymbolMode == OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
68759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return;
68859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
68959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
69059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int prevLineCount = mLineCount;
69159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int prevWordCount1st = mWordCount1st;
69259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            clearNormalViewCandidate();
69359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWordCount1st = 0;
69459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mLineCount = 1;
69559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mLineLength = 0;
69659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mNormalViewWordCountOfLine = 0;
69759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnnWordArray1st.clear();
69859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextViewArray1st.clear();
69959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (((prevWordCount1st == 0) && (mWordCount1st == 1)) ||
70059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                (prevLineCount < mLineCount)) {
70159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewBodyScroll.scrollTo(0, mViewBodyScroll.getScrollY() + getCandidateMinimumHeight());
70259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
70359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isFocusCandidate() && mHasFocusedArray1st) {
70459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCurrentFocusIndex = 0;
70559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                Message m = mHandler.obtainMessage(MSG_MOVE_FOCUS, 0, 0);
70659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mHandler.sendMessage(m);
70759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
70859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return;
70959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
71059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
71177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mCanReadMore = false;
7127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDisplayEndOffset = 0;
7137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mIsFullView = false;
714e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewWordCount = 0;
715e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewOccupyCount = 0;
716e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewPrevLineTopId = 0;
71759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mFullViewPrevView = null;
718e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCreateCandidateDone = false;
719e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mNormalViewWordCountOfLine = 0;
720e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
721e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        clearCandidates();
722e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mConverter = converter;
72359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
72459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
725e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateTemplate.setVisibility(View.VISIBLE);
726e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateTemplate.setBackgroundResource(R.drawable.cand_back);
727e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
728e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        displayCandidates(converter, true, getMaxLine());
72959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
73059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode) {
73159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mIsFullView = true;
73259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
73359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
7367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getMaxLine */
737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int getMaxLine() {
73859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int maxLine = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return maxLine;
740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
74359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get categories text.
74459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param String Source string replacement
74559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return String Categories text
74659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
74759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private String getCategoriesText(String categoriesString) {
74859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        String ret = null;
74959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
75059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Resources r = mWnn.getResources();
75159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if(categoriesString.equals(r.getString(R.string.half_symbol_categories_txt))) {
75259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            ret = r.getString(R.string.half_symbol_txt);
75359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else if (categoriesString.equals(r.getString(R.string.full_symbol_categories_txt))) {
75459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            ret = r.getString(R.string.full_symbol_txt);
75559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
75659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            ret = new String("");
75759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
75859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
75959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return ret;
76059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
76159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
76259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Display the candidates.
7643feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
7657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param converter  {@link WnnEngine} which holds candidates.
766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param dispFirst  Whether it is the first time displaying the candidates
767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param maxLine    The maximum number of displaying lines
768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
76959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void displayCandidates(WnnEngine converter, boolean dispFirst, int maxLine) {
770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (converter == null) {
771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
773053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
774e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Concatenate the candidates already got and the last one in dispFirst mode */
775e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int displayLimit = mDisplayLimit;
7767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
77759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean isDelay = false;
778e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        boolean isBreak = false;
779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
78059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (converter instanceof SymbolList) {
78159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (!dispFirst) {
78259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (maxLine == -1) {
78359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    isDelay = true;
78459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    maxLine = mLineCount + SET_CANDIDATE_FIRST_LINE_COUNT;
78559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
78659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, SET_CANDIDATE_DELAY);
78759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
78859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else if (maxLine == SET_CANDIDATE_DELAY_LINE_COUNT) {
78959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    isDelay = true;
79059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    maxLine = mLineCount + SET_CANDIDATE_DELAY_LINE_COUNT;
79159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
79259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mHandler.sendEmptyMessageDelayed(MSG_SET_CANDIDATES, SET_CANDIDATE_DELAY);
79359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
79459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
79559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mSymbolMode != OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI) {
79659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                displayLimit = -1;
79759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
79859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
79959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
800e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Get candidates */
801e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        WnnWord result = null;
80259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        String prevCandidate = null;
80359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        while ((displayLimit == -1 || getWordCount() < displayLimit)) {
80459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            for (int i = 0; i < DISPLAY_LINE_MAX_COUNT; i++) {
80559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                result = converter.getNextCandidate();
80659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (result == null) {
80759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
80859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
80959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
81059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (converter instanceof SymbolList) {
81159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
81259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
81359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
81459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if ((prevCandidate == null) || !prevCandidate.equals(result.candidate)) {
81559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
81659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
81759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
8187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
819e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (result == null) {
820e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
82159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
82259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                prevCandidate = result.candidate;
82359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
82459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
82559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (converter instanceof SymbolList) {
82659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (isCategory(result)) {
82759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (getWordCount() != 0) {
82859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        createNextLine(false);
82959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
83059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    result.candidate = getCategoriesText(result.candidate);
83159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    setCandidate(true, result);
83259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    createNextLine(true);
83359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    continue;
83459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
835e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
836e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
837e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            setCandidate(false, result);
838e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
83959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if ((dispFirst || isDelay) && (maxLine < mLineCount)) {
840e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mCanReadMore = true;
841e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                isBreak = true;
842e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
843e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
844e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
8457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
846e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!isBreak && !mCreateCandidateDone) {
847e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* align left if necessary */
84859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            createNextLine(false);
849e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mCreateCandidateDone = true;
85059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHandler.removeMessages(MSG_SET_CANDIDATES);
85159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHandler.sendMessage(mHandler.obtainMessage(MSG_SELECT_CANDIDATES));
852e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
85359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
85459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (getWordCount() < 1) { /* no candidates */
855e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mAutoHideMode) {
856e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWnn.setCandidatesViewShown(false);
857e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return;
8587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
859e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mCanReadMore = false;
860e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mIsFullView = false;
861e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
8627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
863053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
864053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
865e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setReadMore();
8667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
867e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!(mViewBody.isShown())) {
868e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mWnn.setCandidatesViewShown(true);
869e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
870e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return;
871e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
872e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
873e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
874e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Add a candidate into the list.
875e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param isCategory  {@code true}:caption of category, {@code false}:normal word
876e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param word        A candidate word
877e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
878e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void setCandidate(boolean isCategory, WnnWord word) {
879e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int textLength = measureText(word.candidate, 0, word.candidate.length());
880e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView template = mViewCandidateTemplate;
881e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textLength += template.getPaddingLeft() + template.getPaddingRight();
882e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int maxWidth = mViewWidth;
88359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean isEmojiSymbol = false;
88459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode && (word.candidate.length() < 3)) {
88559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            isEmojiSymbol = true;
88659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
887e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView textView;
88859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
88959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean is2nd = isFirstListOver(mIsFullView, mLineCount, word);
89059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (is2nd) {
891e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Full view */
89259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int viewDivison = getCandidateViewDivison();
89359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int indentWidth = mViewWidth / viewDivison;
89459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int occupyCount = Math.min((textLength + indentWidth + getCandidateSpaceWidth(isEmojiSymbol)) / indentWidth, viewDivison);
895e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (isCategory) {
89659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                occupyCount = viewDivison;
8977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
898e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
89959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (viewDivison < (mFullViewOccupyCount + occupyCount)) {
90059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (viewDivison != mFullViewOccupyCount) {
90159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mFullViewPrevParams.width += (viewDivison - mFullViewOccupyCount) * indentWidth;
90259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (mFullViewPrevView != null) {
90359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mViewCandidateList2nd.updateViewLayout(mFullViewPrevView, mFullViewPrevParams);
90459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
90577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
906e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mFullViewOccupyCount = 0;
90759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (mFullViewPrevView != null) {
90859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mFullViewPrevLineTopId = mFullViewPrevView.getId();
90959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
910e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineCount++;
91159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (isCategory) {
91259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mLineY += mCandidateCategoryMinimumHeight;
91359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                } else {
91459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    mLineY += getCandidateMinimumHeight();
91559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
91659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
91759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mFullViewWordCount == 0) {
91859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mLineY = 0;
9197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
920e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
9210470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            ViewGroup layout = mViewCandidateList2nd;
922e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
923e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int width = indentWidth * occupyCount;
924e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int height = getCandidateMinimumHeight();
92559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isCategory) {
92659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                height = mCandidateCategoryMinimumHeight;
92759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
9280470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
9290470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            ViewGroup.LayoutParams params = buildLayoutParams(mViewCandidateList2nd, width, height);
9303feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
931e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView = (TextView) layout.getChildAt(mFullViewWordCount);
932e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (textView == null) {
933e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                textView = createCandidateView();
934e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                textView.setLayoutParams(params);
935e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
936e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateList2nd.addView(textView);
937e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
938e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateList2nd.updateViewLayout(textView, params);
939e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
940e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
941e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewOccupyCount += occupyCount;
942e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewWordCount++;
943e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewPrevView = textView;
944e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewPrevParams = params;
945e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
946e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
94759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int viewDivison = getCandidateViewDivison();
94859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int indentWidth = mViewWidth / viewDivison;
94959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textLength = Math.max(textLength, indentWidth);
950e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
951e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Normal view */
952e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int nextEnd = mLineLength + textLength;
95359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            nextEnd += getCandidateSpaceWidth(isEmojiSymbol);
95459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
95559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mLineCount == 1 && !mIsSymbolMode) {
956e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                maxWidth -= getCandidateMinimumWidth();
957e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
958e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
95959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if ((maxWidth < nextEnd) && (getWordCount() != 0)) {
96059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
96159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                createNextLineFor1st();
962e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (getMaxLine() < mLineCount) {
963e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mLineLength = 0;
964e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /* Call this method again to add the candidate in the full view */
96559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    if (!mIsSymbolSelected) {
96659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        setCandidate(isCategory, word);
96759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
968053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return;
969053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
970e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
971e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineLength = textLength;
97259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mLineLength += getCandidateSpaceWidth(isEmojiSymbol);
9737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
974e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineLength = nextEnd;
975053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
976e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
977e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(mLineCount - 1);
978e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView = (TextView) lineView.getChildAt(mNormalViewWordCountOfLine);
979e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
980e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (isCategory) {
981e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mLineCount == 1) {
982e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mViewCandidateTemplate.setBackgroundDrawable(null);
98377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
98459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mLineLength += mCandidateLeftAlignThreshold;
98559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
98659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                int CompareLength = textLength;
98759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                CompareLength += getCandidateSpaceWidth(isEmojiSymbol);
988053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
989053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
990e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mNormalViewWordCountOfLine++;
991053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
992053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
993e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setText(word.candidate);
99459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (is2nd) {
99559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setId(mWordCount2nd);
99659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
99759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setId(mWordCount1st);
99859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
999e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setVisibility(View.VISIBLE);
1000e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setPressed(false);
100159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        textView.setFocusable(false);
1002e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1003e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (isCategory) {
100459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setText("      " + word.candidate);
100559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
100659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandCategoryTextSize);
100759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setBackgroundDrawable(null);
100859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setGravity(Gravity.CENTER_VERTICAL);
100959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setMinHeight(mCandidateCategoryMinimumHeight);
101059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setHeight(mCandidateCategoryMinimumHeight);
101159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1012e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnClickListener(null);
1013e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnLongClickListener(null);
101459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setTextColor(mTextColor);
10157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
101659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandNormalTextSize);
101759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setGravity(Gravity.CENTER);
101859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setMinHeight(getCandidateMinimumHeight());
101959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setHeight(getCandidateMinimumHeight());
102059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
102159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (is2nd) {
102259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                textView.setOnClickListener(mCandidateOnClick2nd);
102359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                textView.setOnLongClickListener(mCandidateOnLongClick2nd);
102459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
102559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                textView.setOnClickListener(mCandidateOnClick1st);
102659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                textView.setOnLongClickListener(mCandidateOnLongClick1st);
102759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
102859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1029e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setBackgroundResource(R.drawable.cand_back);
103059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
103159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            textView.setTextColor(mTextColor);
10327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
1033053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1034e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (maxWidth < textLength) {
1035e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setEllipsize(TextUtils.TruncateAt.END);
1036e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
1037e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setEllipsize(null);
1038e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
1039053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1040e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        ImageSpan span = null;
1041e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (word.candidate.equals(" ")) {
1042e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            span = new ImageSpan(mWnn, R.drawable.word_half_space,
1043e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                 DynamicDrawableSpan.ALIGN_BASELINE);
1044e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else if (word.candidate.equals("\u3000" /* full-width space */)) {
1045e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            span = new ImageSpan(mWnn, R.drawable.word_full_space,
1046e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                 DynamicDrawableSpan.ALIGN_BASELINE);
1047e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
10483feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
1049e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (span != null) {
1050e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            SpannableString spannable = new SpannableString("   ");
105159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            spannable.setSpan(span, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
1052e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setText(spannable);
1053053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
105459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        textView.setPadding(0, 0, 0, 0);
1055e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
105659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (is2nd) {
105759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnnWordArray2nd.add(mWordCount2nd, word);
105859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWordCount2nd++;
105959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextViewArray2nd.add(textView);
106059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
106159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnnWordArray1st.add(mWordCount1st, word);
106259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWordCount1st++;
106359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mTextViewArray1st.add(textView);
106459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
1065053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1066053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
10673feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
10680470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * Create AbsoluteLayout.LayoutParams
10690470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * @param layout AbsoluteLayout
107059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param width  The width of the display
107159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param height The height of the display
107259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return Layout parameter
10730470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     */
10740470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private ViewGroup.LayoutParams buildLayoutParams(AbsoluteLayout layout, int width, int height) {
10750470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
107659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int viewDivison = getCandidateViewDivison();
107759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int indentWidth = mViewWidth / viewDivison;
10780470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        int x         = indentWidth * mFullViewOccupyCount;
107959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int y         = mLineY;
10800470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        ViewGroup.LayoutParams params
10810470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa              = new AbsoluteLayout.LayoutParams(width, height, x, y);
10820470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
10830470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        return params;
10840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    }
10850470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
10860470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /**
1087e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Create a view for a candidate.
1088e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return the view
10893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
1090e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView createCandidateView() {
109159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        TextView text = new CandidateTextView(mViewBodyScroll.getContext());
109259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCandNormalTextSize);
1093e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setBackgroundResource(R.drawable.cand_back);
109459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        text.setCompoundDrawablePadding(0);
1095e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setGravity(Gravity.CENTER);
1096e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setSingleLine();
109759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        text.setPadding(0, 0, 0, 0);
1098e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
1099e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                           ViewGroup.LayoutParams.WRAP_CONTENT,
1100e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                           1.0f));
1101e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setMinHeight(getCandidateMinimumHeight());
1102e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setMinimumWidth(getCandidateMinimumWidth());
110359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        text.setSoundEffectsEnabled(false);
1104e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return text;
11053feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    }
1106e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
11073feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
1108e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Display {@code mReadMoreText} if there are more candidates.
11093feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
1110e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void setReadMore() {
111159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode) {
1112e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mReadMoreButton.setVisibility(View.GONE);
1113e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateTemplate.setVisibility(View.GONE);
1114e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return;
111577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
1116e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
111759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int resid = 0;
111859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1119e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsFullView) {
1120e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mReadMoreButton.setVisibility(View.VISIBLE);
112159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            resid = R.drawable.cand_up;
1122e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
1123e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mCanReadMore) {
1124e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mReadMoreButton.setVisibility(View.VISIBLE);
112559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                resid = R.drawable.cand_down;
1126e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
1127e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mReadMoreButton.setVisibility(View.GONE);
1128e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateTemplate.setVisibility(View.GONE);
1129e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
11307b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
113159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
113259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (resid != 0) {
113359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mReadMoreButton.setImageResource(resid);
113459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
11357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
11367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
11373feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
1138e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Clear the list of the normal candidate view.
11393feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
1140e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void clearNormalViewCandidate() {
1141e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        LinearLayout candidateList = mViewCandidateList1st;
1142e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int lineNum = candidateList.getChildCount();
1143e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < lineNum; i++) {
1144e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1145e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = (LinearLayout)candidateList.getChildAt(i);
1146e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int size = lineView.getChildCount();
1147e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int j = 0; j < size; j++) {
1148e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                View v = lineView.getChildAt(j);
1149e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                v.setVisibility(View.GONE);
115077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
11517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
11527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
115359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
11547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#clearCandidates */
1155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void clearCandidates() {
115659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        closeDialog();
115759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        clearFocusCandidate();
1158e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        clearNormalViewCandidate();
1159e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
11600470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        ViewGroup layout = mViewCandidateList2nd;
1161e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int size = layout.getChildCount();
1162e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < size; i++) {
1163e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            View v = layout.getChildAt(i);
1164e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            v.setVisibility(View.GONE);
1165e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
11667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
116759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mLineCount = 1;
116859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWordCount1st = 0;
116959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWordCount2nd = 0;
117059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnnWordArray1st.clear();
117159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnnWordArray2nd.clear();
117259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mTextViewArray1st.clear();
117359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mTextViewArray2nd.clear();
117477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mLineLength = 0;
11757b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
117659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mLineY = 0;
117759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
1178e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mIsFullView = false;
117959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
118077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        if (mAutoHideMode) {
118177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            setViewLayout(CandidatesViewManager.VIEW_TYPE_CLOSE);
118277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
11837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mAutoHideMode && mViewBody.isShown()) {
1185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mWnn.setCandidatesViewShown(false);
1186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1187e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCanReadMore = false;
1188e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setReadMore();
1189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
11917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#setPreferences */
1192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setPreferences(SharedPreferences pref) {
1193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        try {
1194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (pref.getBoolean("key_vibration", false)) {
1195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mVibrator = (Vibrator)mWnn.getSystemService(Context.VIBRATOR_SERVICE);
1196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mVibrator = null;
1198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
1199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (pref.getBoolean("key_sound", false)) {
120059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mSound = (AudioManager)mWnn.getSystemService(Context.AUDIO_SERVICE);
1201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
1202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mSound = null;
1203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
120459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            setNumeberOfDisplayLines();
1205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } catch (Exception ex) {
120659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Log.e("OpenWnn", "NO VIBRATOR");
1207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
121159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set normal mode.
121259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
121359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setNormalMode() {
121459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        setReadMore();
121559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsFullView = false;
121659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
121759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
121859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
121959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
122059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set full mode.
122159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
122259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setFullMode() {
122359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsFullView = true;
122459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
122559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
122659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
122759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
122859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set symbol mode.
122959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
123059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setSymbolMode(boolean enable, int mode) {
123159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode && !enable) {
123259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE);
123359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
123459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mSymbolMode = mode;
123559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsSymbolMode = enable;
123659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
123759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
123859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
123959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set scroll up.
124059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
124159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setScrollUp() {
124259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mViewBodyScroll.pageScroll(ScrollView.FOCUS_UP)) {
124359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.scrollTo(0, mViewBodyScroll.getChildAt(0).getHeight());
124459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
124559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
124659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
124759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
124859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set scroll down.
124959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
125059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setScrollDown() {
125159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mViewBodyScroll.pageScroll(ScrollView.FOCUS_DOWN)) {
125259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.scrollTo(0, 0);
125359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
125459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
125559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
125659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
125759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set scroll full up.
125859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
125959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setScrollFullUp() {
126059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mViewBodyScroll.fullScroll(ScrollView.FOCUS_UP)) {
126159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.scrollTo(0, mViewBodyScroll.getChildAt(0).getHeight());
126259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
126359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
126459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
126559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
126659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set scroll full down.
126759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
126859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setScrollFullDown() {
126959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mViewBodyScroll.fullScroll(ScrollView.FOCUS_DOWN)) {
127059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mViewBodyScroll.scrollTo(0, 0);
127159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
127259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
127359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
127459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
127559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Process {@link OpenWnnEvent#CANDIDATE_VIEW_TOUCH} event.
127659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
127777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return      {@code true} if event is processed; {@code false} if otherwise
12783feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
12797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public boolean onTouchSync() {
12807b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        return mGestureDetector.onTouchEvent(mMotionEvent);
1281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Select a candidate.
1285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
12867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * This method notices the selected word to {@link OpenWnn}.
1287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
1288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param word  The selected word
1289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
12907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private void selectCandidate(WnnWord word) {
129159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mIsSymbolMode) {
129259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mIsFullView = false;
129359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
129459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
129559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mIsSymbolSelected = mIsSymbolMode;
129659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.SELECT_CANDIDATE, word));
129759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
129859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
129959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void playSoundAndVibration() {
1300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mVibrator != null) {
130159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            try {
130259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mVibrator.vibrate(5);
130359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } catch (Exception ex) {
130459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                Log.e("OpenWnn", "TextCandidatesViewManager::selectCandidate Vibrator " + ex.toString());
130559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
1306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mSound != null) {
130859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            try {
130959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mSound.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, -1);
131059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } catch (Exception ex) {
131159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                Log.e("OpenWnn", "TextCandidatesViewManager::selectCandidate Sound " + ex.toString());
131259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
1313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
1315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1316e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onDown */
131777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onDown(MotionEvent arg0) {
1318e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return false;
131977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
1320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1321e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onFling */
132277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
13237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        boolean consumed = false;
1324e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (arg1 != null && arg0 != null && arg1.getY() < arg0.getY()) {
1325e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if ((mViewType == CandidatesViewManager.VIEW_TYPE_NORMAL) && mCanReadMore) {
13267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (mVibrator != null) {
132759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    try {
132859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mVibrator.vibrate(5);
132959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } catch (Exception ex) {
133059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        Log.e("iwnn", "TextCandidatesViewManager::onFling Vibrator " + ex.toString());
133159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
13327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
13337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = true;
13347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
13357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                consumed = true;
13367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
13377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
13387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mViewBodyScroll.getScrollY() == 0) {
13397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (mVibrator != null) {
134059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    try {
134159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        mVibrator.vibrate(5);
134259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    } catch (Exception ex) {
134359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        Log.e("iwnn", "TextCandidatesViewManager::onFling Sound " + ex.toString());
134459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    }
13457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
13467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = false;
13477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
13487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                consumed = true;
13497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
13507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
13517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
135277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return consumed;
135377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
13547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1355e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onLongPress */
135677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public void onLongPress(MotionEvent arg0) {
1357e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return;
135877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
13597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1360e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onScroll */
1361e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
136277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return false;
136377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
13647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1365e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onShowPress */
136677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public void onShowPress(MotionEvent arg0) {
136777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
13687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1369e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onSingleTapUp */
137077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onSingleTapUp(MotionEvent arg0) {
137177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return false;
137277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
137377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
13743feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
1375e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Retrieve the width of string to draw.
1376e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     *
1377e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param text          The string
1378e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param start         The start position (specified by the number of character)
1379e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param end           The end position (specified by the number of character)
1380e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return          The width of string to draw
1381e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
1382e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public int measureText(CharSequence text, int start, int end) {
13830470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        if (end - start < 3) {
13840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            return getCandidateMinimumWidth();
13850470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        }
13860470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
1387e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextPaint paint = mViewCandidateTemplate.getPaint();
1388e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return (int)paint.measureText(text, start, end);
1389e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
1390e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1391e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
139259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Create a layout for the next line.
139359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
139459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void createNextLine(boolean isCategory) {
139559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (isFirstListOver(mIsFullView, mLineCount, null)) {
139659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            /* Full view */
139759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mFullViewOccupyCount = 0;
139859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mFullViewPrevView != null) {
139959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mFullViewPrevLineTopId = mFullViewPrevView.getId();
140059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
140159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isCategory) {
140259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mLineY += mCandidateCategoryMinimumHeight;
140359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
140459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mLineY += getCandidateMinimumHeight();
140559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
140659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mLineCount++;
140759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
140859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            createNextLineFor1st();
140959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
141059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
141159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
141259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
141359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Create a layout for the next line.
141459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
141559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void createNextLineFor1st() {
141659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(mLineCount - 1);
141759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        float weight = 0;
141859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mLineLength < mCandidateLeftAlignThreshold) {
141959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mLineCount == 1) {
142059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewCandidateTemplate.setVisibility(View.GONE);
142159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
142259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
142359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            weight = 1.0f;
142459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
142559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
142659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        LinearLayout.LayoutParams params
142759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
142859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                            ViewGroup.LayoutParams.WRAP_CONTENT,
142959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                                            weight);
143059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
143159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int child = lineView.getChildCount();
143259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        for (int i = 0; i < child; i++) {
143359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            View view = lineView.getChildAt(i);
143459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
143559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (view != mViewCandidateTemplate) {
143659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                view.setLayoutParams(params);
143759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                view.setPadding(0, 0, 0, 0);
143859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
143959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
144059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
144159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mLineLength = 0;
144259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mNormalViewWordCountOfLine = 0;
144359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mLineCount++;
144459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
144559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
144659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
144759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Judge if it's a category.
144859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
144959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return {@code true} if category
145059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
145159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    boolean isCategory(WnnWord word) {
145259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int length = word.candidate.length();
145359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return ((length > 3) && (word.candidate.charAt(0) == '['));
145459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
145559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
145659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
145759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get a minimum width of a candidate view.
145859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
145959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return the minimum width of a candidate view.
146059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
146159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getCandidateMinimumWidth() {
146259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mCandidateMinimumWidth;
146359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
146459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
146559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
146659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return the minimum height of a candidate view.
146759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
146859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getCandidateMinimumHeight() {
146959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mCandidateMinimumHeight;
147059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
147159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
147259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
147359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get a height of a candidate view.
147459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
147559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return the height of a candidate view.
147659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
147759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getCandidateViewHeight() {
147859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (OpenWnn.isXLarge()) {
147959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma           return mKeyboardHeight + mCandidateOneLineMinimumHeight - mSymbolKeyboardHeight
148059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                         - mSymbolKeyboardTabHeight;
148159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
148259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int numberOfLine = (mPortrait) ? mPortraitNumberOfLine : mLandscapeNumberOfLine;
148359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Resources resource = mWnn.getResources();
148459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Drawable keyboardBackground = resource.getDrawable(R.drawable.keyboard_background);
148559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Rect keyboardPadding = new Rect(0 ,0 ,0 ,0);
148659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            keyboardBackground.getPadding(keyboardPadding);
148759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int keyboardTotalPadding = keyboardPadding.top + keyboardPadding.bottom;
148859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mIsSymbolMode) {
148959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return mKeyboardHeight + numberOfLine * getCandidateMinimumHeight()
149059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                       - mSymbolKeyboardHeight - mSymbolKeyboardTabHeight;
149159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else if (!mHardKeyboardHidden) {
149259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return mKeyboardHeight + numberOfLine * getCandidateMinimumHeight()
149359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                       - mSymbolKeyboardHeight;
149459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
149559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return mKeyboardHeight + keyboardTotalPadding
149659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                       + numberOfLine * getCandidateMinimumHeight();
149759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
149859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
149959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
150059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
150159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
150259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Update symbol type.
150359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
150459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void updateSymbolType() {
150559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (mSymbolMode) {
150659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
150759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabSymbol, true, true);
150859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, false);
150959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
151059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
151159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
151259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabSymbol, true, false);
151359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, true);
151459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
151559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
151659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        default:
151759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabSymbol, true, false);
151859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            updateTabStatus(mViewTabEmoticon, mEnableEmoticon, false);
151959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
152059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
152159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
152259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
152359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
152459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Update tab status.
152559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
152659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param tab           The tab view.
152759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param enabled       The tab is enabled.
152859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param selected      The tab is selected.
152959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
153059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void updateTabStatus(TextView tab, boolean enabled, boolean selected) {
153159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tab.setVisibility(View.VISIBLE);
153259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tab.setEnabled(enabled);
153359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int backgroundId = 0;
153459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int colorId = 0;
153559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (enabled) {
153659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (selected) {
153759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                backgroundId = R.drawable.cand_tab;
153859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                colorId = R.color.tab_textcolor_select;
153959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
154059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                backgroundId = R.drawable.cand_tab_noselect;
154159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                colorId = R.color.tab_textcolor_no_select;
154259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
154359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
154459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            backgroundId = R.drawable.cand_tab_noselect;
154559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            colorId = R.color.tab_textcolor_disable;
154659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
154759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tab.setBackgroundResource(backgroundId);
154859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        tab.setTextColor(mWnn.getResources().getColor(colorId));
154959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
155059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
155159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
155259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get candidate number of division.
155359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return Number of division
155459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
155559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getCandidateViewDivison() {
155659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int viewDivison;
155759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
155859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode) {
155959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int mode = mSymbolMode;
156059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            switch (mode) {
156159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
156259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                viewDivison = (mPortrait) ? FULL_VIEW_SYMBOL_DIV_PORT : FULL_VIEW_SYMBOL_DIV_LAND;
156359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
156459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
156559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            default:
156659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                viewDivison = FULL_VIEW_DIV;
156759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
156859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
156959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
157059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma             viewDivison = FULL_VIEW_DIV;
157159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
157259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return viewDivison;
157359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
157459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
157559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
157659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return Word count
157759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
157859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getWordCount() {
157959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return mWordCount1st + mWordCount2nd;
158059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
158159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
158259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
158359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return Add second
15843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
158559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private boolean isFirstListOver(boolean isFullView, int lineCount, WnnWord word) {
158659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
158759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mIsSymbolMode) {
158859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            switch (mSymbolMode) {
158959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case OpenWnnJAJP.ENGINE_MODE_SYMBOL_KAO_MOJI:
159059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return true;
159159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            case OpenWnnJAJP.ENGINE_MODE_SYMBOL:
159259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma				return true;
159359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            default:
159459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return (isFullView || getMaxLine() < lineCount);
159559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
159659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
159759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return (isFullView || getMaxLine() < lineCount);
159859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
159959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
160059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
160159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
160259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return Candidate space width
160359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
160459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private int getCandidateSpaceWidth(boolean isEmojiSymbol) {
160559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        Resources r = mWnn.getResources();
160659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mPortrait) {
160759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isEmojiSymbol) {
160859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return 0;
160959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
161059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return r.getDimensionPixelSize(R.dimen.cand_space_width);
161159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
161259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
161359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (isEmojiSymbol) {
161459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return r.getDimensionPixelSize(R.dimen.cand_space_width_emoji_symbol);
161559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
161659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                return r.getDimensionPixelSize(R.dimen.cand_space_width);
161759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
161859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
161959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
162059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
162159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
162259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * KeyEvent action for the candidate view.
162359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
162459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param key    Key event
162559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
162659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void processMoveKeyEvent(int key) {
162759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (!mViewBody.isShown()) {
1628e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return;
1629e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
1630e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
163159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        switch (key) {
163259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_DPAD_UP:
163359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            moveFocus(-1, true);
163459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
163559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
163659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_DPAD_DOWN:
163759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            moveFocus(1, true);
163859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
163959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
164059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_DPAD_LEFT:
164159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            moveFocus(-1, false);
164259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
164359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
164459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        case KeyEvent.KEYCODE_DPAD_RIGHT:
164559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            moveFocus(1, false);
164659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
164759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
164859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        default:
164959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            break;
165059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
165159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
165259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
165359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
165459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get a flag candidate is focused now.
165559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
165659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return the Candidate is focused of a flag.
165759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
165859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public boolean isFocusCandidate(){
165959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCurrentFocusIndex != FOCUS_NONE) {
166059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return true;
166159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
166259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return false;
166359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
166459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
166559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
166659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Give focus to View of candidate.
166759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
166859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setViewStatusOfFocusedCandidate(){
166959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        View view = mFocusedView;
167059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (view != null) {
167159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            view.setBackgroundDrawable(mFocusedViewBackground);
167259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            view.setPadding(0, 0, 0, 0);
167359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
167459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
167559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        TextView v = getFocusedView();
167659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mFocusedView = v;
167759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (v != null) {
167859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mFocusedViewBackground = v.getBackground();
167959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            v.setBackgroundResource(R.drawable.cand_back_focuse);
168059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            v.setPadding(0, 0, 0, 0);
168159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
168259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int viewBodyTop = getViewTopOnScreen(mViewBodyScroll);
168359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int viewBodyBottom = viewBodyTop + mViewBodyScroll.getHeight();
168459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int focusedViewTop = getViewTopOnScreen(v);
168559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int focusedViewBottom = focusedViewTop + v.getHeight();
168659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
168759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (focusedViewBottom > viewBodyBottom) {
168859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewBodyScroll.scrollBy(0, (focusedViewBottom - viewBodyBottom));
168959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else if (focusedViewTop < viewBodyTop) {
169059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mViewBodyScroll.scrollBy(0, (focusedViewTop - viewBodyTop));
16913feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
169259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
169359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
169459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
169559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
169659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Clear focus to selected candidate.
169759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
169859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void clearFocusCandidate(){
169959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        View view = mFocusedView;
170059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (view != null) {
170159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            view.setBackgroundDrawable(mFocusedViewBackground);
170259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            view.setPadding(0, 0, 0, 0);
170359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mFocusedView = null;
170459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
170559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
170659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mFocusAxisX = 0;
170759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHasFocusedArray1st = true;
170859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mCurrentFocusIndex = FOCUS_NONE;
170959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHandler.removeMessages(MSG_MOVE_FOCUS);
171059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_END));
171159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
171259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
171359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
171459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @see CandidatesViewManager#selectFocusCandidate
171559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
171659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void selectFocusCandidate(){
171759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCurrentFocusIndex != FOCUS_NONE) {
171859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            WnnWord word = getFocusedWnnWord();
171959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
172059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mHandler.hasMessages(MSG_SET_CANDIDATES)) {
172159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mWnnWordSelectedList.add(word);
172259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
172359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                selectCandidate(word);
172459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
172559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
172659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
172759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
172859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** @see CandidatesViewManager#getFocusedWnnWord */
172959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public WnnWord getFocusedWnnWord() {
173059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return getWnnWord(mCurrentFocusIndex);
173159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
1732e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
173359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
173459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get WnnWord.
173559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
173659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return WnnWord word
173759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
173859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public WnnWord getWnnWord(int index) {
173959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        WnnWord word = null;
174059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (index < 0) {
174159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            index = 0;
174259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHandler.removeMessages(MSG_MOVE_FOCUS);
174359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Log.i("iwnn", "TextCandidatesViewManager::getWnnWord  index < 0 ");
1744e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
174559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            int size = mHasFocusedArray1st ? mWnnWordArray1st.size() : mWnnWordArray2nd.size();
174659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (index >= size) {
174759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                index = size - 1;
174859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mHandler.removeMessages(MSG_MOVE_FOCUS);
174959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                Log.i("iwnn", "TextCandidatesViewManager::getWnnWord  index > candidate max ");
175059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
175159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
175259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
175359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mHasFocusedArray1st) {
175459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            word = mWnnWordArray1st.get(index);
175559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
175659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            word = mWnnWordArray2nd.get(index);
1757e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
175859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return word;
175977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
17603feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
17613feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
176259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set display candidate line from SharedPreferences.
17633feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
176459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    private void setNumeberOfDisplayLines(){
176559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mWnn);
176659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mPortraitNumberOfLine = Integer.parseInt(pref.getString("setting_portrait", "2"));
176759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mLandscapeNumberOfLine = Integer.parseInt(pref.getString("setting_landscape", "1"));
176859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
176959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
177059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
177159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set emoticon enabled.
177259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
177359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setEnableEmoticon(boolean enableEmoticon) {
177459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mEnableEmoticon = enableEmoticon;
177559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
177659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
177759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
177859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get View of focus candidate.
177959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
178059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public TextView getFocusedView() {
178159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mCurrentFocusIndex == FOCUS_NONE) {
178259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            return null;
178359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
178459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        TextView t;
178559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mHasFocusedArray1st) {
178659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            t = mTextViewArray1st.get(mCurrentFocusIndex);
1787e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
178859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            t = mTextViewArray2nd.get(mCurrentFocusIndex);
178959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
179059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return t;
179159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
179259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
179359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /**
179459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Move the focus to next candidate.
179559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
179659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param direction  The direction of increment or decrement.
179759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param updown     {@code true} if move is up or down.
179859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     */
179959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void moveFocus(int direction, boolean updown) {
180059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean isStart = (mCurrentFocusIndex == FOCUS_NONE);
180159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (direction == 0) {
180259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            setViewStatusOfFocusedCandidate();
180359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
180459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
180559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int size1st = mTextViewArray1st.size();
180659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (mHasFocusedArray1st && (size1st == 0)) {
180759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHasFocusedArray1st = false;
180859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
180959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        ArrayList<TextView> list = mHasFocusedArray1st ? mTextViewArray1st : mTextViewArray2nd;
181059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int size = list.size();
181159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int start = (mCurrentFocusIndex == FOCUS_NONE) ? 0 : (mCurrentFocusIndex + direction);
181259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
181359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int index = -1;
181459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        boolean hasChangedLine = false;
181559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        for (int i = start; (0 <= i) && (i < size); i += direction) {
181659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            TextView view = list.get(i);
181759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (!view.isShown()) {
181859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
181959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
182059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
182159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mIsSymbolMode && (view.getBackground() == null)) {
182259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                continue;
182359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
182459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
182559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (updown) {
182659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                int left = view.getLeft();
182759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if ((left <= mFocusAxisX)
182859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        && (mFocusAxisX < view.getRight())) {
182959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    index = i;
183059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    break;
183159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
183259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
183359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (left == 0) {
183459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    hasChangedLine = true;
18357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
1836e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
183759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                index = i;
183859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                break;
18397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
184059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
1841e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
184259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if ((index < 0) && hasChangedLine && !mHasFocusedArray1st && (0 < direction)) {
184359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            index = mTextViewArray2nd.size() - 1;
184459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
184559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
184659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (0 <= index) {
184759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mCurrentFocusIndex = index;
184859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            setViewStatusOfFocusedCandidate();
184959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (!updown) {
185059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mFocusAxisX = getFocusedView().getLeft();
185159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
185259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        } else {
185359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (mCanReadMore && (0 < size1st)) {
185459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
185559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if ((mHasFocusedArray1st && (direction < 0))
185659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                        || (!mHasFocusedArray1st && (0 < direction))) {
185759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    updown = false;
185859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                }
185959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
186059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mHasFocusedArray1st = !mHasFocusedArray1st;
1861e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
186259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                if (!mHasFocusedArray1st && !mIsFullView) {
186359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                    setFullMode();
1864e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
18657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
18667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
186759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (size1st == 0) {
186859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                updown = false;
186959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
187059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
187159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            if (0 < direction) {
187259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCurrentFocusIndex = -1;
187359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            } else {
187459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma                mCurrentFocusIndex = (mHasFocusedArray1st ? size1st : mTextViewArray2nd.size());
187559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            }
187659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            Message m = mHandler.obtainMessage(MSG_MOVE_FOCUS, direction, updown ? 1 : 0);
187759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mHandler.sendMessage(m);
187859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        }
187959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
188059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        if (isStart) {
188159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma            mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.FOCUS_CANDIDATE_START));
1882e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
1883e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
18847b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
18853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
188659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Set hardkeyboard hidden.
188759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
188859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param hardKeyboardHidden hardkeyaboard hidden.
18893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
189059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setHardKeyboardHidden(boolean hardKeyboardHidden) {
189159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHardKeyboardHidden = hardKeyboardHidden;
18927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
18937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
18943feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
189559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * Get view top position on screen.
189659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     *
189759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @param view target view.
189859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma     * @return int view top position on screen
1899e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
190059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public int getViewTopOnScreen(View view) {
190159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        int[] location = new int[2];
190259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        view.getLocationOnScreen(location);
190359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        return location[1];
190459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    }
190559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
190659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma
190759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    /** @see CandidatesViewManager#setCandidateMsgRemove */
190859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma    public void setCandidateMsgRemove() {
190959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma        mHandler.removeMessages(MSG_SET_CANDIDATES);
19107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
19117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa}
1912