/*
* 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