159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma/* 259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd. 359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * 459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Licensed under the Apache License, Version 2.0 (the "License"); 559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * you may not use this file except in compliance with the License. 659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * You may obtain a copy of the License at 759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * 859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * http://www.apache.org/licenses/LICENSE-2.0 959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * 1059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Unless required by applicable law or agreed to in writing, software 1159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * distributed under the License is distributed on an "AS IS" BASIS, 1259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * See the License for the specific language governing permissions and 1459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * limitations under the License. 1559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 1659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmapackage jp.co.omronsoft.openwnn; 1759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 1859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.app.Dialog; 1959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.content.Context; 2059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.graphics.drawable.Drawable; 2159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.text.TextUtils; 2259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.text.TextPaint; 2359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.Gravity; 2459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.View; 2559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.ViewGroup; 2659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.Window; 2759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.view.WindowManager; 2859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.widget.LinearLayout; 2959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmaimport android.widget.TextView; 3059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 3159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma/** 3259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * The default candidates view manager using {@link TextView}. 3359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * 3459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @author Copyright (C) 2011 OMRON SOFTWARE CO., LTD. All Rights Reserved. 3559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 3659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monmapublic class CandidateTextView extends TextView { 3759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 3859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Width of fontsize change */ 3959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private static final int WIDTH_SIZE[] = {0, 50, 100}; 4059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Fontsize corresponding to width */ 4159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private static final float CUSTOM_FONTSIZE[] = {20.0f, 17.0f, 15.0f}; 4259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Width of fontsize change beginning */ 4359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private static final int CHANGE_FONTSIZE_WIDTH = 120; 4459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 4559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Maximum width of candidate view */ 4659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private int mMaxWidth; 4759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Width of fontsize change beginning */ 4859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private int mChangeFontSize; 4959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Minimum width of candidate view */ 5059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private int mCandidateMinimumWidth; 5159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 5259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** Alert dialog */ 5359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma private Dialog mCandidateDialog = null; 5459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 5559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** 5659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Constructor 5759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param context context 5859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 5959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma public CandidateTextView(Context context) { 6059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma super(context); 6159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setSoundEffectsEnabled(false); 6259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 6359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 6459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** 6559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Constructor 6659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param context context 6759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param candidateMinimumHeight Minimum height of candidate view 6859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param candidateMinimumWidth Minimum width of candidate view 6959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param maxWidth Maximum width of candidate view 7059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 7159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma public CandidateTextView(Context context, int candidateMinimumHeight, int candidateMinimumWidth, int maxWidth) { 7259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma super(context); 7359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setSoundEffectsEnabled(false); 7459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setTextColor(getResources().getColor(R.color.candidate_text_1line)); 7559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setBackgroundResource(R.drawable.cand_back_1line); 7659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setGravity(Gravity.CENTER); 7759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setSingleLine(); 7859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 7959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma ViewGroup.LayoutParams.MATCH_PARENT, 8059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 1.0f)); 8159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setMinHeight(candidateMinimumHeight); 8259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setMinimumWidth(candidateMinimumWidth); 8359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateMinimumWidth = candidateMinimumWidth; 8459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mMaxWidth = maxWidth; 8559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mChangeFontSize = maxWidth - CHANGE_FONTSIZE_WIDTH; 8659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 8759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 8859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** 8959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Textview is set to the best content for the display of candidate. 9059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param WnnWord candidate 9159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param wordCount candidate id 9259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param OnClickListener Operation when clicking 9359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param OnClickListener Operation when longclicking 9459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @return Set completion textview 9559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 9659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma public CandidateTextView setCandidateTextView(WnnWord word, int wordCount, 9759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma OnClickListener candidateOnClick, 9859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma OnLongClickListener candidateOnLongClick) { 9959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setTextSize(CUSTOM_FONTSIZE[0]); 10059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setText(word.candidate); 10159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setId(wordCount); 10259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setVisibility(View.VISIBLE); 10359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setPressed(false); 10459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setWidth(0); 10559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setEllipsize(null); 10659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setOnClickListener(candidateOnClick); 10759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setOnLongClickListener(candidateOnLongClick); 10859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setCustomCandidate(word); 10959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma return this; 11059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 11159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 11259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** 11359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * If the text view is set to the best width for the display, 11459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * and it is necessary, the character is shortened. 11559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param WnnWord candidate word 11659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @return int textview width 11759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 11859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma public int setCustomCandidate(WnnWord word) { 11959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma TextPaint paint = getPaint(); 12059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma int width = (int)paint.measureText(word.candidate, 0, word.candidate.length()); 12159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma width += getPaddingLeft() + getPaddingRight(); 12259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 12359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma if (width > mCandidateMinimumWidth) { 12459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma int i; 12559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma for (i = 0; i < WIDTH_SIZE.length; i++) { 12659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma if (width > mChangeFontSize + WIDTH_SIZE[i]) { 12759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setTextSize(CUSTOM_FONTSIZE[i]); 12859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 12959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 13059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 13159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma width = (int)paint.measureText(word.candidate, 0, word.candidate.length()); 13259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma width += getPaddingLeft() + getPaddingRight(); 13359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 13459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma if (width >= mMaxWidth) { 13559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setWidth(mMaxWidth); 13659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma width = mMaxWidth; 13759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setEllipsize(TextUtils.TruncateAt.START); 13859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } else { 13959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setWidth(width); 14059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 14159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } else { 14259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setWidth(mCandidateMinimumWidth); 14359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma width = mCandidateMinimumWidth; 14459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 14559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma return width; 14659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 14759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 14859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** @see View#setBackgroundDrawable */ 14959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma @Override public void setBackgroundDrawable(Drawable d) { 15059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma super.setBackgroundDrawable(d); 15159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma setPadding(20, 0, 20, 0); 15259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 15359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 15459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** 15559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Display Dialog. 15659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * 15759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * @param builder The Dialog builder, 15859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma */ 15959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma public void displayCandidateDialog(Dialog builder) { 16059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma if (mCandidateDialog != null) { 16159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateDialog.dismiss(); 16259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateDialog = null; 16359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 16459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateDialog = builder; 16559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma Window window = mCandidateDialog.getWindow(); 16659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma WindowManager.LayoutParams lp = window.getAttributes(); 16759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma lp.token = getWindowToken(); 16859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 16959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma window.setAttributes(lp); 17059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 17159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateDialog.show(); 17259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 17359aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma 17459aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** @see android.view.View#onWindowVisibilityChanged */ 17559aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma @Override protected void onWindowVisibilityChanged(int visibility) { 17659aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma super.onWindowVisibilityChanged(visibility); 17759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma if ((visibility != VISIBLE) && (mCandidateDialog != null)) { 17859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mCandidateDialog.dismiss(); 17959aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 18059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma } 18159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma} 182