Home | History | Annotate | Download | only in views
      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 SkWidget_DEFINED
     18 #define SkWidget_DEFINED
     19 
     20 #include "SkView.h"
     21 #include "SkBitmap.h"
     22 #include "SkDOM.h"
     23 #include "SkPaint.h"
     24 #include "SkString.h"
     25 #include "SkTDArray.h"
     26 
     27 //////////////////////////////////////////////////////////////////////////////
     28 
     29 class SkWidget : public SkView {
     30 public:
     31     SkWidget(uint32_t flags = 0) : SkView(flags | kFocusable_Mask | kEnabled_Mask) {}
     32 
     33     /** Call this to post the widget's event to its listeners */
     34     void    postWidgetEvent();
     35 
     36     static void Init();
     37     static void Term();
     38 protected:
     39     // override to add slots to an event before posting
     40     virtual void prepareWidgetEvent(SkEvent*);
     41     virtual void onEnabledChange();
     42 
     43     // <event ...> to initialize the event from XML
     44     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
     45 
     46 private:
     47     SkEvent fEvent;
     48     typedef SkView INHERITED;
     49 };
     50 
     51 class SkHasLabelWidget : public SkWidget {
     52 public:
     53     SkHasLabelWidget(uint32_t flags = 0) : SkWidget(flags) {}
     54 
     55     size_t  getLabel(SkString* label = NULL) const;
     56     size_t  getLabel(char lable[] = NULL) const;
     57     void    setLabel(const SkString&);
     58     void    setLabel(const char label[]);
     59     void    setLabel(const char label[], size_t len);
     60 
     61 protected:
     62     // called when the label changes
     63     virtual void onLabelChange();
     64 
     65     // overrides
     66     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
     67 
     68 private:
     69     SkString    fLabel;
     70     typedef SkWidget INHERITED;
     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 class SkPushButtonWidget : public SkButtonWidget {
     98 public:
     99     SkPushButtonWidget(uint32_t flags = 0) : SkButtonWidget(flags) {}
    100 
    101 protected:
    102     virtual bool onEvent(const SkEvent&);
    103     virtual void onDraw(SkCanvas*);
    104     virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
    105     virtual bool onClick(Click* click);
    106 
    107 private:
    108     typedef SkButtonWidget INHERITED;
    109 };
    110 
    111 class SkCheckBoxWidget : public SkButtonWidget {
    112 public:
    113     SkCheckBoxWidget(uint32_t flags = 0);
    114 
    115 protected:
    116     virtual bool onEvent(const SkEvent&);
    117     virtual void onDraw(SkCanvas*);
    118     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
    119 
    120 private:
    121     typedef SkButtonWidget INHERITED;
    122 };
    123 
    124 #include "SkTextBox.h"
    125 
    126 class SkStaticTextView : public SkView {
    127 public:
    128             SkStaticTextView(uint32_t flags = 0);
    129     virtual ~SkStaticTextView();
    130 
    131     enum Mode {
    132         kFixedSize_Mode,
    133         kAutoWidth_Mode,
    134         kAutoHeight_Mode,
    135 
    136         kModeCount
    137     };
    138     Mode    getMode() const { return (Mode)fMode; }
    139     void    setMode(Mode);
    140 
    141     SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; }
    142     void    setSpacingAlign(SkTextBox::SpacingAlign);
    143 
    144     void    getMargin(SkPoint* margin) const;
    145     void    setMargin(SkScalar dx, SkScalar dy);
    146 
    147     size_t  getText(SkString* text = NULL) const;
    148     size_t  getText(char text[] = NULL) const;
    149     void    setText(const SkString&);
    150     void    setText(const char text[]);
    151     void    setText(const char text[], size_t len);
    152 
    153     void    getPaint(SkPaint*) const;
    154     void    setPaint(const SkPaint&);
    155 
    156 protected:
    157     // overrides
    158     virtual void onDraw(SkCanvas*);
    159     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
    160 
    161 private:
    162     SkPoint     fMargin;
    163     SkString    fText;
    164     SkPaint     fPaint;
    165     uint8_t     fMode;
    166     uint8_t     fSpacingAlign;
    167 
    168     void computeSize();
    169 
    170     typedef SkView INHERITED;
    171 };
    172 
    173 class SkBitmapView : public SkView {
    174 public:
    175             SkBitmapView(uint32_t flags = 0);
    176     virtual ~SkBitmapView();
    177 
    178     bool    getBitmap(SkBitmap*) const;
    179     void    setBitmap(const SkBitmap*, bool viewOwnsPixels);
    180     bool    loadBitmapFromFile(const char path[]);
    181 
    182 protected:
    183     virtual void onDraw(SkCanvas*);
    184     virtual void onInflate(const SkDOM&, const SkDOM::Node*);
    185 
    186 private:
    187     SkBitmap    fBitmap;
    188     typedef SkView INHERITED;
    189 };
    190 
    191 /////////////////////////////////////////////////////////////////////////////
    192 
    193 class SkShader;
    194 class SkInterpolator;
    195 
    196 class SkWidgetView : public SkView {
    197 public:
    198             SkWidgetView(uint32_t flags = 0);
    199     virtual ~SkWidgetView();
    200 
    201     static const char*  GetEventType();
    202 };
    203 
    204 class SkSliderView : public SkWidgetView {
    205 public:
    206     SkSliderView(uint32_t flags = 0);
    207 
    208     uint16_t    getValue() const { return fValue; }
    209     uint16_t    getMax() const { return fMax; }
    210 
    211     void    setMax(U16CPU max);
    212     void    setValue(U16CPU value);
    213 
    214 protected:
    215     virtual void    onDraw(SkCanvas*);
    216     virtual Click*  onFindClickHandler(SkScalar x, SkScalar y);
    217     virtual bool    onClick(Click*);
    218 
    219 private:
    220     uint16_t fValue, fMax;
    221 
    222     typedef SkWidgetView INHERITED;
    223 };
    224 
    225 //////////////////////////////////////////////////////////////////////////////
    226 
    227 class SkHasLabelView : public SkView {
    228 public:
    229     void    getLabel(SkString*) const;
    230     void    setLabel(const SkString&);
    231     void    setLabel(const char label[]);
    232 
    233 protected:
    234     SkString    fLabel;
    235 
    236     // called when the label changes
    237     virtual void onLabelChange();
    238 
    239     // overrides
    240     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
    241 };
    242 
    243 class SkPushButtonView : public SkHasLabelView {
    244 public:
    245     SkPushButtonView(uint32_t flags = 0);
    246 
    247 protected:
    248     virtual void onDraw(SkCanvas*);
    249     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
    250 };
    251 
    252 class SkCheckBoxView : public SkHasLabelView {
    253 public:
    254     SkCheckBoxView(uint32_t flags = 0);
    255 
    256     enum State {
    257         kOff_State,
    258         kOn_State,
    259         kMaybe_State
    260     };
    261     State   getState() const { return fState; }
    262     void    setState(State);
    263 
    264 protected:
    265     virtual void onDraw(SkCanvas*);
    266     virtual void onInflate(const SkDOM& dom, const SkDOM::Node*);
    267 
    268 private:
    269     State   fState;
    270 };
    271 
    272 class SkProgressView : public SkView {
    273 public:
    274     SkProgressView(uint32_t flags = 0);
    275     virtual ~SkProgressView();
    276 
    277     uint16_t    getValue() const { return fValue; }
    278     uint16_t    getMax() const { return fMax; }
    279 
    280     void    setMax(U16CPU max);
    281     void    setValue(U16CPU value);
    282 
    283 protected:
    284     virtual void onDraw(SkCanvas*);
    285     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
    286 
    287 private:
    288     uint16_t    fValue, fMax;
    289     SkShader*   fOnShader, *fOffShader;
    290     SkInterpolator* fInterp;
    291     bool fDoInterp;
    292 
    293     typedef SkView INHERITED;
    294 };
    295 
    296 class SkTextView : public SkView {
    297 public:
    298             SkTextView(uint32_t flags = 0);
    299     virtual ~SkTextView();
    300 
    301     enum AnimaDir {
    302         kNeutral_AnimDir,
    303         kForward_AnimDir,
    304         kBackward_AnimDir,
    305         kAnimDirCount
    306     };
    307 
    308     void    getText(SkString*) const;
    309     void    setText(const SkString&, AnimaDir dir = kNeutral_AnimDir);
    310     void    setText(const char text[], AnimaDir dir = kNeutral_AnimDir);
    311     void    setText(const char text[], size_t len, AnimaDir dir = kNeutral_AnimDir);
    312 
    313     void    getMargin(SkPoint* margin) const;
    314     void    setMargin(const SkPoint&);
    315 
    316     SkPaint&    paint() { return fPaint; }
    317 
    318 protected:
    319     virtual void onDraw(SkCanvas*);
    320     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
    321 
    322 private:
    323     SkString fText;
    324     SkPaint  fPaint;
    325     SkPoint  fMargin;
    326 
    327     class Interp;
    328     Interp* fInterp;
    329     bool    fDoInterp;
    330     // called by the other setText methods. This guy does not check for !=
    331     // before doing the assign, so the caller must check for us
    332     void privSetText(const SkString&, AnimaDir dir);
    333 
    334     typedef SkView INHERITED;
    335 };
    336 
    337 //////////////////////////////////////////////////////////
    338 
    339 class SkEvent;
    340 
    341 class SkListSource : public SkEventSink {
    342 public:
    343     virtual int countRows() = 0;
    344     virtual void getRow(int index, SkString* left, SkString* right) = 0;
    345     virtual SkEvent* getEvent(int index);
    346 
    347     static SkListSource* CreateFromDir(const char path[], const char suffix[],
    348                                         const char targetPrefix[]);
    349     static SkListSource* CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node);
    350 };
    351 
    352 class SkListView : public SkWidgetView {
    353 public:
    354             SkListView(uint32_t flags = 0);
    355     virtual ~SkListView();
    356 
    357     SkScalar    getRowHeight() const { return fRowHeight; }
    358     void        setRowHeight(SkScalar);
    359 
    360     /** Return the index of the selected row, or -1 if none
    361     */
    362     int     getSelection() const { return fCurrIndex; }
    363     /** Set the index of the selected row, or -1 for none
    364     */
    365     void    setSelection(int);
    366 
    367     void    moveSelectionUp();
    368     void    moveSelectionDown();
    369 
    370     enum Attr {
    371         kBG_Attr,
    372         kNormalText_Attr,
    373         kHiliteText_Attr,
    374         kHiliteCell_Attr,
    375         kAttrCount
    376     };
    377     SkPaint&    paint(Attr);
    378 
    379     SkListSource*   getListSource() const { return fSource; }
    380     SkListSource*   setListSource(SkListSource*);
    381 
    382 #if 0
    383     enum Action {
    384         kSelectionChange_Action,
    385         kSelectionPicked_Action,
    386         kActionCount
    387     };
    388     /** If event is not null, it is retained by the view, and a copy
    389         of the event will be posted to its listeners when the specified
    390         action occurs. If event is null, then no event will be posted for
    391         the specified action.
    392     */
    393     void    setActionEvent(Action, SkEvent* event);
    394 #endif
    395 
    396 protected:
    397     virtual void onDraw(SkCanvas*);
    398     virtual void onSizeChange();
    399     virtual bool onEvent(const SkEvent&);
    400     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
    401 
    402 private:
    403     SkPaint         fPaint[kAttrCount];
    404     SkListSource*   fSource;
    405     SkScalar        fRowHeight;
    406     int             fCurrIndex;     // logical index
    407     int             fScrollIndex;   // logical index of top-most visible row
    408     int             fVisibleRowCount;
    409     SkString*       fStrCache;
    410 
    411     void    dirtyStrCache();
    412     void    ensureStrCache(int visibleCount);
    413 
    414     int     logicalToVisualIndex(int index) const { return index - fScrollIndex; }
    415     void    invalSelection();
    416     bool    getRowRect(int index, SkRect*) const;
    417     void    ensureSelectionIsVisible();
    418 
    419     typedef SkWidgetView INHERITED;
    420 };
    421 
    422 //////////////////////////////////////////////////////////
    423 
    424 class SkGridView : public SkWidgetView {
    425 public:
    426             SkGridView(uint32_t flags = 0);
    427     virtual ~SkGridView();
    428 
    429     void    getCellSize(SkPoint*) const;
    430     void    setCellSize(SkScalar x, SkScalar y);
    431 
    432     /** Return the index of the selected item, or -1 if none
    433     */
    434     int     getSelection() const { return fCurrIndex; }
    435     /** Set the index of the selected row, or -1 for none
    436     */
    437     void    setSelection(int);
    438 
    439     void    moveSelectionUp();
    440     void    moveSelectionDown();
    441 
    442     enum Attr {
    443         kBG_Attr,
    444         kHiliteCell_Attr,
    445         kAttrCount
    446     };
    447     SkPaint&    paint(Attr);
    448 
    449     SkListSource*   getListSource() const { return fSource; }
    450     SkListSource*   setListSource(SkListSource*);
    451 
    452 protected:
    453     virtual void onDraw(SkCanvas*);
    454     virtual void onSizeChange();
    455     virtual bool onEvent(const SkEvent&);
    456     virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node);
    457 
    458 private:
    459     SkView*         fScrollBar;
    460     SkPaint         fPaint[kAttrCount];
    461     SkListSource*   fSource;
    462     int             fCurrIndex;     // logical index
    463 
    464     SkPoint         fCellSize;
    465     SkIPoint        fVisibleCount;
    466 
    467     int     logicalToVisualIndex(int index) const { return index; }
    468     void    invalSelection();
    469     bool    getCellRect(int index, SkRect*) const;
    470     void    ensureSelectionIsVisible();
    471 
    472     typedef SkWidgetView INHERITED;
    473 };
    474 
    475 #endif
    476 
    477