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