181 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// NoesisGUI - http://www.noesisengine.com
 | 
						|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
 | 
						|
#ifndef __GUI_PANEL_H__
 | 
						|
#define __GUI_PANEL_H__
 | 
						|
 | 
						|
 | 
						|
#include <NsCore/Noesis.h>
 | 
						|
#include <NsGui/FrameworkElement.h>
 | 
						|
 | 
						|
 | 
						|
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
 | 
						|
///
 | 
						|
///    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 | 
						|
///      <StackPanel>
 | 
						|
///        <Button>Button 1</Button>
 | 
						|
///        <Button>Button 2</Button>
 | 
						|
///      </StackPanel>
 | 
						|
///    </Page>
 | 
						|
///
 | 
						|
/// 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<UIElementCollection> 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<BaseComponent> 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<UIElementCollection> mInternalChildren;
 | 
						|
 | 
						|
    // Item container generator when Panel is the items host of an ItemsControl
 | 
						|
    Ptr<ItemContainerGenerator> mItemContainerGenerator;
 | 
						|
 | 
						|
    Ptr<RectangleGeometry> mBackgroundGeometry;
 | 
						|
 | 
						|
    typedef Vector<uint32_t> ZOrderVector;
 | 
						|
    ZOrderVector mZOrder;
 | 
						|
 | 
						|
    bool mValidZOrder;
 | 
						|
    bool mIsValidItemsHost;
 | 
						|
 | 
						|
    NS_DECLARE_REFLECTION(Panel, FrameworkElement)
 | 
						|
};
 | 
						|
 | 
						|
NS_WARNING_POP
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#endif
 |