|
Rapicorn - Experimental UI Toolkit - Source Code 10.08.1
|
00001 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html 00002 #ifndef __RAPICORN_CONTAINER_HH__ 00003 #define __RAPICORN_CONTAINER_HH__ 00004 00005 #include <ui/item.hh> 00006 00007 namespace Rapicorn { 00008 00009 /* --- Container --- */ 00010 struct ContainerImpl : public virtual ItemImpl, public virtual ContainerIface { 00011 friend class ItemImpl; 00012 friend class WindowImpl; 00013 void uncross_descendant(ItemImpl &descendant); 00014 void item_cross_link (ItemImpl &owner, 00015 ItemImpl &link, 00016 const ItemSlot &uncross); 00017 void item_cross_unlink (ItemImpl &owner, 00018 ItemImpl &link, 00019 const ItemSlot &uncross); 00020 void item_uncross_links(ItemImpl &owner, 00021 ItemImpl &link); 00022 protected: 00023 virtual ~ContainerImpl (); 00024 virtual void add_child (ItemImpl &item) = 0; 00025 virtual void repack_child (ItemImpl &item, 00026 const PackInfo &orig, 00027 const PackInfo &pnew); 00028 virtual void remove_child (ItemImpl &item) = 0; 00029 virtual void unparent_child (ItemImpl &item); 00030 virtual void dispose_item (ItemImpl &item); 00031 virtual void hierarchy_changed (ItemImpl *old_toplevel); 00032 virtual bool move_focus (FocusDirType fdir); 00033 void expose_enclosure (); /* expose without children */ 00034 virtual void set_focus_child (ItemImpl *item); 00035 virtual void dump_test_data (TestStream &tstream); 00036 public: 00037 ItemImpl* get_focus_child () const; 00038 typedef Walker<ItemImpl> ChildWalker; 00039 void child_container (ContainerImpl *child_container); 00040 ContainerImpl& child_container (); 00041 virtual ChildWalker local_children () const = 0; 00042 virtual bool has_children () = 0; 00043 void remove (ItemImpl &item); 00044 void remove (ItemImpl *item) { RAPICORN_CHECK (item != NULL); remove (*item); } 00045 void add (ItemImpl &item); 00046 void add (ItemImpl *item); 00047 virtual Affine child_affine (const ItemImpl &item); /* container => item affine */ 00048 virtual 00049 const PropertyList& list_properties (); /* essentially chaining to ItemImpl:: */ 00050 const CommandList& list_commands (); /* essentially chaining to ItemImpl:: */ 00051 virtual void point_children (Point p, /* item coordinates relative */ 00052 std::vector<ItemImpl*> &stack); 00053 void viewp0rt_point_children (Point p, /* viewp0rt coordinates relative */ 00054 std::vector<ItemImpl*> &stack); 00055 virtual void render (Display &display); 00056 void debug_tree (String indent = String()); 00057 // ContainerIface 00058 virtual ItemIface* create_child (const std::string &item_identifier, 00059 const StringListImpl &args); 00060 }; 00061 00062 /* --- Single Child Container Impl --- */ 00063 class SingleContainerImpl : public virtual ContainerImpl { 00064 ItemImpl *child_item; 00065 protected: 00066 virtual void size_request (Requisition &requisition); 00067 virtual void size_allocate (Allocation area); 00068 ItemImpl& get_child () { RAPICORN_CHECK (child_item != NULL); return *child_item; } 00069 virtual void pre_finalize (); 00070 virtual ~SingleContainerImpl (); 00071 virtual ChildWalker local_children () const; 00072 virtual bool has_children () { return child_item != NULL; } 00073 bool has_visible_child () { return child_item && child_item->visible(); } 00074 bool has_drawable_child () { return child_item && child_item->drawable(); } 00075 bool has_allocatable_child () { return child_item && child_item->allocatable(); } 00076 virtual void add_child (ItemImpl &item); 00077 virtual void remove_child (ItemImpl &item); 00078 Allocation layout_child (ItemImpl &child, 00079 const Allocation &carea); 00080 explicit SingleContainerImpl (); 00081 }; 00082 00083 /* --- Multi Child Container Impl --- */ 00084 class MultiContainerImpl : public virtual ContainerImpl { 00085 std::vector<ItemImpl*> items; 00086 protected: 00087 virtual void pre_finalize (); 00088 virtual ~MultiContainerImpl (); 00089 virtual ChildWalker local_children () const { return value_walker (items); } 00090 virtual bool has_children () { return items.size() > 0; } 00091 virtual void add_child (ItemImpl &item); 00092 virtual void remove_child (ItemImpl &item); 00093 void raise_child (ItemImpl &item); 00094 void lower_child (ItemImpl &item); 00095 void remove_all_children (); 00096 explicit MultiContainerImpl (); 00097 }; 00098 00099 } // Rapicorn 00100 00101 #endif /* __RAPICORN_CONTAINER_HH__ */
1.7.4