1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
2053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Copyright (C) 2008,2009  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
197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport java.util.ArrayList;
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Context;
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.SharedPreferences;
22e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.content.res.Configuration;
237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.content.res.Resources;
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.media.MediaPlayer;
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Vibrator;
26e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.TextUtils;
27e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.TextPaint;
28e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.SpannableString;
29e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.Spanned;
30e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.style.ImageSpan;
31e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.text.style.DynamicDrawableSpan;
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
33e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.util.DisplayMetrics;
347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.view.Gravity;
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.MotionEvent;
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.ViewGroup;
38e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.View.OnClickListener;
39e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.View.OnLongClickListener;
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View.OnTouchListener;
417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.view.GestureDetector;
42e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.view.LayoutInflater;
437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.Button;
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.LinearLayout;
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.ScrollView;
467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.TextView;
477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawaimport android.widget.EditText;
480470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawaimport android.widget.AbsoluteLayout;
49e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.widget.ImageView;
50e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawaimport android.graphics.drawable.Drawable;
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
533feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The default candidates view manager class using {@link EditText}.
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
553feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
57e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawapublic class TextCandidatesViewManager implements CandidatesViewManager, GestureDetector.OnGestureListener {
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Height of a line */
59e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public static final int LINE_HEIGHT = 34;
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of lines to display (Portrait) */
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int LINE_NUM_PORTRAIT       = 2;
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Number of lines to display (Landscape) */
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public static final int LINE_NUM_LANDSCAPE      = 1;
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Maximum lines */
663feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private static final int DISPLAY_LINE_MAX_COUNT = 1000;
67e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Width of the view */
68e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int CANDIDATE_MINIMUM_WIDTH = 48;
69e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Height of the view */
70e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int CANDIDATE_MINIMUM_HEIGHT = 35;
71e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Align the candidate left if the width of the string exceeds this threshold */
72e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int CANDIDATE_LEFT_ALIGN_THRESHOLD = 120;
73e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Maximum number of displaying candidates par one line (full view mode) */
74e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private static final int FULL_VIEW_DIV = 4;
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Body view of the candidates list */
777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private ViewGroup  mViewBody;
787b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Scroller of {@code mViewBodyText} */
797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private ScrollView mViewBodyScroll;
80e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Base of {@code mViewCandidateList1st}, {@code mViewCandidateList2nd} */
81e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ViewGroup mViewCandidateBase;
82e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Button displayed bottom of the view when there are more candidates. */
83e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private ImageView mReadMoreButton;
84e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** The view of the scaling up candidate */
85e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private View mViewScaleUp;
86e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout for the candidates list on normal view */
87e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private LinearLayout mViewCandidateList1st;
88e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout for the candidates list on full view */
890470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private AbsoluteLayout mViewCandidateList2nd;
907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** {@link OpenWnn} instance using this manager */
917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private OpenWnn mWnn;
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** View type (VIEW_TYPE_NORMAL or VIEW_TYPE_FULL or VIEW_TYPE_CLOSE) */
937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mViewType;
947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Portrait display({@code true}) or landscape({@code false}) */
957b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mPortrait;
967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Width of the view */
987b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mViewWidth;
993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** Height of the view */
1003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private int mViewHeight;
1010470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /** Minimum width of a candidate (density support) */
1020470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private int mCandidateMinimumWidth;
1030470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /** Maximum width of a candidate (density support) */
1040470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private int mCandidateMinimumHeight;
1050470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
1067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Whether hide the view if there is no candidates */
1077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mAutoHideMode;
1087b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** The converter to be get candidates from and notice the selected candidate to. */
1097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private WnnEngine mConverter;
1107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Limitation of displaying candidates */
1117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mDisplayLimit;
1127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1137b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Vibrator for touch vibration */
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Vibrator mVibrator = null;
1157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** MediaPlayer for click sound */
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private MediaPlayer mSound = null;
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Number of candidates displaying */
1197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mWordCount;
1207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** List of candidates */
1217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private ArrayList<WnnWord> mWnnWordArray;
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** Gesture detector */
1247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private GestureDetector mGestureDetector;
1257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** The word pressed */
1267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private WnnWord mWord;
1273feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** Character width of the candidate area */
1287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mLineLength = 0;
129e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of lines displayed */
130e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mLineCount = 1;
1317b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1323feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** {@code true} if the candidate delete state is selected */
133e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mIsScaleUp = false;
1347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** {@code true} if the full screen mode is selected */
1367b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean mIsFullView = false;
1377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** The event object for "touch" */
1397b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private MotionEvent mMotionEvent = null;
1407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1413feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** The offset when the candidates is flowed out the candidate window */
1427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private int mDisplayEndOffset = 0;
1433feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /** {@code true} if there are more candidates to display. */
1443feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private boolean mCanReadMore = false;
145e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Width of {@code mReadMoreButton} */
146e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mReadMoreButtonWidth = 0;
147e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Color of the candidates */
148e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mTextColor = 0;
149e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Template object for each candidate and normal/full view change button */
150e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView mViewCandidateTemplate;
151e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of candidates in full view */
152e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewWordCount;
153e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of candidates in the current line (in full view) */
154e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewOccupyCount;
155e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** View of the previous candidate (in full view) */
156e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView mFullViewPrevView;
157e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Id of the top line view (in full view) */
158e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mFullViewPrevLineTopId;
159e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Layout of the previous candidate (in full view) */
1600470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private ViewGroup.LayoutParams mFullViewPrevParams;
161e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Whether all candidates is displayed */
162e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private boolean mCreateCandidateDone;
163e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Number of lines in normal view */
164e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int mNormalViewWordCountOfLine;
165e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** general infomation about a display */
166e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private final DisplayMetrics mMetrics = new DisplayMetrics();
167e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
168e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Event listener for touching a candidate */
169e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private OnTouchListener mCandidateOnTouch = new OnTouchListener() {
170e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            public boolean onTouch(View v, MotionEvent event) {
171e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mMotionEvent != null) {
172e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return true;
173e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
174e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
175e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if ((event.getAction() == MotionEvent.ACTION_UP)
176e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    && (v instanceof TextView)) {
177e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    Drawable d = v.getBackground();
178e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (d != null) {
179e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        d.setState(new int[] {});
180e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
181e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
182e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
183e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mMotionEvent = event;
184e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                boolean ret = mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.CANDIDATE_VIEW_TOUCH));
185e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mMotionEvent = null;
186e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return ret;
187e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
188e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        };
189e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
1907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
191e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Event listener for clicking a candidate */
192e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private OnClickListener mCandidateOnClick = new OnClickListener() {
193e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            public void onClick(View v) {
194e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (!v.isShown()) {
195e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return;
196e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
197e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
198e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (v instanceof TextView) {
199e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    TextView text = (TextView)v;
200e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    int wordcount = text.getId();
201e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    WnnWord word = null;
202e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    word = mWnnWordArray.get(wordcount);
203e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    selectCandidate(word);
204e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
205e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
206e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        };
207e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
208e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** Event listener for long-clicking a candidate */
209e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private OnLongClickListener mCandidateOnLongClick = new OnLongClickListener() {
210e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            public boolean onLongClick(View v) {
211e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mViewScaleUp == null) {
212e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return false;
213e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
214e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
215e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (!v.isShown()) {
216e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return true;
217e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
218e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
219e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                Drawable d = v.getBackground();
220e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (d != null) {
221e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if(d.getState().length == 0){
222e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        return true;
223e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
224e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
225e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
226e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                int wordcount = ((TextView)v).getId();
227e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWord = mWnnWordArray.get(wordcount);
228e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                setViewScaleUp(true, mWord);
229e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
230e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return true;
231e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
232e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        };
233e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
234e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
2353feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public TextCandidatesViewManager() {
2393feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        this(-1);
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param displayLimit      The limit of display
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public TextCandidatesViewManager(int displayLimit) {
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        this.mDisplayLimit = displayLimit;
2497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        this.mWnnWordArray = new ArrayList<WnnWord>();
25077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        this.mAutoHideMode = true;
251e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mMetrics.setToDefaults();
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Set auto-hide mode.
25677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param hide      {@code true} if the view will hidden when no candidate exists;
25777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     *                  {@code false} if the view is always shown.
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setAutoHide(boolean hide) {
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mAutoHideMode = hide;
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** @see CandidatesViewManager */
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public View initView(OpenWnn parent, int width, int height) {
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mWnn = parent;
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mViewWidth = width;
267e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewHeight = height;
2680470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        mCandidateMinimumWidth = (int)(CANDIDATE_MINIMUM_WIDTH * mMetrics.density);
2690470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        mCandidateMinimumHeight = (int)(CANDIDATE_MINIMUM_HEIGHT * mMetrics.density);
270e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mPortrait =
271e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            (parent.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE);
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
273e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Resources r = mWnn.getResources();
2747b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
275e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        LayoutInflater inflater = parent.getLayoutInflater();
276e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewBody = (ViewGroup)inflater.inflate(R.layout.candidates, null);
2777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mViewBodyScroll = (ScrollView)mViewBody.findViewById(R.id.candview_scroll);
279e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewBodyScroll.setOnTouchListener(mCandidateOnTouch);
280e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
281e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateBase = (ViewGroup)mViewBody.findViewById(R.id.candview_base);
282e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
283e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        createNormalCandidateView();
2840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        mViewCandidateList2nd = (AbsoluteLayout)mViewBody.findViewById(R.id.candidates_2nd_view);
285e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
286e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButtonWidth = r.getDrawable(R.drawable.cand_up).getMinimumWidth();
287e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
288e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mTextColor = r.getColor(R.color.candidate_text);
2897b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
290e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButton = (ImageView)mViewBody.findViewById(R.id.read_more_text);
291e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButton.setOnTouchListener(new View.OnTouchListener() {
292e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public boolean onTouch(View v, MotionEvent event) {
293e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    switch (event.getAction()) {
294e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    case MotionEvent.ACTION_DOWN:
295e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (mIsFullView) {
296e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mReadMoreButton.setImageResource(R.drawable.cand_down_press);
297e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        } else {
298e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mReadMoreButton.setImageResource(R.drawable.cand_up_press);
299e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
300e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                	    break;
301e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    case MotionEvent.ACTION_UP:
302e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        if (mIsFullView) {
303e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mReadMoreButton.setImageResource(R.drawable.cand_down);
304e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        } else {
305e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            mReadMoreButton.setImageResource(R.drawable.cand_up);
306e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        }
307e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        break;
308e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    default:
309e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        break;
310e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
311e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    return false;
312e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
313e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
314e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mReadMoreButton.setOnClickListener(new View.OnClickListener() {
315e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
316e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (!v.isShown()) {
317e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        return;
318e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
319e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
320e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    if (mIsFullView) {
321e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mIsFullView = false;
322e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
323e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    } else {
324e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mIsFullView = true;
325e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
326e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    }
327e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
328e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
3293feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setViewType(CandidatesViewManager.VIEW_TYPE_CLOSE);
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mGestureDetector = new GestureDetector(this);
333e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
334e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        View scaleUp = (View)inflater.inflate(R.layout.candidate_scale_up, null);
335e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewScaleUp = scaleUp;
336e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
337e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* select button */
338e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        Button b = (Button)scaleUp.findViewById(R.id.candidate_select);
339e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b.setOnClickListener(new View.OnClickListener() {
340e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
341e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    selectCandidate(mWord);
342e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
343e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
344e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
345e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* cancel button */
346e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b = (Button)scaleUp.findViewById(R.id.candidate_cancel);
347e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        b.setOnClickListener(new View.OnClickListener() {
348e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                public void onClick(View v) {
349e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
350e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.UPDATE_CANDIDATE));
351e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
352e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            });
353e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewBody;
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
357e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
358e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Create the normal candidate view
359e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
360e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void createNormalCandidateView() {
361e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateList1st = (LinearLayout)mViewBody.findViewById(R.id.candidates_1st_view);
362e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateList1st.setOnTouchListener(mCandidateOnTouch);
363e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateList1st.setOnClickListener(mCandidateOnClick);
364e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
365e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int line = getMaxLine();
366e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int width = mViewWidth;
367e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < line; i++) {
368e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = new LinearLayout(mViewBodyScroll.getContext());
369e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            lineView.setOrientation(LinearLayout.HORIZONTAL);
370e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout.LayoutParams layoutParams =
3710f28cd7d2d4967ce9a796497387e8dbfd19666c6Romain Guy                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
372e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                              ViewGroup.LayoutParams.WRAP_CONTENT);
373e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            lineView.setLayoutParams(layoutParams);
374e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int j = 0; j < (width / getCandidateMinimumWidth()); j++) {
375e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TextView tv = createCandidateView();
376e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                lineView.addView(tv);
377e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
378e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
379e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (i == 0) {
380e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                TextView tv = createCandidateView();
381e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
382e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                             ViewGroup.LayoutParams.WRAP_CONTENT);
383e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams.weight = 0;
384e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                layoutParams.gravity = Gravity.RIGHT;
385e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                tv.setLayoutParams(layoutParams);
386e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
387e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                lineView.addView(tv);
388e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateTemplate = tv;
389e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
390e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.addView(lineView);
391e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
392e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
393e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
3947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getCurrentView */
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public View getCurrentView() {
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewBody;
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
3997b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#setViewType */
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setViewType(int type) {
4017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        boolean readMore = setViewLayout(type);
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4037b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (readMore) {
4047b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            displayCandidates(this.mConverter, false, -1);
4057b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
40677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            if (type == CandidatesViewManager.VIEW_TYPE_NORMAL) {
4077b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = false;
40877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (mDisplayEndOffset > 0) {
4093feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    int maxLine = getMaxLine();
4103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                    displayCandidates(this.mConverter, false, maxLine);
41177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                } else {
41277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    setReadMore();
41377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
41477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            } else {
41577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if (mViewBody.isShown()) {
416e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mWnn.setCandidatesViewShown(false);
41777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
41877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
4197b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
4207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
4217b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
4227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /**
4237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Set the view layout
4247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     *
42577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param type      View type
42677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return          {@code true} if display is updated; {@code false} if otherwise
4277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     */
4287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean setViewLayout(int type) {
4297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mViewType = type;
430e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setViewScaleUp(false, null);
43177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
432e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        switch (type) {
433e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_CLOSE:
434e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(-1);
435e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return false;
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
437e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_NORMAL:
438e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewBodyScroll.scrollTo(0, 0);
439e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.setVisibility(View.VISIBLE);
440e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList2nd.setVisibility(View.GONE);
441e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(-1);
442e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int line = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
443e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.setMinimumHeight(getCandidateMinimumHeight() * line);
444e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return false;
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
446e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        case CandidatesViewManager.VIEW_TYPE_FULL:
447e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        default:
448e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList2nd.setVisibility(View.VISIBLE);
449e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(mViewHeight);
450e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return true;
451e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
453053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getViewType */
455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public int getViewType() {
456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return mViewType;
457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#displayCandidates */
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void displayCandidates(WnnEngine converter) {
461e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
46277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mCanReadMore = false;
4637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mDisplayEndOffset = 0;
4647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mIsFullView = false;
465e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewWordCount = 0;
466e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewOccupyCount = 0;
467e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mFullViewPrevLineTopId = 0;
468e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCreateCandidateDone = false;
469e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mNormalViewWordCountOfLine = 0;
470e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
471e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        clearCandidates();
472e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mConverter = converter;
473e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
474e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
475e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateTemplate.setVisibility(View.VISIBLE);
476e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mViewCandidateTemplate.setBackgroundResource(R.drawable.cand_back);
477e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
478e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        displayCandidates(converter, true, getMaxLine());
479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
4817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#getMaxLine */
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int getMaxLine() {
4837b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        int maxLine = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return maxLine;
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Display the candidates.
4893feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
4907b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @param converter  {@link WnnEngine} which holds candidates.
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param dispFirst  Whether it is the first time displaying the candidates
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param maxLine    The maximum number of displaying lines
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
4947b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    synchronized private void displayCandidates(WnnEngine converter, boolean dispFirst, int maxLine) {
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (converter == null) {
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
499e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Concatenate the candidates already got and the last one in dispFirst mode */
500e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int displayLimit = mDisplayLimit;
5017b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
502e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        boolean isHistorySequence = false;
503e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        boolean isBreak = false;
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
505e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Get candidates */
506e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        WnnWord result = null;
507e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        while ((displayLimit == -1 || mWordCount < displayLimit)) {
508e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            result = converter.getNextCandidate();
5097b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
510e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (result == null) {
511e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
512e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
513e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
514e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            setCandidate(false, result);
515e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
516e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (dispFirst && (maxLine < mLineCount)) {
517e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mCanReadMore = true;
518e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                isBreak = true;
519e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                break;
520e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
521e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
5227b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
523e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!isBreak && !mCreateCandidateDone) {
524e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* align left if necessary */
525e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            createNextLine();
526e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mCreateCandidateDone = true;
527e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
528e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
529e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mWordCount < 1) { /* no candidates */
530e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mAutoHideMode) {
531e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mWnn.setCandidatesViewShown(false);
532e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                return;
5337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
534e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mCanReadMore = false;
535e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mIsFullView = false;
536e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
5377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
540e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setReadMore();
5417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
542e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (!(mViewBody.isShown())) {
543e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mWnn.setCandidatesViewShown(true);
544e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
545e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return;
546e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
547e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
548e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
549e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Add a candidate into the list.
550e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param isCategory  {@code true}:caption of category, {@code false}:normal word
551e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param word        A candidate word
552e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
553e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void setCandidate(boolean isCategory, WnnWord word) {
554e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int textLength = measureText(word.candidate, 0, word.candidate.length());
555e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView template = mViewCandidateTemplate;
556e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textLength += template.getPaddingLeft() + template.getPaddingRight();
557e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int maxWidth = mViewWidth;
558e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
559e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView textView;
560e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsFullView || getMaxLine() < mLineCount) {
561e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Full view */
562e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int indentWidth = mViewWidth / FULL_VIEW_DIV;
563e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int occupyCount = Math.min((textLength + indentWidth) / indentWidth, FULL_VIEW_DIV);
564e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (isCategory) {
565e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                occupyCount = FULL_VIEW_DIV;
5667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
567e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
568e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (FULL_VIEW_DIV < (mFullViewOccupyCount + occupyCount)) {
569e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (FULL_VIEW_DIV != mFullViewOccupyCount) {
570e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mFullViewPrevParams.width += (FULL_VIEW_DIV - mFullViewOccupyCount) * indentWidth;
571e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mViewCandidateList2nd.updateViewLayout(mFullViewPrevView, mFullViewPrevParams);
57277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
573e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mFullViewOccupyCount = 0;
574e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mFullViewPrevLineTopId = mFullViewPrevView.getId();
575e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineCount++;
5767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
577e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
5780470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            ViewGroup layout = mViewCandidateList2nd;
579e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
580e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int width = indentWidth * occupyCount;
581e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int height = getCandidateMinimumHeight();
582e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
5830470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
5840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            ViewGroup.LayoutParams params = buildLayoutParams(mViewCandidateList2nd, width, height);
5853feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
586e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView = (TextView) layout.getChildAt(mFullViewWordCount);
587e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (textView == null) {
588e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                textView = createCandidateView();
589e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                textView.setLayoutParams(params);
590e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
591e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateList2nd.addView(textView);
592e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
593e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateList2nd.updateViewLayout(textView, params);
594e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
595e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
596e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewOccupyCount += occupyCount;
597e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewWordCount++;
598e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewPrevView = textView;
599e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewPrevParams = params;
600e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
601e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
602e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textLength = Math.max(textLength, getCandidateMinimumWidth());
603e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
604e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Normal view */
605e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int nextEnd = mLineLength + textLength;
606e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mLineCount == 1) {
607e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                maxWidth -= getCandidateMinimumWidth();
608e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
609e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
610e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if ((maxWidth < nextEnd) && (mWordCount != 0)) {
611e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                createNextLine();
612e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (getMaxLine() < mLineCount) {
613e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mLineLength = 0;
614e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    /* Call this method again to add the candidate in the full view */
615e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    setCandidate(isCategory, word);
616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return;
617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
618e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
619e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineLength = textLength;
6207b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            } else {
621e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineLength = nextEnd;
622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
623e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
624e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(mLineCount - 1);
625e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView = (TextView) lineView.getChildAt(mNormalViewWordCountOfLine);
626e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
627e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (isCategory) {
628e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (mLineCount == 1) {
629e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mViewCandidateTemplate.setBackgroundDrawable(null);
63077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                }
631e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mLineLength += CANDIDATE_LEFT_ALIGN_THRESHOLD;
632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
634e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mNormalViewWordCountOfLine++;
635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
637e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setText(word.candidate);
638e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setTextColor(mTextColor);
639e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setId(mWordCount);
640e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setVisibility(View.VISIBLE);
641e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setPressed(false);
642e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
643e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (isCategory) {
644e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnClickListener(null);
645e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnLongClickListener(null);
646e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setBackgroundDrawable(null);
6477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
648e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnClickListener(mCandidateOnClick);
649e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setOnLongClickListener(mCandidateOnLongClick);
650e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setBackgroundResource(R.drawable.cand_back);
6517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
652e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        textView.setOnTouchListener(mCandidateOnTouch);
653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
654e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (maxWidth < textLength) {
655e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setEllipsize(TextUtils.TruncateAt.END);
656e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
657e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setEllipsize(null);
658e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
660e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        ImageSpan span = null;
661e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (word.candidate.equals(" ")) {
662e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            span = new ImageSpan(mWnn, R.drawable.word_half_space,
663e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                 DynamicDrawableSpan.ALIGN_BASELINE);
664e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else if (word.candidate.equals("\u3000" /* full-width space */)) {
665e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            span = new ImageSpan(mWnn, R.drawable.word_full_space,
666e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                 DynamicDrawableSpan.ALIGN_BASELINE);
667e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
6683feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
669e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (span != null) {
670e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            SpannableString spannable = new SpannableString("   ");
671e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            spannable.setSpan(span, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
672e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            textView.setText(spannable);
673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
674e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
675e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mWnnWordArray.add(mWordCount, word);
676e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mWordCount++;
677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
6793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
6800470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * Create AbsoluteLayout.LayoutParams
6810470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * @param layout AbsoluteLayout
6820470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * @param width
6830470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * @param height
6840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     * @return ViewGroup.LayoutParams
6850470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa     */
6860470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    private ViewGroup.LayoutParams buildLayoutParams(AbsoluteLayout layout, int width, int height) {
6870470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
6880470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        int indentWidth = mViewWidth / FULL_VIEW_DIV;
6890470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        int x         = indentWidth * mFullViewOccupyCount;
6900470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        int nomalLine = (mPortrait) ? LINE_NUM_PORTRAIT : LINE_NUM_LANDSCAPE;
6910470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        int y         = getCandidateMinimumHeight() * (mLineCount - nomalLine - 1);
6920470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        ViewGroup.LayoutParams params
6930470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa              = new AbsoluteLayout.LayoutParams(width, height, x, y);
6940470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
6950470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        return params;
6960470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    }
6970470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
6980470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
6990470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
7000470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
7010470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
7020470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
7030470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa    /**
704e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Create a view for a candidate.
705e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return the view
7063feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
707e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private TextView createCandidateView() {
708e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextView text = new TextView(mViewBodyScroll.getContext());
709e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setTextSize(20);
710e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setBackgroundResource(R.drawable.cand_back);
711e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setGravity(Gravity.CENTER);
712e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setSingleLine();
713e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setPadding(4, 4, 4, 4);
714e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
715e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                           ViewGroup.LayoutParams.WRAP_CONTENT,
716e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                           1.0f));
717e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setMinHeight(getCandidateMinimumHeight());
718e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        text.setMinimumWidth(getCandidateMinimumWidth());
719e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return text;
7203feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    }
721e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
7223feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
723e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Display {@code mReadMoreText} if there are more candidates.
7243feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
725e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void setReadMore() {
726e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsScaleUp) {
727e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mReadMoreButton.setVisibility(View.GONE);
728e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateTemplate.setVisibility(View.GONE);
729e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return;
73077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
731e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
732e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsFullView) {
733e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mReadMoreButton.setVisibility(View.VISIBLE);
734e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mReadMoreButton.setImageResource(R.drawable.cand_down);
735e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
736e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mCanReadMore) {
737e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mReadMoreButton.setVisibility(View.VISIBLE);
738e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mReadMoreButton.setImageResource(R.drawable.cand_up);
739e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
740e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mReadMoreButton.setVisibility(View.GONE);
741e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                mViewCandidateTemplate.setVisibility(View.GONE);
742e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            }
7437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
7447b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
7457b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
7463feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
747e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Clear the list of the normal candidate view.
7483feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
749e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void clearNormalViewCandidate() {
750e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        LinearLayout candidateList = mViewCandidateList1st;
751e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int lineNum = candidateList.getChildCount();
752e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < lineNum; i++) {
753e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
754e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = (LinearLayout)candidateList.getChildAt(i);
755e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int size = lineView.getChildCount();
756e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int j = 0; j < size; j++) {
757e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                View v = lineView.getChildAt(j);
758e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                v.setVisibility(View.GONE);
75977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            }
7607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
7617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
76277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
7637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#clearCandidates */
764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void clearCandidates() {
765e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        clearNormalViewCandidate();
766e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
7670470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        ViewGroup layout = mViewCandidateList2nd;
768e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int size = layout.getChildCount();
769e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        for (int i = 0; i < size; i++) {
770e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            View v = layout.getChildAt(i);
771e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            v.setVisibility(View.GONE);
772e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
77377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
774e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mLineCount = 1;
775053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mWordCount = 0;
7767b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mWnnWordArray.clear();
7777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
77877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        mLineLength = 0;
7797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
780e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mIsFullView = false;
781e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
78277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        if (mAutoHideMode) {
78377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            setViewLayout(CandidatesViewManager.VIEW_TYPE_CLOSE);
78477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        }
7857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mAutoHideMode && mViewBody.isShown()) {
787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mWnn.setCandidatesViewShown(false);
788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
789e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mCanReadMore = false;
790e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        setReadMore();
791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
7937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see CandidatesViewManager#setPreferences */
794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setPreferences(SharedPreferences pref) {
795053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        try {
796053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (pref.getBoolean("key_vibration", false)) {
797053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mVibrator = (Vibrator)mWnn.getSystemService(Context.VIBRATOR_SERVICE);
798053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
799053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mVibrator = null;
800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
801053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (pref.getBoolean("key_sound", false)) {
802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mSound = MediaPlayer.create(mWnn, R.raw.type);
803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                mSound = null;
805053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } catch (Exception ex) {
807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Log.d("iwnn", "NO VIBRATOR");
808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
812e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Process {@code OpenWnnEvent.CANDIDATE_VIEW_TOUCH} event.
8133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     *
81477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return      {@code true} if event is processed; {@code false} if otherwise
8153feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
8167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public boolean onTouchSync() {
8177b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        return mGestureDetector.onTouchEvent(mMotionEvent);
818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Select a candidate.
822053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * <br>
8237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * This method notices the selected word to {@link OpenWnn}.
824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param word  The selected word
826053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
8277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private void selectCandidate(WnnWord word) {
8287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mVibrator != null) {
830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            try { mVibrator.vibrate(30); } catch (Exception ex) { }
831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (mSound != null) {
833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            try { mSound.seekTo(0); mSound.start(); } catch (Exception ex) { }
834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.SELECT_CANDIDATE, word));
836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
837053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
838e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onDown */
83977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onDown(MotionEvent arg0) {
840e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return false;
84177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
842053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
843e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onFling */
84477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
845e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsScaleUp) {
8467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            return false;
8477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
8487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
8497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        boolean consumed = false;
850e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (arg1 != null && arg0 != null && arg1.getY() < arg0.getY()) {
851e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if ((mViewType == CandidatesViewManager.VIEW_TYPE_NORMAL) && mCanReadMore) {
8527b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (mVibrator != null) {
8537b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    try { mVibrator.vibrate(30); } catch (Exception ex) { }
8547b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
8557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = true;
8567b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_FULL));
8577b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                consumed = true;
8587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
8597b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        } else {
8607b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            if (mViewBodyScroll.getScrollY() == 0) {
8617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                if (mVibrator != null) {
8627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    try { mVibrator.vibrate(30); } catch (Exception ex) { }
8637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
8647b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mIsFullView = false;
8657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                mWnn.onEvent(new OpenWnnEvent(OpenWnnEvent.LIST_CANDIDATES_NORMAL));
8667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                consumed = true;
8677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
8687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        }
8697b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
87077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return consumed;
87177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
8727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
873e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onLongPress */
87477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public void onLongPress(MotionEvent arg0) {
875e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return;
87677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
8777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
878e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onScroll */
879e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
88077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return false;
88177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
8827b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
883e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onShowPress */
88477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public void onShowPress(MotionEvent arg0) {
88577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
8867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
887e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /** @see android.view.GestureDetector.OnGestureListener#onSingleTapUp */
88877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    public boolean onSingleTapUp(MotionEvent arg0) {
88977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        return false;
89077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
89177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa
8923feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
893e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Retrieve the width of string to draw.
894e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     *
895e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param text          The string
896e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param start         The start position (specified by the number of character)
897e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param end           The end position (specified by the number of character)
898e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return          The width of string to draw
899e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
900e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    public int measureText(CharSequence text, int start, int end) {
9010470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        if (end - start < 3) {
9020470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            return getCandidateMinimumWidth();
9030470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        }
9040470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa
905e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        TextPaint paint = mViewCandidateTemplate.getPaint();
906e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        return (int)paint.measureText(text, start, end);
907e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
908e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
909e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    /**
910e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Switch list/enlarge view mode.
911e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param up  {@code true}:enlarge, {@code false}:list
912e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @param word  The candidate word to be enlarged.
9133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
914e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void setViewScaleUp(boolean up, WnnWord word) {
915e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (up == mIsScaleUp || (mViewScaleUp == null)) {
916e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            return;
917e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
918e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
919e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (up) {
920e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            setViewLayout(CandidatesViewManager.VIEW_TYPE_NORMAL);
921e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateList1st.setVisibility(View.GONE);
922e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.setMinimumHeight(-1);
923e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.addView(mViewScaleUp);
924e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            TextView text = (TextView)mViewScaleUp.findViewById(R.id.candidate_scale_up_text);
925e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            text.setText(word.candidate);
926e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (!mPortrait) {
927e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                Resources r = mViewBodyScroll.getContext().getResources();
928e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                text.setTextSize(r.getDimensionPixelSize(R.dimen.candidate_delete_word_size_landscape));
9293feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa            }
930e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
931e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mIsScaleUp = true;
932e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            setReadMore();
933e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
934e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mIsScaleUp = false;
935e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mViewCandidateBase.removeView(mViewScaleUp);
936e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
93777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa    }
9383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
9393feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
940e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * Create a layout for the next line.
9413feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
942e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private void createNextLine() {
943e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        int lineCount = mLineCount;
944e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        if (mIsFullView || getMaxLine() < lineCount) {
945e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Full view */
946e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewOccupyCount = 0;
947e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mFullViewPrevLineTopId = mFullViewPrevView.getId();
948e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        } else {
949e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* Normal view */
950e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout lineView = (LinearLayout) mViewCandidateList1st.getChildAt(lineCount - 1);
951e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            float weight = 0;
952e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            if (mLineLength < CANDIDATE_LEFT_ALIGN_THRESHOLD) {
953e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (lineCount == 1) {
954e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    mViewCandidateTemplate.setVisibility(View.GONE);
9557b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                }
956e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            } else {
957e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                weight = 1.0f;
9587b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
959e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
960e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            LinearLayout.LayoutParams params
961e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
962e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                ViewGroup.LayoutParams.WRAP_CONTENT,
963e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                                weight);
964e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
965e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            int child = lineView.getChildCount();
966e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            for (int i = 0; i < child; i++) {
967e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                View view = lineView.getChildAt(i);
968e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
969e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                if (view != mViewCandidateTemplate) {
970e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                    view.setLayoutParams(params);
971e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                }
9727b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            }
9737b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
974e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mLineLength = 0;
975e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            mNormalViewWordCountOfLine = 0;
976e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        }
977e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        mLineCount++;
978e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    }
9797b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
9803feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
981e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return the minimum width of a candidate view.
9823feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa     */
983e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int getCandidateMinimumWidth() {
9840470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        return mCandidateMinimumWidth;
9857b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
9867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
9873feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    /**
988e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     * @return the minimum height of a candidate view.
989e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa     */
990e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa    private int getCandidateMinimumHeight() {
9910470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        return mCandidateMinimumHeight;
9927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    }
9937b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa}
994