//////////////////////////////////////////////////////////////////////////////////////////////////// // NoesisGUI - http://www.noesisengine.com // Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved. //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __GUI_PANEL_H__ #define __GUI_PANEL_H__ #include #include namespace Noesis { class UIElementCollection; class ItemsControl; class ItemContainerGenerator; class RectangleGeometry; struct ItemsChangedEventArgs; struct GeneratorPosition; NS_WARNING_PUSH NS_MSVC_WARNING_DISABLE(4251 4275) //////////////////////////////////////////////////////////////////////////////////////////////////// /// Provides a base class for all Panel elements. Use Panel elements to position and arrange child /// objects. /// /// .. code-block:: xml /// :caption: XAML /// /// /// /// /// /// /// /// /// Panel contains a collection of UIElement objects, which are in the Children property. Adding a /// UIElement child to a Panel implicitly adds it to the UIElementCollection for the Panel element. /// /// Panel elements do not receive mouse events if a Background is not defined. If you need to handle /// mouse events but do not want a background for your Panel, use Transparent. /// /// http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.aspx //////////////////////////////////////////////////////////////////////////////////////////////////// class NS_GUI_CORE_API Panel: public FrameworkElement { public: Panel(); Panel(const Panel&) = delete; Panel& operator=(const Panel&) = delete; virtual ~Panel() = 0; /// Gets or sets panel background //@{ Brush* GetBackground() const; void SetBackground(Brush* brush); //@} /// Gets or sets a value that indicates that this Panel is a container for user interface (UI) /// items that are generated by an ItemsControl. //@{ bool GetIsItemsHost() const; void SetIsItemsHost(bool value); //@} /// Gets or sets a value that represents the order on the z-plane in which an element appears //@{ static int32_t GetZIndex(const DependencyObject* element); static void SetZIndex(DependencyObject* element, int32_t value); //@} /// Gets children collection /// \prop UIElementCollection* GetChildren() const; public: /// Dependency properties //@{ static const DependencyProperty* BackgroundProperty; static const DependencyProperty* IsItemsHostProperty; static const DependencyProperty* ZIndexProperty; // attached property //@} protected: UIElementCollection* GetInternalChildren() const; void EnsureGenerator(); ItemContainerGenerator* GetGenerator() const; // Creates children collection virtual Ptr CreateChildrenCollection(FrameworkElement* logicalParent); // Generates item containers hosted in this panel virtual void GenerateChildren(); // Updates children when items changed virtual void OnItemsChangedOverride(BaseComponent* sender, const ItemsChangedEventArgs& e); virtual void OnConnectToGenerator(ItemsControl* itemsControl); virtual void OnDisconnectFromGenerator(); /// From DependencyObject //@{ void OnInit() override; bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override; //@} /// From Visual //@{ uint32_t GetVisualChildrenCount() const override; Visual* GetVisualChild(uint32_t index) const override; void OnVisualChildrenChanged(Visual* added, Visual* removed) override; //@} /// From UIElement //@{ void OnRender(DrawingContext* context) override; //@} /// From FrameworkElement //@{ void CloneOverride(FrameworkElement* clone, FrameworkTemplate* template_) const override; uint32_t GetLogicalChildrenCount() const override; Ptr GetLogicalChild(uint32_t index) const override; void OnTemplatedParentChanged(FrameworkElement* oldParent, FrameworkElement* newParent) override; //@} private: /// Updates Z-order indirection vector taking into account children elements ZIndex void UpdateChildrenZOrder(); void InvalidateZOrder(); void EnsureChildrenCollection(FrameworkElement* logicalParent); void ConnectToGenerator(); void DisconnectFromGenerator(); friend class ItemsControl; void Refresh(); void OnItemsChanged(BaseComponent* sender, const ItemsChangedEventArgs& e); void OnAddItem(const GeneratorPosition& position, int numItems); void OnRemoveItem(const GeneratorPosition& position, int numContainers); void OnReplaceItem(const GeneratorPosition& position, int numItems, int numContainers); void OnMoveItem(const GeneratorPosition& from, const GeneratorPosition& to, int numContainers); void OnResetItems(); private: // Collection of child elements of this panel Ptr mInternalChildren; // Item container generator when Panel is the items host of an ItemsControl Ptr mItemContainerGenerator; Ptr mBackgroundGeometry; typedef Vector ZOrderVector; ZOrderVector mZOrder; bool mValidZOrder; bool mIsValidItemsHost; NS_DECLARE_REFLECTION(Panel, FrameworkElement) }; NS_WARNING_POP } #endif