blob: 8fb8bc12a58f9cc799835c436015925aa92e19ce [file] [log] [blame]
reed@android.com985dfad2010-02-09 12:40:30 +00001#include "SkWidgetViews.h"
2#include "SkTextBox.h"
3
4#ifdef SK_DEBUG
5static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[])
6{
7 const char* value = dom.findAttr(node, attr);
8 if (value)
9 SkDebugf("unknown attribute %s=\"%s\"\n", attr, value);
10}
11#else
12 #define assert_no_attr(dom, node, attr)
13#endif
14
15SkStaticTextView::SkStaticTextView()
16{
17 fMargin.set(0, 0);
18 fMode = kFixedSize_Mode;
19 fSpacingAlign = SkTextBox::kStart_SpacingAlign;
20
21// init_skin_paint(kStaticText_SkinEnum, &fPaint);
22}
23
24SkStaticTextView::~SkStaticTextView()
25{
26}
27
28void SkStaticTextView::computeSize()
29{
30 if (fMode == kAutoWidth_Mode)
31 {
32 SkScalar width = fPaint.measureText(fText.c_str(), fText.size());
33 this->setWidth(width + fMargin.fX * 2);
34 }
35 else if (fMode == kAutoHeight_Mode)
36 {
37 SkScalar width = this->width() - fMargin.fX * 2;
38 int lines = width > 0 ? SkTextLineBreaker::CountLines(fText.c_str(), fText.size(), fPaint, width) : 0;
39
40 this->setHeight(lines * fPaint.getFontSpacing() + fMargin.fY * 2);
41 }
42}
43
44void SkStaticTextView::setMode(Mode mode)
45{
46 SkASSERT((unsigned)mode < kModeCount);
47
48 if (fMode != mode)
49 {
50 fMode = SkToU8(mode);
51 this->computeSize();
52 }
53}
54
55void SkStaticTextView::setSpacingAlign(SkTextBox::SpacingAlign align)
56{
57 fSpacingAlign = SkToU8(align);
58 this->inval(NULL);
59}
60
61void SkStaticTextView::getMargin(SkPoint* margin) const
62{
63 if (margin)
64 *margin = fMargin;
65}
66
67void SkStaticTextView::setMargin(SkScalar dx, SkScalar dy)
68{
69 if (fMargin.fX != dx || fMargin.fY != dy)
70 {
71 fMargin.set(dx, dy);
72 this->computeSize();
73 this->inval(NULL);
74 }
75}
76
77size_t SkStaticTextView::getText(SkString* text) const
78{
79 if (text)
80 *text = fText;
81 return fText.size();
82}
83
84size_t SkStaticTextView::getText(char text[]) const
85{
86 if (text)
87 memcpy(text, fText.c_str(), fText.size());
88 return fText.size();
89}
90
91void SkStaticTextView::setText(const SkString& text)
92{
93 this->setText(text.c_str(), text.size());
94}
95
96void SkStaticTextView::setText(const char text[])
97{
98 if (text == NULL)
99 text = "";
100 this->setText(text, strlen(text));
101}
102
103void SkStaticTextView::setText(const char text[], size_t len)
104{
105 if (!fText.equals(text, len))
106 {
107 fText.set(text, len);
108 this->computeSize();
109 this->inval(NULL);
110 }
111}
112
113void SkStaticTextView::getPaint(SkPaint* paint) const
114{
115 if (paint)
116 *paint = fPaint;
117}
118
119void SkStaticTextView::setPaint(const SkPaint& paint)
120{
121 if (fPaint != paint)
122 {
123 fPaint = paint;
124 this->computeSize();
125 this->inval(NULL);
126 }
127}
128
129void SkStaticTextView::onDraw(SkCanvas* canvas)
130{
131 this->INHERITED::onDraw(canvas);
132
133 if (fText.isEmpty())
134 return;
135
136 SkTextBox box;
137
138 box.setMode(fMode == kAutoWidth_Mode ? SkTextBox::kOneLine_Mode : SkTextBox::kLineBreak_Mode);
139 box.setSpacingAlign(this->getSpacingAlign());
140 box.setBox(fMargin.fX, fMargin.fY, this->width() - fMargin.fX, this->height() - fMargin.fY);
141 box.draw(canvas, fText.c_str(), fText.size(), fPaint);
142}
143
144void SkStaticTextView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
145{
146#if 0
147 this->INHERITED::onInflate(dom, node);
148
149 int index;
150 if ((index = dom.findList(node, "mode", "fixed,auto-width,auto-height")) >= 0)
151 this->setMode((Mode)index);
152 else
153 assert_no_attr(dom, node, "mode");
154
155 if ((index = dom.findList(node, "spacing-align", "start,center,end")) >= 0)
156 this->setSpacingAlign((SkTextBox::SpacingAlign)index);
157 else
158 assert_no_attr(dom, node, "spacing-align");
159
160 SkScalar s[2];
161 if (dom.findScalars(node, "margin", s, 2))
162 this->setMargin(s[0], s[1]);
163 else
164 assert_no_attr(dom, node, "margin");
165
166 const char* text = dom.findAttr(node, "text");
167 if (text)
168 this->setText(text);
169
170 if ((node = dom.getFirstChild(node, "paint")) != NULL &&
171 (node = dom.getFirstChild(node, "screenplay")) != NULL)
172 {
173 inflate_paint(dom, node, &fPaint);
174 }
175#endif
176}
177