Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 05a3c687 authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by The Android Open Source Project
Browse files

AI 143196: am: CL 142964 Add a function to clear styles in EditStyledText.

  Add a function to change getBackground color.
  Add a function to check whether EditStyledText has styled text or not.
  Refactor function and variable names for readability.
  Original author: satok
  Merged from: //branches/cupcake/...

Automated import of CL 143196
parent 209d4152
Loading
Loading
Loading
Loading
+346 −45
Original line number Original line Diff line number Diff line
@@ -16,22 +16,34 @@


package com.android.internal.widget;
package com.android.internal.widget;


import java.io.InputStream;
import java.util.ArrayList;
import java.util.ArrayList;


import android.app.AlertDialog.Builder;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RectShape;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.text.Editable;
import android.text.Editable;
import android.text.Html;
import android.text.Html;
import android.text.Layout;
import android.text.Layout;
import android.text.Spannable;
import android.text.Spannable;
import android.text.Spanned;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.ArrowKeyMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AlignmentSpan;
import android.text.style.AlignmentSpan;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.ImageSpan;
import android.text.style.ParagraphStyle;
import android.text.style.QuoteSpan;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Log;
import android.view.KeyEvent;
import android.view.KeyEvent;
@@ -49,7 +61,7 @@ import android.widget.TextView;
public class EditStyledText extends EditText {
public class EditStyledText extends EditText {


    private static final String LOG_TAG = "EditStyledText";
    private static final String LOG_TAG = "EditStyledText";
    private static final boolean DBG = true;
    private static final boolean DBG = false;


    /**
    /**
     * The modes of editing actions.
     * The modes of editing actions.
@@ -92,6 +104,12 @@ public class EditStyledText extends EditText {
    public static final int HINT_MSG_SELECT_END = 3;
    public static final int HINT_MSG_SELECT_END = 3;
    public static final int HINT_MSG_PUSH_COMPETE = 4;
    public static final int HINT_MSG_PUSH_COMPETE = 4;


    
    /**
     * The help message strings.
     */
    public static final int DEFAULT_BACKGROUND_COLOR = 0x00FFFFFF;

    /**
    /**
     * EditStyledTextInterface provides functions for notifying messages to
     * EditStyledTextInterface provides functions for notifying messages to
     * calling class.
     * calling class.
@@ -109,7 +127,9 @@ public class EditStyledText extends EditText {
     */
     */
    private EditorManager mManager;
    private EditorManager mManager;
    private StyledTextConverter mConverter;
    private StyledTextConverter mConverter;
    private StyledTextToast mToast;
    private StyledTextDialog mDialog;
    private Drawable mDefaultBackground;
    private int mBackgroundColor;


    /**
    /**
     * EditStyledText extends EditText for managing flow of each editing
     * EditStyledText extends EditText for managing flow of each editing
@@ -144,7 +164,7 @@ public class EditStyledText extends EditText {
     *            Builder for opening Alert Dialog.
     *            Builder for opening Alert Dialog.
     */
     */
    public void setBuilder(Builder builder) {
    public void setBuilder(Builder builder) {
        mToast.setBuilder(builder);
        mDialog.setBuilder(builder);
    }
    }


    /**
    /**
@@ -159,7 +179,7 @@ public class EditStyledText extends EditText {
     */
     */
    public void setColorAlertParams(CharSequence colortitle,
    public void setColorAlertParams(CharSequence colortitle,
            CharSequence[] colornames, CharSequence[] colorints) {
            CharSequence[] colornames, CharSequence[] colorints) {
        mToast.setColorAlertParams(colortitle, colornames, colorints);
        mDialog.setColorAlertParams(colortitle, colornames, colorints);
    }
    }


