|
Android example source code file (SpannableStringInternal.java)
The SpannableStringInternal.java Android example source code/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.text; import com.android.internal.util.ArrayUtils; import java.lang.reflect.Array; /* package */ abstract class SpannableStringInternal { /* package */ SpannableStringInternal(CharSequence source, int start, int end) { if (start == 0 && end == source.length()) mText = source.toString(); else mText = source.toString().substring(start, end); int initial = ArrayUtils.idealIntArraySize(0); mSpans = new Object[initial]; mSpanData = new int[initial * 3]; if (source instanceof Spanned) { Spanned sp = (Spanned) source; Object[] spans = sp.getSpans(start, end, Object.class); for (int i = 0; i < spans.length; i++) { int st = sp.getSpanStart(spans[i]); int en = sp.getSpanEnd(spans[i]); int fl = sp.getSpanFlags(spans[i]); if (st < start) st = start; if (en > end) en = end; setSpan(spans[i], st - start, en - start, fl); } } } public final int length() { return mText.length(); } public final char charAt(int i) { return mText.charAt(i); } public final String toString() { return mText; } /* subclasses must do subSequence() to preserve type */ public final void getChars(int start, int end, char[] dest, int off) { mText.getChars(start, end, dest, off); } /* package */ void setSpan(Object what, int start, int end, int flags) { int nstart = start; int nend = end; checkRange("setSpan", start, end); if ((flags & Spannable.SPAN_PARAGRAPH) == Spannable.SPAN_PARAGRAPH) { if (start != 0 && start != length()) { char c = charAt(start - 1); if (c != '\n') throw new RuntimeException( "PARAGRAPH span must start at paragraph boundary" + " (" + start + " follows " + c + ")"); } if (end != 0 && end != length()) { char c = charAt(end - 1); if (c != '\n') throw new RuntimeException( "PARAGRAPH span must end at paragraph boundary" + " (" + end + " follows " + c + ")"); } } int count = mSpanCount; Object[] spans = mSpans; int[] data = mSpanData; for (int i = 0; i < count; i++) { if (spans[i] == what) { int ostart = data[i * COLUMNS + START]; int oend = data[i * COLUMNS + END]; data[i * COLUMNS + START] = start; data[i * COLUMNS + END] = end; data[i * COLUMNS + FLAGS] = flags; sendSpanChanged(what, ostart, oend, nstart, nend); return; } } if (mSpanCount + 1 >= mSpans.length) { int newsize = ArrayUtils.idealIntArraySize(mSpanCount + 1); Object[] newtags = new Object[newsize]; int[] newdata = new int[newsize * 3]; System.arraycopy(mSpans, 0, newtags, 0, mSpanCount); System.arraycopy(mSpanData, 0, newdata, 0, mSpanCount * 3); mSpans = newtags; mSpanData = newdata; } mSpans[mSpanCount] = what; mSpanData[mSpanCount * COLUMNS + START] = start; mSpanData[mSpanCount * COLUMNS + END] = end; mSpanData[mSpanCount * COLUMNS + FLAGS] = flags; mSpanCount++; if (this instanceof Spannable) sendSpanAdded(what, nstart, nend); } /* package */ void removeSpan(Object what) { int count = mSpanCount; Object[] spans = mSpans; int[] data = mSpanData; for (int i = count - 1; i >= 0; i--) { if (spans[i] == what) { int ostart = data[i * COLUMNS + START]; int oend = data[i * COLUMNS + END]; int c = count - (i + 1); System.arraycopy(spans, i + 1, spans, i, c); System.arraycopy(data, (i + 1) * COLUMNS, data, i * COLUMNS, c * COLUMNS); mSpanCount--; sendSpanRemoved(what, ostart, oend); return; } } } public int getSpanStart(Object what) { int count = mSpanCount; Object[] spans = mSpans; int[] data = mSpanData; for (int i = count - 1; i >= 0; i--) { if (spans[i] == what) { return data[i * COLUMNS + START]; } } return -1; } public int getSpanEnd(Object what) { int count = mSpanCount; Object[] spans = mSpans; int[] data = mSpanData; for (int i = count - 1; i >= 0; i--) { if (spans[i] == what) { return data[i * COLUMNS + END]; } } return -1; } public int getSpanFlags(Object what) { int count = mSpanCount; Object[] spans = mSpans; int[] data = mSpanData; for (int i = count - 1; i >= 0; i--) { if (spans[i] == what) { return data[i * COLUMNS + FLAGS]; } } return 0; } public <T> T[] getSpans(int queryStart, int queryEnd, Class Other Android examples (source code examples)Here is a short list of links related to this Android SpannableStringInternal.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.