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