1/*
2 * Copyright (C) 2012 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mail.text;
19
20import android.graphics.Canvas;
21import android.graphics.Paint;
22import android.support.v4.text.BidiFormatter;
23import android.text.TextPaint;
24import android.text.TextUtils;
25import android.text.style.ReplacementSpan;
26
27import com.android.mail.ui.FolderDisplayer;
28
29/**
30 * A replacement span to use when displaying folders in conversation view. Prevents a folder name
31 * from wrapping mid-name, and ellipsizes very long folder names that can't fit on a single line.
32 */
33public class FolderSpan extends ReplacementSpan {
34    private final TextPaint mWorkPaint = new TextPaint();
35    private final String mName;
36    private final int mFgColor;
37    private final int mBgColor;
38    private final FolderDisplayer.FolderDrawableResources mRes;
39    private final BidiFormatter mFormatter;
40    private final FolderSpanDimensions mDim;
41
42    public FolderSpan(String name, int fgColor, int bgColor,
43            FolderDisplayer.FolderDrawableResources res, BidiFormatter formatter,
44            FolderSpanDimensions dim) {
45        super();
46
47        mName = name;
48        mFgColor = fgColor;
49        mBgColor = bgColor;
50        mRes = res;
51        mFormatter = formatter;
52        mDim = dim;
53    }
54
55    private int getWidth(Paint p) {
56        p.setTextSize(mRes.folderFontSize);
57        return Math.min((int) p.measureText(mName) + 2 * mRes.folderHorizontalPadding,
58                mDim.getMaxChipWidth());
59    }
60
61    private int getHeight(Paint p) {
62        p.setTextSize(mRes.folderFontSize);
63        final Paint.FontMetricsInt fm = p.getFontMetricsInt();
64        return fm.bottom - fm.top;
65    }
66
67    @Override
68    public int getSize(Paint p, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
69        mWorkPaint.set(p);
70        return getWidth(mWorkPaint);
71    }
72
73    @Override
74    public void draw(Canvas canvas, CharSequence charSequence, int start, int end, float x, int top,
75            int baseline, int bottom, Paint paint) {
76        mWorkPaint.set(paint);
77        mWorkPaint.setTextSize(mRes.folderFontSize);
78        final int width = getWidth(mWorkPaint);
79        final int height = getHeight(mWorkPaint);
80        String name = mName;
81        if (width == mDim.getMaxChipWidth()) {
82            name = TextUtils.ellipsize(mName, mWorkPaint, width - 2 * mRes.folderHorizontalPadding,
83                    TextUtils.TruncateAt.MIDDLE).toString();
84        }
85        FolderDisplayer.drawFolder(canvas, x, baseline - height, width, height, name, mFgColor,
86                mBgColor, mRes, mFormatter, mWorkPaint);
87    }
88
89    public static interface FolderSpanDimensions {
90        int getMaxChipWidth();
91    }
92}
93