blob: 9b3a8160d523ba85d2db065b3253b5fff485988f [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 SkWidgetViews_DEFINED
18#define SkWidgetViews_DEFINED
19
20#include "SkView.h"
21
22
23enum SkWidgetEnum {
24 kBorder_WidgetEnum, //!< <sk-border>
25 kButton_WidgetEnum, //!< <sk-button>
26 kImage_WidgetEnum, //!< <sk-image>
27 kList_WidgetEnum, //!< <sk-list>
28 kProgress_WidgetEnum, //!< <sk-progress>
29 kScroll_WidgetEnum, //!< <sk-scroll>
30 kText_WidgetEnum, //!< <sk-text>
31
32 kWidgetEnumCount
33};
34
35//determines which skin to use
36enum SkinEnum {
37 kBorder_SkinEnum,
38 kButton_SkinEnum,
39 kProgress_SkinEnum,
40 kScroll_SkinEnum,
41 kStaticText_SkinEnum,
42
43 kSkinEnumCount
44};
45
46#include "SkAnimator.h"
47//used for inflates
48const char* get_skin_enum_path(SkinEnum se);
49void init_skin_anim(const char path[], SkAnimator* anim);
50void init_skin_anim(SkinEnum se, SkAnimator* anim);
51void init_skin_paint(SkinEnum se, SkPaint* paint);
52void inflate_paint(const SkDOM& dom, const SkDOM::Node* node, SkPaint* paint);
53
54/** Given an enum value, return an instance of the specified widget.
55 If the enum is out of range, returns null
56*/
57SkView* SkWidgetFactory(SkWidgetEnum);
58/** Given the inflate/element name of a widget, return an instance of
59 the specified widget, or null if name does not match any known
60 widget type.
61*/
62SkView* SkWidgetFactory(const char name[]);
63
64////////////////////////////////////////////////////////////////////////////////////////////////
65
66class SkWidgetView : public SkView {
67public:
68 SkWidgetView();
69
70 const char* getLabel() const;
71 void getLabel(SkString* label) const;
72
73 void setLabel(const char[]);
74 void setLabel(const char[], size_t len);
75 void setLabel(const SkString&);
76
77 SkEvent& event() { return fEvent; }
78 const SkEvent& event() const { return fEvent; }
79
80 /** Returns true if the widget can post its event to its listeners.
81 */
82 bool postWidgetEvent();
83
84 /** Returns the sinkID of the widgetview that posted the event, or 0
85 */
86 static SkEventSinkID GetWidgetEventSinkID(const SkEvent&);
87
88protected:
89 /** called when the label changes. override in subclasses. default action invals the view's bounds.
90 called with the old and new labels, before the label has actually changed.
91 */
92 virtual void onLabelChange(const char oldLabel[], const char newLabel[]);
93 /** called before posting the event to our listeners. Override to add slots to the event
94 before posting. Return true to proceed with posting, or false to not post the event to any
95 listener. Note: the event passed in may not be the same as calling this->event().
96 Be sure to call your INHERITED method as well, so that all classes in the hierarchy get a shot
97 at modifying the event (and possibly returning false to abort).
98 */
99 virtual bool onPrepareWidgetEvent(SkEvent* evt);
100
101 // overrides
102 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
103
104private:
105 SkString fLabel;
106 SkEvent fEvent;
107
108 typedef SkView INHERITED;
109};
110
111////////////////////////////////////////////////////////////////////////////////////////////////
112
113class SkButtonView : public SkWidgetView {
114public:
115 // inflate: "sk-button"
116
117protected:
118 // overrides
119 virtual bool onEvent(const SkEvent&);
bsalomon@google.comc8ad63e2011-03-18 14:29:44 +0000120private:
121 typedef SkWidgetView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000122};
123
124////////////////////////////////////////////////////////////////////////////////////////////////
125
126class SkCheckButtonView : public SkWidgetView {
127public:
128 SkCheckButtonView();
129
130 // inflate: "sk-checkbutton"
131
132 enum CheckState {
133 kOff_CheckState, //!< inflate: check-state="off"
134 kOn_CheckState, //!< inflate: check-state="on"
135 kUnknown_CheckState //!< inflate: check-state="unknown"
136 };
137 CheckState getCheckState() const { return (CheckState)fCheckState; }
138 void setCheckState(CheckState);
139
140 /** use this to extract the CheckState from an event (i.e. one that as posted
141 by a SkCheckButtonView). Returns true if the proper slot was present in the event,
142 and sets state to that value. If no proper slot is found, returns false and does not
143 modify state.
144 */
145 static bool GetWidgetEventCheckState(const SkEvent&, CheckState* state);
146
147protected:
148 // called when the check-state is about to change, but before it actually has
149 virtual void onCheckStateChange(CheckState oldState, CheckState newState);
150
151 // overrides
152 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
153 virtual bool onPrepareWidgetEvent(SkEvent* evt);
154
155private:
156 uint8_t fCheckState;
157
158 typedef SkWidgetView INHERITED;
159};
160
161////////////////////////////////////////////////////////////////////////////////////////////////
162#include "SkTextBox.h"
163
164class SkStaticTextView : public SkView {
165public:
166 SkStaticTextView();
167 virtual ~SkStaticTextView();
168
169 enum Mode {
170 kFixedSize_Mode,
171 kAutoWidth_Mode,
172 kAutoHeight_Mode,
173
174 kModeCount
175 };
176 Mode getMode() const { return (Mode)fMode; }
177 void setMode(Mode);
178
179 SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; }
180 void setSpacingAlign(SkTextBox::SpacingAlign);
181
182 void getMargin(SkPoint* margin) const;
183 void setMargin(SkScalar dx, SkScalar dy);
184
185 size_t getText(SkString* text = NULL) const;
186 size_t getText(char text[] = NULL) const;
187 void setText(const SkString&);
188 void setText(const char text[]);
189 void setText(const char text[], size_t len);
190
191 void getPaint(SkPaint*) const;
192 void setPaint(const SkPaint&);
193
194protected:
195 // overrides
196 virtual void onDraw(SkCanvas*);
197 virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
198
199private:
200 SkPoint fMargin;
201 SkString fText;
202 SkPaint fPaint;
203 uint8_t fMode;
204 uint8_t fSpacingAlign;
205
206 void computeSize();
207
208 typedef SkView INHERITED;
209};
210
211////////////////////////////////////////////////////////////////////////////////////////////////
212
213class SkAnimator;
214class SkListSource;
215class SkScrollBarView;
216
217class SkListView : public SkWidgetView {
218public:
219 SkListView();
220 virtual ~SkListView();
221
222 bool hasScrollBar() const { return fScrollBar != NULL; }
223 void setHasScrollBar(bool);
224
225 /** Return the number of visible rows
226 */
227 int getVisibleRowCount() const { return fVisibleRowCount; }
228 /** Return the index of the selected row, or -1 if none
229 */
230 int getSelection() const { return fCurrIndex; }
231 /** Set the index of the selected row, or -1 for none
232 */
233 void setSelection(int);
234 /** If possible, move the selection up and return true,
235 else do nothing and return false
236 If nothing is selected, select the last item (unless there are no items).
237 */
238 bool moveSelectionUp();
239 /** If possible, move the selection down and return true,
240 else do nothing and return false.
241 If nothing is selected, select the first item (unless there are no items).
242 */
243 bool moveSelectionDown();
244
245 SkListSource* getListSource() const { return fSource; }
246 SkListSource* setListSource(SkListSource*);
247
248 /** Call this in your event handler. If the specified event is from a SkListView,
249 then it returns the index of the selected item in this list, otherwise it
250 returns -1
251 */
252 static int GetWidgetEventListIndex(const SkEvent&);
253
254protected:
255 // overrides
256 virtual void onDraw(SkCanvas*);
257 virtual void onSizeChange();
258 virtual bool onEvent(const SkEvent&);
259 virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
260 virtual bool onPrepareWidgetEvent(SkEvent*);
261
262private:
263 enum DirtyFlags {
264 kAnimCount_DirtyFlag = 0x01,
265 kAnimContent_DirtyFlag = 0x02
266 };
267 void dirtyCache(unsigned dirtyFlags);
268 bool ensureCache();
269
270 int logicalToVisualIndex(int index) const { return index - fScrollIndex; }
271 void invalSelection();
272 SkScalar getContentWidth() const;
273 bool getRowRect(int index, SkRect*) const;
274 void ensureSelectionIsVisible();
275 void ensureVisibleRowCount();
276
277 struct BindingRec;
278
279 enum Heights {
280 kNormal_Height,
281 kSelected_Height
282 };
283 SkListSource* fSource;
284 SkScrollBarView* fScrollBar;
285 SkAnimator* fAnims;
286 BindingRec* fBindings;
287 SkString fSkinName;
288 SkScalar fHeights[2];
289 int16_t fScrollIndex, fCurrIndex;
290 uint16_t fVisibleRowCount, fBindingCount;
291 SkBool8 fAnimContentDirty;
292 SkBool8 fAnimFocusDirty;
293
294 typedef SkWidgetView INHERITED;
295};
296
297class SkListSource : public SkRefCnt {
298public:
299 virtual int countFields();
300 virtual void getFieldName(int index, SkString* field);
301 /** Return the index of the named field, or -1 if not found */
302 virtual int findFieldIndex(const char field[]);
303
304 virtual int countRecords();
305 virtual void getRecord(int rowIndex, int fieldIndex, SkString* data);
306
307 virtual bool prepareWidgetEvent(SkEvent*, int rowIndex);
308
309 static SkListSource* Factory(const char name[]);
310};
311
312#endif