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