blob: db85f01ff477a58a898785e03f5ddf8198291831 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
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#ifndef SkWidget_DEFINED
18#define SkWidget_DEFINED
19
20#include "SkView.h"
21#include "SkBitmap.h"
22#include "SkDOM.h"
23#include "SkPaint.h"
24#include "SkString.h"
25#include "SkTDArray.h"
26
27//////////////////////////////////////////////////////////////////////////////
28
29class SkWidget : public SkView {
30public:
31 SkWidget(uint32_t flags = 0) : SkView(flags | kFocusable_Mask | kEnabled_Mask) {}
32
33 /** Call this to post the widget's event to its listeners */
34 void postWidgetEvent();
35
36 static void Init();
37 static void Term();
38protected:
39 // override to add slots to an event before posting
40 virtual void prepareWidgetEvent(SkEvent*);
41 virtual void onEnabledChange();
42
43 // <event ...> to initialize the event from XML
44 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
45
46private:
47 SkEvent fEvent;
48 typedef SkView INHERITED;
49};
50
51class SkHasLabelWidget : public SkWidget {
52public:
53 SkHasLabelWidget(uint32_t flags = 0) : SkWidget(flags) {}
54
55 size_t getLabel(SkString* label = NULL) const;
56 size_t getLabel(char lable[] = NULL) const;
57 void setLabel(const SkString&);
58 void setLabel(const char label[]);
59 void setLabel(const char label[], size_t len);
60
61protected:
62 // called when the label changes
63 virtual void onLabelChange();
64
65 // overrides
66 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
67
68private:
69 SkString fLabel;
70 typedef SkWidget INHERITED;
71};
72
73class SkButtonWidget : public SkHasLabelWidget {
74public:
75 SkButtonWidget(uint32_t flags = 0) : SkHasLabelWidget(flags), fState(kOff_State) {}
76
77 enum State {
78 kOff_State, //!< XML: buttonState="off"
79 kOn_State, //!< XML: buttonState="on"
80 kUnknown_State //!< XML: buttonState="unknown"
81 };
82 State getButtonState() const { return fState; }
83 void setButtonState(State);
84
85protected:
86 /** called when the label changes. default behavior is to inval the widget */
87 virtual void onButtonStateChange();
88
89 // overrides
90 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
91
92private:
93 State fState;
94 typedef SkHasLabelWidget INHERITED;
95};
96
97class SkPushButtonWidget : public SkButtonWidget {
98public:
99 SkPushButtonWidget(uint32_t flags = 0) : SkButtonWidget(flags) {}
100
101protected:
102 virtual bool onEvent(const SkEvent&);
103 virtual void onDraw(SkCanvas*);
104 virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
105 virtual bool onClick(Click* click);
106
107private:
108 typedef SkButtonWidget INHERITED;
109};
110
111class SkCheckBoxWidget : public SkButtonWidget {
112public:
113 SkCheckBoxWidget(uint32_t flags = 0);
114
115protected:
116 virtual bool onEvent(const SkEvent&);
117 virtual void onDraw(SkCanvas*);
118 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
119
120private:
121 typedef SkButtonWidget INHERITED;
122};
123
124#include "SkTextBox.h"
125
126class SkStaticTextView : public SkView {
127public:
128 SkStaticTextView(uint32_t flags = 0);
129 virtual ~SkStaticTextView();
130
131 enum Mode {
132 kFixedSize_Mode,
133 kAutoWidth_Mode,
134 kAutoHeight_Mode,
135
136 kModeCount
137 };
138 Mode getMode() const { return (Mode)fMode; }
139 void setMode(Mode);
140
141 SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; }
142 void setSpacingAlign(SkTextBox::SpacingAlign);
143
144 void getMargin(SkPoint* margin) const;
145 void setMargin(SkScalar dx, SkScalar dy);
146
147 size_t getText(SkString* text = NULL) const;
148 size_t getText(char text[] = NULL) const;
149 void setText(const SkString&);
150 void setText(const char text[]);
151 void setText(const char text[], size_t len);
152
153 void getPaint(SkPaint*) const;
154 void setPaint(const SkPaint&);
155
156protected:
157 // overrides
158 virtual void onDraw(SkCanvas*);
159 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
160
161private:
162 SkPoint fMargin;
163 SkString fText;
164 SkPaint fPaint;
165 uint8_t fMode;
166 uint8_t fSpacingAlign;
167
168 void computeSize();
169
170 typedef SkView INHERITED;
171};
172
173class SkBitmapView : public SkView {
174public:
175 SkBitmapView(uint32_t flags = 0);
176 virtual ~SkBitmapView();
177
178 bool getBitmap(SkBitmap*) const;
179 void setBitmap(const SkBitmap*, bool viewOwnsPixels);
180 bool loadBitmapFromFile(const char path[]);
181
182protected:
183 virtual void onDraw(SkCanvas*);
184 virtual void onInflate(const SkDOM&, const SkDOM::Node*);
185
186private:
187 SkBitmap fBitmap;
188 typedef SkView INHERITED;
189};
190
191/////////////////////////////////////////////////////////////////////////////
192
193class SkShader;
194class SkInterpolator;
195
196class SkWidgetView : public SkView {
197public:
198 SkWidgetView(uint32_t flags = 0);
199 virtual ~SkWidgetView();
200
201 static const char* GetEventType();
202};
203
204class SkSliderView : public SkWidgetView {
205public:
206 SkSliderView(uint32_t flags = 0);
207
208 uint16_t getValue() const { return fValue; }
209 uint16_t getMax() const { return fMax; }
210
211 void setMax(U16CPU max);
212 void setValue(U16CPU value);
213
214protected:
215 virtual void onDraw(SkCanvas*);
216 virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
217 virtual bool onClick(Click*);
218
219private:
220 uint16_t fValue, fMax;
221
222 typedef SkWidgetView INHERITED;
223};
224
225//////////////////////////////////////////////////////////////////////////////
226
227class SkHasLabelView : public SkView {
228public:
229 void getLabel(SkString*) const;
230 void setLabel(const SkString&);
231 void setLabel(const char label[]);
232
233protected:
234 SkString fLabel;
235
236 // called when the label changes
237 virtual void onLabelChange();
238
239 // overrides
240 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
241};
242
243class SkPushButtonView : public SkHasLabelView {
244public:
245 SkPushButtonView(uint32_t flags = 0);
246
247protected:
248 virtual void onDraw(SkCanvas*);
249 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
250};
251
252class SkCheckBoxView : public SkHasLabelView {
253public:
254 SkCheckBoxView(uint32_t flags = 0);
255
256 enum State {
257 kOff_State,
258 kOn_State,
259 kMaybe_State
260 };
261 State getState() const { return fState; }
262 void setState(State);
263
264protected:
265 virtual void onDraw(SkCanvas*);
266 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
267
268private:
269 State fState;
270};
271
272class SkProgressView : public SkView {
273public:
274 SkProgressView(uint32_t flags = 0);
275 virtual ~SkProgressView();
276
277 uint16_t getValue() const { return fValue; }
278 uint16_t getMax() const { return fMax; }
279
280 void setMax(U16CPU max);
281 void setValue(U16CPU value);
282
283protected:
284 virtual void onDraw(SkCanvas*);
285 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
286
287private:
288 uint16_t fValue, fMax;
289 SkShader* fOnShader, *fOffShader;
290 SkInterpolator* fInterp;
291 bool fDoInterp;
292
293 typedef SkView INHERITED;
294};
295
296class SkTextView : public SkView {
297public:
298 SkTextView(uint32_t flags = 0);
299 virtual ~SkTextView();
300
301 enum AnimaDir {
302 kNeutral_AnimDir,
303 kForward_AnimDir,
304 kBackward_AnimDir,
305 kAnimDirCount
306 };
307
308 void getText(SkString*) const;
309 void setText(const SkString&, AnimaDir dir = kNeutral_AnimDir);
310 void setText(const char text[], AnimaDir dir = kNeutral_AnimDir);
311 void setText(const char text[], size_t len, AnimaDir dir = kNeutral_AnimDir);
312
313 void getMargin(SkPoint* margin) const;
314 void setMargin(const SkPoint&);
315
316 SkPaint& paint() { return fPaint; }
317
318protected:
319 virtual void onDraw(SkCanvas*);
320 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
321
322private:
323 SkString fText;
324 SkPaint fPaint;
325 SkPoint fMargin;
326
327 class Interp;
328 Interp* fInterp;
329 bool fDoInterp;
330 // called by the other setText methods. This guy does not check for !=
331 // before doing the assign, so the caller must check for us
332 void privSetText(const SkString&, AnimaDir dir);
333
334 typedef SkView INHERITED;
335};
336
337//////////////////////////////////////////////////////////
338
339class SkEvent;
340
341class SkListSource : public SkEventSink {
342public:
343 virtual int countRows() = 0;
344 virtual void getRow(int index, SkString* left, SkString* right) = 0;
345 virtual SkEvent* getEvent(int index);
346
347 static SkListSource* CreateFromDir(const char path[], const char suffix[],
348 const char targetPrefix[]);
349 static SkListSource* CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node);
350};
351
352class SkListView : public SkWidgetView {
353public:
354 SkListView(uint32_t flags = 0);
355 virtual ~SkListView();
356
357 SkScalar getRowHeight() const { return fRowHeight; }
358 void setRowHeight(SkScalar);
359
360 /** Return the index of the selected row, or -1 if none
361 */
362 int getSelection() const { return fCurrIndex; }
363 /** Set the index of the selected row, or -1 for none
364 */
365 void setSelection(int);
366
367 void moveSelectionUp();
368 void moveSelectionDown();
369
370 enum Attr {
371 kBG_Attr,
372 kNormalText_Attr,
373 kHiliteText_Attr,
374 kHiliteCell_Attr,
375 kAttrCount
376 };
377 SkPaint& paint(Attr);
378
379 SkListSource* getListSource() const { return fSource; }
380 SkListSource* setListSource(SkListSource*);
381
382#if 0
383 enum Action {
384 kSelectionChange_Action,
385 kSelectionPicked_Action,
386 kActionCount
387 };
388 /** If event is not null, it is retained by the view, and a copy
389 of the event will be posted to its listeners when the specified
390 action occurs. If event is null, then no event will be posted for
391 the specified action.
392 */
393 void setActionEvent(Action, SkEvent* event);
394#endif
395
396protected:
397 virtual void onDraw(SkCanvas*);
398 virtual void onSizeChange();
399 virtual bool onEvent(const SkEvent&);
400 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
401
402private:
403 SkPaint fPaint[kAttrCount];
404 SkListSource* fSource;
405 SkScalar fRowHeight;
406 int fCurrIndex; // logical index
407 int fScrollIndex; // logical index of top-most visible row
408 int fVisibleRowCount;
409 SkString* fStrCache;
410
411 void dirtyStrCache();
412 void ensureStrCache(int visibleCount);
413
414 int logicalToVisualIndex(int index) const { return index - fScrollIndex; }
415 void invalSelection();
416 bool getRowRect(int index, SkRect*) const;
417 void ensureSelectionIsVisible();
418
419 typedef SkWidgetView INHERITED;
420};
421
422//////////////////////////////////////////////////////////
423
424class SkGridView : public SkWidgetView {
425public:
426 SkGridView(uint32_t flags = 0);
427 virtual ~SkGridView();
428
429 void getCellSize(SkPoint*) const;
430 void setCellSize(SkScalar x, SkScalar y);
431
432 /** Return the index of the selected item, or -1 if none
433 */
434 int getSelection() const { return fCurrIndex; }
435 /** Set the index of the selected row, or -1 for none
436 */
437 void setSelection(int);
438
439 void moveSelectionUp();
440 void moveSelectionDown();
441
442 enum Attr {
443 kBG_Attr,
444 kHiliteCell_Attr,
445 kAttrCount
446 };
447 SkPaint& paint(Attr);
448
449 SkListSource* getListSource() const { return fSource; }
450 SkListSource* setListSource(SkListSource*);
451
452protected:
453 virtual void onDraw(SkCanvas*);
454 virtual void onSizeChange();
455 virtual bool onEvent(const SkEvent&);
456 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
457
458private:
459 SkView* fScrollBar;
460 SkPaint fPaint[kAttrCount];
461 SkListSource* fSource;
462 int fCurrIndex; // logical index
463
464 SkPoint fCellSize;
465 SkIPoint fVisibleCount;
466
467 int logicalToVisualIndex(int index) const { return index; }
468 void invalSelection();
469 bool getCellRect(int index, SkRect*) const;
470 void ensureSelectionIsVisible();
471
472 typedef SkWidgetView INHERITED;
473};
474
475#endif
476