package com.electronapps.LJPro; import com.electronapps.LJPro.BlockQuoteSpan; import android.graphics.Bitmap; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.os.Parcel; import android.os.Parcelable; import android.text.ParcelableSpan; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.style.AbsoluteSizeSpan; import android.text.style.AlignmentSpan; import android.text.style.BackgroundColorSpan; import android.text.style.BulletSpan; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; import android.text.style.SubscriptSpan; import android.text.style.SuperscriptSpan; import android.text.style.TypefaceSpan; import android.text.style.URLSpan; import android.text.style.UnderlineSpan; public class SpanInfo { public int id; public int start; public int end; public int color; Class type; Object what; public SpanInfo(int style) { id=style; } public SpanInfo(int style,boolean adding) { type=spanClassFactory(style); if (adding) { what=styleFactory(style); } } public SpanInfo(int style, boolean adding, Integer size) { type=spanClassFactory(style); if (adding) { what=sizeFactory(size); } } public SpanInfo(int style,boolean adding, int color) { type=spanClassFactory(style); if(adding) { what=colorFactory(style,color); } } public SpanInfo(int style, boolean adding, String text) { type=spanClassFactory(style); if (adding) { if (style==RichEditText.URL_SPAN) { what=linkFactory(text); } else { what=ljcutFactory(text); } } } static public Class spanClassFactory(int style) { switch (style) { case Typeface.BOLD: case Typeface.ITALIC: return StyleSpan.class; case RichEditText.STYLE_UNDERLINE: return UnderlineSpan.class; case RichEditText.STYLE_STRIKETHROUGH: return StrikethroughSpan.class; case RichEditText.STYLE_SUBSCRIPT: return SubscriptSpan.class; case RichEditText.STYLE_SUPERSCRIPT: return SuperscriptSpan.class; case RichEditText.STYLE_BLOCKQUOTE: return BlockQuoteSpan.class; case RichEditText.HEADER_H1: case RichEditText.HEADER_H2: case RichEditText.HEADER_H3: case RichEditText.HEADER_H4: case RichEditText.HEADER_H5: case RichEditText.HEADER_H6: return RelativeSizeSpan.class; case RichEditText.ALIGNMENT_SPAN: return AlignmentSpan.class; case RichEditText.SIZE_XXSMALL: case RichEditText.SIZE_XSMALL: case RichEditText.SIZE_SMALL: case RichEditText.SIZE_MEDIUM: case RichEditText.SIZE_LARGE: case RichEditText.SIZE_XLARGE: case RichEditText.SIZE_XXLARGE: return AbsoluteSizeSpan.class; case RichEditText.IMAGE_SPAN: return HTMLImageSpan.class; case RichEditText.URL_SPAN: return URLSpan.class; case RichEditText.BACKGROUND_COLOR: return BackgroundColorSpan.class; case RichEditText.TEXT_COLOR: return ForegroundColorSpan.class; case RichEditText.BULLET_SPAN: return BulletSpan.class; case RichEditText.LJCUT_SPAN: return LJCutSpan.class; } return Object.class; } static public Object styleFactory(int type) { Object what=null; switch(type) { case Typeface.BOLD: what=new StyleSpan(type); break; case Typeface.ITALIC: what=new StyleSpan(type); break; case RichEditText.STYLE_BLOCKQUOTE: what=new BlockQuoteSpan(); break; case RichEditText.STYLE_UNDERLINE: what=new UnderlineSpan(); break; case RichEditText.STYLE_STRIKETHROUGH: what=new StrikethroughSpan(); break; case RichEditText.STYLE_SUPERSCRIPT: what=new SuperscriptSpan(); break; case RichEditText.STYLE_SUBSCRIPT: what=new SubscriptSpan(); break; case RichEditText.BULLET_SPAN: what=new BulletSpan(); break; } return what; } public static LJCutSpan ljcutFactory(String cuttext) { return new LJCutSpan(cuttext); } public static URLSpan linkFactory(String url) { return new URLSpan(url); } public static Object colorFactory(int type, int color) { switch(type) { case RichEditText.TEXT_COLOR: return new ForegroundColorSpan(color); case RichEditText.BACKGROUND_COLOR: return new BackgroundColorSpan(color); } return null; } public static URLSpan urlFactory(String url) { return new URLSpan(url); } public static AbsoluteSizeSpan sizeFactory(int size) { return new AbsoluteSizeSpan(size); } public static RelativeSizeSpan relativeSizeFactory(float proportion) { return new RelativeSizeSpan(proportion); } public static HTMLImageSpan imageFactory(BitmapDrawable d,int h,int w ,String src){ return new HTMLImageSpan(d,src,h,w); } public static final Parcelable.Creator<CharSequence> CHAR_SEQUENCE_CREATOR = new Parcelable.Creator<CharSequence>() { /** * Read and return a new CharSequence, possibly with styles, * from the parcel. */ public CharSequence createFromParcel(Parcel p) { int kind = p.readInt(); if (kind == 1) return p.readString(); SpannableString sp = new SpannableString(p.readString()); while (true) { kind = p.readInt(); if (kind == 0) break; switch (kind) { case RichEditText.ALIGNMENT_SPAN: readSpan(p, sp, new AlignmentSpan.Standard(p)); break; case RichEditText.TEXT_COLOR: readSpan(p, sp, new ForegroundColorSpan(p)); break; case RichEditText.HEADER_H1: case RichEditText.HEADER_H2: case RichEditText.HEADER_H3: case RichEditText.HEADER_H4: case RichEditText.HEADER_H5: case RichEditText.HEADER_H6: readSpan(p, sp, new RelativeSizeSpan(p)); break; case RichEditText.SIZE_XXSMALL: case RichEditText.SIZE_XSMALL: case RichEditText.SIZE_SMALL: case RichEditText.SIZE_MEDIUM: case RichEditText.SIZE_LARGE: case RichEditText.SIZE_XLARGE: readSpan(p, sp, new AbsoluteSizeSpan(p)); break; case RichEditText.STYLE_STRIKETHROUGH: readSpan(p, sp, new StrikethroughSpan(p)); break; case RichEditText.STYLE_UNDERLINE: readSpan(p, sp, new UnderlineSpan(p)); break; case Typeface.BOLD: case Typeface.ITALIC: readSpan(p, sp, new StyleSpan(p)); break; case RichEditText.BULLET_SPAN: readSpan(p, sp, new BulletSpan(p)); break; case RichEditText.STYLE_BLOCKQUOTE : readSpan(p, sp, new BlockQuoteSpan(p)); break; case RichEditText.IMAGE_SPAN: readSpan(p,sp,new HTMLImageSpan(p,p.dataPosition())); case RichEditText.URL_SPAN: readSpan(p, sp, new URLSpan(p)); break; case RichEditText.BACKGROUND_COLOR: readSpan(p, sp, new BackgroundColorSpan(p)); break; case RichEditText.STYLE_SUPERSCRIPT: readSpan(p, sp, new SuperscriptSpan(p)); break; case RichEditText.STYLE_SUBSCRIPT: readSpan(p, sp, new SubscriptSpan(p)); break; default: throw new RuntimeException("bogus span encoding " + kind); } } return sp; } public CharSequence[] newArray(int size) { return new CharSequence[size]; } }; private static void readSpan(Parcel p, Spannable sp, Object o) { sp.setSpan(o, p.readInt(), p.readInt(), p.readInt()); } public static void writeToParcel(CharSequence cs, Parcel p, int parcelableFlags) { if (cs instanceof Spanned) { p.writeInt(0); p.writeString(cs.toString()); Spanned sp = (Spanned) cs; Object[] os = sp.getSpans(0, cs.length(), Object.class); // note to people adding to this: check more specific types // before more generic types. also notice that it uses // "if" instead of "else if" where there are interfaces // so one object can be several. for (int i = 0; i < os.length; i++) { Object o = os[i]; Object prop = os[i]; if (prop instanceof HTMLImageSpan) { HTMLImageSpan ps = (HTMLImageSpan)prop; SpanInfo s=getSpanInfo(prop,sp); p.writeInt(s.id); ps.writeToParcel(p, parcelableFlags); writeWhere(p,s.start,s.end,sp.getSpanFlags(ps)); } if (prop instanceof BlockQuoteSpan){ BlockQuoteSpan ps = (BlockQuoteSpan)prop; SpanInfo s=getSpanInfo(prop,sp); p.writeInt(s.id); ps.writeToParcel(p, parcelableFlags); writeWhere(p,s.start,s.end,sp.getSpanFlags(ps)); } if (prop instanceof ParcelableSpan) { ParcelableSpan ps = (ParcelableSpan)prop; SpanInfo s=getSpanInfo(prop,sp); p.writeInt(s.id); ps.writeToParcel(p, parcelableFlags); writeWhere(p,s.start,s.end,sp.getSpanFlags(ps)); } } p.writeInt(0); } else { p.writeInt(1); if (cs != null) { p.writeString(cs.toString()); } else { p.writeString(null); } } } private static void writeWhere(Parcel p, int start, int end,int spanFlags) { p.writeInt(start); p.writeInt(end); p.writeInt(spanFlags); } public static SpanInfo getSpanInfo(Object span,Spanned sp2) { SpanInfo s=null; if (span instanceof StyleSpan) { StyleSpan sp=(StyleSpan) span; s=new SpanInfo(sp.getStyle()); } if (span instanceof UnderlineSpan) { s=new SpanInfo(RichEditText.STYLE_UNDERLINE); } if (span instanceof StrikethroughSpan) { s=new SpanInfo(RichEditText.STYLE_STRIKETHROUGH); } if (span instanceof SubscriptSpan) { s=new SpanInfo(RichEditText.STYLE_SUBSCRIPT); } if (span instanceof BlockQuoteSpan) { s=new SpanInfo(RichEditText.STYLE_BLOCKQUOTE); } if (span instanceof LJCutSpan) { s=new SpanInfo(RichEditText.LJCUT_SPAN); } if (span instanceof SuperscriptSpan) { s=new SpanInfo(RichEditText.STYLE_SUPERSCRIPT); } if (span instanceof RelativeSizeSpan) { RelativeSizeSpan rss=(RelativeSizeSpan) span; rss.getSizeChange(); } if (span instanceof AlignmentSpan) { s=new SpanInfo(RichEditText.ALIGNMENT_SPAN); } if (span instanceof BackgroundColorSpan) { s=new SpanInfo(RichEditText.BACKGROUND_COLOR); s.color=((BackgroundColorSpan)span).getBackgroundColor(); } if (span instanceof ForegroundColorSpan) { s=new SpanInfo(RichEditText.TEXT_COLOR); s.color=((ForegroundColorSpan)span).getForegroundColor(); } if (span instanceof URLSpan) { s=new SpanInfo(RichEditText.URL_SPAN); } if (span instanceof HTMLImageSpan) { s=new SpanInfo(RichEditText.IMAGE_SPAN); } if(span instanceof AbsoluteSizeSpan) { final int size=((AbsoluteSizeSpan)(span)).getSize(); s=new SpanInfo(RichEditText.SizeIdMap.get(size)); } if(span instanceof RelativeSizeSpan) { final float relsize=((RelativeSizeSpan)span).getSizeChange(); s=new SpanInfo(RichEditText.RelativeSizeIdMap.get(relsize)); } if (s!=null) { s.start=sp2.getSpanStart(span); s.end=sp2.getSpanEnd(span); } return s; } }