Implement Appendable and CharSequence in SpannableBuilder

This commit is contained in:
Dimitry Ivanov 2018-08-17 17:10:51 +03:00
parent 1bad514714
commit 359fd8699d

View File

@ -14,11 +14,13 @@ import java.util.Iterator;
* is using an array to store all the information about spans. So, a span that is added first * is using an array to store all the information about spans. So, a span that is added first
* will be drawn first, which leads to subtle bugs (spans receive wrong `x` values when * will be drawn first, which leads to subtle bugs (spans receive wrong `x` values when
* requested to draw itself) * requested to draw itself)
* <p>
* since 2.0.0 implements Appendable and CharSequence
* *
* @since 1.0.1 * @since 1.0.1
*/ */
@SuppressWarnings({"WeakerAccess", "unused"}) @SuppressWarnings({"WeakerAccess", "unused"})
public class SpannableBuilder { public class SpannableBuilder implements Appendable, CharSequence {
// do not implement CharSequence (or any of Spanned interfaces) // do not implement CharSequence (or any of Spanned interfaces)
@ -51,12 +53,14 @@ public class SpannableBuilder {
} }
@NonNull @NonNull
@Override
public SpannableBuilder append(char c) { public SpannableBuilder append(char c) {
builder.append(c); builder.append(c);
return this; return this;
} }
@NonNull @NonNull
@Override
public SpannableBuilder append(@NonNull CharSequence cs) { public SpannableBuilder append(@NonNull CharSequence cs) {
copySpans(length(), cs); copySpans(length(), cs);
@ -66,6 +70,21 @@ public class SpannableBuilder {
return this; return this;
} }
/**
* @since 2.0.0 to follow Appendable interface
*/
@NonNull
@Override
public SpannableBuilder append(CharSequence csq, int start, int end) {
final CharSequence cs = csq.subSequence(start, end);
copySpans(length(), cs);
builder.append(cs.toString());
return this;
}
@NonNull @NonNull
public SpannableBuilder append(@NonNull CharSequence cs, @NonNull Object span) { public SpannableBuilder append(@NonNull CharSequence cs, @NonNull Object span) {
final int length = length(); final int length = length();
@ -98,14 +117,24 @@ public class SpannableBuilder {
return this; return this;
} }
@Override
public int length() { public int length() {
return builder.length(); return builder.length();
} }
@Override
public char charAt(int index) { public char charAt(int index) {
return builder.charAt(index); return builder.charAt(index);
} }
/**
* @since 2.0.0 to follow CharSequence interface
*/
@Override
public CharSequence subSequence(int start, int end) {
return builder.subSequence(start, end);
}
public char lastChar() { public char lastChar() {
return builder.charAt(length() - 1); return builder.charAt(length() - 1);
} }