1package com.xtremelabs.robolectric.shadows;
2
3import java.lang.reflect.Array;
4import java.util.ArrayList;
5import java.util.HashMap;
6
7import android.text.SpannableString;
8
9import com.xtremelabs.robolectric.internal.Implementation;
10import com.xtremelabs.robolectric.internal.Implements;
11
12@Implements(SpannableString.class)
13public class ShadowSpannableString {
14
15    private CharSequence text = "";
16    private HashMap<Object, SpanHolder> spans = new HashMap<Object, SpanHolder>();
17
18    public void __constructor__(CharSequence source) {
19        text = source;
20    }
21
22    @Implementation
23    public String toString() {
24        return text.toString();
25    }
26
27    @Implementation
28    public void setSpan(Object what, int start, int end, int flags) {
29        spans.put(what, new SpanHolder(start, end, flags) );
30    }
31
32    @Implementation
33    public void removeSpan(Object what) {
34        spans.remove(what);
35    }
36
37    @Implementation
38    public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) {
39        ArrayList<T> retVal = new ArrayList<T>();
40
41        for (Object s : spans.keySet()) {
42            if (kind.isInstance(s)) {
43                SpanHolder h = spans.get(s);
44                if ( (h.start <= queryStart && h.end >= queryStart) ||
45                        (h.start <= queryEnd   && h.end >= queryEnd)   ||
46                        (h.start >= queryStart && h.end <= queryEnd) ) {
47                    retVal.add((T) s);
48                }
49            }
50        }
51        T[] array = (T[]) Array.newInstance(kind, retVal.size());
52        return retVal.toArray(array);
53    }
54
55    @Implementation
56    public int getSpanStart(Object what) {
57        SpanHolder spanHolder = spans.get(what);
58        if (spanHolder != null) {
59            return spanHolder.start;
60        } else {
61            return -1;
62        }
63    }
64
65    @Implementation
66    public int getSpanEnd(Object what) {
67        SpanHolder spanHolder = spans.get(what);
68        if (spanHolder != null) {
69            return spanHolder.end;
70        } else {
71            return -1;
72        }
73    }
74
75    private class SpanHolder {
76        public int start;
77        public int end;
78        public int flags;
79
80        public SpanHolder(int start, int end, int flags) {
81            this.start = start;
82            this.end = end;
83            this.flags = flags;
84        }
85    }
86}
87