    /**
    /**
@@ -177,13 +197,13 @@ public class EditStyledText extends EditText {
    public void setSizeAlertParams(CharSequence sizetitle,
    public void setSizeAlertParams(CharSequence sizetitle,
            CharSequence[] sizenames, CharSequence[] sizedisplayints,
            CharSequence[] sizenames, CharSequence[] sizedisplayints,
            CharSequence[] sizesendints) {
            CharSequence[] sizesendints) {
        mToast.setSizeAlertParams(sizetitle, sizenames, sizedisplayints,
        mDialog.setSizeAlertParams(sizetitle, sizenames, sizedisplayints,
                sizesendints);
                sizesendints);
    }
    }


    public void setAlignAlertParams(CharSequence aligntitle,
    public void setAlignAlertParams(CharSequence aligntitle,
            CharSequence[] alignnames) {
            CharSequence[] alignnames) {
        mToast.setAlignAlertParams(aligntitle, alignnames);
        mDialog.setAlignAlertParams(aligntitle, alignnames);
    }
    }


    @Override
    @Override
@@ -252,6 +272,13 @@ public class EditStyledText extends EditText {
        mManager.onStartColor();
        mManager.onStartColor();
    }
    }


    /**
     * Start changing "BackgroundColor" action.
     */
    public void onStartBackgroundColor() {
        mManager.onStartBackgroundColor();
    }

    /**
    /**
     * Start changing "Alignment" action.
     * Start changing "Alignment" action.
     */
     */
@@ -300,6 +327,13 @@ public class EditStyledText extends EditText {
        mManager.onInsertImage(resId);
        mManager.onInsertImage(resId);
    }
    }


    public void onInsertHorizontalLine() {
        mManager.onInsertHorizontalLine();
    }

    public void onClearStyles() {
        mManager.onClearStyles();
    }
    /**
    /**
     * Set Size of the Item.
     * Set Size of the Item.
     * 
     * 
@@ -320,10 +354,37 @@ public class EditStyledText extends EditText {
        mManager.setItemColor(color);
        mManager.setItemColor(color);
    }
    }


    /**
     * Set Alignment of the Item.
     * 
     * @param color
     *            The color of the Item.
     */
    public void setAlignment(Layout.Alignment align) {
    public void setAlignment(Layout.Alignment align) {
        mManager.setAlignment(align);
        mManager.setAlignment(align);
    }
    }


    /**
     * Set Background color of View.
     * 
     * @param color
     *            The background color of view.
     */
    @Override
    public void setBackgroundColor(int color) {
        super.setBackgroundColor(color);
        mBackgroundColor = color;
    }

    /**
     * Set html to EditStyledText.
     * 
     * @param html
     *            The html to be set.
     */
    public void setHtml(String html) {
        mConverter.SetHtml(html);
    }
    /**
    /**
     * Check whether editing is started or not.
     * Check whether editing is started or not.
     * 
     * 
@@ -333,6 +394,14 @@ public class EditStyledText extends EditText {
        return mManager.isEditting();
        return mManager.isEditting();
    }
    }


    /**
     * Check whether styled text or not.
     * 
     * @return Whether styled text or not.
     */
    public boolean isStyledText() {
        return mManager.isStyledText();
    }
    /**
    /**
     * Check whether SoftKey is Blocked or not.
     * Check whether SoftKey is Blocked or not.
     * 
     * 
@@ -362,10 +431,14 @@ public class EditStyledText extends EditText {


    @Override
    @Override
    public Bundle getInputExtras(boolean create) {
    public Bundle getInputExtras(boolean create) {
        if (DBG) {
            Log.d(LOG_TAG, "---getInputExtras");
        }
        Bundle bundle = super.getInputExtras(create);
        Bundle bundle = super.getInputExtras(create);
        if (bundle != null) {
        if (bundle != null) {
            bundle.putBoolean("allowEmoji", true);
            bundle = new Bundle();
        }
        }
        bundle.putBoolean("allowEmoji", true);
        return bundle;
        return bundle;
    }
    }


@@ -375,7 +448,7 @@ public class EditStyledText extends EditText {
     * @return The state of the selection.
     * @return The state of the selection.
     */
     */
    public String getHtml() {
    public String getHtml() {
        return mConverter.getConvertedBody();
        return mConverter.getHtml();
    }
    }


