C++11 override should now be supported by all of {bots,Chrome,Android,Mozilla}
[platform/upstream/libSkiaSharp.git] / include / views / SkWidget.h
1 /*
2  * Copyright 2006 The Android Open Source Project
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #ifndef SkWidget_DEFINED
9 #define SkWidget_DEFINED
10
11 #include "SkBitmap.h"
12 #include "SkDOM.h"
13 #include "SkPaint.h"
14 #include "SkString.h"
15 #include "SkTDArray.h"
16 #include "SkTextBox.h"
17 #include "SkView.h"
18
19 class SkEvent;
20 class SkInterpolator;
21 class SkShader;
22
23 ////////////////////////////////////////////////////////////////////////////////
24
25 class SkWidget : public SkView {
26 public:
27     SkWidget(uint32_t flags = 0) : SkView(flags | kFocusable_Mask | kEnabled_Mask) {}
28
29     /** Call this to post the widget's event to its listeners */
30     void    postWidgetEvent();
31
32     static void Init();
33     static void Term();
34 protected:
35     // override to add slots to an event before posting
36     virtual void prepareWidgetEvent(SkEvent*);
37     virtual void onEnabledChange();
38
39     // <event ...> to initialize the event from XML
40     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
41
42 private:
43     SkEvent fEvent;
44     typedef SkView INHERITED;
45 };
46
47 ////////////////////////////////////////////////////////////////////////////////
48
49 class SkHasLabelWidget : public SkWidget {
50 public:
51     SkHasLabelWidget(uint32_t flags = 0) : SkWidget(flags) {}
52
53     size_t  getLabel(SkString* label = NULL) const;
54     size_t  getLabel(char lable[] = NULL) const;
55     void    setLabel(const SkString&);
56     void    setLabel(const char label[]);
57     void    setLabel(const char label[], size_t len);
58
59 protected:
60     // called when the label changes
61     virtual void onLabelChange();
62
63     // overrides
64     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
65
66 private:
67     SkString    fLabel;
68     typedef SkWidget INHERITED;
69 };
70
71 ////////////////////////////////////////////////////////////////////////////////
72
73 class SkButtonWidget : public SkHasLabelWidget {
74 public:
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
85 protected:
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
92 private:
93     State   fState;
94     typedef SkHasLabelWidget INHERITED;
95 };
96
97 ////////////////////////////////////////////////////////////////////////////////
98
99 class SkPushButtonWidget : public SkButtonWidget {
100 public:
101     SkPushButtonWidget(uint32_t flags = 0) : SkButtonWidget(flags) {}
102
103 protected:
104     bool onEvent(const SkEvent&) override;
105     void onDraw(SkCanvas*) override;
106     Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override;
107     bool onClick(Click* click) override;
108
109 private:
110     typedef SkButtonWidget INHERITED;
111 };
112
113 ////////////////////////////////////////////////////////////////////////////////
114
115 class SkCheckBoxWidget : public SkButtonWidget {
116 public:
117     SkCheckBoxWidget(uint32_t flags = 0);
118
119 protected:
120     virtual bool onEvent(const SkEvent&);
121     virtual void onDraw(SkCanvas*);
122     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
123
124 private:
125     typedef SkButtonWidget INHERITED;
126 };
127
128 ////////////////////////////////////////////////////////////////////////////////
129
130 class SkStaticTextView : public SkView {
131 public:
132             SkStaticTextView(uint32_t flags = 0);
133     virtual ~SkStaticTextView();
134
135     enum Mode {
136         kFixedSize_Mode,
137         kAutoWidth_Mode,
138         kAutoHeight_Mode,
139
140         kModeCount
141     };
142     Mode    getMode() const { return (Mode)fMode; }
143     void    setMode(Mode);
144
145     SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; }
146     void    setSpacingAlign(SkTextBox::SpacingAlign);
147
148     void    getMargin(SkPoint* margin) const;
149     void    setMargin(SkScalar dx, SkScalar dy);
150
151     size_t  getText(SkString* text = NULL) const;
152     size_t  getText(char text[] = NULL) const;
153     void    setText(const SkString&);
154     void    setText(const char text[]);
155     void    setText(const char text[], size_t len);
156
157     void    getPaint(SkPaint*) const;
158     void    setPaint(const SkPaint&);
159
160 protected:
161     // overrides
162     virtual void onDraw(SkCanvas*);
163     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
164
165 private:
166     SkPoint     fMargin;
167     SkString    fText;
168     SkPaint     fPaint;
169     uint8_t     fMode;
170     uint8_t     fSpacingAlign;
171
172     void computeSize();
173
174     typedef SkView INHERITED;
175 };
176
177 ////////////////////////////////////////////////////////////////////////////////
178
179 class SkBitmapView : public SkView {
180 public:
181             SkBitmapView(uint32_t flags = 0);
182     virtual ~SkBitmapView();
183
184     bool    getBitmap(SkBitmap*) const;
185     void    setBitmap(const SkBitmap*, bool viewOwnsPixels);
186     bool    loadBitmapFromFile(const char path[]);
187
188 protected:
189     virtual void onDraw(SkCanvas*);
190     virtual void onInflate(const SkDOM&, const SkDOM::Node*);
191
192 private:
193     SkBitmap    fBitmap;
194     typedef SkView INHERITED;
195 };
196
197 ////////////////////////////////////////////////////////////////////////////////
198
199 class SkHasLabelView : public SkView {
200 public:
201     void    getLabel(SkString*) const;
202     void    setLabel(const SkString&);
203     void    setLabel(const char label[]);
204
205 protected:
206     SkString    fLabel;
207
208     // called when the label changes
209     virtual void onLabelChange();
210
211     // overrides
212     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
213 };
214
215 ////////////////////////////////////////////////////////////////////////////////
216
217 class SkPushButtonView : public SkHasLabelView {
218 public:
219     SkPushButtonView(uint32_t flags = 0);
220
221 protected:
222     virtual void onDraw(SkCanvas*);
223     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
224 };
225
226 ////////////////////////////////////////////////////////////////////////////////
227
228 class SkCheckBoxView : public SkHasLabelView {
229 public:
230     SkCheckBoxView(uint32_t flags = 0);
231
232     enum State {
233         kOff_State,
234         kOn_State,
235         kMaybe_State
236     };
237     State   getState() const { return fState; }
238     void    setState(State);
239
240 protected:
241     virtual void onDraw(SkCanvas*);
242     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
243
244 private:
245     State   fState;
246 };
247
248 ////////////////////////////////////////////////////////////////////////////////
249
250 class SkProgressView : public SkView {
251 public:
252     SkProgressView(uint32_t flags = 0);
253     virtual ~SkProgressView();
254
255     uint16_t    getValue() const { return fValue; }
256     uint16_t    getMax() const { return fMax; }
257
258     void    setMax(U16CPU max);
259     void    setValue(U16CPU value);
260
261 protected:
262     virtual void onDraw(SkCanvas*);
263     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
264
265 private:
266     uint16_t    fValue, fMax;
267     SkShader*   fOnShader, *fOffShader;
268     SkInterpolator* fInterp;
269     bool fDoInterp;
270
271     typedef SkView INHERITED;
272 };
273
274 ////////////////////////////////////////////////////////////////////////////////
275
276 class SkListSource : public SkEventSink {
277 public:
278     virtual int countRows() = 0;
279     virtual void getRow(int index, SkString* left, SkString* right) = 0;
280     virtual SkEvent* getEvent(int index);
281
282     static SkListSource* CreateFromDir(const char path[], const char suffix[],
283                                         const char targetPrefix[]);
284     static SkListSource* CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node);
285 };
286
287 ////////////////////////////////////////////////////////////////////////////////
288
289 class SkListView : public SkView {
290 public:
291             SkListView(uint32_t flags = 0);
292     virtual ~SkListView();
293
294     SkScalar    getRowHeight() const { return fRowHeight; }
295     void        setRowHeight(SkScalar);
296
297     /** Return the index of the selected row, or -1 if none
298     */
299     int     getSelection() const { return fCurrIndex; }
300     /** Set the index of the selected row, or -1 for none
301     */
302     void    setSelection(int);
303
304     void    moveSelectionUp();
305     void    moveSelectionDown();
306
307     enum Attr {
308         kBG_Attr,
309         kNormalText_Attr,
310         kHiliteText_Attr,
311         kHiliteCell_Attr,
312         kAttrCount
313     };
314     SkPaint&    paint(Attr);
315
316     SkListSource*   getListSource() const { return fSource; }
317     SkListSource*   setListSource(SkListSource*);
318
319 #if 0
320     enum Action {
321         kSelectionChange_Action,
322         kSelectionPicked_Action,
323         kActionCount
324     };
325     /** If event is not null, it is retained by the view, and a copy
326         of the event will be posted to its listeners when the specified
327         action occurs. If event is null, then no event will be posted for
328         the specified action.
329     */
330     void    setActionEvent(Action, SkEvent* event);
331 #endif
332
333 protected:
334     virtual void onDraw(SkCanvas*);
335     virtual void onSizeChange();
336     virtual bool onEvent(const SkEvent&);
337     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
338
339 private:
340     SkPaint         fPaint[kAttrCount];
341     SkListSource*   fSource;
342     SkScalar        fRowHeight;
343     int             fCurrIndex;     // logical index
344     int             fScrollIndex;   // logical index of top-most visible row
345     int             fVisibleRowCount;
346     SkString*       fStrCache;
347
348     void    dirtyStrCache();
349     void    ensureStrCache(int visibleCount);
350
351     int     logicalToVisualIndex(int index) const { return index - fScrollIndex; }
352     void    invalSelection();
353     bool    getRowRect(int index, SkRect*) const;
354     void    ensureSelectionIsVisible();
355
356     typedef SkView INHERITED;
357 };
358
359 ////////////////////////////////////////////////////////////////////////////////
360
361 class SkGridView : public SkView {
362 public:
363             SkGridView(uint32_t flags = 0);
364     virtual ~SkGridView();
365
366     void    getCellSize(SkPoint*) const;
367     void    setCellSize(SkScalar x, SkScalar y);
368
369     /** Return the index of the selected item, or -1 if none
370     */
371     int     getSelection() const { return fCurrIndex; }
372     /** Set the index of the selected row, or -1 for none
373     */
374     void    setSelection(int);
375
376     void    moveSelectionUp();
377     void    moveSelectionDown();
378
379     enum Attr {
380         kBG_Attr,
381         kHiliteCell_Attr,
382         kAttrCount
383     };
384     SkPaint&    paint(Attr);
385
386     SkListSource*   getListSource() const { return fSource; }
387     SkListSource*   setListSource(SkListSource*);
388
389 protected:
390     virtual void onDraw(SkCanvas*);
391     virtual void onSizeChange();
392     virtual bool onEvent(const SkEvent&);
393     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
394
395 private:
396     SkView*         fScrollBar;
397     SkPaint         fPaint[kAttrCount];
398     SkListSource*   fSource;
399     int             fCurrIndex;     // logical index
400
401     SkPoint         fCellSize;
402     SkIPoint        fVisibleCount;
403
404     int     logicalToVisualIndex(int index) const { return index; }
405     void    invalSelection();
406     bool    getCellRect(int index, SkRect*) const;
407     void    ensureSelectionIsVisible();
408
409     typedef SkView INHERITED;
410 };
411
412 #endif