• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
23 enum 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
36 enum 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
48 const char* get_skin_enum_path(SkinEnum se);
49 void init_skin_anim(const char path[], SkAnimator* anim);
50 void init_skin_anim(SkinEnum se, SkAnimator* anim);
51 void init_skin_paint(SkinEnum se, SkPaint* paint);
52 void 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 */
57 SkView* 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 */
62 SkView* SkWidgetFactory(const char name[]);
63 
64 ////////////////////////////////////////////////////////////////////////////////////////////////
65 
66 class SkWidgetView : public SkView {
67 public:
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 
event()77     SkEvent&        event() { return fEvent; }
event()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 
88 protected:
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 
104 private:
105     SkString    fLabel;
106     SkEvent     fEvent;
107 
108     typedef SkView INHERITED;
109 };
110 
111 ////////////////////////////////////////////////////////////////////////////////////////////////
112 
113 class SkButtonView : public SkWidgetView {
114 public:
115     // inflate: "sk-button"
116 
117 protected:
118     // overrides
119     virtual bool onEvent(const SkEvent&);
120 private:
121     typedef SkWidgetView INHERITED;
122 };
123 
124 ////////////////////////////////////////////////////////////////////////////////////////////////
125 
126 class SkCheckButtonView : public SkWidgetView {
127 public:
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     };
getCheckState()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 
147 protected:
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 
155 private:
156     uint8_t  fCheckState;
157 
158     typedef SkWidgetView INHERITED;
159 };
160 
161 ////////////////////////////////////////////////////////////////////////////////////////////////
162 #include "SkTextBox.h"
163 
164 class SkStaticTextView : public SkView {
165 public:
166             SkStaticTextView();
167     virtual ~SkStaticTextView();
168 
169     enum Mode {
170         kFixedSize_Mode,
171         kAutoWidth_Mode,
172         kAutoHeight_Mode,
173 
174         kModeCount
175     };
getMode()176     Mode    getMode() const { return (Mode)fMode; }
177     void    setMode(Mode);
178 
getSpacingAlign()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 
194 protected:
195     // overrides
196     virtual void onDraw(SkCanvas*);
197     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
198 
199 private:
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 
213 class SkAnimator;
214 class SkListSource;
215 class SkScrollBarView;
216 
217 class SkListView : public SkWidgetView {
218 public:
219             SkListView();
220     virtual ~SkListView();
221 
hasScrollBar()222     bool    hasScrollBar() const { return fScrollBar != NULL; }
223     void    setHasScrollBar(bool);
224 
225     /** Return the number of visible rows
226     */
getVisibleRowCount()227     int     getVisibleRowCount() const { return fVisibleRowCount; }
228     /** Return the index of the selected row, or -1 if none
229     */
getSelection()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 
getListSource()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 
254 protected:
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 
262 private:
263     enum DirtyFlags {
264         kAnimCount_DirtyFlag    = 0x01,
265         kAnimContent_DirtyFlag  = 0x02
266     };
267     void    dirtyCache(unsigned dirtyFlags);
268     bool    ensureCache();
269 
logicalToVisualIndex(int index)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 
297 class SkListSource : public SkRefCnt {
298 public:
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
313