OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / core / java / android / text / style / BulletSpan.java
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package android.text.style;
18
19 import android.graphics.Canvas;
20 import android.graphics.Paint;
21 import android.os.Parcel;
22 import android.text.Layout;
23 import android.text.ParcelableSpan;
24 import android.text.Spanned;
25 import android.text.TextUtils;
26
27 public class BulletSpan implements LeadingMarginSpan, ParcelableSpan {
28     private final int mGapWidth;
29     private final boolean mWantColor;
30     private final int mColor;
31
32     private static final int BULLET_RADIUS = 3;
33     public static final int STANDARD_GAP_WIDTH = 2;
34
35     public BulletSpan() {
36         mGapWidth = STANDARD_GAP_WIDTH;
37         mWantColor = false;
38         mColor = 0;
39     }
40
41     public BulletSpan(int gapWidth) {
42         mGapWidth = gapWidth;
43         mWantColor = false;
44         mColor = 0;
45     }
46
47     public BulletSpan(int gapWidth, int color) {
48         mGapWidth = gapWidth;
49         mWantColor = true;
50         mColor = color;
51     }
52
53     public BulletSpan(Parcel src) {
54         mGapWidth = src.readInt();
55         mWantColor = src.readInt() != 0;
56         mColor = src.readInt();
57     }
58     
59     public int getSpanTypeId() {
60         return TextUtils.BULLET_SPAN;
61     }
62     
63     public int describeContents() {
64         return 0;
65     }
66
67     public void writeToParcel(Parcel dest, int flags) {
68         dest.writeInt(mGapWidth);
69         dest.writeInt(mWantColor ? 1 : 0);
70         dest.writeInt(mColor);
71     }
72
73     public int getLeadingMargin(boolean first) {
74         return 2 * BULLET_RADIUS + mGapWidth;
75     }
76
77     public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
78                                   int top, int baseline, int bottom,
79                                   CharSequence text, int start, int end,
80                                   boolean first, Layout l) {
81         if (((Spanned) text).getSpanStart(this) == start) {
82             Paint.Style style = p.getStyle();
83             int oldcolor = 0;
84
85             if (mWantColor) {
86                 oldcolor = p.getColor();
87                 p.setColor(mColor);
88             }
89
90             p.setStyle(Paint.Style.FILL);
91
92             c.drawCircle(x + dir * BULLET_RADIUS, (top + bottom) / 2.0f,
93                          BULLET_RADIUS, p);
94
95             if (mWantColor) {
96                 p.setColor(oldcolor);
97             }
98
99             p.setStyle(style);
100         }
101     }
102 }