00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_XRB_CONTAINERWIDGET_HPP_)
00012 #define _XRB_CONTAINERWIDGET_HPP_
00013
00014 #include "xrb.hpp"
00015
00016 #include <list>
00017 #include <vector>
00018
00019 #include "xrb_widget.hpp"
00020
00021 namespace Xrb
00022 {
00023
00024
00025 class ContainerWidget : public Widget
00026 {
00027 public:
00028
00029
00030
00031 class ChildResizeBlocker
00032 {
00033 public:
00034
00035 ChildResizeBlocker (ContainerWidget *container_widget)
00036 {
00037 ASSERT1(container_widget != NULL);
00038 m_container_widget = container_widget;
00039 m_container_widget->IncrementResizeBlockerCount();
00040 }
00041 ~ChildResizeBlocker ()
00042 {
00043 ASSERT1(m_container_widget != NULL);
00044 m_container_widget->DecrementResizeBlockerCount();
00045 m_container_widget = NULL;
00046 }
00047
00048 private:
00049
00050 void *operator new (size_t) throw() { ASSERT0(false && "this class should always be instantiated on the stack"); return NULL; }
00051 void *operator new[] (size_t) throw() { ASSERT0(false && "this class should always be instantiated on the stack"); return NULL; }
00052 void operator delete (void *) throw() { ASSERT0(false && "this class should always be instantiated on the stack"); }
00053 void operator delete[] (void *) throw() { ASSERT0(false && "this class should always be instantiated on the stack"); }
00054
00055 ContainerWidget *m_container_widget;
00056 };
00057
00058
00059
00060
00061
00071 ContainerWidget (ContainerWidget *parent, std::string const &name = "ContainerWidget");
00076 virtual ~ContainerWidget ();
00077
00078
00079
00080
00081
00085 inline Widget *Focus () const { return m_focus; }
00089 inline Widget *MouseoverFocus () const { return m_mouseover_focus; }
00092 inline bool FocusHasMouseGrab () const { return m_focus_has_mouse_grab; }
00096 inline Widget *GetMainWidget () const { return m_main_widget; }
00101 virtual Bool2 const &MinSizeEnabled () const
00102 {
00103 return m_main_widget ?
00104 m_main_widget->MinSizeEnabled() :
00105 m_size_properties.m_min_size_enabled;
00106 }
00110 virtual ScreenCoordVector2 const &MinSize () const
00111 {
00112 return m_main_widget ?
00113 m_main_widget->MinSize() :
00114 m_size_properties.m_min_size;
00115 }
00120 virtual Bool2 const &MaxSizeEnabled () const
00121 {
00122 return m_main_widget ?
00123 m_main_widget->MaxSizeEnabled() :
00124 m_size_properties.m_max_size_enabled;
00125 }
00129 virtual ScreenCoordVector2 const &MaxSize () const
00130 {
00131 return m_main_widget ?
00132 m_main_widget->MaxSize() :
00133 m_size_properties.m_max_size;
00134 }
00135 virtual ScreenCoordVector2 AdjustedSize (ScreenCoordVector2 const &size) const;
00136
00137
00138
00139
00140
00158 virtual void SetSizePropertyEnabled (
00159 SizeProperties::Property property,
00160 Uint32 component,
00161 bool value,
00162 bool defer_parent_update = false);
00178 virtual void SetSizePropertyEnabled (
00179 SizeProperties::Property property,
00180 Bool2 const &value,
00181 bool defer_parent_update = false);
00199 virtual void SetSizeProperty (
00200 SizeProperties::Property property,
00201 Uint32 component,
00202 ScreenCoord value,
00203 bool defer_parent_update = false);
00219 virtual void SetSizeProperty (
00220 SizeProperties::Property property,
00221 ScreenCoordVector2 const &value,
00222 bool defer_parent_update = false);
00223
00228 virtual void SetMainWidget (Widget *main_widget);
00229
00230
00231
00232
00233
00249 virtual void Draw (RenderContext const &render_context) const;
00253 virtual void MoveBy (ScreenCoordVector2 const &delta);
00272 virtual ScreenCoordVector2 Resize (ScreenCoordVector2 const &size);
00276 virtual void AttachChild (Widget *child);
00280 virtual void DetachChild (Widget *child);
00289 virtual void MoveChildDown (Widget *child);
00299 virtual void MoveChildUp (Widget *child);
00309 virtual void MoveChildToBottom (Widget *child);
00319 virtual void MoveChildToTop (Widget *child);
00325 void DeleteAllChildren ();
00326
00327 protected:
00328
00332 virtual Uint32 WidgetSkinHandlerChildCount () const;
00336 virtual WidgetSkinHandler *WidgetSkinHandlerChild (Uint32 index);
00337
00338
00339
00340 virtual Bool2 ContentsMinSizeEnabled () const;
00341 virtual ScreenCoordVector2 ContentsMinSize () const;
00342 virtual Bool2 ContentsMaxSizeEnabled () const;
00343 virtual ScreenCoordVector2 ContentsMaxSize () const;
00344
00345 inline Uint32 ChildResizeBlockerCount () const { return m_child_resize_blocker_count; }
00346 inline bool ChildResizeWasBlocked () const { return m_child_resize_was_blocked; }
00347
00348 inline void IndicateChildResizeWasBlocked () { m_child_resize_was_blocked = true; }
00349
00359 virtual void HandleFrame ();
00363 virtual bool ProcessDeleteChildWidgetEvent (EventDeleteChildWidget const *e);
00364
00372 virtual void AddModalWidget (Widget *modal_widget);
00377 virtual void RemoveModalWidget (Widget *modal_widget);
00383 virtual void CalculateMinAndMaxSizePropertiesFromContents ();
00389 virtual void ChildSizePropertiesChanged (Widget *child);
00399 virtual void ChildStackPriorityChanged (
00400 Widget *child,
00401 StackPriority previous_stack_priority);
00402
00403 typedef std::vector<Widget *> WidgetVector;
00404
00408 WidgetVector m_child_vector;
00419 SizeProperties m_preferred_size_properties;
00425 bool m_children_get_input_events_first;
00426
00427 private:
00428
00429 typedef std::list<Widget *> WidgetList;
00430
00434 WidgetVector::iterator FindChildWidget (Widget const *child);
00438 virtual bool InternalProcessKeyEvent (EventKey const *e);
00442 virtual bool InternalProcessMouseEvent (EventMouse const *e);
00446 virtual bool InternalProcessJoyEvent (EventJoy const *e);
00449 virtual bool InternalProcessFocusEvent (EventFocus const *e);
00452 virtual bool InternalProcessMouseoverEvent (EventMouseover const *e);
00458 bool SendMouseEventToChild (EventMouse const *e);
00459
00460 void IncrementResizeBlockerCount ();
00461 void DecrementResizeBlockerCount ();
00462
00466 Widget *m_focus;
00470 Widget *m_mouseover_focus;
00473 bool m_focus_has_mouse_grab;
00479 WidgetList m_modal_widget_stack;
00485 Widget *m_main_widget;
00491 Uint32 m_child_resize_blocker_count;
00494 bool m_child_resize_was_blocked;
00495
00496
00497 friend class ChildResizeBlocker;
00498 friend class Screen;
00499 friend class Widget;
00500 };
00501
00502 }
00503
00504 #endif // !defined(_XRB_CONTAINERWIDGET_HPP_)
00505