package in.uncod.android.bypass;
import android.text.SpannableStringBuilder;
/**
* Exactly the same as SpannableStringBuilder, but it returns its spans in reverse.
* <p/>
* What effect does this have? Well, if you're building up a Spannable recursively (as we
* are doing in Bypass) then returning the spans in reverse order has the correct effect
* in some corner cases regarding leading spans.
* <p/>
* Example:
* Suppose we have a BLOCK_QUOTE with a LIST inside of it. Both of them have leading spans, but the LIST
* span is set first. As a result, the QuoteSpan for the BLOCK_QUOTE is actually indented by the LIST's span!
* If the order is reversed, then the LIST's margin span is properly indented (and the BlockQuote remains on
* the side).
*/
public class ReverseSpannableStringBuilder extends SpannableStringBuilder {
private static void reverse(Object[] arr) {
if (arr == null) {
return;
}
int i = 0;
int j = arr.length - 1;
Object tmp;
while (j > i) {
tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
j--;
i++;
}
}
@Override
public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) {
T[] ret = super.getSpans(queryStart, queryEnd, kind);
reverse(ret);
return ret;
}
}