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