14df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project/*
24df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
34df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
44df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
54df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * you may not use this file except in compliance with the License.
64df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * You may obtain a copy of the License at
74df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
84df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
94df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project *
104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * See the License for the specific language governing permissions and
144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project * limitations under the License.
154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */
164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectpackage com.android.internal.widget;
184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport java.io.InputStream;
206ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataokaimport java.util.ArrayList;
216ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka
22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.app.AlertDialog.Builder;
234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.content.Context;
24ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.content.DialogInterface;
2505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.Bitmap;
2605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.BitmapFactory;
2705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.Canvas;
2805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.drawable.BitmapDrawable;
2905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.drawable.Drawable;
3005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.drawable.ShapeDrawable;
3105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.graphics.drawable.shapes.RectShape;
32ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.net.Uri;
33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.os.Bundle;
344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.text.Editable;
35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.text.Html;
36ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.text.Layout;
374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.text.Spannable;
3805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.text.Spanned;
39ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.text.method.ArrowKeyMovementMethod;
404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.text.style.AbsoluteSizeSpan;
41ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.text.style.AlignmentSpan;
4205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.text.style.CharacterStyle;
434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.text.style.ForegroundColorSpan;
44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.text.style.ImageSpan;
4505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.text.style.ParagraphStyle;
4605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataokaimport android.text.style.QuoteSpan;
474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.util.AttributeSet;
484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.util.Log;
49ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.view.KeyEvent;
504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.view.MotionEvent;
51ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.view.View;
52ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.view.inputmethod.InputMethodManager;
534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectimport android.widget.EditText;
54ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataokaimport android.widget.TextView;
554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project/**
57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * EditStyledText extends EditText for managing the flow and status to edit
58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * the styled text. This manages the states and flows of editing, supports
59ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * inserting image, import/export HTML.
604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project */
614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Projectpublic class EditStyledText extends EditText {
624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    private static final String LOG_TAG = "EditStyledText";
6405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private static final boolean DBG = false;
654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * The modes of editing actions.
684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode that no editing action is done. */
704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_NOTHING = 0;
714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode of copy. */
724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_COPY = 1;
734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode of paste. */
744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_PASTE = 2;
754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode of changing size. */
764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_SIZE = 3;
774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode of changing color. */
784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_COLOR = 4;
794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The mode of selection. */
804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int MODE_SELECT = 5;
81ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /** The mode of changing alignment. */
82ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public static final int MODE_ALIGN = 6;
83ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /** The mode of changing cut. */
84ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public static final int MODE_CUT = 7;
854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * The state of selection.
884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The state that selection isn't started. */
904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int STATE_SELECT_OFF = 0;
914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The state that selection is started. */
924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int STATE_SELECT_ON = 1;
934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /** The state that selection is done, but not fixed. */
944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int STATE_SELECTED = 2;
95ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /** The state that selection is done and not fixed. */
964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int STATE_SELECT_FIX = 3;
974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * The help message strings.
1004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
1014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int HINT_MSG_NULL = 0;
1024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int HINT_MSG_COPY_BUF_BLANK = 1;
1034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int HINT_MSG_SELECT_START = 2;
1044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int HINT_MSG_SELECT_END = 3;
1054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public static final int HINT_MSG_PUSH_COMPETE = 4;
1064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
10705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
10805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
10905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * The help message strings.
11005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
11105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public static final int DEFAULT_BACKGROUND_COLOR = 0x00FFFFFF;
11205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
1134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * EditStyledTextInterface provides functions for notifying messages to
115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * calling class.
1164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
117ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public interface EditStyledTextNotifier {
118ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void notifyHintMsg(int msgId);
119ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void notifyStateChanged(int mode, int state);
1204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
121ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
122ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private EditStyledTextNotifier mESTInterface;
1234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
125ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * EditStyledTextEditorManager manages the flow and status of each
126ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * function for editing styled text.
1274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
128ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private EditorManager mManager;
129ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private StyledTextConverter mConverter;
13005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private StyledTextDialog mDialog;
13105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private Drawable mDefaultBackground;
13205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private int mBackgroundColor;
1334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
135ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * EditStyledText extends EditText for managing flow of each editing
136ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * action.
137ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
1384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public EditStyledText(Context context, AttributeSet attrs, int defStyle) {
1394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        super(context, attrs, defStyle);
1404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        init();
1414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public EditStyledText(Context context, AttributeSet attrs) {
1444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        super(context, attrs);
1454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        init();
1464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public EditStyledText(Context context) {
1494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        super(context);
1504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        init();
1514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
1524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
154ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Set Notifier.
155ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
156ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void setNotifier(EditStyledTextNotifier estInterface) {
157ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mESTInterface = estInterface;
158ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
159ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
160ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
161ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Set Builder for AlertDialog.
162ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
163ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param builder
164ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            Builder for opening Alert Dialog.
165ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
166ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void setBuilder(Builder builder) {
16705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.setBuilder(builder);
168ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
169ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
170ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
171ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Set Parameters for ColorAlertDialog.
172ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
173ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param colortitle
174ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            Title for Alert Dialog.
175ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param colornames
176ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            List of name of selecting color.
177ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param colorints
178ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            List of int of color.
179ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
180ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void setColorAlertParams(CharSequence colortitle,
181ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            CharSequence[] colornames, CharSequence[] colorints) {
18205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.setColorAlertParams(colortitle, colornames, colorints);
183ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
184ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
185ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
186ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Set Parameters for SizeAlertDialog.
187ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
188ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param sizetitle
189ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            Title for Alert Dialog.
190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param sizenames
191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            List of name of selecting size.
192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param sizedisplayints
193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            List of int of size displayed in TextView.
194ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param sizesendints
195ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            List of int of size exported to HTML.
1964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
197ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void setSizeAlertParams(CharSequence sizetitle,
198ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            CharSequence[] sizenames, CharSequence[] sizedisplayints,
199ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            CharSequence[] sizesendints) {
20005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.setSizeAlertParams(sizetitle, sizenames, sizedisplayints,
201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                sizesendints);
2024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
204ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public void setAlignAlertParams(CharSequence aligntitle,
205ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            CharSequence[] alignnames) {
20605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.setAlignAlertParams(aligntitle, alignnames);
207ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
208ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
2094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    @Override
2104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
211ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        if (mManager.isSoftKeyBlocked() &&
212ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                event.getAction() == MotionEvent.ACTION_UP) {
213ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            cancelLongPress();
214ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
2154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        final boolean superResult = super.onTouchEvent(event);
2164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (event.getAction() == MotionEvent.ACTION_UP) {
2174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
2184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- onTouchEvent");
2194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
220ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager.onCursorMoved();
2214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
2224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        return superResult;
2234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
226ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * Start editing. This function have to be called before other editing
227ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * actions.
2284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartEdit() {
2304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartEdit();
2314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
2344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * End editing.
2354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onEndEdit() {
2374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onEndEdit();
2384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
2414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start "Copy" action.
2424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartCopy() {
2444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartCopy();
2454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
248ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Start "Cut" action.
249ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
250ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public void onStartCut() {
251ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        mManager.onStartCut();
252ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
253ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
254ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
2554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start "Paste" action.
2564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartPaste() {
2584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartPaste();
2594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
2624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start changing "Size" action.
2634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartSize() {
2654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartSize();
2664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
2694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start changing "Color" action.
2704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartColor() {
2724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartColor();
2734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
27605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Start changing "BackgroundColor" action.
27705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
27805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public void onStartBackgroundColor() {
27905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mManager.onStartBackgroundColor();
28005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
28105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
28205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
283ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Start changing "Alignment" action.
284ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
285ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public void onStartAlign() {
286ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        mManager.onStartAlign();
287ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
288ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
289ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
2904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start "Select" action.
2914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartSelect() {
2934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartSelect();
2944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
2954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
2964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
2974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Start "SelectAll" action.
2984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
2994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void onStartSelectAll() {
3004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.onStartSelectAll();
3014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
3024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
3034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
304ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Fix Selected Item.
305ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
306ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public void onFixSelectedItem() {
307ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        mManager.onFixSelectedItem();
308ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
309ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
310ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
311ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * InsertImage to TextView by using URI
312ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param uri
314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            URI of the iamge inserted to TextView.
315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
316ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void onInsertImage(Uri uri) {
317ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mManager.onInsertImage(uri);
318ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
319ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * InsertImage to TextView by using resource ID
322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
323ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param resId
324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            Resource ID of the iamge inserted to TextView.
325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     */
326ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    public void onInsertImage(int resId) {
327ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mManager.onInsertImage(resId);
328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
33005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public void onInsertHorizontalLine() {
33105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mManager.onInsertHorizontalLine();
33205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
33305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
33405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public void onClearStyles() {
33505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mManager.onClearStyles();
33605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
337ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    /**
3384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Set Size of the Item.
339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param size
341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            The size of the Item.
3424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
3434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void setItemSize(int size) {
3444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.setItemSize(size);
3454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
3464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
3474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
3484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Set Color of the Item.
349ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param color
351ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            The color of the Item.
3524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
3534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void setItemColor(int color) {
3544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mManager.setItemColor(color);
3554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
3564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
35705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
35805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Set Alignment of the Item.
35905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
36005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @param color
36105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *            The color of the Item.
36205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
363ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public void setAlignment(Layout.Alignment align) {
364ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        mManager.setAlignment(align);
365ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
3674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
36805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Set Background color of View.
36905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
37005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @param color
37105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *            The background color of view.
37205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
37305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    @Override
37405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public void setBackgroundColor(int color) {
37505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        super.setBackgroundColor(color);
37605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mBackgroundColor = color;
37705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
37805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
37905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
38005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Set html to EditStyledText.
38105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
38205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @param html
38305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *            The html to be set.
38405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
38505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public void setHtml(String html) {
38605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mConverter.SetHtml(html);
38705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
38805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
3896ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * Check whether editing is started or not.
390ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
3914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @return Whether editing is started or not.
3924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
3934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public boolean isEditting() {
3944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        return mManager.isEditting();
3954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
3964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
3976ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    /**
39805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Check whether styled text or not.
39905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
40005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @return Whether styled text or not.
40105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
40205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public boolean isStyledText() {
40305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        return mManager.isStyledText();
40405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
40505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
4066ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * Check whether SoftKey is Blocked or not.
4076ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     *
4086ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * @return whether SoftKey is Blocked or not.
4096ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     */
410ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public boolean isSoftKeyBlocked() {
411ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        return mManager.isSoftKeyBlocked();
412ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
413ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
4144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
4154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Get the mode of the action.
416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
4174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @return The mode of the action.
4184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
4194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public int getEditMode() {
4204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        return mManager.getEditMode();
4214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
4224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
4234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
4244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Get the state of the selection.
425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
4264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * @return The state of the selection.
4274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
4284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public int getSelectState() {
4294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        return mManager.getSelectState();
4304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
4314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
4326ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    @Override
4336ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    public Bundle getInputExtras(boolean create) {
43405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        if (DBG) {
43505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Log.d(LOG_TAG, "---getInputExtras");
43605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
4376ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        Bundle bundle = super.getInputExtras(create);
4386ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        if (bundle != null) {
43905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            bundle = new Bundle();
4406ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        }
44105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        bundle.putBoolean("allowEmoji", true);
4426ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        return bundle;
4436ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    }
4446ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka
445ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
446ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Get the state of the selection.
447ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     *
448ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * @return The state of the selection.
449ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
450ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    public String getHtml() {
45105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        return mConverter.getHtml();
452ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
453ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
4544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
4556ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * Get the state of the selection.
4566ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     *
4576ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * @param uris
4586ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     *            The array of used uris.
4596ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     * @return The state of the selection.
4606ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka     */
4616ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    public String getHtml(ArrayList<Uri> uris) {
46205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mConverter.getUriArray(uris, getText());
46305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        return mConverter.getHtml();
46405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
46505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
46605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
46705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Get Background color of View.
46805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
46905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @return The background color of View.
47005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
47105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public int getBackgroundColor() {
47205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        return mBackgroundColor;
47305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
47405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
47505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
47605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Get Foreground color of View.
47705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     *
47805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * @return The background color of View.
47905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
48005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public int getForeGroundColor(int pos) {
48105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        if (DBG) {
48205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Log.d(LOG_TAG, "---getForeGroundColor: " + pos);
48305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
48405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        if (pos < 0 || pos > getText().length()) {
48505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Log.e(LOG_TAG, "---getForeGroundColor: Illigal position.");
48605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            return DEFAULT_BACKGROUND_COLOR;
48705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        } else {
48805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            ForegroundColorSpan[] spans =
48905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                getText().getSpans(pos, pos, ForegroundColorSpan.class);
49005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (spans.length > 0) {
49105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                return spans[0].getForegroundColor();
49205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            } else {
49305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                return DEFAULT_BACKGROUND_COLOR;
49405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
49505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
4966ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    }
4976ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka
4986ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka    /**
4994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Initialize members.
5004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
5014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    private void init() {
5024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (DBG) {
5034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            Log.d(LOG_TAG, "--- init");
5044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
50505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        requestFocus();
50605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDefaultBackground = getBackground();
50705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mBackgroundColor = DEFAULT_BACKGROUND_COLOR;
508ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mManager = new EditorManager(this);
509ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mConverter = new StyledTextConverter(this);
51005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog = new StyledTextDialog(this);
511ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        setMovementMethod(new StyledTextArrowKeyMethod(mManager));
51205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mManager.blockSoftKey();
51305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mManager.unblockSoftKey();
514ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
515ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
516ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
51705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Show Foreground Color Selecting Dialog.
518ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
51905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private void onShowForegroundColorAlert() {
52005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.onShowForegroundColorAlertDialog();
52105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
52205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
52305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    /**
52405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     * Show Background Color Selecting Dialog.
52505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka     */
52605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private void onShowBackgroundColorAlert() {
52705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.onShowBackgroundColorAlertDialog();
528ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
529ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
530ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
531ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Show Size Selecting Dialog.
532ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
533ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    private void onShowSizeAlert() {
53405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.onShowSizeAlertDialog();
535ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
536ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
537ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
538ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Show Alignment Selecting Dialog.
539ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
540ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    private void onShowAlignAlert() {
54105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        mDialog.onShowAlignAlertDialog();
5424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
5434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
5444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
5454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     * Notify hint messages what action is expected to calling class.
546ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *
547ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     * @param msgId
548ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project     *            Id of the hint message.
5494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
550ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private void setHintMessage(int msgId) {
5514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (mESTInterface != null) {
552ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mESTInterface.notifyHintMsg(msgId);
553ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
554ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
555ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
556ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    /**
557ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * Notify the event that the mode and state are changed.
558ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     *
559ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * @param mode
560ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     *            Mode of the editing action.
561ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * @param state
562ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     *            Mode of the selection state.
563ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     */
564ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    private void notifyStateChanged(int mode, int state) {
565ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        if (mESTInterface != null) {
566ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mESTInterface.notifyStateChanged(mode, state);
567ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
568ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
569ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
5704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    /**
571ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka     * EditorManager manages the flow and status of editing actions.
5724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project     */
573ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private class EditorManager {
5744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private boolean mEditFlag = false;
575ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean mSoftKeyBlockFlag = false;
5764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private int mMode = 0;
5774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private int mState = 0;
5784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private int mCurStart = 0;
5794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private int mCurEnd = 0;
5804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private EditStyledText mEST;
5814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
582ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        EditorManager(EditStyledText est) {
5834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEST = est;
5844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
5854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
5864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void onStartEdit() {
5874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
588ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartEdit");
5894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
59005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Log.d(LOG_TAG, "--- onstartedit:");
5914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleResetEdit();
592ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
5934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
5944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
5954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void onEndEdit() {
5964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
597ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onEndEdit");
5984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
5994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleCancel();
600ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
6034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void onStartCopy() {
6044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
605ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartCopy");
6064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
6074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleCopy();
608ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
611ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onStartCut() {
6124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
613ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartCut");
6144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
615ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleCut();
616ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
619ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onStartPaste() {
6204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
621ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartPaste");
6224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
623ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handlePaste();
624ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
627ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onStartSize() {
6284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
629ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartSize");
6304df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
631ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleSize();
632ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6344df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
635ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onStartAlign() {
6364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
637ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onStartAlignRight");
6384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
639ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleAlign();
640ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
6434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void onStartColor() {
6444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
6454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- onClickColor");
6464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
6474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleColor();
648ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
65105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public void onStartBackgroundColor() {
65205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
65305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onClickColor");
65405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
65505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.onShowBackgroundColorAlert();
65605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
65705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
65805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
6594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public void onStartSelect() {
6604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
6614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- onClickSelect");
6624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
6634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mMode = MODE_SELECT;
6644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mState == STATE_SELECT_OFF) {
6654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleSelect();
6664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else {
667ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                unsetSelect();
6684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleSelect();
6694df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
670ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
673ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onCursorMoved() {
6744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
6754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- onClickView");
6764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
6774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mState == STATE_SELECT_ON || mState == STATE_SELECTED) {
6784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleSelect();
679ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mEST.notifyStateChanged(mMode, mState);
680ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
681ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
682ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
683ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onStartSelectAll() {
684ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
685ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onClickSelectAll");
6864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
687ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleSelectAll();
688ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
691ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void onFixSelectedItem() {
6924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
6934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- onClickComplete");
6944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
6954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleComplete();
696ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
6974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
6984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
699ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void onInsertImage(Uri uri) {
700ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
701ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- onInsertImage by URI: " + uri.getPath()
702ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        + "," + uri.toString());
703ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
70405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            insertImageSpan(new ImageSpan(mEST.getContext(), uri));
705ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
706ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
707ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
708ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void onInsertImage(int resID) {
709ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
710ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- onInsertImage by resID");
711ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
71205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            insertImageSpan(new ImageSpan(mEST.getContext(), resID));
71305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
71405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
71505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
71605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public void onInsertHorizontalLine() {
71705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
71805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onInsertHorizontalLine:");
71905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
72005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            insertImageSpan(new HorizontalLineSpan(0xFF000000, mEST));
721ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.notifyStateChanged(mMode, mState);
722ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
723ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
72405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public void onClearStyles() {
72505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
72605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onClearStyles");
72705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
72805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Editable txt = mEST.getText();
72905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            int len = txt.length();
73005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Object[] styles = txt.getSpans(0, len, Object.class);
73105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            for (Object style : styles) {
73205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                if (style instanceof ParagraphStyle ||
73305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        style instanceof QuoteSpan ||
73405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        style instanceof CharacterStyle) {
73505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    if (style instanceof ImageSpan) {
73605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        int start = txt.getSpanStart(style);
73705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        int end = txt.getSpanEnd(style);
73805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        txt.replace(start, end, "");
73905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    }
74005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    txt.removeSpan(style);
74105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                }
74205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
74305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.setBackgroundDrawable(mEST.mDefaultBackground);
74405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.mBackgroundColor = DEFAULT_BACKGROUND_COLOR;
74505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
74605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
747ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void setItemSize(int size) {
748ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
749ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onClickSizeItem");
750ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
751ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (mState == STATE_SELECTED || mState == STATE_SELECT_FIX) {
752ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                changeSizeSelectedText(size);
753ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleResetEdit();
754ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
755ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
756ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
757ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void setItemColor(int color) {
758ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
759ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onClickColorItem");
760ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
761ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (mState == STATE_SELECTED || mState == STATE_SELECT_FIX) {
762ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                changeColorSelectedText(color);
763ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleResetEdit();
764ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
765ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
766ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
767ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void setAlignment(Layout.Alignment align) {
768ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
769ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- onClickColorItem");
770ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
771ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (mState == STATE_SELECTED || mState == STATE_SELECT_FIX) {
772ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                changeAlign(align);
773ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleResetEdit();
774ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
775ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
776ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
7774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public boolean isEditting() {
7784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return mEditFlag;
7794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
7804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
78105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        /* If the style of the span is added, add check case for that style */
78205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public boolean isStyledText() {
78305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Editable txt = mEST.getText();
78405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            int len = txt.length();
78505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (txt.getSpans(0, len -1, ParagraphStyle.class).length > 0 ||
78605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    txt.getSpans(0, len -1, QuoteSpan.class).length > 0 ||
78705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    txt.getSpans(0, len -1, CharacterStyle.class).length > 0 ||
78805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    mEST.mBackgroundColor != DEFAULT_BACKGROUND_COLOR) {
78905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                return true;
79005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
79105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            return false;
79205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
79305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
794ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public boolean isSoftKeyBlocked() {
79505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            return mSoftKeyBlockFlag;
796ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
797ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
7984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public int getEditMode() {
7994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return mMode;
8004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
8014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
8024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        public int getSelectState() {
8034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return mState;
8044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
8054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
806ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public int getSelectionStart() {
807ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return mCurStart;
808ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
809ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
810ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public int getSelectionEnd() {
811ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return mCurEnd;
812ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
813ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
814ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void doNextHandle() {
815ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
816ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- doNextHandle: " + mMode + "," + mState);
817ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
818ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            switch (mMode) {
819ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_COPY:
820ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleCopy();
821ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
822ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_CUT:
823ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleCut();
824ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
825ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_PASTE:
826ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handlePaste();
827ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
828ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_SIZE:
829ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleSize();
830ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
831ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_COLOR:
832ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleColor();
833ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
834ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case MODE_ALIGN:
835ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleAlign();
836ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
837ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            default:
838ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
839ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
840ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
841ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
8424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void handleCancel() {
8434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
8444df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- handleCancel");
8454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mMode = MODE_NOTHING;
8474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mState = STATE_SELECT_OFF;
8484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEditFlag = false;
849ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            Log.d(LOG_TAG, "--- handleCancel:" + mEST.getInputType());
850ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            unblockSoftKey();
851ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            unsetSelect();
8524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
8534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
8544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void handleComplete() {
8554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
8564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- handleComplete");
8574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
8594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
8604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8614df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mState == STATE_SELECTED) {
8624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mState = STATE_SELECT_FIX;
8634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
864ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            doNextHandle();
8654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
8664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
867ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleTextViewFunc(int mode, int id) {
8684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
869ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- handleTextView: " + mMode + "," + mState +
870ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        "," + id);
8714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
8734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
8744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mMode == MODE_NOTHING || mMode == MODE_SELECT) {
876ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mMode = mode;
8774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                if (mState == STATE_SELECTED) {
8784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    mState = STATE_SELECT_FIX;
879ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    handleTextViewFunc(mode, id);
8804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                } else {
8814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    handleSelect();
8824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                }
883ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            } else if (mMode != mode) {
8844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleCancel();
885ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mMode = mode;
886ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleTextViewFunc(mode, id);
8874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else if (mState == STATE_SELECT_FIX) {
888ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mEST.onTextContextMenuItem(id);
8894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleResetEdit();
8904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
8914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
8924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
893ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleCopy() {
8944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
895ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- handleCopy: " + mMode + "," + mState);
8964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
897ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleTextViewFunc(MODE_COPY, android.R.id.copy);
898ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
899ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
900ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleCut() {
901ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
902ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- handleCopy: " + mMode + "," + mState);
9034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
904ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleTextViewFunc(MODE_CUT, android.R.id.cut);
9054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
9064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
907ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handlePaste() {
9084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
909ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- handlePaste");
9104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
9124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
9134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
914ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.onTextContextMenuItem(android.R.id.paste);
9154df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
9164df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
917ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleSetSpan(int mode) {
9184df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
919ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- handleSetSpan:" + mEditFlag + ","
920ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        + mState + ',' + mMode);
9214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
923ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.e(LOG_TAG, "--- handleSetSpan: Editing is not started.");
9244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
9254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9264df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mMode == MODE_NOTHING || mMode == MODE_SELECT) {
927ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mMode = mode;
9284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                if (mState == STATE_SELECTED) {
9294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    mState = STATE_SELECT_FIX;
930ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    handleSetSpan(mode);
9314df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                } else {
9324df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    handleSelect();
9334df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                }
934ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            } else if (mMode != mode) {
9354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                handleCancel();
936ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mMode = mode;
937ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handleSetSpan(mode);
938ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } else {
939ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                if (mState == STATE_SELECT_FIX) {
940ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mEST.setHintMessage(HINT_MSG_NULL);
941ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    switch (mode) {
942ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case MODE_COLOR:
94305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        mEST.onShowForegroundColorAlert();
944ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
945ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case MODE_SIZE:
946ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        mEST.onShowSizeAlert();
947ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
948ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case MODE_ALIGN:
949ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        mEST.onShowAlignAlert();
950ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
951ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    default:
952ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        Log.e(LOG_TAG, "--- handleSetSpan: invalid mode.");
953ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
954ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    }
955ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                } else {
956ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    Log.d(LOG_TAG, "--- handleSetSpan: do nothing.");
957ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
9584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
9604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
961ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleSize() {
962ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleSetSpan(MODE_SIZE);
963ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
964ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
965ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleColor() {
966ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleSetSpan(MODE_COLOR);
967ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
968ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
969ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void handleAlign() {
970ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            handleSetSpan(MODE_ALIGN);
971ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
972ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
9734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void handleSelect() {
9744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
975ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- handleSelect:" + mEditFlag + "," + mState);
9764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
9784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
9794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
9804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mState == STATE_SELECT_OFF) {
9814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                if (isTextSelected()) {
982ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    Log.e(LOG_TAG, "Selection is off, but selected");
9834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                }
9844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                setSelectStartPos();
985ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                blockSoftKey();
9864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mEST.setHintMessage(HINT_MSG_SELECT_END);
9874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else if (mState == STATE_SELECT_ON) {
9884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                if (isTextSelected()) {
989ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    Log.e(LOG_TAG, "Selection now start, but selected");
9904df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                }
991ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                setSelectedEndPos();
9924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mEST.setHintMessage(HINT_MSG_PUSH_COMPETE);
9934df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                doNextHandle();
9944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else if (mState == STATE_SELECTED) {
9954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                if (!isTextSelected()) {
996ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    Log.e(LOG_TAG, "Selection is done, but not selected");
9974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                }
998ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                setSelectedEndPos();
9994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                doNextHandle();
10004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10014df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
10034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void handleSelectAll() {
10044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
10054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- handleSelectAll");
10064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (!mEditFlag) {
10084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                return;
10094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEST.selectAll();
1011ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mState = STATE_SELECTED;
10124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
10144df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void handleResetEdit() {
1015ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
1016ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "Reset Editor");
1017ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
10186eb7298019c2e59877939474e7d77e8334192a98Satoshi Kataoka            blockSoftKey();
10194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            handleCancel();
10204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEditFlag = true;
10214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEST.setHintMessage(HINT_MSG_SELECT_START);
10224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1024ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void setSelection() {
10254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
1026ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- onSelect:" + mCurStart + "," + mCurEnd);
10274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10284df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (mCurStart >= 0 && mCurStart <= mEST.getText().length()
10294df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    && mCurEnd >= 0 && mCurEnd <= mEST.getText().length()) {
1030ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                if (mCurStart < mCurEnd) {
1031ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    mEST.setSelection(mCurStart, mCurEnd);
1032ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                } else {
1033ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    mEST.setSelection(mCurEnd, mCurStart);
1034ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
10354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                mState = STATE_SELECTED;
10364df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else {
10374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.e(LOG_TAG,
10384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                        "Select is on, but cursor positions are illigal.:"
10394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                                + mEST.getText().length() + "," + mCurStart
10404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                                + "," + mCurEnd);
10414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10424df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10434df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1044ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void unsetSelect() {
10454df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
10464df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- offSelect");
10474df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10484df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            int currpos = mEST.getSelectionStart();
10494df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mEST.setSelection(currpos, currpos);
10504df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mState = STATE_SELECT_OFF;
10514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10524df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
10534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void setSelectStartPos() {
10544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
10554df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- setSelectStartPos");
10564df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10574df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mCurStart = mEST.getSelectionStart();
10584df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            mState = STATE_SELECT_ON;
10594df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10604df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1061ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void setSelectedEndPos() {
10624df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
1063ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- setSelectEndPos:");
10644df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1065ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (mEST.getSelectionStart() == mCurStart) {
1066ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                setSelectedEndPos(mEST.getSelectionEnd());
10674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            } else {
1068ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                setSelectedEndPos(mEST.getSelectionStart());
1069ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1070ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1071ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1072ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void setSelectedEndPos(int pos) {
1073ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1074ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- setSelectedEndPos:");
10754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1076ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mCurEnd = pos;
1077ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            setSelection();
10784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
10804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private boolean isTextSelected() {
10814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
10824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                Log.d(LOG_TAG, "--- isTextSelected:" + mCurStart + ","
10834df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                        + mCurEnd);
10844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
10854df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            return (mCurStart != mCurEnd)
10864df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                    && (mState == STATE_SELECTED ||
10874df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                            mState == STATE_SELECT_FIX);
10884df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
10894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1090ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void setStyledTextSpan(Object span, int start, int end) {
10914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
1092ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- setStyledTextSpan:" + mMode + ","
1093ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        + start + "," + end);
10944df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1095df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka            if (start < end) {
1096df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka                mEST.getText().setSpan(span, start, end,
1097df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
1098df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka            } else {
1099df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka                mEST.getText().setSpan(span, end, start,
1100df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
1101df6601ac91493a7368effbe198e0181627a2cd34Satoshi Kataoka            }
11024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
11034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
11044df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void changeSizeSelectedText(int size) {
11054df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
110605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- changeSize:" + size);
11074df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1108ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            setStyledTextSpan(new AbsoluteSizeSpan(size),
1109ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mCurStart, mCurEnd);
11104df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
11114df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
11124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        private void changeColorSelectedText(int color) {
11134df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            if (DBG) {
111405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- changeColor:" + color);
1115ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1116ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            setStyledTextSpan(new ForegroundColorSpan(color),
1117ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mCurStart, mCurEnd);
1118ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1119ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1120ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void changeAlign(Layout.Alignment align) {
1121ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1122ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- changeAlign:" + align);
1123ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1124ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            setStyledTextSpan(new AlignmentSpan.Standard(align),
1125ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    findLineStart(mEST.getText(), mCurStart),
1126ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    findLineEnd(mEST.getText(), mCurEnd));
1127ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1128ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1129ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private int findLineStart(Editable text, int current) {
1130ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1131ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- findLineStart: curr:" + current +
1132ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        ", length:" + text.length());
1133ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1134ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int pos = current;
1135ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            for (; pos > 0; pos--) {
11366eb7298019c2e59877939474e7d77e8334192a98Satoshi Kataoka                if (text.charAt(pos - 1) == '\n') {
1137ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    break;
1138ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
1139ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1140ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return pos;
1141ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1142ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
114305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void insertImageSpan(ImageSpan span) {
114405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
114505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- insertImageSpan");
114605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
114705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (span != null) {
114805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- insertimagespan:" + span.getDrawable().getIntrinsicHeight() + "," + span.getDrawable().getIntrinsicWidth());
114905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- insertimagespan:" + span.getDrawable().getClass());
115005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                int curpos = mEST.getSelectionStart();
115105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                mEST.getText().insert(curpos, "\uFFFC");
115205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                mEST.getText().setSpan(span, curpos, curpos + 1,
115305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
115405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                mEST.notifyStateChanged(mMode, mState);
115505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            } else {
115605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.e(LOG_TAG, "--- insertImageSpan: null span was inserted");
115705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
115805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
115905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
1160ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private int findLineEnd(Editable text, int current) {
1161ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1162ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- findLineEnd: curr:" + current +
1163ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        ", length:" + text.length());
1164ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1165ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int pos = current;
1166ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            for (; pos < text.length(); pos++) {
11676eb7298019c2e59877939474e7d77e8334192a98Satoshi Kataoka                if (pos > 0 && text.charAt(pos - 1) == '\n') {
1168ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    break;
1169ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
1170ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1171ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return pos;
1172ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1173ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1174ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void blockSoftKey() {
1175ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1176ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- blockSoftKey:");
11774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            }
1178ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            InputMethodManager imm = (InputMethodManager) mEST.getContext().
1179ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            getSystemService(Context.INPUT_METHOD_SERVICE);
1180ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            imm.hideSoftInputFromWindow(mEST.getWindowToken(), 0);
1181ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.setOnClickListener(
1182ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    new OnClickListener() {
1183ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        public void onClick(View v) {
1184ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                            Log.d(LOG_TAG, "--- ontrackballclick:");
1185ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                            onFixSelectedItem();
1186ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        }
1187ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            });
1188ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mSoftKeyBlockFlag = true;
1189ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1190ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1191ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void unblockSoftKey() {
1192ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1193ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- unblockSoftKey:");
1194ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1195ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mEST.setOnClickListener(null);
119605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mSoftKeyBlockFlag = false;
11974df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
11984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
11994df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
1200ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    private class StyledTextConverter {
1201ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        private EditStyledText mEST;
1202ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1203ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public StyledTextConverter(EditStyledText est) {
1204ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mEST = est;
1205ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1206ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
120705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public String getHtml() {
1208ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            String htmlBody = Html.toHtml(mEST.getText());
1209ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1210ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- getConvertedBody:" + htmlBody);
1211ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1212ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return htmlBody;
1213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
12146ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka
12156ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        public void getUriArray(ArrayList<Uri> uris, Editable text) {
12166ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            uris.clear();
12176ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            if (DBG) {
12186ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                Log.d(LOG_TAG, "--- getUriArray:");
12196ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            }
12206ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            int len = text.length();
12216ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            int next;
12226ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            for (int i = 0; i < text.length(); i = next) {
12236ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                next = text.nextSpanTransition(i, len, ImageSpan.class);
12246ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                ImageSpan[] images = text.getSpans(i, next, ImageSpan.class);
12256ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                for (int j = 0; j < images.length; j++) {
12266ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                    if (DBG) {
12276ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                        Log.d(LOG_TAG, "--- getUriArray: foundArray" +
12286ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                                ((ImageSpan) images[j]).getSource());
12296ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                    }
12306ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                    uris.add(Uri.parse(
12315c70839ae3b06a03c82032a77fc44405cf1de2deSatoshi Kataoka                            ((ImageSpan) images[j]).getSource()));
12326ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka                }
12336ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka            }
12346ef7af508903eddc76f7bb693b71a547df94cb6eSatoshi Kataoka        }
123505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
123605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public void SetHtml (String html) {
123705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            final Spanned spanned = Html.fromHtml(html, new Html.ImageGetter() {
123805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                public Drawable getDrawable(String src) {
123905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    Log.d(LOG_TAG, "--- sethtml: src="+src);
124005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    if (src.startsWith("content://")) {
124105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        Uri uri = Uri.parse(src);
124205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        try {
124305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            InputStream is = mEST.getContext().getContentResolver().openInputStream(uri);
124405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            Bitmap bitmap = BitmapFactory.decodeStream(is);
124511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                            Drawable drawable = new BitmapDrawable(
124611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                                    getContext().getResources(), bitmap);
124705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            drawable.setBounds(0, 0,
124805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                                    drawable.getIntrinsicWidth(),
124905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                                    drawable.getIntrinsicHeight());
125005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            is.close();
125105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            return drawable;
125205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        } catch (Exception e) {
125305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            Log.e(LOG_TAG, "--- set html: Failed to loaded content " + uri, e);
125405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            return null;
125505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        }
125605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    }
125705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    Log.d(LOG_TAG, "  unknown src="+src);
125805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    return null;
125905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                }
126005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }, null);
126105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mEST.setText(spanned);
126205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
1263ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
1264ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
126505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    private class StyledTextDialog {
1266ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        Builder mBuilder;
1267ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence mColorTitle;
1268ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence mSizeTitle;
1269ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        CharSequence mAlignTitle;
1270ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence[] mColorNames;
1271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence[] mColorInts;
1272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence[] mSizeNames;
1273ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence[] mSizeDisplayInts;
1274ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        CharSequence[] mSizeSendInts;
1275ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        CharSequence[] mAlignNames;
1276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        EditStyledText mEST;
1277ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
127805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public StyledTextDialog(EditStyledText est) {
1279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mEST = est;
1280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1281ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void setBuilder(Builder builder) {
1283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder = builder;
1284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void setColorAlertParams(CharSequence colortitle,
1287ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                CharSequence[] colornames, CharSequence[] colorints) {
1288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mColorTitle = colortitle;
1289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mColorNames = colornames;
1290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mColorInts = colorints;
1291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        public void setSizeAlertParams(CharSequence sizetitle,
1294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                CharSequence[] sizenames, CharSequence[] sizedisplayints,
1295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                CharSequence[] sizesendints) {
1296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mSizeTitle = sizetitle;
1297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mSizeNames = sizenames;
1298ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mSizeDisplayInts = sizedisplayints;
1299ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mSizeSendInts = sizesendints;
1300ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1301ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
1302ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public void setAlignAlertParams(CharSequence aligntitle,
1303ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                CharSequence[] alignnames) {
1304ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mAlignTitle = aligntitle;
1305ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mAlignNames = alignnames;
1306ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1307ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
130805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private boolean checkColorAlertParams() {
1309ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
1310ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- checkParams");
1311ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1312ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (mBuilder == null) {
1313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- builder is null.");
1314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return false;
1315ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } else if (mColorTitle == null || mColorNames == null
1316ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    || mColorInts == null) {
1317ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- color alert params are null.");
1318ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return false;
1319ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } else if (mColorNames.length != mColorInts.length) {
1320ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- the length of color alert params are "
1321ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        + "different.");
1322ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return false;
1323ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1324ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return true;
1325ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1326ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
132705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private boolean checkSizeAlertParams() {
1328ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
1329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.d(LOG_TAG, "--- checkParams");
1330ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1331ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (mBuilder == null) {
1332ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- builder is null.");
1333ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return false;
1334ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } else if (mSizeTitle == null || mSizeNames == null
1335ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    || mSizeDisplayInts == null || mSizeSendInts == null) {
1336ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- size alert params are null.");
1337ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return false;
1338ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            } else if (mSizeNames.length != mSizeDisplayInts.length
1339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    && mSizeSendInts.length != mSizeDisplayInts.length) {
1340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                Log.e(LOG_TAG, "--- the length of size alert params are "
1341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        + "different.");
1342ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return false;
1343ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1344ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return true;
1345ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1346ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
134705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private boolean checkAlignAlertParams() {
1348ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1349ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- checkAlignAlertParams");
1350ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1351ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (mBuilder == null) {
1352ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.e(LOG_TAG, "--- builder is null.");
1353ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return false;
1354ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            } else if (mAlignTitle == null) {
1355ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.e(LOG_TAG, "--- align alert params are null.");
1356ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return false;
1357ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1358ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            return true;
1359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1360ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
136105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void onShowForegroundColorAlertDialog() {
1362ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
136305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onShowForegroundColorAlertDialog");
1364ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1365ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (!checkColorAlertParams()) {
1366ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;
1367ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1368ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.setTitle(mColorTitle);
1369ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.setIcon(0);
1370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.
1371ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            setItems(mColorNames,
1372ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    new DialogInterface.OnClickListener() {
1373ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                public void onClick(DialogInterface dialog, int which) {
1374ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    Log.d("EETVM", "mBuilder.onclick:" + which);
1375ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    int color = Integer.parseInt(
1376ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                            (String) mColorInts[which], 16) - 0x01000000;
1377ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mEST.setItemColor(color);
1378ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
1379ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            });
1380ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.show();
1381ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1382ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project
138305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void onShowBackgroundColorAlertDialog() {
1384ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (DBG) {
138505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onShowBackgroundColorAlertDialog");
1386ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
1387ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            if (!checkColorAlertParams()) {
1388ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                return;
1389ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            }
139005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mBuilder.setTitle(mColorTitle);
139105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mBuilder.setIcon(0);
139205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mBuilder.
139305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            setItems(mColorNames,
139405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    new DialogInterface.OnClickListener() {
139505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                public void onClick(DialogInterface dialog, int which) {
139605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    Log.d("EETVM", "mBuilder.onclick:" + which);
139705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    int color = Integer.parseInt(
139805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            (String) mColorInts[which], 16) - 0x01000000;
139905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    mEST.setBackgroundColor(color);
140005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                }
140105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            });
140205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mBuilder.show();
140305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
140405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
140505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void onShowSizeAlertDialog() {
140605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
140705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onShowSizeAlertDialog");
140805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
140905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (!checkSizeAlertParams()) {
141005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                return;
141105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
1412ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.setTitle(mSizeTitle);
1413ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.setIcon(0);
1414ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.
1415ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            setItems(mSizeNames,
1416ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    new DialogInterface.OnClickListener() {
1417ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                public void onClick(DialogInterface dialog, int which) {
1418ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    Log.d(LOG_TAG, "mBuilder.onclick:" + which);
1419ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    int size = Integer
1420ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    .parseInt((String) mSizeDisplayInts[which]);
1421ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mEST.setItemSize(size);
1422ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                }
1423ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            });
1424ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            mBuilder.show();
1425ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        }
1426ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1427ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private void onShowAlignAlertDialog() {
1428ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
142905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- onShowAlignAlertDialog");
1430ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1431ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (!checkAlignAlertParams()) {
1432ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return;
1433ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1434ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mBuilder.setTitle(mAlignTitle);
1435ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mBuilder.setIcon(0);
1436ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mBuilder.
1437ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            setItems(mAlignNames,
1438ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    new DialogInterface.OnClickListener() {
1439ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                public void onClick(DialogInterface dialog, int which) {
1440ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    Log.d(LOG_TAG, "mBuilder.onclick:" + which);
1441ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    Layout.Alignment align = Layout.Alignment.ALIGN_NORMAL;
1442ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    switch (which) {
1443ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case 0:
1444ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        align = Layout.Alignment.ALIGN_NORMAL;
1445ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
1446ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case 1:
1447ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        align = Layout.Alignment.ALIGN_CENTER;
1448ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
1449ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    case 2:
1450ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        align = Layout.Alignment.ALIGN_OPPOSITE;
1451ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
1452ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    default:
1453ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                        break;
1454ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    }
1455ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    mEST.setAlignment(align);
1456ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
1457ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            });
1458ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mBuilder.show();
1459ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1460ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    }
1461ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1462ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka    private class StyledTextArrowKeyMethod extends ArrowKeyMovementMethod {
1463ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        EditorManager mManager;
1464ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        StyledTextArrowKeyMethod(EditorManager manager) {
1465ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            super();
1466ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager = manager;
1467ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1468ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1469ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        @Override
1470ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        public boolean onKeyDown(TextView widget, Spannable buffer,
1471ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                int keyCode, KeyEvent event) {
1472ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (!mManager.isSoftKeyBlocked()) {
1473ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return super.onKeyDown(widget, buffer, keyCode, event);
1474ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1475ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (executeDown(widget, buffer, keyCode)) {
1476ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return true;
1477ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1478ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return false;
1479ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1480ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1481ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private int getEndPos(TextView widget) {
1482ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int end;
1483ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (widget.getSelectionStart() == mManager.getSelectionStart()) {
1484ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                end = widget.getSelectionEnd();
1485ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            } else {
1486ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                end = widget.getSelectionStart();
1487ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1488ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return end;
1489ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1490ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1491ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean up(TextView widget, Spannable buffer) {
1492ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1493ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- up:");
1494ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1495ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            Layout layout = widget.getLayout();
1496ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int end = getEndPos(widget);
1497ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int line = layout.getLineForOffset(end);
1498ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (line > 0) {
1499ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                int to;
1500ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                if (layout.getParagraphDirection(line) ==
1501ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    layout.getParagraphDirection(line - 1)) {
1502ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    float h = layout.getPrimaryHorizontal(end);
1503ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    to = layout.getOffsetForHorizontal(line - 1, h);
1504ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                } else {
1505ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    to = layout.getLineStart(line - 1);
1506ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
1507ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mManager.setSelectedEndPos(to);
1508ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mManager.onCursorMoved();
1509ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return true;
1510ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1511ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return false;
1512ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1513ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1514ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean down(TextView widget, Spannable buffer) {
1515ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1516ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- down:");
1517ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1518ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            Layout layout = widget.getLayout();
1519ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int end = getEndPos(widget);
1520ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int line = layout.getLineForOffset(end);
1521ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (line < layout.getLineCount() - 1) {
1522ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                int to;
1523ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                if (layout.getParagraphDirection(line) ==
1524ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    layout.getParagraphDirection(line + 1)) {
1525ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    float h = layout.getPrimaryHorizontal(end);
1526ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    to = layout.getOffsetForHorizontal(line + 1, h);
1527ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                } else {
1528ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    to = layout.getLineStart(line + 1);
1529ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                }
1530ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mManager.setSelectedEndPos(to);
1531ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                mManager.onCursorMoved();
1532ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                return true;
1533ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1534ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return false;
1535ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1536ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1537ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean left(TextView widget, Spannable buffer) {
1538ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1539ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- left:");
1540ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1541ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            Layout layout = widget.getLayout();
1542ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int to = layout.getOffsetToLeftOf(getEndPos(widget));
1543ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager.setSelectedEndPos(to);
1544ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager.onCursorMoved();
1545ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return true;
1546ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1547ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1548ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean right(TextView widget, Spannable buffer) {
1549ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1550ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- right:");
1551ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1552ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            Layout layout = widget.getLayout();
1553ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            int to = layout.getOffsetToRightOf(getEndPos(widget));
1554ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager.setSelectedEndPos(to);
1555ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            mManager.onCursorMoved();
1556ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return true;
1557ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1558ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1559ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        private boolean executeDown(TextView widget, Spannable buffer,
1560ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                int keyCode) {
1561ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            if (DBG) {
1562ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                Log.d(LOG_TAG, "--- executeDown: " + keyCode);
1563ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1564ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            boolean handled = false;
1565ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka
1566ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            switch (keyCode) {
1567ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case KeyEvent.KEYCODE_DPAD_UP:
1568ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handled |= up(widget, buffer);
1569ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
1570ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case KeyEvent.KEYCODE_DPAD_DOWN:
1571ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handled |= down(widget, buffer);
1572ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
1573ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case KeyEvent.KEYCODE_DPAD_LEFT:
1574ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handled |= left(widget, buffer);
1575ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
1576ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            case KeyEvent.KEYCODE_DPAD_RIGHT:
1577ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                handled |= right(widget, buffer);
1578ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                break;
1579ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                case KeyEvent.KEYCODE_DPAD_CENTER:
1580ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    mManager.onFixSelectedItem();
1581ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    handled = true;
1582ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka                    break;
1583ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            }
1584ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka            return handled;
1585ce8f3a8eca07291bf0f8f187b0d677204a897111Satoshi Kataoka        }
1586ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project    }
158705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
158805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public class HorizontalLineSpan extends ImageSpan {
158905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public HorizontalLineSpan(int color, View view) {
159005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            super(new HorizontalLineDrawable(color, view));
159105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
159205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
159305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    public class HorizontalLineDrawable extends ShapeDrawable {
159405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private View mView;
159505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public HorizontalLineDrawable(int color, View view) {
159605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            super(new RectShape());
159705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            mView = view;
159805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            renewColor(color);
159905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            renewBounds(view);
160005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
160105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        @Override
160205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        public void draw(Canvas canvas) {
160305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
160405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- draw:");
160505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
160605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            renewColor();
160705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            renewBounds(mView);
160805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            super.draw(canvas);
160905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
161005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka
161105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void renewBounds(View view) {
161205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
161305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                int width = mView.getBackground().getBounds().width();
161405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                int height = mView.getBackground().getBounds().height();
161505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- renewBounds:" + width + "," + height);
161605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- renewBounds:" + mView.getClass());
161705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
161805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            int width = mView.getWidth();
161905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (width > 20) {
162005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                width -= 20;
162105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
162205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            setBounds(0, 0, width, 2);
162305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
162405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void renewColor(int color) {
162505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
162605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- renewColor:" + color);
162705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
162805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            getPaint().setColor(color);
162905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
163005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private void renewColor() {
163105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
163205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- renewColor:");
163305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
163405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (mView instanceof View) {
163505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                ImageSpan parent = getParentSpan();
163605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Editable text = ((EditStyledText)mView).getText();
163705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                int start = text.getSpanStart(parent);
163805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                ForegroundColorSpan[] spans = text.getSpans(start, start, ForegroundColorSpan.class);
163905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                if (spans.length > 0) {
164005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    renewColor(spans[spans.length - 1].getForegroundColor());
164105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                }
164205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
164305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
164405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        private ImageSpan getParentSpan() {
164505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (DBG) {
164605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Log.d(LOG_TAG, "--- getParentSpan:");
164705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
164805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            if (mView instanceof EditStyledText) {
164905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                Editable text = ((EditStyledText)mView).getText();
165005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                ImageSpan[] images = text.getSpans(0, text.length(), ImageSpan.class);
165105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                if (images.length > 0) {
165205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    for (ImageSpan image: images) {
165305a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        if (image.getDrawable() == this) {
165405a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                            return image;
165505a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                        }
165605a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                    }
165705a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka                }
165805a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            }
165905a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            Log.e(LOG_TAG, "---renewBounds: Couldn't find");
166005a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka            return null;
166105a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka        }
166205a3c6870cf718f0bdeea6f3b7c031299ecdd7faSatoshi Kataoka    }
16634df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project}
1664