    /**
    /**
@@ -386,8 +459,40 @@ public class EditStyledText extends EditText {
     * @return The state of the selection.
     * @return The state of the selection.
     */
     */
    public String getHtml(ArrayList<Uri> uris) {
    public String getHtml(ArrayList<Uri> uris) {
        mConverter.getUriArray(uris, this.getText());
        mConverter.getUriArray(uris, getText());
        return mConverter.getConvertedBody();
        return mConverter.getHtml();
    }

    /**
     * Get Background color of View.
     * 
     * @return The background color of View.
     */
    public int getBackgroundColor() {
        return mBackgroundColor;
    }

    /**
     * Get Foreground color of View.
     * 
     * @return The background color of View.
     */
    public int getForeGroundColor(int pos) {
        if (DBG) {
            Log.d(LOG_TAG, "---getForeGroundColor: " + pos);
        }
        if (pos < 0 || pos > getText().length()) {
            Log.e(LOG_TAG, "---getForeGroundColor: Illigal position.");
            return DEFAULT_BACKGROUND_COLOR;
        } else {
            ForegroundColorSpan[] spans =
                getText().getSpans(pos, pos, ForegroundColorSpan.class);
            if (spans.length > 0) {
                return spans[0].getForegroundColor();
            } else {
                return DEFAULT_BACKGROUND_COLOR;
            }
        }
    }
    }


    /**
    /**
@@ -396,33 +501,44 @@ public class EditStyledText extends EditText {
    private void init() {
    private void init() {
        if (DBG) {
        if (DBG) {
            Log.d(LOG_TAG, "--- init");
            Log.d(LOG_TAG, "--- init");
            requestFocus();
        }
        }
        requestFocus();
        mDefaultBackground = getBackground();
        mBackgroundColor = DEFAULT_BACKGROUND_COLOR;
        mManager = new EditorManager(this);
        mManager = new EditorManager(this);
        mConverter = new StyledTextConverter(this);
        mConverter = new StyledTextConverter(this);
        mToast = new StyledTextToast(this);
        mDialog = new StyledTextDialog(this);
        setMovementMethod(new StyledTextArrowKeyMethod(mManager));
        setMovementMethod(new StyledTextArrowKeyMethod(mManager));
        mManager.blockSoftKey();
        mManager.unblockSoftKey();
    }
    }


    /**
    /**
     * Show Color Selecting Dialog.
     * Show Foreground Color Selecting Dialog.
     */
     */
    private void onShowColorAlert() {
    private void onShowForegroundColorAlert() {
        mToast.onShowColorAlertDialog();
        mDialog.onShowForegroundColorAlertDialog();
    }

    /**
     * Show Background Color Selecting Dialog.
     */
    private void onShowBackgroundColorAlert() {
        mDialog.onShowBackgroundColorAlertDialog();
    }
    }


    /**
    /**
     * Show Size Selecting Dialog.
     * Show Size Selecting Dialog.
     */
     */
    private void onShowSizeAlert() {
    private void onShowSizeAlert() {
        mToast.onShowSizeAlertDialog();
        mDialog.onShowSizeAlertDialog();
    }
    }


    /**
    /**
     * Show Alignment Selecting Dialog.
     * Show Alignment Selecting Dialog.
     */
     */
    private void onShowAlignAlert() {
    private void onShowAlignAlert() {
        mToast.onShowAlignAlertDialog();
        mDialog.onShowAlignAlertDialog();
    }
    }


