00001 #ifndef __DW_UI_HH__
00002 #define __DW_UI_HH__
00003
00004 #ifndef __INCLUDED_FROM_DW_CORE_HH__
00005 # error Do not include this file directly, use "core.hh" instead.
00006 #endif
00007
00008 namespace dw {
00009 namespace core {
00010
00213 namespace ui {
00214
00215 class Resource;
00216
00222 class Embed: public Widget
00223 {
00224 friend class Resource;
00225
00226 private:
00227 Resource *resource;
00228
00229 protected:
00230 void sizeRequestImpl (Requisition *requisition);
00231 void getExtremesImpl (Extremes *extremes);
00232 void sizeAllocateImpl (Allocation *allocation);
00233 void enterNotifyImpl (core::EventCrossing *event);
00234 void leaveNotifyImpl (core::EventCrossing *event);
00235 bool buttonPressImpl (core::EventButton *event);
00236
00237 public:
00238 static int CLASS_ID;
00239
00240 Embed(Resource *resource);
00241 ~Embed();
00242
00243 void setWidth (int width);
00244 void setAscent (int ascent);
00245 void setDescent (int descent);
00246 void setDisplayed (bool displayed);
00247 void setEnabled (bool enabled);
00248 void draw (View *view, Rectangle *area);
00249 Iterator *iterator (Content::Type mask, bool atEnd);
00250 void setStyle (style::Style *style);
00251
00252 inline void setUsesHints () { setFlags (USES_HINTS); }
00253
00254 inline Resource *getResource () { return resource; }
00255 };
00256
00262 class Resource
00263 {
00264 friend class Embed;
00265
00266 public:
00270 class ActivateReceiver: public lout::signal::Receiver
00271 {
00272 public:
00273 virtual void activate (Resource *resource) = 0;
00274 virtual void enter (Resource *resource) = 0;
00275 virtual void leave (Resource *resource) = 0;
00276 };
00280 class ClickedReceiver: public lout::signal::Receiver
00281 {
00282 public:
00283 virtual void clicked (Resource *resource, EventButton *event) = 0;
00284 };
00285
00286 private:
00287 class ActivateEmitter: public lout::signal::Emitter
00288 {
00289 protected:
00290 bool emitToReceiver (lout::signal::Receiver *receiver, int signalNo,
00291 int argc, Object **argv);
00292 public:
00293 inline void connectActivate (ActivateReceiver *receiver) {
00294 connect (receiver); }
00295 void emitActivate (Resource *resource);
00296 void emitEnter (Resource *resource);
00297 void emitLeave (Resource *resource);
00298 };
00299
00300 class ClickedEmitter: public lout::signal::Emitter
00301 {
00302 protected:
00303 bool emitToReceiver (lout::signal::Receiver *receiver, int signalNo,
00304 int argc, Object **argv);
00305 public:
00306 inline void connectClicked (ClickedReceiver *receiver) {
00307 connect (receiver); }
00308 void emitClicked (Resource *resource, EventButton *event);
00309 };
00310
00311 Embed *embed;
00312 ActivateEmitter activateEmitter;
00313 ClickedEmitter clickedEmitter;
00314
00315 void emitEnter ();
00316 void emitLeave ();
00317 protected:
00318 inline void queueResize (bool extremesChanged) {
00319 if (embed) embed->queueResize (0, extremesChanged);
00320 }
00321
00322 virtual Embed *getEmbed () { return embed; }
00323 virtual void setEmbed (Embed *embed);
00324
00325 inline void emitActivate () {
00326 return activateEmitter.emitActivate (this); }
00327 inline void emitClicked (EventButton *event) {
00328 clickedEmitter.emitClicked (this, event); }
00329
00330 public:
00331 inline Resource () { embed = NULL; }
00332
00333 virtual ~Resource ();
00334
00335 virtual void sizeRequest (Requisition *requisition) = 0;
00336 virtual void getExtremes (Extremes *extremes);
00337 virtual void sizeAllocate (Allocation *allocation);
00338 virtual void setWidth (int width);
00339 virtual void setAscent (int ascent);
00340 virtual void setDescent (int descent);
00341 virtual void setDisplayed (bool displayed);
00342 virtual void draw (View *view, Rectangle *area);
00343 virtual Iterator *iterator (Content::Type mask, bool atEnd) = 0;
00344 virtual void setStyle (style::Style *style);
00345
00346 virtual bool isEnabled () = 0;
00347 virtual void setEnabled (bool enabled) = 0;
00348
00349 inline void connectActivate (ActivateReceiver *receiver) {
00350 activateEmitter.connectActivate (receiver); }
00351 inline void connectClicked (ClickedReceiver *receiver) {
00352 clickedEmitter.connectClicked (receiver); }
00353 };
00354
00355
00356 class ButtonResource: public Resource
00357 {};
00358
00362 class LabelButtonResource: public ButtonResource
00363 {
00364 public:
00365 Iterator *iterator (Content::Type mask, bool atEnd);
00366
00367 virtual const char *getLabel () = 0;
00368 virtual void setLabel (const char *label) = 0;
00369 };
00370
00371 class ComplexButtonResource: public ButtonResource
00372 {
00373 private:
00374 class LayoutReceiver: public Layout::Receiver
00375 {
00376 public:
00377 ComplexButtonResource *resource;
00378
00379 void canvasSizeChanged (int width, int ascent, int descent);
00380 };
00381
00382 friend class LayoutReceiver;
00383 LayoutReceiver layoutReceiver;
00384
00385 Widget *childWidget;
00386
00387 protected:
00388 Layout *layout;
00389 int click_x, click_y;
00390
00391 void setEmbed (Embed *embed);
00392
00393 virtual Platform *createPlatform () = 0;
00394 virtual void setLayout (Layout *layout) = 0;
00395
00396 virtual int reliefXThickness () = 0;
00397 virtual int reliefYThickness () = 0;
00398
00399 void init (Widget *widget);
00400
00401 public:
00402 ComplexButtonResource ();
00403 ~ComplexButtonResource ();
00404
00405 void sizeRequest (Requisition *requisition);
00406 void getExtremes (Extremes *extremes);
00407 void sizeAllocate (Allocation *allocation);
00408 void setWidth (int width);
00409 void setAscent (int ascent);
00410 void setDescent (int descent);
00411 Iterator *iterator (Content::Type mask, bool atEnd);
00412 int getClickX () {return click_x;};
00413 int getClickY () {return click_y;};
00414 };
00415
00420 class SelectionResource: public Resource
00421 {
00422 public:
00423 virtual void addItem (const char *str, bool enabled, bool selected) = 0;
00424 virtual void pushGroup (const char *name, bool enabled) = 0;
00425 virtual void popGroup () = 0;
00426
00427 virtual int getNumberOfItems () = 0;
00428 virtual bool isSelected (int index) = 0;
00429 };
00430
00431 class ListResource: public SelectionResource
00432 {
00433 public:
00434 enum SelectionMode {
00440 SELECTION_EXACTLY_ONE,
00441
00448 SELECTION_EXACTLY_ONE_BY_USER,
00449
00456 SELECTION_AT_MOST_ONE,
00457
00461 SELECTION_MULTIPLE
00462 };
00463 };
00464
00465 class OptionMenuResource: public SelectionResource
00466 {
00467 };
00468
00469 class TextResource: public Resource
00470 {
00471 public:
00472 Iterator *iterator (Content::Type mask, bool atEnd);
00473
00474 virtual const char *getText () = 0;
00475 virtual void setText (const char *text) = 0;
00476 virtual bool isEditable () = 0;
00477 virtual void setEditable (bool editable) = 0;
00478 };
00479
00480 class EntryResource: public TextResource
00481 {
00482 public:
00483 enum { UNLIMITED_MAX_LENGTH = -1 };
00484 };
00485
00486 class MultiLineTextResource: public TextResource
00487 {
00488 };
00489
00490
00491 class ToggleButtonResource: public Resource
00492 {
00493 public:
00494 virtual bool isActivated () = 0;
00495 virtual void setActivated (bool activated) = 0;
00496 };
00497
00498 class CheckButtonResource: public ToggleButtonResource
00499 {
00500 public:
00501 Iterator *iterator (Content::Type mask, bool atEnd);
00502 };
00503
00504 class RadioButtonResource: public ToggleButtonResource
00505 {
00506 public:
00507 class GroupIterator
00508 {
00509 protected:
00510 GroupIterator () { }
00511 virtual ~GroupIterator ();
00512
00513 public:
00514 virtual bool hasNext () = 0;
00515 virtual RadioButtonResource *getNext () = 0;
00516 virtual void unref () = 0;
00517 };
00518
00523 virtual GroupIterator *groupIterator () = 0;
00524
00525 Iterator *iterator (Content::Type mask, bool atEnd);
00526 };
00527
00528
00532 class ResourceFactory: public lout::object::Object
00533 {
00534 public:
00535 virtual LabelButtonResource *createLabelButtonResource (const char *label)
00536 = 0;
00537 virtual ComplexButtonResource *createComplexButtonResource (Widget *widget,
00538 bool relief)
00539 = 0;
00540 virtual ListResource *createListResource (ListResource::SelectionMode
00541 selectionMode, int rows) = 0;
00542 virtual OptionMenuResource *createOptionMenuResource () = 0;
00543 virtual EntryResource *createEntryResource (int maxLength, bool password,
00544 const char *label) = 0;
00545 virtual MultiLineTextResource *createMultiLineTextResource (int cols,
00546 int rows) = 0;
00547 virtual CheckButtonResource *createCheckButtonResource (bool activated) = 0;
00548 virtual RadioButtonResource *createRadioButtonResource (RadioButtonResource
00549 *groupedWith,
00550 bool activated) = 0;
00551 };
00552
00553 }
00554 }
00555 }
00556
00557 #endif // __DW_UI_HH__