477 lines
12 KiB
C
477 lines
12 KiB
C
|
/*
|
||
|
* 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
|
||
|
|