    /**
    /**
@@ -471,7 +587,7 @@ public class EditStyledText extends EditText {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onStartEdit");
                Log.d(LOG_TAG, "--- onStartEdit");
            }
            }
            Log.d(LOG_TAG, "--- onstartedit:" + this.getSelectionStart() + this.getSelectionEnd());
            Log.d(LOG_TAG, "--- onstartedit:");
            handleResetEdit();
            handleResetEdit();
            mEST.notifyStateChanged(mMode, mState);
            mEST.notifyStateChanged(mMode, mState);
        }
        }
@@ -532,6 +648,14 @@ public class EditStyledText extends EditText {
            mEST.notifyStateChanged(mMode, mState);
            mEST.notifyStateChanged(mMode, mState);
        }
        }


        public void onStartBackgroundColor() {
            if (DBG) {
                Log.d(LOG_TAG, "--- onClickColor");
            }
            mEST.onShowBackgroundColorAlert();
            mEST.notifyStateChanged(mMode, mState);
        }

        public void onStartSelect() {
        public void onStartSelect() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onClickSelect");
                Log.d(LOG_TAG, "--- onClickSelect");
@@ -577,12 +701,7 @@ public class EditStyledText extends EditText {
                Log.d(LOG_TAG, "--- onInsertImage by URI: " + uri.getPath()
                Log.d(LOG_TAG, "--- onInsertImage by URI: " + uri.getPath()
                        + "," + uri.toString());
                        + "," + uri.toString());
            }
            }
            int curpos = mEST.getSelectionStart();
            insertImageSpan(new ImageSpan(mEST.getContext(), uri));
            mEST.getText().insert(curpos, "a");
            ImageSpan is = new ImageSpan(mEST.getContext(), uri);
            mEST.getText().setSpan(is,
                    curpos, curpos + 1,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            mEST.notifyStateChanged(mMode, mState);
            mEST.notifyStateChanged(mMode, mState);
        }
        }


@@ -590,14 +709,41 @@ public class EditStyledText extends EditText {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onInsertImage by resID");
                Log.d(LOG_TAG, "--- onInsertImage by resID");
            }
            }
            int curpos = mEST.getSelectionStart();
            insertImageSpan(new ImageSpan(mEST.getContext(), resID));
            mEST.getText().insert(curpos, "a");
            mEST.getText().setSpan(new ImageSpan(mEST.getContext(), resID),
                    curpos, curpos + 1,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            mEST.notifyStateChanged(mMode, mState);
            mEST.notifyStateChanged(mMode, mState);
        }
        }


        public void onInsertHorizontalLine() {
            if (DBG) {
                Log.d(LOG_TAG, "--- onInsertHorizontalLine:");
            }
            insertImageSpan(new HorizontalLineSpan(0xFF000000, mEST));
            mEST.notifyStateChanged(mMode, mState);
        }

        public void onClearStyles() {
            if (DBG) {
                Log.d(LOG_TAG, "--- onClearStyles");
            }
            Editable txt = mEST.getText();
            int len = txt.length();
            Object[] styles = txt.getSpans(0, len, Object.class);
            for (Object style : styles) {
                if (style instanceof ParagraphStyle ||
                        style instanceof QuoteSpan ||
                        style instanceof CharacterStyle) {
                    if (style instanceof ImageSpan) {
                        int start = txt.getSpanStart(style);
                        int end = txt.getSpanEnd(style);
                        txt.replace(start, end, "");
                    }
                    txt.removeSpan(style);
                }
            }
            mEST.setBackgroundDrawable(mEST.mDefaultBackground);
            mEST.mBackgroundColor = DEFAULT_BACKGROUND_COLOR;
        }

        public void setItemSize(int size) {
        public void setItemSize(int size) {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onClickSizeItem");
                Log.d(LOG_TAG, "--- onClickSizeItem");
@@ -632,8 +778,21 @@ public class EditStyledText extends EditText {
            return mEditFlag;
            return mEditFlag;
        }
        }


        /* If the style of the span is added, add check case for that style */
        public boolean isStyledText() {
            Editable txt = mEST.getText();
            int len = txt.length();
            if (txt.getSpans(0, len -1, ParagraphStyle.class).length > 0 ||
                    txt.getSpans(0, len -1, QuoteSpan.class).length > 0 ||
                    txt.getSpans(0, len -1, CharacterStyle.class).length > 0 ||
                    mEST.mBackgroundColor != DEFAULT_BACKGROUND_COLOR) {
                return true;
            }
            return false;
        }

