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
							 |