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