/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import android.content.Context;
import android.graphics.Rect;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.URLSpan;
import com.galaxy.meetup.client.util.TextPaintUtils;
/**
*
* @author sihai
*
*/
public class ClickableStaticLayout extends PositionedStaticLayout implements ClickableItem {
private final SpanClickListener mClickListener;
private StateURLSpan mClickedSpan;
private CharSequence mContentDescription;
private final Spanned mSpannedText;
public ClickableStaticLayout(CharSequence charsequence, TextPaint textpaint, int i, Alignment alignment, float f, float f1, boolean flag, SpanClickListener spanclicklistener)
{
super(charsequence, textpaint, i, alignment, f, 0.0F, false);
mClickListener = spanclicklistener;
mContentDescription = charsequence;
if(charsequence instanceof Spanned)
mSpannedText = (Spanned)charsequence;
else
mSpannedText = null;
}
@Override
public int compare(ClickableItem obj, ClickableItem obj1) {
ClickableItem clickableitem = (ClickableItem)obj;
ClickableItem clickableitem1 = (ClickableItem)obj1;
return sComparator.compare(clickableitem, clickableitem1);
}
@Override
public CharSequence getContentDescription() {
return mContentDescription;
}
@Override
public Rect getRect() {
return mContentArea;
}
@Override
public boolean handleEvent(int i, int j, int k) {
if (3 == k) {
if (mClickedSpan != null) {
mClickedSpan.setClicked(false);
mClickedSpan = null;
}
return true;
}
boolean flag = true;
if (mSpannedText == null)
flag = false;
else if (!mContentArea.contains(i, j)) {
if (k == 1 && mClickedSpan != null) {
mClickedSpan.setClicked(false);
mClickedSpan = null;
}
flag = false;
} else {
float f = i - mContentArea.left;
float f1 = Math.max(0.0F, j - mContentArea.top);
int l = getLineForVertical((int) Math.min(-1 + getHeight(), f1));
float f2 = Math.max(0.0F, f);
int i1 = getOffsetForHorizontal(l, Math.min(-1 + getWidth(), f2));
if (i1 < 0) {
flag = false;
} else {
StateURLSpan astateurlspan[] = (StateURLSpan[]) mSpannedText
.getSpans(i1, i1,
ClickableStaticLayout.StateURLSpan.class);
if (astateurlspan.length == 0)
flag = false;
else
switch (k) {
default:
break;
case 0: // '\0'
mClickedSpan = astateurlspan[0];
mClickedSpan.setClicked(flag);
break;
case 1: // '\001'
if (mClickedSpan == astateurlspan[0]
&& mClickListener != null)
mClickListener.onSpanClick(astateurlspan[0]);
if (mClickedSpan != null) {
mClickedSpan.setClicked(false);
mClickedSpan = null;
}
break;
}
}
}
return flag;
}
public static ClickableStaticLayout createConstrainedLayout(TextPaint textpaint, CharSequence charsequence, int i, int j, SpanClickListener spanclicklistener)
{
int k = Math.max(i, 0);
CharSequence txt = null;
if(0 == j) {
txt = "";
} else if(1 == j) {
txt = TextPaintUtils.smartEllipsize(charsequence, textpaint, k, android.text.TextUtils.TruncateAt.END);
} else {
ClickableStaticLayout clickablestaticlayout = new ClickableStaticLayout(charsequence, textpaint, k, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false, spanclicklistener);
if(clickablestaticlayout.getLineCount() <= j) {
return clickablestaticlayout;
}
int l = clickablestaticlayout.getLineEnd(j - 2);
SpannableStringBuilder spannablestringbuilder = new SpannableStringBuilder(charsequence.subSequence(0, l));
spannablestringbuilder.append(TextPaintUtils.smartEllipsize(charsequence.subSequence(l, charsequence.length()), textpaint, k, android.text.TextUtils.TruncateAt.END));
txt = spannablestringbuilder;
}
return new ClickableStaticLayout(txt, textpaint, k, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, false, spanclicklistener);
}
public static SpannableStringBuilder buildStateSpans(String s)
{
return buildStateSpans(null, s, null, -1, false);
}
public static SpannableStringBuilder buildStateSpans(String s, android.text.Html.TagHandler taghandler)
{
return buildStateSpans(null, s, taghandler, -1, false);
}
private static SpannableStringBuilder buildStateSpans(Context context, String s, android.text.Html.TagHandler taghandler, int i, boolean flag)
{
SpannableStringBuilder spannablestringbuilder;
if(s == null)
{
spannablestringbuilder = new SpannableStringBuilder();
} else
{
Spanned spanned = Html.fromHtml(s, null, taghandler);
spannablestringbuilder = new SpannableStringBuilder(spanned);
URLSpan aurlspan[] = (URLSpan[])spannablestringbuilder.getSpans(0, spanned.length(), URLSpan.class);
int j = 0;
while(j < aurlspan.length)
{
URLSpan urlspan = aurlspan[j];
spannablestringbuilder.setSpan(new StateURLSpan(urlspan.getURL()), spannablestringbuilder.getSpanStart(urlspan), spannablestringbuilder.getSpanEnd(urlspan), spannablestringbuilder.getSpanFlags(urlspan));
spannablestringbuilder.removeSpan(urlspan);
j++;
}
}
return spannablestringbuilder;
}
public static abstract interface SpanClickListener {
void onSpanClick(URLSpan paramURLSpan);
}
public static final class StateURLSpan extends URLSpan {
private int mBgColor;
private boolean mClicked;
private boolean mFirstTime;
public StateURLSpan(String s) {
super(s);
mFirstTime = true;
}
public final void setClicked(boolean flag) {
mClicked = flag;
}
public final void updateDrawState(TextPaint textpaint) {
if (mFirstTime) {
mFirstTime = false;
mBgColor = textpaint.bgColor;
}
if (mClicked) {
if (android.os.Build.VERSION.SDK_INT >= 13)
textpaint.bgColor = 0xff33b5e5;
else
textpaint.bgColor = -32768;
} else {
textpaint.bgColor = mBgColor;
}
textpaint.setColor(textpaint.linkColor);
textpaint.setUnderlineText(false);
}
}
}