253 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// NoesisGUI - http://www.noesisengine.com
 | 
						|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
 | 
						|
#ifndef __GUI_MENUITEM_H__
 | 
						|
#define __GUI_MENUITEM_H__
 | 
						|
 | 
						|
 | 
						|
#include <NsCore/Noesis.h>
 | 
						|
#include <NsCore/ReflectionDeclareEnum.h>
 | 
						|
#include <NsGui/CoreApi.h>
 | 
						|
#include <NsGui/HeaderedItemsControl.h>
 | 
						|
#include <NsGui/ICommandSource.h>
 | 
						|
 | 
						|
 | 
						|
namespace Noesis
 | 
						|
{
 | 
						|
 | 
						|
class PopupLayer;
 | 
						|
class ItemCollection;
 | 
						|
 | 
						|
NS_WARNING_PUSH
 | 
						|
NS_MSVC_WARNING_DISABLE(4251 4275)
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
/// Represents a selectable item inside a Menu or ContextMenu.
 | 
						|
///
 | 
						|
/// http://msdn.microsoft.com/en-us/library/system.windows.controls.menuitem.aspx
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
class NS_GUI_CORE_API MenuItem: public HeaderedItemsControl, public ICommandSource
 | 
						|
{
 | 
						|
public:
 | 
						|
    MenuItem();
 | 
						|
    ~MenuItem();
 | 
						|
 | 
						|
    /// Gets or sets the parameter to pass to the Command property of a MenuItem
 | 
						|
    //@{
 | 
						|
    BaseComponent* GetCommandParameter() const override final;
 | 
						|
    void SetCommandParameter(BaseComponent* parameter);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the command associated with the menu item
 | 
						|
    //@{
 | 
						|
    ICommand* GetCommand() const override final;
 | 
						|
    void SetCommand(ICommand* command);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the target element on which to raise the specified command
 | 
						|
    //@{
 | 
						|
    UIElement* GetCommandTarget() const override final;
 | 
						|
    void SetCommandTarget(UIElement* target);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the icon that appears in a MenuItem
 | 
						|
    //@{
 | 
						|
    BaseComponent* GetIcon() const;
 | 
						|
    void SetIcon(BaseComponent* icon);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Sets the text describing an input gesture that will call the command tied to the specified 
 | 
						|
    /// item
 | 
						|
    //@{
 | 
						|
    const char* GetInputGestureText() const;
 | 
						|
    void SetInputGestureText(const char* text);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets a value that indicates whether a MenuItem can be checked
 | 
						|
    //@{
 | 
						|
    bool GetIsCheckable() const;
 | 
						|
    void SetIsCheckable(bool value);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets a value that indicates whether the MenuItem is checked
 | 
						|
    //@{
 | 
						|
    bool GetIsChecked() const;
 | 
						|
    void SetIsChecked(bool value);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets a value that indicates whether a MenuItem is highlighted
 | 
						|
    bool GetIsHighlighted() const;
 | 
						|
 | 
						|
    /// Gets a value that indicates whether a MenuItem is pressed
 | 
						|
    bool GetIsPressed() const;
 | 
						|
 | 
						|
    /// Gets or sets a value that indicates whether the submenu of the MenuItem is open
 | 
						|
    //@{
 | 
						|
    bool GetIsSubmenuOpen() const;
 | 
						|
    void SetIsSubmenuOpen(bool value);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets a value that indicates the role of a MenuItem
 | 
						|
    MenuItemRole GetRole() const;
 | 
						|
 | 
						|
    /// Gets or sets a value that indicates that the submenu in which this MenuItem is located 
 | 
						|
    /// should not close when this item is clicked
 | 
						|
    //@{
 | 
						|
    bool GetStaysOpenOnClick() const;
 | 
						|
    void SetStaysOpenOnClick(bool value);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Occurs when a menu item is checked
 | 
						|
    UIElement::RoutedEvent_<RoutedEventHandler> Checked();
 | 
						|
 | 
						|
    /// Occurs when a MenuItem is clicked
 | 
						|
    UIElement::RoutedEvent_<RoutedEventHandler> Click();
 | 
						|
 | 
						|
    /// Occurs when the state of the IsSubmenuOpen property changes to false
 | 
						|
    UIElement::RoutedEvent_<RoutedEventHandler> SubmenuClosed();
 | 
						|
 | 
						|
    /// Occurs when the state of the IsSubmenuOpen property changes to true
 | 
						|
    UIElement::RoutedEvent_<RoutedEventHandler> SubmenuOpened();
 | 
						|
 | 
						|
    /// Occurs when a MenuItem is unchecked
 | 
						|
    UIElement::RoutedEvent_<RoutedEventHandler> Unchecked();
 | 
						|
 | 
						|
    NS_IMPLEMENT_INTERFACE_FIXUP
 | 
						|
 | 
						|
public:
 | 
						|
    static const DependencyProperty* CommandParameterProperty;
 | 
						|
    static const DependencyProperty* CommandProperty;
 | 
						|
    static const DependencyProperty* CommandTargetProperty;
 | 
						|
    static const DependencyProperty* IconProperty;
 | 
						|
    static const DependencyProperty* InputGestureTextProperty;
 | 
						|
    static const DependencyProperty* IsCheckableProperty;
 | 
						|
    static const DependencyProperty* IsCheckedProperty;
 | 
						|
    static const DependencyProperty* IsHighlightedProperty;
 | 
						|
    static const DependencyProperty* IsPressedProperty;
 | 
						|
    static const DependencyProperty* IsSubmenuOpenProperty;
 | 
						|
    static const DependencyProperty* RoleProperty;
 | 
						|
    static const DependencyProperty* StaysOpenOnClickProperty;
 | 
						|
 | 
						|
    static const DependencyProperty* SeparatorStyleKey;
 | 
						|
 | 
						|
    static const RoutedEvent* CheckedEvent;
 | 
						|
    static const RoutedEvent* ClickEvent;
 | 
						|
    static const RoutedEvent* SubmenuClosedEvent;
 | 
						|
    static const RoutedEvent* SubmenuOpenedEvent;
 | 
						|
    static const RoutedEvent* UncheckedEvent;
 | 
						|
 | 
						|
protected:
 | 
						|
    /// From DependencyObject
 | 
						|
    //@{
 | 
						|
    void OnInit() override;
 | 
						|
    bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// From Visual
 | 
						|
    //@{
 | 
						|
    void OnDisconnectFromView() override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// From UIElement
 | 
						|
    //@{
 | 
						|
    bool IsEnabledCore() const override;
 | 
						|
    void OnMouseEnter(const MouseEventArgs& e) override;
 | 
						|
    void OnMouseLeave(const MouseEventArgs& e) override;
 | 
						|
    void OnMouseMove(const MouseEventArgs& e) override;
 | 
						|
    void OnMouseLeftButtonDown(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseLeftButtonUp(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseRightButtonDown(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseRightButtonUp(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnGotKeyboardFocus(const KeyboardFocusChangedEventArgs& e) override;
 | 
						|
    void OnLostKeyboardFocus(const KeyboardFocusChangedEventArgs& e) override;
 | 
						|
    void OnKeyDown(const KeyEventArgs& e) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// From FrameworkElement
 | 
						|
    //@{
 | 
						|
    void OnLogicalParentChanged(FrameworkElement* oldParent) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// From ItemsControl
 | 
						|
    //@{
 | 
						|
    Ptr<DependencyObject> GetContainerForItemOverride() const override;
 | 
						|
    bool IsItemItsOwnContainerOverride(BaseComponent* item) const override;
 | 
						|
    void ApplyItemContainerStyle(DependencyObject* container) const override;
 | 
						|
    void OnItemsChanged(const NotifyCollectionChangedEventArgs& args) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
private:
 | 
						|
    friend class ContextMenu;
 | 
						|
    static void SetIsInsideContextMenu(DependencyObject* element, bool value);
 | 
						|
    bool GetIsInsideContextMenu() const;
 | 
						|
 | 
						|
    bool IsSeparator() const;
 | 
						|
 | 
						|
    void OnIsCheckedChanged(bool isChecked);
 | 
						|
    void OnIsSubmenuOpenChanged(bool isOpen);
 | 
						|
 | 
						|
    void OnHeaderClicked();
 | 
						|
    void OnItemClicked();
 | 
						|
 | 
						|
    void OnDirectlyOverChanged(UIElement* directlyOver);
 | 
						|
 | 
						|
    void OnMouseButtonDown(const MouseButtonEventArgs& e, bool clickAllowed);
 | 
						|
    void OnMouseButtonUp(const MouseButtonEventArgs& e, bool clickAllowed);
 | 
						|
 | 
						|
    void UpdateIsPressed();
 | 
						|
 | 
						|
    void UpdateSubmenuVisibility(bool visible, bool focus = false);
 | 
						|
    void UpdateRole();
 | 
						|
 | 
						|
    void ShowSubmenu();
 | 
						|
    void HideSubmenu();
 | 
						|
 | 
						|
    static void UpdateCommandCanExecute(ItemCollection* items);
 | 
						|
 | 
						|
    void ActivateMenu(bool activate);
 | 
						|
    void NavigateMenu(FocusNavigationDirection direction);
 | 
						|
    void NavigateSubmenu(FocusNavigationDirection direction);
 | 
						|
 | 
						|
    void CloseAncestors();
 | 
						|
    void CloseDescendants();
 | 
						|
 | 
						|
    void RegisterMouse();
 | 
						|
    void UnregisterMouse();
 | 
						|
 | 
						|
    void RegisterCommand(ICommand* command);
 | 
						|
    void UnregisterCommand(ICommand* command);
 | 
						|
    void UpdateCanExecute(ICommand* command);
 | 
						|
    void OnCanExecuteChanged(BaseComponent* sender, const EventArgs& e);
 | 
						|
 | 
						|
    friend class Popup;
 | 
						|
    void SetSubmenuLayer(PopupLayer* submenuLayer);
 | 
						|
 | 
						|
private:
 | 
						|
    static const DependencyProperty* IsInsideContextMenuProperty;
 | 
						|
 | 
						|
    PopupLayer* mSubmenuLayer;
 | 
						|
 | 
						|
    union
 | 
						|
    {
 | 
						|
        uint8_t mAllFlags;
 | 
						|
        struct
 | 
						|
        {
 | 
						|
            bool ownClose:1;
 | 
						|
            bool canExecute:1;
 | 
						|
            bool isMouseRegistered:1;
 | 
						|
        } mFlags;
 | 
						|
    };
 | 
						|
 | 
						|
    NS_DECLARE_REFLECTION(MenuItem, HeaderedItemsControl)
 | 
						|
};
 | 
						|
 | 
						|
NS_WARNING_POP
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#endif
 |