        public boolean isSoftKeyBlocked() {
        public boolean isSoftKeyBlocked() {
            return this.mSoftKeyBlockFlag;
            return mSoftKeyBlockFlag;
        }
        }


        public int getEditMode() {
        public int getEditMode() {
@@ -781,7 +940,7 @@ public class EditStyledText extends EditText {
                    mEST.setHintMessage(HINT_MSG_NULL);
                    mEST.setHintMessage(HINT_MSG_NULL);
                    switch (mode) {
                    switch (mode) {
                    case MODE_COLOR:
                    case MODE_COLOR:
                        mEST.onShowColorAlert();
                        mEST.onShowForegroundColorAlert();
                        break;
                        break;
                    case MODE_SIZE:
                    case MODE_SIZE:
                        mEST.onShowSizeAlert();
                        mEST.onShowSizeAlert();
@@ -944,7 +1103,7 @@ public class EditStyledText extends EditText {


        private void changeSizeSelectedText(int size) {
        private void changeSizeSelectedText(int size) {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- changeAlign:" + size);
                Log.d(LOG_TAG, "--- changeSize:" + size);
            }
            }
            setStyledTextSpan(new AbsoluteSizeSpan(size),
            setStyledTextSpan(new AbsoluteSizeSpan(size),
                mCurStart, mCurEnd);
                mCurStart, mCurEnd);
@@ -952,7 +1111,7 @@ public class EditStyledText extends EditText {


        private void changeColorSelectedText(int color) {
        private void changeColorSelectedText(int color) {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- changeAlign:" + color);
                Log.d(LOG_TAG, "--- changeColor:" + color);
            }
            }
            setStyledTextSpan(new ForegroundColorSpan(color),
            setStyledTextSpan(new ForegroundColorSpan(color),
                mCurStart, mCurEnd);
                mCurStart, mCurEnd);
@@ -981,6 +1140,23 @@ public class EditStyledText extends EditText {
            return pos;
            return pos;
        }
        }


        private void insertImageSpan(ImageSpan span) {
            if (DBG) {
                Log.d(LOG_TAG, "--- insertImageSpan");
            }
            if (span != null) {
                Log.d(LOG_TAG, "--- insertimagespan:" + span.getDrawable().getIntrinsicHeight() + "," + span.getDrawable().getIntrinsicWidth());
                Log.d(LOG_TAG, "--- insertimagespan:" + span.getDrawable().getClass());
                int curpos = mEST.getSelectionStart();
                mEST.getText().insert(curpos, "\uFFFC");
                mEST.getText().setSpan(span, curpos, curpos + 1,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                mEST.notifyStateChanged(mMode, mState);
            } else {
                Log.e(LOG_TAG, "--- insertImageSpan: null span was inserted");
            }
        }

        private int findLineEnd(Editable text, int current) {
        private int findLineEnd(Editable text, int current) {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- findLineEnd: curr:" + current +
                Log.d(LOG_TAG, "--- findLineEnd: curr:" + current +
@@ -1017,7 +1193,7 @@ public class EditStyledText extends EditText {
                Log.d(LOG_TAG, "--- unblockSoftKey:");
                Log.d(LOG_TAG, "--- unblockSoftKey:");
            }
            }
            mEST.setOnClickListener(null);
            mEST.setOnClickListener(null);
            this.mSoftKeyBlockFlag = false;
            mSoftKeyBlockFlag = false;
        }
        }
    }
    }


@@ -1028,7 +1204,7 @@ public class EditStyledText extends EditText {
            mEST = est;
            mEST = est;
        }
        }


        public String getConvertedBody() {
        public String getHtml() {
            String htmlBody = Html.toHtml(mEST.getText());
            String htmlBody = Html.toHtml(mEST.getText());
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- getConvertedBody:" + htmlBody);
                Log.d(LOG_TAG, "--- getConvertedBody:" + htmlBody);
@@ -1056,9 +1232,36 @@ public class EditStyledText extends EditText {
                }
                }
            }
            }
        }
        }

        public void SetHtml (String html) {
            final Spanned spanned = Html.fromHtml(html, new Html.ImageGetter() {
                public Drawable getDrawable(String src) {
                    Log.d(LOG_TAG, "--- sethtml: src="+src);
                    if (src.startsWith("content://")) {
                        Uri uri = Uri.parse(src);
                        try {
                            InputStream is = mEST.getContext().getContentResolver().openInputStream(uri);
                            Bitmap bitmap = BitmapFactory.decodeStream(is);
                            Drawable drawable = new BitmapDrawable(bitmap);
                            drawable.setBounds(0, 0,
                                    drawable.getIntrinsicWidth(),
                                    drawable.getIntrinsicHeight());
                            is.close();
                            return drawable;
                        } catch (Exception e) {
                            Log.e(LOG_TAG, "--- set html: Failed to loaded content " + uri, e);
                            return null;
                        }
                    }
                    Log.d(LOG_TAG, "  unknown src="+src);
                    return null;
                }
            }, null);
            mEST.setText(spanned);
        }
    }
    }


    private class StyledTextToast {
    private class StyledTextDialog {
        Builder mBuilder;
        Builder mBuilder;
        CharSequence mColorTitle;
        CharSequence mColorTitle;
        CharSequence mSizeTitle;
        CharSequence mSizeTitle;
@@ -1071,7 +1274,7 @@ public class EditStyledText extends EditText {
        CharSequence[] mAlignNames;
        CharSequence[] mAlignNames;
        EditStyledText mEST;
        EditStyledText mEST;


        public StyledTextToast(EditStyledText est) {
        public StyledTextDialog(EditStyledText est) {
            mEST = est;
            mEST = est;
        }
        }


@@ -1101,7 +1304,7 @@ public class EditStyledText extends EditText {
            mAlignNames = alignnames;
            mAlignNames = alignnames;
        }
        }


        public boolean checkColorAlertParams() {
        private boolean checkColorAlertParams() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- checkParams");
                Log.d(LOG_TAG, "--- checkParams");
            }
            }
@@ -1120,7 +1323,7 @@ public class EditStyledText extends EditText {
            return true;
            return true;
        }
        }


        public boolean checkSizeAlertParams() {
        private boolean checkSizeAlertParams() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- checkParams");
                Log.d(LOG_TAG, "--- checkParams");
            }
            }
