| package com.xtremelabs.robolectric.shadows; |
| |
| import java.lang.reflect.Array; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| |
| import android.text.SpannableString; |
| |
| import com.xtremelabs.robolectric.internal.Implementation; |
| import com.xtremelabs.robolectric.internal.Implements; |
| |
| @Implements(SpannableString.class) |
| public class ShadowSpannableString { |
| |
| private CharSequence text = ""; |
| private HashMap<Object, SpanHolder> spans = new HashMap<Object, SpanHolder>(); |
| |
| public void __constructor__(CharSequence source) { |
| text = source; |
| } |
| |
| @Implementation |
| public String toString() { |
| return text.toString(); |
| } |
| |
| @Implementation |
| public void setSpan(Object what, int start, int end, int flags) { |
| spans.put(what, new SpanHolder(start, end, flags) ); |
| } |
| |
| @Implementation |
| public void removeSpan(Object what) { |
| spans.remove(what); |
| } |
| |
| @Implementation |
| public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) { |
| ArrayList<T> retVal = new ArrayList<T>(); |
| |
| for (Object s : spans.keySet()) { |
| if (kind.isInstance(s)) { |
| SpanHolder h = spans.get(s); |
| if ( (h.start <= queryStart && h.end >= queryStart) || |
| (h.start <= queryEnd && h.end >= queryEnd) || |
| (h.start >= queryStart && h.end <= queryEnd) ) { |
| retVal.add((T) s); |
| } |
| } |
| } |
| T[] array = (T[]) Array.newInstance(kind, retVal.size()); |
| return retVal.toArray(array); |
| } |
| |
| @Implementation |
| public int getSpanStart(Object what) { |
| SpanHolder spanHolder = spans.get(what); |
| if (spanHolder != null) { |
| return spanHolder.start; |
| } else { |
| return -1; |
| } |
| } |
| |
| @Implementation |
| public int getSpanEnd(Object what) { |
| SpanHolder spanHolder = spans.get(what); |
| if (spanHolder != null) { |
| return spanHolder.end; |
| } else { |
| return -1; |
| } |
| } |
| |
| private class SpanHolder { |
| public int start; |
| public int end; |
| public int flags; |
| |
| public SpanHolder(int start, int end, int flags) { |
| this.start = start; |
| this.end = end; |
| this.flags = flags; |
| } |
| } |
| } |