michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #ifndef SkWidget_DEFINED michael@0: #define SkWidget_DEFINED michael@0: michael@0: #include "SkBitmap.h" michael@0: #include "SkDOM.h" michael@0: #include "SkPaint.h" michael@0: #include "SkString.h" michael@0: #include "SkTDArray.h" michael@0: #include "SkTextBox.h" michael@0: #include "SkView.h" michael@0: michael@0: class SkEvent; michael@0: class SkInterpolator; michael@0: class SkShader; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkWidget : public SkView { michael@0: public: michael@0: SkWidget(uint32_t flags = 0) : SkView(flags | kFocusable_Mask | kEnabled_Mask) {} michael@0: michael@0: /** Call this to post the widget's event to its listeners */ michael@0: void postWidgetEvent(); michael@0: michael@0: static void Init(); michael@0: static void Term(); michael@0: protected: michael@0: // override to add slots to an event before posting michael@0: virtual void prepareWidgetEvent(SkEvent*); michael@0: virtual void onEnabledChange(); michael@0: michael@0: // to initialize the event from XML michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); michael@0: michael@0: private: michael@0: SkEvent fEvent; michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkHasLabelWidget : public SkWidget { michael@0: public: michael@0: SkHasLabelWidget(uint32_t flags = 0) : SkWidget(flags) {} michael@0: michael@0: size_t getLabel(SkString* label = NULL) const; michael@0: size_t getLabel(char lable[] = NULL) const; michael@0: void setLabel(const SkString&); michael@0: void setLabel(const char label[]); michael@0: void setLabel(const char label[], size_t len); michael@0: michael@0: protected: michael@0: // called when the label changes michael@0: virtual void onLabelChange(); michael@0: michael@0: // overrides michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: michael@0: private: michael@0: SkString fLabel; michael@0: typedef SkWidget INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkButtonWidget : public SkHasLabelWidget { michael@0: public: michael@0: SkButtonWidget(uint32_t flags = 0) : SkHasLabelWidget(flags), fState(kOff_State) {} michael@0: michael@0: enum State { michael@0: kOff_State, //!< XML: buttonState="off" michael@0: kOn_State, //!< XML: buttonState="on" michael@0: kUnknown_State //!< XML: buttonState="unknown" michael@0: }; michael@0: State getButtonState() const { return fState; } michael@0: void setButtonState(State); michael@0: michael@0: protected: michael@0: /** called when the label changes. default behavior is to inval the widget */ michael@0: virtual void onButtonStateChange(); michael@0: michael@0: // overrides michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: michael@0: private: michael@0: State fState; michael@0: typedef SkHasLabelWidget INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkPushButtonWidget : public SkButtonWidget { michael@0: public: michael@0: SkPushButtonWidget(uint32_t flags = 0) : SkButtonWidget(flags) {} michael@0: michael@0: protected: michael@0: virtual bool onEvent(const SkEvent&); michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE; michael@0: virtual bool onClick(Click* click); michael@0: michael@0: private: michael@0: typedef SkButtonWidget INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkCheckBoxWidget : public SkButtonWidget { michael@0: public: michael@0: SkCheckBoxWidget(uint32_t flags = 0); michael@0: michael@0: protected: michael@0: virtual bool onEvent(const SkEvent&); michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: michael@0: private: michael@0: typedef SkButtonWidget INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkStaticTextView : public SkView { michael@0: public: michael@0: SkStaticTextView(uint32_t flags = 0); michael@0: virtual ~SkStaticTextView(); michael@0: michael@0: enum Mode { michael@0: kFixedSize_Mode, michael@0: kAutoWidth_Mode, michael@0: kAutoHeight_Mode, michael@0: michael@0: kModeCount michael@0: }; michael@0: Mode getMode() const { return (Mode)fMode; } michael@0: void setMode(Mode); michael@0: michael@0: SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; } michael@0: void setSpacingAlign(SkTextBox::SpacingAlign); michael@0: michael@0: void getMargin(SkPoint* margin) const; michael@0: void setMargin(SkScalar dx, SkScalar dy); michael@0: michael@0: size_t getText(SkString* text = NULL) const; michael@0: size_t getText(char text[] = NULL) const; michael@0: void setText(const SkString&); michael@0: void setText(const char text[]); michael@0: void setText(const char text[], size_t len); michael@0: michael@0: void getPaint(SkPaint*) const; michael@0: void setPaint(const SkPaint&); michael@0: michael@0: protected: michael@0: // overrides michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: michael@0: private: michael@0: SkPoint fMargin; michael@0: SkString fText; michael@0: SkPaint fPaint; michael@0: uint8_t fMode; michael@0: uint8_t fSpacingAlign; michael@0: michael@0: void computeSize(); michael@0: michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkBitmapView : public SkView { michael@0: public: michael@0: SkBitmapView(uint32_t flags = 0); michael@0: virtual ~SkBitmapView(); michael@0: michael@0: bool getBitmap(SkBitmap*) const; michael@0: void setBitmap(const SkBitmap*, bool viewOwnsPixels); michael@0: bool loadBitmapFromFile(const char path[]); michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM&, const SkDOM::Node*); michael@0: michael@0: private: michael@0: SkBitmap fBitmap; michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkHasLabelView : public SkView { michael@0: public: michael@0: void getLabel(SkString*) const; michael@0: void setLabel(const SkString&); michael@0: void setLabel(const char label[]); michael@0: michael@0: protected: michael@0: SkString fLabel; michael@0: michael@0: // called when the label changes michael@0: virtual void onLabelChange(); michael@0: michael@0: // overrides michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkPushButtonView : public SkHasLabelView { michael@0: public: michael@0: SkPushButtonView(uint32_t flags = 0); michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkCheckBoxView : public SkHasLabelView { michael@0: public: michael@0: SkCheckBoxView(uint32_t flags = 0); michael@0: michael@0: enum State { michael@0: kOff_State, michael@0: kOn_State, michael@0: kMaybe_State michael@0: }; michael@0: State getState() const { return fState; } michael@0: void setState(State); michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); michael@0: michael@0: private: michael@0: State fState; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkProgressView : public SkView { michael@0: public: michael@0: SkProgressView(uint32_t flags = 0); michael@0: virtual ~SkProgressView(); michael@0: michael@0: uint16_t getValue() const { return fValue; } michael@0: uint16_t getMax() const { return fMax; } michael@0: michael@0: void setMax(U16CPU max); michael@0: void setValue(U16CPU value); michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); michael@0: michael@0: private: michael@0: uint16_t fValue, fMax; michael@0: SkShader* fOnShader, *fOffShader; michael@0: SkInterpolator* fInterp; michael@0: bool fDoInterp; michael@0: michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkListSource : public SkEventSink { michael@0: public: michael@0: virtual int countRows() = 0; michael@0: virtual void getRow(int index, SkString* left, SkString* right) = 0; michael@0: virtual SkEvent* getEvent(int index); michael@0: michael@0: static SkListSource* CreateFromDir(const char path[], const char suffix[], michael@0: const char targetPrefix[]); michael@0: static SkListSource* CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node); michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkListView : public SkView { michael@0: public: michael@0: SkListView(uint32_t flags = 0); michael@0: virtual ~SkListView(); michael@0: michael@0: SkScalar getRowHeight() const { return fRowHeight; } michael@0: void setRowHeight(SkScalar); michael@0: michael@0: /** Return the index of the selected row, or -1 if none michael@0: */ michael@0: int getSelection() const { return fCurrIndex; } michael@0: /** Set the index of the selected row, or -1 for none michael@0: */ michael@0: void setSelection(int); michael@0: michael@0: void moveSelectionUp(); michael@0: void moveSelectionDown(); michael@0: michael@0: enum Attr { michael@0: kBG_Attr, michael@0: kNormalText_Attr, michael@0: kHiliteText_Attr, michael@0: kHiliteCell_Attr, michael@0: kAttrCount michael@0: }; michael@0: SkPaint& paint(Attr); michael@0: michael@0: SkListSource* getListSource() const { return fSource; } michael@0: SkListSource* setListSource(SkListSource*); michael@0: michael@0: #if 0 michael@0: enum Action { michael@0: kSelectionChange_Action, michael@0: kSelectionPicked_Action, michael@0: kActionCount michael@0: }; michael@0: /** If event is not null, it is retained by the view, and a copy michael@0: of the event will be posted to its listeners when the specified michael@0: action occurs. If event is null, then no event will be posted for michael@0: the specified action. michael@0: */ michael@0: void setActionEvent(Action, SkEvent* event); michael@0: #endif michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onSizeChange(); michael@0: virtual bool onEvent(const SkEvent&); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); michael@0: michael@0: private: michael@0: SkPaint fPaint[kAttrCount]; michael@0: SkListSource* fSource; michael@0: SkScalar fRowHeight; michael@0: int fCurrIndex; // logical index michael@0: int fScrollIndex; // logical index of top-most visible row michael@0: int fVisibleRowCount; michael@0: SkString* fStrCache; michael@0: michael@0: void dirtyStrCache(); michael@0: void ensureStrCache(int visibleCount); michael@0: michael@0: int logicalToVisualIndex(int index) const { return index - fScrollIndex; } michael@0: void invalSelection(); michael@0: bool getRowRect(int index, SkRect*) const; michael@0: void ensureSelectionIsVisible(); michael@0: michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: class SkGridView : public SkView { michael@0: public: michael@0: SkGridView(uint32_t flags = 0); michael@0: virtual ~SkGridView(); michael@0: michael@0: void getCellSize(SkPoint*) const; michael@0: void setCellSize(SkScalar x, SkScalar y); michael@0: michael@0: /** Return the index of the selected item, or -1 if none michael@0: */ michael@0: int getSelection() const { return fCurrIndex; } michael@0: /** Set the index of the selected row, or -1 for none michael@0: */ michael@0: void setSelection(int); michael@0: michael@0: void moveSelectionUp(); michael@0: void moveSelectionDown(); michael@0: michael@0: enum Attr { michael@0: kBG_Attr, michael@0: kHiliteCell_Attr, michael@0: kAttrCount michael@0: }; michael@0: SkPaint& paint(Attr); michael@0: michael@0: SkListSource* getListSource() const { return fSource; } michael@0: SkListSource* setListSource(SkListSource*); michael@0: michael@0: protected: michael@0: virtual void onDraw(SkCanvas*); michael@0: virtual void onSizeChange(); michael@0: virtual bool onEvent(const SkEvent&); michael@0: virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); michael@0: michael@0: private: michael@0: SkView* fScrollBar; michael@0: SkPaint fPaint[kAttrCount]; michael@0: SkListSource* fSource; michael@0: int fCurrIndex; // logical index michael@0: michael@0: SkPoint fCellSize; michael@0: SkIPoint fVisibleCount; michael@0: michael@0: int logicalToVisualIndex(int index) const { return index; } michael@0: void invalSelection(); michael@0: bool getCellRect(int index, SkRect*) const; michael@0: void ensureSelectionIsVisible(); michael@0: michael@0: typedef SkView INHERITED; michael@0: }; michael@0: michael@0: #endif