Loading core/java/android/text/DynamicLayout.java +3 −2 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ extends Layout } if (reflowed == null) { reflowed = new StaticLayout(true); reflowed = new StaticLayout(getText()); } else { reflowed.prepare(); } Loading Loading @@ -488,7 +488,8 @@ extends Layout private int mTopPadding, mBottomPadding; private static StaticLayout sStaticLayout = new StaticLayout(true); private static StaticLayout sStaticLayout = null; private static final Object[] sLock = new Object[0]; private static final int START = 0; Loading core/java/android/text/Layout.java +4 −11 Original line number Diff line number Diff line Loading @@ -880,6 +880,10 @@ public abstract class Layout { } } Directions directions = getLineDirections(line); // Returned directions can actually be null if (directions == null) { return 0f; } int dir = getParagraphDirection(line); TextLine tl = TextLine.obtain(); Loading Loading @@ -1781,17 +1785,6 @@ public abstract class Layout { } } /** * Inform this layout that not all of its lines will be displayed, because a maximum number of * lines has been set on the associated TextView. * * A non strictly positive value means that all lines are displayed. * * @param lineCount number of visible lines * @hide */ public void setMaximumVisibleLineCount(int lineCount) {} private CharSequence mText; private TextPaint mPaint; /* package */ TextPaint mWorkPaint; Loading core/java/android/text/StaticLayout.java +77 −56 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; import android.text.style.LineHeightSpan; import android.text.style.MetricAffectingSpan; import android.text.style.TabStopSpan; import android.util.Log; import com.android.internal.util.ArrayUtils; Loading @@ -38,6 +39,8 @@ import com.android.internal.util.ArrayUtils; */ public class StaticLayout extends Layout { static final String TAG = "StaticLayout"; public StaticLayout(CharSequence source, TextPaint paint, int width, Alignment align, float spacingmult, float spacingadd, Loading Loading @@ -75,7 +78,7 @@ public class StaticLayout extends Layout { float spacingmult, float spacingadd, boolean includepad) { this(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, null, 0); spacingmult, spacingadd, includepad, null, 0, Integer.MAX_VALUE); } public StaticLayout(CharSequence source, int bufstart, int bufend, Loading @@ -86,7 +89,7 @@ public class StaticLayout extends Layout { TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(source, bufstart, bufend, paint, outerwidth, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth, Integer.MAX_VALUE); } /** Loading @@ -97,7 +100,7 @@ public class StaticLayout extends Layout { Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { TextUtils.TruncateAt ellipsize, int ellipsizedWidth, int maxLines) { super((ellipsize == null) ? source : (source instanceof Spanned) Loading Loading @@ -130,6 +133,7 @@ public class StaticLayout extends Layout { mLines = new int[ArrayUtils.idealIntArraySize(2 * mColumns)]; mLineDirections = new Directions[ ArrayUtils.idealIntArraySize(2 * mColumns)]; mMaximumVisibleLineCount = maxLines; mMeasured = MeasuredText.obtain(); Loading @@ -141,8 +145,8 @@ public class StaticLayout extends Layout { mFontMetricsInt = null; } /* package */ StaticLayout(boolean ellipsize) { super(null, null, 0, null, 0, 0); /* package */ StaticLayout(CharSequence text) { super(text, null, 0, null, 0, 0); mColumns = COLUMNS_ELLIPSIZE; mLines = new int[ArrayUtils.idealIntArraySize(2 * mColumns)]; Loading Loading @@ -394,6 +398,7 @@ public class StaticLayout extends Layout { okBottom = fitBottom; } } else { final boolean moreChars = (j + 1 < spanEnd); if (ok != here) { // Log.e("text", "output ok " + here + " to " +ok); Loading @@ -411,7 +416,7 @@ public class StaticLayout extends Layout { ok == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, okWidth, paint); paint, moreChars); here = ok; } else if (fit != here) { Loading @@ -427,7 +432,7 @@ public class StaticLayout extends Layout { fit == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, fitWidth, paint); paint, moreChars); here = fit; } else { Loading @@ -449,7 +454,7 @@ public class StaticLayout extends Layout { trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, widths[here - paraStart], paint); widths[here - paraStart], paint, moreChars); here = here + 1; } Loading @@ -472,10 +477,13 @@ public class StaticLayout extends Layout { width = restWidth; } } if (mLineCount >= mMaximumVisibleLineCount) { break; } } } if (paraEnd != here) { if (paraEnd != here && mLineCount < mMaximumVisibleLineCount) { if ((fitTop | fitBottom | fitDescent | fitAscent) == 0) { paint.getFontMetricsInt(fm); Loading @@ -496,7 +504,7 @@ public class StaticLayout extends Layout { needMultiply, paraStart, chdirs, dir, easy, paraEnd == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, w, paint); ellipsize, ellipsizedWidth, w, paint, paraEnd != bufEnd); } paraStart = paraEnd; Loading @@ -505,7 +513,8 @@ public class StaticLayout extends Layout { break; } if (bufEnd == bufStart || source.charAt(bufEnd - 1) == CHAR_NEW_LINE) { if ((bufEnd == bufStart || source.charAt(bufEnd - 1) == CHAR_NEW_LINE) && mLineCount < mMaximumVisibleLineCount) { // Log.e("text", "output last " + bufEnd); paint.getFontMetricsInt(fm); Loading @@ -519,7 +528,7 @@ public class StaticLayout extends Layout { needMultiply, bufEnd, null, DEFAULT_DIR, true, true, includepad, trackpad, null, null, bufStart, ellipsize, ellipsizedWidth, 0, paint); ellipsize, ellipsizedWidth, 0, paint, false); } } Loading Loading @@ -624,7 +633,7 @@ public class StaticLayout extends Layout { boolean includePad, boolean trackPad, char[] chs, float[] widths, int widthStart, TextUtils.TruncateAt ellipsize, float ellipsisWidth, float textWidth, TextPaint paint) { float textWidth, TextPaint paint, boolean moreChars) { int j = mLineCount; int off = j * mColumns; int want = off + mColumns + TOP; Loading Loading @@ -722,9 +731,10 @@ public class StaticLayout extends Layout { // If ellipsize is in marquee mode, do not apply ellipsis on the first line if (ellipsize != null && (ellipsize != TextUtils.TruncateAt.MARQUEE || j != 0)) { boolean forceEllipsis = moreChars && (mLineCount + 1 == mMaximumVisibleLineCount); calculateEllipsis(start, end, widths, widthStart, ellipsisWidth, ellipsize, j, textWidth, paint); textWidth, paint, forceEllipsis); } mLineCount++; Loading @@ -734,9 +744,9 @@ public class StaticLayout extends Layout { private void calculateEllipsis(int lineStart, int lineEnd, float[] widths, int widthStart, float avail, TextUtils.TruncateAt where, int line, float textWidth, TextPaint paint) { if (textWidth <= avail) { int line, float textWidth, TextPaint paint, boolean forceEllipsis) { if (textWidth <= avail && !forceEllipsis) { // Everything fits! mLines[mColumns * line + ELLIPSIS_START] = 0; mLines[mColumns * line + ELLIPSIS_COUNT] = 0; Loading @@ -744,10 +754,13 @@ public class StaticLayout extends Layout { } float ellipsisWidth = paint.measureText(HORIZONTAL_ELLIPSIS); int ellipsisStart, ellipsisCount; int ellipsisStart = 0; int ellipsisCount = 0; int len = lineEnd - lineStart; // We only support start ellipsis on a single line if (where == TextUtils.TruncateAt.START) { if (mMaximumVisibleLineCount == 1) { float sum = 0; int i; Loading @@ -763,6 +776,11 @@ public class StaticLayout extends Layout { ellipsisStart = 0; ellipsisCount = i; } else { if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Start Ellipsis only supported with one line"); } } } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE) { float sum = 0; int i; Loading @@ -779,7 +797,13 @@ public class StaticLayout extends Layout { ellipsisStart = i; ellipsisCount = len - i; } else /* where = TextUtils.TruncateAt.MIDDLE */ { if (forceEllipsis && ellipsisCount == 0 && i > 0) { ellipsisStart = i - 1; ellipsisCount = 1; } } else { // where = TextUtils.TruncateAt.MIDDLE We only support middle ellipsis on a single line if (mMaximumVisibleLineCount == 1) { float lsum = 0, rsum = 0; int left = 0, right = len; Loading Loading @@ -807,6 +831,11 @@ public class StaticLayout extends Layout { ellipsisStart = left; ellipsisCount = right - left; } else { if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Middle Ellipsis only supported with one line"); } } } mLines[mColumns * line + ELLIPSIS_START] = ellipsisStart; Loading Loading @@ -916,14 +945,6 @@ public class StaticLayout extends Layout { return mEllipsizedWidth; } /** * @hide */ @Override public void setMaximumVisibleLineCount(int lineCount) { mMaximumVisibleLineCount = lineCount; } void prepare() { mMeasured = MeasuredText.obtain(); } Loading @@ -949,7 +970,7 @@ public class StaticLayout extends Layout { private int[] mLines; private Directions[] mLineDirections; private int mMaximumVisibleLineCount = 0; private int mMaximumVisibleLineCount = Integer.MAX_VALUE; private static final int START_MASK = 0x1FFFFFFF; private static final int DIR_SHIFT = 30; Loading core/java/android/text/TextLine.java +3 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,9 @@ class TextLine { mLen = limit - start; mDir = dir; mDirections = directions; if (mDirections == null) { throw new IllegalArgumentException("Directions cannot be null"); } mHasTabs = hasTabs; mSpanned = null; Loading core/java/android/widget/TextView.java +37 −19 Original line number Diff line number Diff line Loading @@ -6068,6 +6068,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int ellipsisWidth, boolean bringIntoView) { stopMarquee(); // Update "old" cached values mOldMaximum = mMaximum; mOldMaxMode = mMaxMode; mHighlightPathBogus = true; if (w < 0) { Loading Loading @@ -6129,7 +6133,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mTransformed.length(), mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mLayout = new StaticLayout(mTransformed, mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading @@ -6140,7 +6144,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mTransformed.length(), mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mLayout = new StaticLayout(mTransformed, mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading Loading @@ -6195,7 +6199,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mHint.length(), mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mHintLayout = new StaticLayout(mHint, mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading @@ -6206,7 +6210,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mHint.length(), mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mHintLayout = new StaticLayout(mHint, mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading Loading @@ -6411,25 +6415,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mHorizontallyScrolling) want = VERY_WIDE; int hintWant = want; int hintWidth = mHintLayout == null ? hintWant : mHintLayout.getWidth(); int hintWidth = (mHintLayout == null) ? hintWant : mHintLayout.getWidth(); if (mLayout == null) { makeNewLayout(want, hintWant, boring, hintBoring, width - getCompoundPaddingLeft() - getCompoundPaddingRight(), false); } else if ((mLayout.getWidth() != want) || (hintWidth != hintWant) || } else { final boolean layoutChanged = (mLayout.getWidth() != want) || (hintWidth != hintWant) || (mLayout.getEllipsizedWidth() != width - getCompoundPaddingLeft() - getCompoundPaddingRight())) { if (mHint == null && mEllipsize == null && want > mLayout.getWidth() && (mLayout instanceof BoringLayout || (fromexisting && des >= 0 && des <= want))) { width - getCompoundPaddingLeft() - getCompoundPaddingRight()); final boolean widthChanged = (mHint == null) && (mEllipsize == null) && (want > mLayout.getWidth()) && (mLayout instanceof BoringLayout || (fromexisting && des >= 0 && des <= want)); final boolean maximumChanged = (mMaxMode != mOldMaxMode) || (mMaximum != mOldMaximum); if (layoutChanged || maximumChanged) { if (!maximumChanged && widthChanged) { mLayout.increaseWidthTo(want); } else { makeNewLayout(want, hintWant, boring, hintBoring, width - getCompoundPaddingLeft() - getCompoundPaddingRight(), false); } } else { // Width has not changed. // Nothing has changed } } if (heightMode == MeasureSpec.EXACTLY) { Loading Loading @@ -6489,7 +6502,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } desired += pad; layout.setMaximumVisibleLineCount(0); if (mMaxMode == LINES) { /* Loading @@ -6498,7 +6510,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ if (cap) { if (linecount > mMaximum) { layout.setMaximumVisibleLineCount(mMaximum); desired = layout.getLineTop(mMaximum); if (dr != null) { Loading Loading @@ -7106,6 +7117,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * to constrain the text to a single line. Use <code>null</code> * to turn off ellipsizing. * * If {@link #setMaxLines} has been used to set two or more lines, * {@link TextUtils.TruncateAt#END} and {@link TextUtils.TruncateAt#MARQUEE} * are only supported (other ellipsizing types will not do anything). * * @attr ref android.R.styleable#TextView_ellipsize */ public void setEllipsize(TextUtils.TruncateAt where) { Loading Loading @@ -10878,6 +10893,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private int mMinimum = 0; private int mMinMode = LINES; private int mOldMaximum = mMaximum; private int mOldMaxMode = mMaxMode; private int mMaxWidth = Integer.MAX_VALUE; private int mMaxWidthMode = PIXELS; private int mMinWidth = 0; Loading Loading
core/java/android/text/DynamicLayout.java +3 −2 Original line number Diff line number Diff line Loading @@ -275,7 +275,7 @@ extends Layout } if (reflowed == null) { reflowed = new StaticLayout(true); reflowed = new StaticLayout(getText()); } else { reflowed.prepare(); } Loading Loading @@ -488,7 +488,8 @@ extends Layout private int mTopPadding, mBottomPadding; private static StaticLayout sStaticLayout = new StaticLayout(true); private static StaticLayout sStaticLayout = null; private static final Object[] sLock = new Object[0]; private static final int START = 0; Loading
core/java/android/text/Layout.java +4 −11 Original line number Diff line number Diff line Loading @@ -880,6 +880,10 @@ public abstract class Layout { } } Directions directions = getLineDirections(line); // Returned directions can actually be null if (directions == null) { return 0f; } int dir = getParagraphDirection(line); TextLine tl = TextLine.obtain(); Loading Loading @@ -1781,17 +1785,6 @@ public abstract class Layout { } } /** * Inform this layout that not all of its lines will be displayed, because a maximum number of * lines has been set on the associated TextView. * * A non strictly positive value means that all lines are displayed. * * @param lineCount number of visible lines * @hide */ public void setMaximumVisibleLineCount(int lineCount) {} private CharSequence mText; private TextPaint mPaint; /* package */ TextPaint mWorkPaint; Loading
core/java/android/text/StaticLayout.java +77 −56 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; import android.text.style.LineHeightSpan; import android.text.style.MetricAffectingSpan; import android.text.style.TabStopSpan; import android.util.Log; import com.android.internal.util.ArrayUtils; Loading @@ -38,6 +39,8 @@ import com.android.internal.util.ArrayUtils; */ public class StaticLayout extends Layout { static final String TAG = "StaticLayout"; public StaticLayout(CharSequence source, TextPaint paint, int width, Alignment align, float spacingmult, float spacingadd, Loading Loading @@ -75,7 +78,7 @@ public class StaticLayout extends Layout { float spacingmult, float spacingadd, boolean includepad) { this(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, null, 0); spacingmult, spacingadd, includepad, null, 0, Integer.MAX_VALUE); } public StaticLayout(CharSequence source, int bufstart, int bufend, Loading @@ -86,7 +89,7 @@ public class StaticLayout extends Layout { TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(source, bufstart, bufend, paint, outerwidth, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth, Integer.MAX_VALUE); } /** Loading @@ -97,7 +100,7 @@ public class StaticLayout extends Layout { Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { TextUtils.TruncateAt ellipsize, int ellipsizedWidth, int maxLines) { super((ellipsize == null) ? source : (source instanceof Spanned) Loading Loading @@ -130,6 +133,7 @@ public class StaticLayout extends Layout { mLines = new int[ArrayUtils.idealIntArraySize(2 * mColumns)]; mLineDirections = new Directions[ ArrayUtils.idealIntArraySize(2 * mColumns)]; mMaximumVisibleLineCount = maxLines; mMeasured = MeasuredText.obtain(); Loading @@ -141,8 +145,8 @@ public class StaticLayout extends Layout { mFontMetricsInt = null; } /* package */ StaticLayout(boolean ellipsize) { super(null, null, 0, null, 0, 0); /* package */ StaticLayout(CharSequence text) { super(text, null, 0, null, 0, 0); mColumns = COLUMNS_ELLIPSIZE; mLines = new int[ArrayUtils.idealIntArraySize(2 * mColumns)]; Loading Loading @@ -394,6 +398,7 @@ public class StaticLayout extends Layout { okBottom = fitBottom; } } else { final boolean moreChars = (j + 1 < spanEnd); if (ok != here) { // Log.e("text", "output ok " + here + " to " +ok); Loading @@ -411,7 +416,7 @@ public class StaticLayout extends Layout { ok == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, okWidth, paint); paint, moreChars); here = ok; } else if (fit != here) { Loading @@ -427,7 +432,7 @@ public class StaticLayout extends Layout { fit == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, fitWidth, paint); paint, moreChars); here = fit; } else { Loading @@ -449,7 +454,7 @@ public class StaticLayout extends Layout { trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, widths[here - paraStart], paint); widths[here - paraStart], paint, moreChars); here = here + 1; } Loading @@ -472,10 +477,13 @@ public class StaticLayout extends Layout { width = restWidth; } } if (mLineCount >= mMaximumVisibleLineCount) { break; } } } if (paraEnd != here) { if (paraEnd != here && mLineCount < mMaximumVisibleLineCount) { if ((fitTop | fitBottom | fitDescent | fitAscent) == 0) { paint.getFontMetricsInt(fm); Loading @@ -496,7 +504,7 @@ public class StaticLayout extends Layout { needMultiply, paraStart, chdirs, dir, easy, paraEnd == bufEnd, includepad, trackpad, chs, widths, paraStart, ellipsize, ellipsizedWidth, w, paint); ellipsize, ellipsizedWidth, w, paint, paraEnd != bufEnd); } paraStart = paraEnd; Loading @@ -505,7 +513,8 @@ public class StaticLayout extends Layout { break; } if (bufEnd == bufStart || source.charAt(bufEnd - 1) == CHAR_NEW_LINE) { if ((bufEnd == bufStart || source.charAt(bufEnd - 1) == CHAR_NEW_LINE) && mLineCount < mMaximumVisibleLineCount) { // Log.e("text", "output last " + bufEnd); paint.getFontMetricsInt(fm); Loading @@ -519,7 +528,7 @@ public class StaticLayout extends Layout { needMultiply, bufEnd, null, DEFAULT_DIR, true, true, includepad, trackpad, null, null, bufStart, ellipsize, ellipsizedWidth, 0, paint); ellipsize, ellipsizedWidth, 0, paint, false); } } Loading Loading @@ -624,7 +633,7 @@ public class StaticLayout extends Layout { boolean includePad, boolean trackPad, char[] chs, float[] widths, int widthStart, TextUtils.TruncateAt ellipsize, float ellipsisWidth, float textWidth, TextPaint paint) { float textWidth, TextPaint paint, boolean moreChars) { int j = mLineCount; int off = j * mColumns; int want = off + mColumns + TOP; Loading Loading @@ -722,9 +731,10 @@ public class StaticLayout extends Layout { // If ellipsize is in marquee mode, do not apply ellipsis on the first line if (ellipsize != null && (ellipsize != TextUtils.TruncateAt.MARQUEE || j != 0)) { boolean forceEllipsis = moreChars && (mLineCount + 1 == mMaximumVisibleLineCount); calculateEllipsis(start, end, widths, widthStart, ellipsisWidth, ellipsize, j, textWidth, paint); textWidth, paint, forceEllipsis); } mLineCount++; Loading @@ -734,9 +744,9 @@ public class StaticLayout extends Layout { private void calculateEllipsis(int lineStart, int lineEnd, float[] widths, int widthStart, float avail, TextUtils.TruncateAt where, int line, float textWidth, TextPaint paint) { if (textWidth <= avail) { int line, float textWidth, TextPaint paint, boolean forceEllipsis) { if (textWidth <= avail && !forceEllipsis) { // Everything fits! mLines[mColumns * line + ELLIPSIS_START] = 0; mLines[mColumns * line + ELLIPSIS_COUNT] = 0; Loading @@ -744,10 +754,13 @@ public class StaticLayout extends Layout { } float ellipsisWidth = paint.measureText(HORIZONTAL_ELLIPSIS); int ellipsisStart, ellipsisCount; int ellipsisStart = 0; int ellipsisCount = 0; int len = lineEnd - lineStart; // We only support start ellipsis on a single line if (where == TextUtils.TruncateAt.START) { if (mMaximumVisibleLineCount == 1) { float sum = 0; int i; Loading @@ -763,6 +776,11 @@ public class StaticLayout extends Layout { ellipsisStart = 0; ellipsisCount = i; } else { if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Start Ellipsis only supported with one line"); } } } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE) { float sum = 0; int i; Loading @@ -779,7 +797,13 @@ public class StaticLayout extends Layout { ellipsisStart = i; ellipsisCount = len - i; } else /* where = TextUtils.TruncateAt.MIDDLE */ { if (forceEllipsis && ellipsisCount == 0 && i > 0) { ellipsisStart = i - 1; ellipsisCount = 1; } } else { // where = TextUtils.TruncateAt.MIDDLE We only support middle ellipsis on a single line if (mMaximumVisibleLineCount == 1) { float lsum = 0, rsum = 0; int left = 0, right = len; Loading Loading @@ -807,6 +831,11 @@ public class StaticLayout extends Layout { ellipsisStart = left; ellipsisCount = right - left; } else { if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Middle Ellipsis only supported with one line"); } } } mLines[mColumns * line + ELLIPSIS_START] = ellipsisStart; Loading Loading @@ -916,14 +945,6 @@ public class StaticLayout extends Layout { return mEllipsizedWidth; } /** * @hide */ @Override public void setMaximumVisibleLineCount(int lineCount) { mMaximumVisibleLineCount = lineCount; } void prepare() { mMeasured = MeasuredText.obtain(); } Loading @@ -949,7 +970,7 @@ public class StaticLayout extends Layout { private int[] mLines; private Directions[] mLineDirections; private int mMaximumVisibleLineCount = 0; private int mMaximumVisibleLineCount = Integer.MAX_VALUE; private static final int START_MASK = 0x1FFFFFFF; private static final int DIR_SHIFT = 30; Loading
core/java/android/text/TextLine.java +3 −0 Original line number Diff line number Diff line Loading @@ -125,6 +125,9 @@ class TextLine { mLen = limit - start; mDir = dir; mDirections = directions; if (mDirections == null) { throw new IllegalArgumentException("Directions cannot be null"); } mHasTabs = hasTabs; mSpanned = null; Loading
core/java/android/widget/TextView.java +37 −19 Original line number Diff line number Diff line Loading @@ -6068,6 +6068,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int ellipsisWidth, boolean bringIntoView) { stopMarquee(); // Update "old" cached values mOldMaximum = mMaximum; mOldMaxMode = mMaxMode; mHighlightPathBogus = true; if (w < 0) { Loading Loading @@ -6129,7 +6133,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mTransformed.length(), mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mLayout = new StaticLayout(mTransformed, mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading @@ -6140,7 +6144,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mTransformed.length(), mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mLayout = new StaticLayout(mTransformed, mTextPaint, w, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading Loading @@ -6195,7 +6199,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mHint.length(), mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mHintLayout = new StaticLayout(mHint, mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading @@ -6206,7 +6210,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener 0, mHint.length(), mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, mIncludePad, mEllipsize, ellipsisWidth); ellipsisWidth, mMaxMode == LINES ? mMaximum : Integer.MAX_VALUE); } else { mHintLayout = new StaticLayout(mHint, mTextPaint, hintWidth, alignment, mTextDir, mSpacingMult, mSpacingAdd, Loading Loading @@ -6411,25 +6415,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mHorizontallyScrolling) want = VERY_WIDE; int hintWant = want; int hintWidth = mHintLayout == null ? hintWant : mHintLayout.getWidth(); int hintWidth = (mHintLayout == null) ? hintWant : mHintLayout.getWidth(); if (mLayout == null) { makeNewLayout(want, hintWant, boring, hintBoring, width - getCompoundPaddingLeft() - getCompoundPaddingRight(), false); } else if ((mLayout.getWidth() != want) || (hintWidth != hintWant) || } else { final boolean layoutChanged = (mLayout.getWidth() != want) || (hintWidth != hintWant) || (mLayout.getEllipsizedWidth() != width - getCompoundPaddingLeft() - getCompoundPaddingRight())) { if (mHint == null && mEllipsize == null && want > mLayout.getWidth() && (mLayout instanceof BoringLayout || (fromexisting && des >= 0 && des <= want))) { width - getCompoundPaddingLeft() - getCompoundPaddingRight()); final boolean widthChanged = (mHint == null) && (mEllipsize == null) && (want > mLayout.getWidth()) && (mLayout instanceof BoringLayout || (fromexisting && des >= 0 && des <= want)); final boolean maximumChanged = (mMaxMode != mOldMaxMode) || (mMaximum != mOldMaximum); if (layoutChanged || maximumChanged) { if (!maximumChanged && widthChanged) { mLayout.increaseWidthTo(want); } else { makeNewLayout(want, hintWant, boring, hintBoring, width - getCompoundPaddingLeft() - getCompoundPaddingRight(), false); } } else { // Width has not changed. // Nothing has changed } } if (heightMode == MeasureSpec.EXACTLY) { Loading Loading @@ -6489,7 +6502,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } desired += pad; layout.setMaximumVisibleLineCount(0); if (mMaxMode == LINES) { /* Loading @@ -6498,7 +6510,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ if (cap) { if (linecount > mMaximum) { layout.setMaximumVisibleLineCount(mMaximum); desired = layout.getLineTop(mMaximum); if (dr != null) { Loading Loading @@ -7106,6 +7117,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * to constrain the text to a single line. Use <code>null</code> * to turn off ellipsizing. * * If {@link #setMaxLines} has been used to set two or more lines, * {@link TextUtils.TruncateAt#END} and {@link TextUtils.TruncateAt#MARQUEE} * are only supported (other ellipsizing types will not do anything). * * @attr ref android.R.styleable#TextView_ellipsize */ public void setEllipsize(TextUtils.TruncateAt where) { Loading Loading @@ -10878,6 +10893,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private int mMinimum = 0; private int mMinMode = LINES; private int mOldMaximum = mMaximum; private int mOldMaxMode = mMaxMode; private int mMaxWidth = Integer.MAX_VALUE; private int mMaxWidthMode = PIXELS; private int mMinWidth = 0; Loading