@@ -1140,7 +1343,7 @@ public class EditStyledText extends EditText {
            return true;
            return true;
        }
        }


        public boolean checkAlignAlertParams() {
        private boolean checkAlignAlertParams() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- checkAlignAlertParams");
                Log.d(LOG_TAG, "--- checkAlignAlertParams");
            }
            }
@@ -1154,9 +1357,9 @@ public class EditStyledText extends EditText {
            return true;
            return true;
        }
        }


        private void onShowColorAlertDialog() {
        private void onShowForegroundColorAlertDialog() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onShowAlertDialog");
                Log.d(LOG_TAG, "--- onShowForegroundColorAlertDialog");
            }
            }
            if (!checkColorAlertParams()) {
            if (!checkColorAlertParams()) {
                return;
                return;
@@ -1176,13 +1379,35 @@ public class EditStyledText extends EditText {
            mBuilder.show();
            mBuilder.show();
        }
        }


        private void onShowSizeAlertDialog() {
        private void onShowBackgroundColorAlertDialog() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onShowAlertDialog");
                Log.d(LOG_TAG, "--- onShowBackgroundColorAlertDialog");
            }
            }
            if (!checkColorAlertParams()) {
            if (!checkColorAlertParams()) {
                return;
                return;
            }
            }
            mBuilder.setTitle(mColorTitle);
            mBuilder.setIcon(0);
            mBuilder.
            setItems(mColorNames,
                    new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Log.d("EETVM", "mBuilder.onclick:" + which);
                    int color = Integer.parseInt(
                            (String) mColorInts[which], 16) - 0x01000000;
                    mEST.setBackgroundColor(color);
                }
            });
            mBuilder.show();
        }

        private void onShowSizeAlertDialog() {
            if (DBG) {
                Log.d(LOG_TAG, "--- onShowSizeAlertDialog");
            }
            if (!checkSizeAlertParams()) {
                return;
            }
            mBuilder.setTitle(mSizeTitle);
            mBuilder.setTitle(mSizeTitle);
            mBuilder.setIcon(0);
            mBuilder.setIcon(0);
            mBuilder.
            mBuilder.
@@ -1200,7 +1425,7 @@ public class EditStyledText extends EditText {


        private void onShowAlignAlertDialog() {
        private void onShowAlignAlertDialog() {
            if (DBG) {
            if (DBG) {
                Log.d(LOG_TAG, "--- onShowAlertDialog");
                Log.d(LOG_TAG, "--- onShowAlignAlertDialog");
            }
            }
            if (!checkAlignAlertParams()) {
            if (!checkAlignAlertParams()) {
                return;
                return;
@@ -1358,4 +1583,80 @@ public class EditStyledText extends EditText {
            return handled;
            return handled;
        }
        }
    }
    }

    public class HorizontalLineSpan extends ImageSpan {
        public HorizontalLineSpan(int color, View view) {
            super(new HorizontalLineDrawable(color, view));
        }
    }
    public class HorizontalLineDrawable extends ShapeDrawable {
        private View mView;
        public HorizontalLineDrawable(int color, View view) {
            super(new RectShape());
            mView = view;
            renewColor(color);
            renewBounds(view);
        }
        @Override
        public void draw(Canvas canvas) {
            if (DBG) {
                Log.d(LOG_TAG, "--- draw:");
            }
            renewColor();
            renewBounds(mView);
            super.draw(canvas);
        }

        private void renewBounds(View view) {
            if (DBG) {
                int width = mView.getBackground().getBounds().width();
                int height = mView.getBackground().getBounds().height();
                Log.d(LOG_TAG, "--- renewBounds:" + width + "," + height);
                Log.d(LOG_TAG, "--- renewBounds:" + mView.getClass());
            }
            int width = mView.getWidth();
            if (width > 20) {
                width -= 20;
            }
            setBounds(0, 0, width, 2);
        }
        private void renewColor(int color) {
            if (DBG) {
                Log.d(LOG_TAG, "--- renewColor:" + color);
            }
            getPaint().setColor(color);
        }
        private void renewColor() {
            if (DBG) {
                Log.d(LOG_TAG, "--- renewColor:");
            }
            if (mView instanceof View) {
                ImageSpan parent = getParentSpan();
                Editable text = ((EditStyledText)mView).getText();
                int start = text.getSpanStart(parent);
                ForegroundColorSpan[] spans = text.getSpans(start, start, ForegroundColorSpan.class);
                if (spans.length > 0) {
                    renewColor(spans[spans.length - 1].getForegroundColor());
                }
            }
        }
        private ImageSpan getParentSpan() {
            if (DBG) {
                Log.d(LOG_TAG, "--- getParentSpan:");
            }
            if (mView instanceof EditStyledText) {
                Editable text = ((EditStyledText)mView).getText();
                ImageSpan[] images = text.getSpans(0, text.length(), ImageSpan.class);
                if (images.length > 0) {
                    for (ImageSpan image: images) {
                        if (image.getDrawable() == this) {
                            return image;
                        }
                    }
                }
            }
            Log.e(LOG_TAG, "---renewBounds: Couldn't find");
            return null;
        }
    }
}
}