15edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao/* 25edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * Copyright (C) 2012 Google Inc. 35edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * Licensed to The Android Open Source Project. 45edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * 55edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * Licensed under the Apache License, Version 2.0 (the "License"); 65edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * you may not use this file except in compliance with the License. 75edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * You may obtain a copy of the License at 85edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * 95edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * http://www.apache.org/licenses/LICENSE-2.0 105edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * 115edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * Unless required by applicable law or agreed to in writing, software 125edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * distributed under the License is distributed on an "AS IS" BASIS, 135edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * See the License for the specific language governing permissions and 155edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * limitations under the License. 165edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao */ 175edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 185edf5fd7327691b73dcb57c3cba340fd25576d18Jin Caopackage com.android.mail.text; 195edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 205edf5fd7327691b73dcb57c3cba340fd25576d18Jin Caoimport android.graphics.Canvas; 216fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Caoimport android.graphics.Paint; 225edf5fd7327691b73dcb57c3cba340fd25576d18Jin Caoimport android.support.v4.text.BidiFormatter; 236fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Caoimport android.text.TextPaint; 245edf5fd7327691b73dcb57c3cba340fd25576d18Jin Caoimport android.text.TextUtils; 256fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Caoimport android.text.style.ReplacementSpan; 265edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 275edf5fd7327691b73dcb57c3cba340fd25576d18Jin Caoimport com.android.mail.ui.FolderDisplayer; 285edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 295edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao/** 305edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * A replacement span to use when displaying folders in conversation view. Prevents a folder name 315edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao * from wrapping mid-name, and ellipsizes very long folder names that can't fit on a single line. 325edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao */ 336fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Caopublic class FolderSpan extends ReplacementSpan { 346fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao private final TextPaint mWorkPaint = new TextPaint(); 355edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final String mName; 365edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final int mFgColor; 375edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final int mBgColor; 385edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final FolderDisplayer.FolderDrawableResources mRes; 395edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final BidiFormatter mFormatter; 405edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao private final FolderSpanDimensions mDim; 415edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 425edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao public FolderSpan(String name, int fgColor, int bgColor, 435edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao FolderDisplayer.FolderDrawableResources res, BidiFormatter formatter, 445edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao FolderSpanDimensions dim) { 455edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao super(); 465edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 475edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mName = name; 485edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mFgColor = fgColor; 495edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mBgColor = bgColor; 505edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mRes = res; 515edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mFormatter = formatter; 525edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mDim = dim; 535edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 545edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 556fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao private int getWidth(Paint p) { 566fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao p.setTextSize(mRes.folderFontSize); 576fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao return Math.min((int) p.measureText(mName) + 2 * mRes.folderHorizontalPadding, 585edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao mDim.getMaxChipWidth()); 595edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 605edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 616fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao private int getHeight(Paint p) { 626fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao p.setTextSize(mRes.folderFontSize); 636fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao final Paint.FontMetricsInt fm = p.getFontMetricsInt(); 646fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao return fm.bottom - fm.top; 656fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao } 666fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao 675edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao @Override 686fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao public int getSize(Paint p, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { 696fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao mWorkPaint.set(p); 706fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao return getWidth(mWorkPaint); 715edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 725edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 735edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao @Override 746fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao public void draw(Canvas canvas, CharSequence charSequence, int start, int end, float x, int top, 756fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao int baseline, int bottom, Paint paint) { 766fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao mWorkPaint.set(paint); 776fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao mWorkPaint.setTextSize(mRes.folderFontSize); 786fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao final int width = getWidth(mWorkPaint); 796fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao final int height = getHeight(mWorkPaint); 805edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao String name = mName; 815edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao if (width == mDim.getMaxChipWidth()) { 826fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao name = TextUtils.ellipsize(mName, mWorkPaint, width - 2 * mRes.folderHorizontalPadding, 835edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao TextUtils.TruncateAt.MIDDLE).toString(); 845edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 856fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao FolderDisplayer.drawFolder(canvas, x, baseline - height, width, height, name, mFgColor, 866fce8bb099fc38a68b96486921e9bf03a5b095d4Jin Cao mBgColor, mRes, mFormatter, mWorkPaint); 875edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 885edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao 895edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao public static interface FolderSpanDimensions { 905edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao int getMaxChipWidth(); 915edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao } 925edf5fd7327691b73dcb57c3cba340fd25576d18Jin Cao} 93