/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SkWidget_DEFINED #define SkWidget_DEFINED #include "SkView.h" #include "SkBitmap.h" #include "SkDOM.h" #include "SkPaint.h" #include "SkString.h" #include "SkTDArray.h" ////////////////////////////////////////////////////////////////////////////// class SkWidget : public SkView { public: SkWidget(uint32_t flags = 0) : SkView(flags | kFocusable_Mask | kEnabled_Mask) {} /** Call this to post the widget's event to its listeners */ void postWidgetEvent(); static void Init(); static void Term(); protected: // override to add slots to an event before posting virtual void prepareWidgetEvent(SkEvent*); virtual void onEnabledChange(); // <event ...> to initialize the event from XML virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); private: SkEvent fEvent; typedef SkView INHERITED; }; class SkHasLabelWidget : public SkWidget { public: SkHasLabelWidget(uint32_t flags = 0) : SkWidget(flags) {} size_t getLabel(SkString* label = NULL) const; size_t getLabel(char lable[] = NULL) const; void setLabel(const SkString&); void setLabel(const char label[]); void setLabel(const char label[], size_t len); protected: // called when the label changes virtual void onLabelChange(); // overrides virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); private: SkString fLabel; typedef SkWidget INHERITED; }; class SkButtonWidget : public SkHasLabelWidget { public: SkButtonWidget(uint32_t flags = 0) : SkHasLabelWidget(flags), fState(kOff_State) {} enum State { kOff_State, //!< XML: buttonState="off" kOn_State, //!< XML: buttonState="on" kUnknown_State //!< XML: buttonState="unknown" }; State getButtonState() const { return fState; } void setButtonState(State); protected: /** called when the label changes. default behavior is to inval the widget */ virtual void onButtonStateChange(); // overrides virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); private: State fState; typedef SkHasLabelWidget INHERITED; }; class SkPushButtonWidget : public SkButtonWidget { public: SkPushButtonWidget(uint32_t flags = 0) : SkButtonWidget(flags) {} protected: virtual bool onEvent(const SkEvent&); virtual void onDraw(SkCanvas*); virtual Click* onFindClickHandler(SkScalar x, SkScalar y); virtual bool onClick(Click* click); private: typedef SkButtonWidget INHERITED; }; class SkCheckBoxWidget : public SkButtonWidget { public: SkCheckBoxWidget(uint32_t flags = 0); protected: virtual bool onEvent(const SkEvent&); virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); private: typedef SkButtonWidget INHERITED; }; #include "SkTextBox.h" class SkStaticTextView : public SkView { public: SkStaticTextView(uint32_t flags = 0); virtual ~SkStaticTextView(); enum Mode { kFixedSize_Mode, kAutoWidth_Mode, kAutoHeight_Mode, kModeCount }; Mode getMode() const { return (Mode)fMode; } void setMode(Mode); SkTextBox::SpacingAlign getSpacingAlign() const { return (SkTextBox::SpacingAlign)fSpacingAlign; } void setSpacingAlign(SkTextBox::SpacingAlign); void getMargin(SkPoint* margin) const; void setMargin(SkScalar dx, SkScalar dy); size_t getText(SkString* text = NULL) const; size_t getText(char text[] = NULL) const; void setText(const SkString&); void setText(const char text[]); void setText(const char text[], size_t len); void getPaint(SkPaint*) const; void setPaint(const SkPaint&); protected: // overrides virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); private: SkPoint fMargin; SkString fText; SkPaint fPaint; uint8_t fMode; uint8_t fSpacingAlign; void computeSize(); typedef SkView INHERITED; }; class SkBitmapView : public SkView { public: SkBitmapView(uint32_t flags = 0); virtual ~SkBitmapView(); bool getBitmap(SkBitmap*) const; void setBitmap(const SkBitmap*, bool viewOwnsPixels); bool loadBitmapFromFile(const char path[]); protected: virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM&, const SkDOM::Node*); private: SkBitmap fBitmap; typedef SkView INHERITED; }; ///////////////////////////////////////////////////////////////////////////// class SkShader; class SkInterpolator; class SkWidgetView : public SkView { public: SkWidgetView(uint32_t flags = 0); virtual ~SkWidgetView(); static const char* GetEventType(); }; class SkSliderView : public SkWidgetView { public: SkSliderView(uint32_t flags = 0); uint16_t getValue() const { return fValue; } uint16_t getMax() const { return fMax; } void setMax(U16CPU max); void setValue(U16CPU value); protected: virtual void onDraw(SkCanvas*); virtual Click* onFindClickHandler(SkScalar x, SkScalar y); virtual bool onClick(Click*); private: uint16_t fValue, fMax; typedef SkWidgetView INHERITED; }; ////////////////////////////////////////////////////////////////////////////// class SkHasLabelView : public SkView { public: void getLabel(SkString*) const; void setLabel(const SkString&); void setLabel(const char label[]); protected: SkString fLabel; // called when the label changes virtual void onLabelChange(); // overrides virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); }; class SkPushButtonView : public SkHasLabelView { public: SkPushButtonView(uint32_t flags = 0); protected: virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); }; class SkCheckBoxView : public SkHasLabelView { public: SkCheckBoxView(uint32_t flags = 0); enum State { kOff_State, kOn_State, kMaybe_State }; State getState() const { return fState; } void setState(State); protected: virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node*); private: State fState; }; class SkProgressView : public SkView { public: SkProgressView(uint32_t flags = 0); virtual ~SkProgressView(); uint16_t getValue() const { return fValue; } uint16_t getMax() const { return fMax; } void setMax(U16CPU max); void setValue(U16CPU value); protected: virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); private: uint16_t fValue, fMax; SkShader* fOnShader, *fOffShader; SkInterpolator* fInterp; bool fDoInterp; typedef SkView INHERITED; }; class SkTextView : public SkView { public: SkTextView(uint32_t flags = 0); virtual ~SkTextView(); enum AnimaDir { kNeutral_AnimDir, kForward_AnimDir, kBackward_AnimDir, kAnimDirCount }; void getText(SkString*) const; void setText(const SkString&, AnimaDir dir = kNeutral_AnimDir); void setText(const char text[], AnimaDir dir = kNeutral_AnimDir); void setText(const char text[], size_t len, AnimaDir dir = kNeutral_AnimDir); void getMargin(SkPoint* margin) const; void setMargin(const SkPoint&); SkPaint& paint() { return fPaint; } protected: virtual void onDraw(SkCanvas*); virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); private: SkString fText; SkPaint fPaint; SkPoint fMargin; class Interp; Interp* fInterp; bool fDoInterp; // called by the other setText methods. This guy does not check for != // before doing the assign, so the caller must check for us void privSetText(const SkString&, AnimaDir dir); typedef SkView INHERITED; }; ////////////////////////////////////////////////////////// class SkEvent; class SkListSource : public SkEventSink { public: virtual int countRows() = 0; virtual void getRow(int index, SkString* left, SkString* right) = 0; virtual SkEvent* getEvent(int index); static SkListSource* CreateFromDir(const char path[], const char suffix[], const char targetPrefix[]); static SkListSource* CreateFromDOM(const SkDOM& dom, const SkDOM::Node* node); }; class SkListView : public SkWidgetView { public: SkListView(uint32_t flags = 0); virtual ~SkListView(); SkScalar getRowHeight() const { return fRowHeight; } void setRowHeight(SkScalar); /** Return the index of the selected row, or -1 if none */ int getSelection() const { return fCurrIndex; } /** Set the index of the selected row, or -1 for none */ void setSelection(int); void moveSelectionUp(); void moveSelectionDown(); enum Attr { kBG_Attr, kNormalText_Attr, kHiliteText_Attr, kHiliteCell_Attr, kAttrCount }; SkPaint& paint(Attr); SkListSource* getListSource() const { return fSource; } SkListSource* setListSource(SkListSource*); #if 0 enum Action { kSelectionChange_Action, kSelectionPicked_Action, kActionCount }; /** If event is not null, it is retained by the view, and a copy of the event will be posted to its listeners when the specified action occurs. If event is null, then no event will be posted for the specified action. */ void setActionEvent(Action, SkEvent* event); #endif protected: virtual void onDraw(SkCanvas*); virtual void onSizeChange(); virtual bool onEvent(const SkEvent&); virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); private: SkPaint fPaint[kAttrCount]; SkListSource* fSource; SkScalar fRowHeight; int fCurrIndex; // logical index int fScrollIndex; // logical index of top-most visible row int fVisibleRowCount; SkString* fStrCache; void dirtyStrCache(); void ensureStrCache(int visibleCount); int logicalToVisualIndex(int index) const { return index - fScrollIndex; } void invalSelection(); bool getRowRect(int index, SkRect*) const; void ensureSelectionIsVisible(); typedef SkWidgetView INHERITED; }; ////////////////////////////////////////////////////////// class SkGridView : public SkWidgetView { public: SkGridView(uint32_t flags = 0); virtual ~SkGridView(); void getCellSize(SkPoint*) const; void setCellSize(SkScalar x, SkScalar y); /** Return the index of the selected item, or -1 if none */ int getSelection() const { return fCurrIndex; } /** Set the index of the selected row, or -1 for none */ void setSelection(int); void moveSelectionUp(); void moveSelectionDown(); enum Attr { kBG_Attr, kHiliteCell_Attr, kAttrCount }; SkPaint& paint(Attr); SkListSource* getListSource() const { return fSource; } SkListSource* setListSource(SkListSource*); protected: virtual void onDraw(SkCanvas*); virtual void onSizeChange(); virtual bool onEvent(const SkEvent&); virtual void onInflate(const SkDOM& dom, const SkDOM::Node* node); private: SkView* fScrollBar; SkPaint fPaint[kAttrCount]; SkListSource* fSource; int fCurrIndex; // logical index SkPoint fCellSize; SkIPoint fVisibleCount; int logicalToVisualIndex(int index) const { return index; } void invalSelection(); bool getCellRect(int index, SkRect*) const; void ensureSelectionIsVisible(); typedef SkWidgetView INHERITED; }; #endif