Home | History | Annotate | Download | only in views
      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
    413