Home | History | Annotate | Download | only in views
      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 invals the view's bounds.
     83         called with the old and new labels, before the label has actually changed.
     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 post 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 the 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 posted
    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 has
    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::SpacingAlign)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 SkListView,
    242         then it returns the index of the selected item in this list, otherwise it
    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     virtual int countFields();
    293     virtual void getFieldName(int index, SkString* field);
    294     /** Return the index of the named field, or -1 if not found */
    295     virtual int findFieldIndex(const char field[]);
    296 
    297     virtual int countRecords();
    298     virtual void getRecord(int rowIndex, int fieldIndex, SkString* data);
    299 
    300     virtual bool prepareWidgetEvent(SkEvent*, int rowIndex);
    301 
    302     static SkListSource* Factory(const char name[]);
    303 };
    304 
    305 #endif
    306