AI 143347: am: CL 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/...
  Original author: android-build
  Merged from: //branches/donutburger/...

Automated import of CL 143347
This commit is contained in:
Satoshi Kataoka
2009-03-27 18:59:37 -07:00
committed by The Android Open Source Project
parent 7977a61308
commit 0b4d64807e

View File

@@ -16,22 +16,34 @@
package com.android.internal.widget;
import java.io.InputStream;
import java.util.ArrayList;
import android.app.AlertDialog.Builder;
import android.content.Context;
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.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.Layout;
import android.text.Spannable;
import android.text.Spanned;
import android.text.method.ArrowKeyMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AlignmentSpan;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.ParagraphStyle;
import android.text.style.QuoteSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
@@ -49,7 +61,7 @@ import android.widget.TextView;
public class EditStyledText extends EditText {
private static final String LOG_TAG = "EditStyledText";
private static final boolean DBG = true;
private static final boolean DBG = false;
/**
* 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_PUSH_COMPETE = 4;
/**
* The help message strings.
*/
public static final int DEFAULT_BACKGROUND_COLOR = 0x00FFFFFF;
/**
* EditStyledTextInterface provides functions for notifying messages to
* calling class.
@@ -109,7 +127,9 @@ public class EditStyledText extends EditText {
*/
private EditorManager mManager;
private StyledTextConverter mConverter;
private StyledTextToast mToast;
private StyledTextDialog mDialog;
private Drawable mDefaultBackground;
private int mBackgroundColor;
/**
* EditStyledText extends EditText for managing flow of each editing
@@ -144,7 +164,7 @@ public class EditStyledText extends EditText {
* Builder for opening Alert Dialog.
*/
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,
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,
CharSequence[] sizenames, CharSequence[] sizedisplayints,
CharSequence[] sizesendints) {
mToast.setSizeAlertParams(sizetitle, sizenames, sizedisplayints,
mDialog.setSizeAlertParams(sizetitle, sizenames, sizedisplayints,
sizesendints);
}
public void setAlignAlertParams(CharSequence aligntitle,
CharSequence[] alignnames) {
mToast.setAlignAlertParams(aligntitle, alignnames);
mDialog.setAlignAlertParams(aligntitle, alignnames);
}
@Override
@@ -252,6 +272,13 @@ public class EditStyledText extends EditText {
mManager.onStartColor();
}
/**
* Start changing "BackgroundColor" action.
*/
public void onStartBackgroundColor() {
mManager.onStartBackgroundColor();
}
/**
* Start changing "Alignment" action.
*/
@@ -300,6 +327,13 @@ public class EditStyledText extends EditText {
mManager.onInsertImage(resId);
}
public void onInsertHorizontalLine() {
mManager.onInsertHorizontalLine();
}
public void onClearStyles() {
mManager.onClearStyles();
}
/**
* Set Size of the Item.
*
@@ -320,10 +354,37 @@ public class EditStyledText extends EditText {
mManager.setItemColor(color);
}
/**
* Set Alignment of the Item.
*
* @param color
* The color of the Item.
*/
public void setAlignment(Layout.Alignment 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.
*
@@ -333,6 +394,14 @@ public class EditStyledText extends EditText {
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.
*
@@ -362,10 +431,14 @@ public class EditStyledText extends EditText {
@Override
public Bundle getInputExtras(boolean create) {
if (DBG) {
Log.d(LOG_TAG, "---getInputExtras");
}
Bundle bundle = super.getInputExtras(create);
if (bundle != null) {
bundle.putBoolean("allowEmoji", true);
bundle = new Bundle();
}
bundle.putBoolean("allowEmoji", true);
return bundle;
}
@@ -375,7 +448,7 @@ public class EditStyledText extends EditText {
* @return The state of the selection.
*/
public String getHtml() {
return mConverter.getConvertedBody();
return mConverter.getHtml();
}
/**
@@ -386,8 +459,40 @@ public class EditStyledText extends EditText {
* @return The state of the selection.
*/
public String getHtml(ArrayList<Uri> uris) {
mConverter.getUriArray(uris, this.getText());
return mConverter.getConvertedBody();
mConverter.getUriArray(uris, getText());
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() {
if (DBG) {
Log.d(LOG_TAG, "--- init");
requestFocus();
}
requestFocus();
mDefaultBackground = getBackground();
mBackgroundColor = DEFAULT_BACKGROUND_COLOR;
mManager = new EditorManager(this);
mConverter = new StyledTextConverter(this);
mToast = new StyledTextToast(this);
mDialog = new StyledTextDialog(this);
setMovementMethod(new StyledTextArrowKeyMethod(mManager));
mManager.blockSoftKey();
mManager.unblockSoftKey();
}
/**
* Show Color Selecting Dialog.
* Show Foreground Color Selecting Dialog.
*/
private void onShowColorAlert() {
mToast.onShowColorAlertDialog();
private void onShowForegroundColorAlert() {
mDialog.onShowForegroundColorAlertDialog();
}
/**
* Show Background Color Selecting Dialog.
*/
private void onShowBackgroundColorAlert() {
mDialog.onShowBackgroundColorAlertDialog();
}
/**
* Show Size Selecting Dialog.
*/
private void onShowSizeAlert() {
mToast.onShowSizeAlertDialog();
mDialog.onShowSizeAlertDialog();
}
/**
* Show Alignment Selecting Dialog.
*/
private void onShowAlignAlert() {
mToast.onShowAlignAlertDialog();
mDialog.onShowAlignAlertDialog();
}
/**
@@ -471,7 +587,7 @@ public class EditStyledText extends EditText {
if (DBG) {
Log.d(LOG_TAG, "--- onStartEdit");
}
Log.d(LOG_TAG, "--- onstartedit:" + this.getSelectionStart() + this.getSelectionEnd());
Log.d(LOG_TAG, "--- onstartedit:");
handleResetEdit();
mEST.notifyStateChanged(mMode, mState);
}
@@ -532,6 +648,14 @@ public class EditStyledText extends EditText {
mEST.notifyStateChanged(mMode, mState);
}
public void onStartBackgroundColor() {
if (DBG) {
Log.d(LOG_TAG, "--- onClickColor");
}
mEST.onShowBackgroundColorAlert();
mEST.notifyStateChanged(mMode, mState);
}
public void onStartSelect() {
if (DBG) {
Log.d(LOG_TAG, "--- onClickSelect");
@@ -577,12 +701,7 @@ public class EditStyledText extends EditText {
Log.d(LOG_TAG, "--- onInsertImage by URI: " + uri.getPath()
+ "," + uri.toString());
}
int curpos = mEST.getSelectionStart();
mEST.getText().insert(curpos, "a");
ImageSpan is = new ImageSpan(mEST.getContext(), uri);
mEST.getText().setSpan(is,
curpos, curpos + 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
insertImageSpan(new ImageSpan(mEST.getContext(), uri));
mEST.notifyStateChanged(mMode, mState);
}
@@ -590,14 +709,41 @@ public class EditStyledText extends EditText {
if (DBG) {
Log.d(LOG_TAG, "--- onInsertImage by resID");
}
int curpos = mEST.getSelectionStart();
mEST.getText().insert(curpos, "a");
mEST.getText().setSpan(new ImageSpan(mEST.getContext(), resID),
curpos, curpos + 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
insertImageSpan(new ImageSpan(mEST.getContext(), resID));
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) {
if (DBG) {
Log.d(LOG_TAG, "--- onClickSizeItem");
@@ -632,8 +778,21 @@ public class EditStyledText extends EditText {
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() {
return this.mSoftKeyBlockFlag;
return mSoftKeyBlockFlag;
}
public int getEditMode() {
@@ -781,7 +940,7 @@ public class EditStyledText extends EditText {
mEST.setHintMessage(HINT_MSG_NULL);
switch (mode) {
case MODE_COLOR:
mEST.onShowColorAlert();
mEST.onShowForegroundColorAlert();
break;
case MODE_SIZE:
mEST.onShowSizeAlert();
@@ -944,7 +1103,7 @@ public class EditStyledText extends EditText {
private void changeSizeSelectedText(int size) {
if (DBG) {
Log.d(LOG_TAG, "--- changeAlign:" + size);
Log.d(LOG_TAG, "--- changeSize:" + size);
}
setStyledTextSpan(new AbsoluteSizeSpan(size),
mCurStart, mCurEnd);
@@ -952,7 +1111,7 @@ public class EditStyledText extends EditText {
private void changeColorSelectedText(int color) {
if (DBG) {
Log.d(LOG_TAG, "--- changeAlign:" + color);
Log.d(LOG_TAG, "--- changeColor:" + color);
}
setStyledTextSpan(new ForegroundColorSpan(color),
mCurStart, mCurEnd);
@@ -981,6 +1140,23 @@ public class EditStyledText extends EditText {
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) {
if (DBG) {
Log.d(LOG_TAG, "--- findLineEnd: curr:" + current +
@@ -1017,7 +1193,7 @@ public class EditStyledText extends EditText {
Log.d(LOG_TAG, "--- unblockSoftKey:");
}
mEST.setOnClickListener(null);
this.mSoftKeyBlockFlag = false;
mSoftKeyBlockFlag = false;
}
}
@@ -1028,7 +1204,7 @@ public class EditStyledText extends EditText {
mEST = est;
}
public String getConvertedBody() {
public String getHtml() {
String htmlBody = Html.toHtml(mEST.getText());
if (DBG) {
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;
CharSequence mColorTitle;
CharSequence mSizeTitle;
@@ -1071,7 +1274,7 @@ public class EditStyledText extends EditText {
CharSequence[] mAlignNames;
EditStyledText mEST;
public StyledTextToast(EditStyledText est) {
public StyledTextDialog(EditStyledText est) {
mEST = est;
}
@@ -1101,7 +1304,7 @@ public class EditStyledText extends EditText {
mAlignNames = alignnames;
}
public boolean checkColorAlertParams() {
private boolean checkColorAlertParams() {
if (DBG) {
Log.d(LOG_TAG, "--- checkParams");
}
@@ -1120,7 +1323,7 @@ public class EditStyledText extends EditText {
return true;
}
public boolean checkSizeAlertParams() {
private boolean checkSizeAlertParams() {
if (DBG) {
Log.d(LOG_TAG, "--- checkParams");
}
@@ -1140,7 +1343,7 @@ public class EditStyledText extends EditText {
return true;
}
public boolean checkAlignAlertParams() {
private boolean checkAlignAlertParams() {
if (DBG) {
Log.d(LOG_TAG, "--- checkAlignAlertParams");
}
@@ -1154,9 +1357,9 @@ public class EditStyledText extends EditText {
return true;
}
private void onShowColorAlertDialog() {
private void onShowForegroundColorAlertDialog() {
if (DBG) {
Log.d(LOG_TAG, "--- onShowAlertDialog");
Log.d(LOG_TAG, "--- onShowForegroundColorAlertDialog");
}
if (!checkColorAlertParams()) {
return;
@@ -1176,13 +1379,35 @@ public class EditStyledText extends EditText {
mBuilder.show();
}
private void onShowSizeAlertDialog() {
private void onShowBackgroundColorAlertDialog() {
if (DBG) {
Log.d(LOG_TAG, "--- onShowAlertDialog");
Log.d(LOG_TAG, "--- onShowBackgroundColorAlertDialog");
}
if (!checkColorAlertParams()) {
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.setIcon(0);
mBuilder.
@@ -1200,7 +1425,7 @@ public class EditStyledText extends EditText {
private void onShowAlignAlertDialog() {
if (DBG) {
Log.d(LOG_TAG, "--- onShowAlertDialog");
Log.d(LOG_TAG, "--- onShowAlignAlertDialog");
}
if (!checkAlignAlertParams()) {
return;
@@ -1358,4 +1583,80 @@ public class EditStyledText extends EditText {
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;
}
}
}