1/*
2 * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package jp.co.omronsoft.openwnn;
17
18import android.app.Dialog;
19import android.content.Context;
20import android.graphics.drawable.Drawable;
21import android.text.TextUtils;
22import android.text.TextPaint;
23import android.view.Gravity;
24import android.view.View;
25import android.view.ViewGroup;
26import android.view.Window;
27import android.view.WindowManager;
28import android.widget.LinearLayout;
29import android.widget.TextView;
30
31/**
32 * The default candidates view manager using {@link TextView}.
33 *
34 * @author Copyright (C) 2011 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
35 */
36public class CandidateTextView extends TextView {
37
38    /** Width of fontsize change */
39    private static final int WIDTH_SIZE[] = {0, 50, 100};
40    /** Fontsize corresponding to width */
41    private static final float CUSTOM_FONTSIZE[] = {20.0f, 17.0f, 15.0f};
42    /** Width of fontsize change beginning */
43    private static final int CHANGE_FONTSIZE_WIDTH = 120;
44
45    /** Maximum width of candidate view */
46    private int mMaxWidth;
47    /** Width of fontsize change beginning */
48    private int mChangeFontSize;
49    /** Minimum width of candidate view */
50    private int mCandidateMinimumWidth;
51
52    /** Alert dialog */
53    private Dialog mCandidateDialog = null;
54
55   /**
56    * Constructor
57    * @param context    context
58    */
59    public CandidateTextView(Context context) {
60        super(context);
61        setSoundEffectsEnabled(false);
62    }
63
64   /**
65    * Constructor
66    * @param context    context
67    * @param candidateMinimumHeight Minimum height of candidate view
68    * @param candidateMinimumWidth  Minimum width of candidate view
69    * @param maxWidth  Maximum width of candidate view
70    */
71    public CandidateTextView(Context context, int candidateMinimumHeight, int candidateMinimumWidth, int maxWidth) {
72        super(context);
73        setSoundEffectsEnabled(false);
74        setTextColor(getResources().getColor(R.color.candidate_text_1line));
75        setBackgroundResource(R.drawable.cand_back_1line);
76        setGravity(Gravity.CENTER);
77        setSingleLine();
78        setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
79                                                           ViewGroup.LayoutParams.MATCH_PARENT,
80                                                           1.0f));
81        setMinHeight(candidateMinimumHeight);
82        setMinimumWidth(candidateMinimumWidth);
83        mCandidateMinimumWidth = candidateMinimumWidth;
84        mMaxWidth = maxWidth;
85        mChangeFontSize = maxWidth - CHANGE_FONTSIZE_WIDTH;
86    }
87
88   /**
89    * Textview is set to the best content for the display of candidate.
90    * @param WnnWord    candidate
91    * @param wordCount  candidate id
92    * @param OnClickListener Operation when clicking
93    * @param OnClickListener Operation when longclicking
94    * @return Set completion textview
95    */
96    public CandidateTextView setCandidateTextView(WnnWord word, int wordCount,
97                                                        OnClickListener candidateOnClick,
98                                                        OnLongClickListener candidateOnLongClick) {
99        setTextSize(CUSTOM_FONTSIZE[0]);
100        setText(word.candidate);
101        setId(wordCount);
102        setVisibility(View.VISIBLE);
103        setPressed(false);
104        setWidth(0);
105        setEllipsize(null);
106        setOnClickListener(candidateOnClick);
107        setOnLongClickListener(candidateOnLongClick);
108        setCustomCandidate(word);
109        return this;
110    }
111
112   /**
113    * If the text view is set to the best width for the display,
114    * and it is necessary, the character is shortened.
115    * @param WnnWord candidate word
116    * @return int    textview width
117    */
118    public int setCustomCandidate(WnnWord word) {
119        TextPaint paint = getPaint();
120        int width = (int)paint.measureText(word.candidate, 0, word.candidate.length());
121        width += getPaddingLeft() + getPaddingRight();
122
123        if (width > mCandidateMinimumWidth) {
124            int i;
125            for (i = 0; i < WIDTH_SIZE.length; i++) {
126                if (width > mChangeFontSize + WIDTH_SIZE[i]) {
127                    setTextSize(CUSTOM_FONTSIZE[i]);
128                }
129            }
130
131            width = (int)paint.measureText(word.candidate, 0, word.candidate.length());
132            width += getPaddingLeft() + getPaddingRight();
133
134            if (width >= mMaxWidth) {
135                setWidth(mMaxWidth);
136                width = mMaxWidth;
137                setEllipsize(TextUtils.TruncateAt.START);
138            } else {
139                setWidth(width);
140            }
141        } else {
142            setWidth(mCandidateMinimumWidth);
143            width = mCandidateMinimumWidth;
144        }
145        return width;
146    }
147
148    /** @see View#setBackgroundDrawable */
149    @Override public void setBackgroundDrawable(Drawable d) {
150        super.setBackgroundDrawable(d);
151        setPadding(20, 0, 20, 0);
152    }
153
154    /**
155     * Display Dialog.
156     *
157     * @param builder  The Dialog builder,
158     */
159    public void displayCandidateDialog(Dialog builder) {
160        if (mCandidateDialog != null) {
161            mCandidateDialog.dismiss();
162            mCandidateDialog = null;
163        }
164        mCandidateDialog = builder;
165        Window window = mCandidateDialog.getWindow();
166        WindowManager.LayoutParams lp = window.getAttributes();
167        lp.token = getWindowToken();
168        lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
169        window.setAttributes(lp);
170        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
171        mCandidateDialog.show();
172    }
173
174    /** @see android.view.View#onWindowVisibilityChanged */
175    @Override protected void onWindowVisibilityChanged(int visibility) {
176       super.onWindowVisibilityChanged(visibility);
177       if ((visibility != VISIBLE) && (mCandidateDialog != null)) {
178           mCandidateDialog.dismiss();
179       }
180    }
181}
182