private void viewMenuItem_DropDown_Closing(object sender, ToolStripDropDownClosingEventArgs e)
        {
            if (e.CloseReason != ToolStripDropDownCloseReason.ItemClicked)
            {
                return;
            }

            ToolStripDropDownMenu menu     = sender as ToolStripDropDownMenu;
            ToolStripItem         viewItem = menu != null?menu.GetItemAt(menu.PointToClient(Cursor.Position)) : null;

            if (viewItem == null)
            {
                return;
            }

            IMenuModelItem modelItem = this.GetModelItem(viewItem);

            if (modelItem == null)
            {
                return;
            }

            if (modelItem.Checkable)
            {
                e.Cancel = true;
            }
        }
        protected virtual void UpdateItemProperties(IMenuModelItem modelItem, ToolStripItem viewItem)
        {
            bool wasVisible = viewItem.Available;

            viewItem.Tag       = modelItem.Tag;
            viewItem.Image     = modelItem.Icon;
            viewItem.Name      = modelItem.Name;
            viewItem.Text      = modelItem.Name;
            viewItem.Available = modelItem.Visible && (modelItem.TypeHint != MenuItemTypeHint.Separator || this.visibleSeparators.Contains(viewItem));
            viewItem.Enabled   = modelItem.Enabled;

            ToolStripMenuItem viewMenuItem = viewItem as ToolStripMenuItem;

            if (viewMenuItem != null)
            {
                viewMenuItem.ShortcutKeys = modelItem.ShortcutKeys;
                viewMenuItem.CheckOnClick = modelItem.Checkable;
                viewMenuItem.Checked      = modelItem.Checked;
            }

            if (wasVisible != viewItem.Available)
            {
                this.UpdateSeparatorVisibility(this.GetTargetViewItemCollection(modelItem));
            }
        }
 private void RaiseItemRemoved(IMenuModelItem modelItem, ToolStripItem viewItem)
 {
     if (this.ItemRemoved != null)
     {
         this.ItemRemoved(this, new MenuStripMenuViewItemEventArgs(modelItem, viewItem, this));
     }
 }
        protected virtual ToolStripItem CreateViewItem(IMenuModelItem modelItem)
        {
            switch (modelItem.TypeHint)
            {
            default:
            case MenuItemTypeHint.Item:                     return(new ToolStripMenuItem());

            case MenuItemTypeHint.Separator:        return(new ToolStripSeparator());
            }
        }
        public ToolStripItem GetViewItem(IMenuModelItem modelItem)
        {
            ToolStripItem viewItem;

            if (this.viewItems.TryGetValue(modelItem, out viewItem))
            {
                return(viewItem);
            }
            else
            {
                return(null);
            }
        }
        private void viewMenuItem_Click(object sender, EventArgs e)
        {
            ToolStripItem viewItem = sender as ToolStripItem;

            if (viewItem == null)
            {
                return;
            }

            IMenuModelItem modelItem = this.GetModelItem(viewItem);

            if (modelItem != null)
            {
                modelItem.RaisePerformAction();
            }
        }
        private void viewMenuItem_CheckedChanged(object sender, EventArgs e)
        {
            ToolStripMenuItem viewItem = sender as ToolStripMenuItem;

            if (viewItem == null)
            {
                return;
            }

            IMenuModelItem modelItem = this.GetModelItem(viewItem);

            if (modelItem != null)
            {
                modelItem.Checked = viewItem.Checked;
            }
        }
        private void UpdateSeparatorVisibility(ToolStripItemCollection parentCollection)
        {
            this.visibleSeparators.Clear();
            bool separatorStreak    = false;
            bool isFirstVisibleItem = true;
            int  lastSeparatorIndex = -1;

            for (int i = 0; i < parentCollection.Count; i++)
            {
                ToolStripItem  viewItem  = parentCollection[i];
                IMenuModelItem modelItem = this.GetModelItem(viewItem);
                if (!modelItem.Visible)
                {
                    continue;
                }

                bool isSeparator = modelItem.TypeHint == MenuItemTypeHint.Separator;

                if (isSeparator)
                {
                    viewItem.Available = false;
                    separatorStreak    = true;
                    lastSeparatorIndex = i;
                }
                else if (separatorStreak && !isFirstVisibleItem)
                {
                    ToolStripItem  lastViewItem  = parentCollection[lastSeparatorIndex];
                    IMenuModelItem lastModelItem = this.GetModelItem(lastViewItem);
                    lastViewItem.Available = lastModelItem.Visible;
                    this.visibleSeparators.Add(lastViewItem);
                }

                if (!isSeparator)
                {
                    isFirstVisibleItem = false;
                    separatorStreak    = false;
                }
            }
        }
        private void InsertViewItem(ToolStripItemCollection parentCollection, ToolStripItem viewItem, IMenuModelItem modelItem)
        {
            ToolStripMenuItem viewMenuItem = viewItem as ToolStripMenuItem;

            // Determine where to insert the item
            int insertIndex = parentCollection.Count;

            for (int i = 0; i < parentCollection.Count; i++)
            {
                IMenuModelItem item = this.GetModelItem(parentCollection[i]);
                if (comparison(item, modelItem) > 0)
                {
                    insertIndex = i;
                    break;
                }
            }

            // Insert the item
            if (insertIndex < parentCollection.Count)
            {
                parentCollection.Insert(insertIndex, viewItem);
            }
            else
            {
                parentCollection.Add(viewItem);
            }

            this.viewItems.Add(modelItem, viewItem);
            viewItem.Click += this.viewMenuItem_Click;
            if (viewMenuItem != null)
            {
                viewMenuItem.CheckedChanged   += this.viewMenuItem_CheckedChanged;
                viewMenuItem.DropDown.Closing += this.viewMenuItem_DropDown_Closing;
            }

            this.UpdateSeparatorVisibility(parentCollection);
            this.RaiseItemInserted(modelItem, viewItem);
        }
        private ToolStripItemCollection GetTargetViewItemCollection(IMenuModelItem modelItem)
        {
            if (modelItem.Parent == null)
            {
                return(this.target);
            }

            ToolStripItem viewItemParent;

            if (!this.viewItems.TryGetValue(modelItem.Parent, out viewItemParent))
            {
                return(this.target);
            }

            ToolStripMenuItem viewMenuItem = viewItemParent as ToolStripMenuItem;

            if (viewMenuItem == null)
            {
                return(this.target);
            }

            return(viewMenuItem.DropDownItems);
        }
        private int ContextMenuItemComparison(IMenuModelItem itemA, IMenuModelItem itemB)
        {
            int result;

            // SortValue overrides all
            result = itemA.SortValue - itemB.SortValue;
            if (result != 0) return result;

            // Don't sort any further unless within the new menu
            bool isInNewMenu = false;
            IMenuModelItem item = itemA;
            while (item != null)
            {
                if (item == this.nodeContextItemNew)
                {
                    isInNewMenu = true;
                    break;
                }
                item = item.Parent;
            }
            if (!isInNewMenu) return 0;

            CreateContextEntryTag createEntryA = itemA.Tag as CreateContextEntryTag;
            CreateContextEntryTag createEntryB = itemB.Tag as CreateContextEntryTag;

            // Duality-internal Types first
            result =
                ((createEntryB != null && createEntryB.IsDualityType) ? 1 : 0) -
                ((createEntryA != null && createEntryA.IsDualityType) ? 1 : 0);
            if (result != 0) return result;

            // Type entries first
            result =
                ((createEntryB != null && createEntryB.TypeId != null) ? 1 : 0) -
                ((createEntryA != null && createEntryA.TypeId != null) ? 1 : 0);
            if (result != 0) return result;

            // Sort by Item Name
            result = string.Compare(itemA.Name, itemB.Name);
            return result;
        }
Exemple #12
0
        private void OnMenuItemClicked(object sender, EventArgs e)
        {
            IMenuModelItem modelItem = sender as IMenuModelItem;

            Console.WriteLine(string.Format(modelItem.Checkable ? "Sender: {0}, Checked: {1}" : "Sender: {0}", modelItem.Name, modelItem.Checked));
        }
Exemple #13
0
 public MenuStripMenuViewItemEventArgs(IMenuModelItem modelItem, ToolStripItem viewItem, MenuStripMenuView view) : base(view)
 {
     this.modelItem = modelItem;
     this.viewItem  = viewItem;
 }
 public MenuStripMenuViewItemEventArgs(IMenuModelItem modelItem, ToolStripItem viewItem, MenuStripMenuView view)
     : base(view)
 {
     this.modelItem = modelItem;
     this.viewItem = viewItem;
 }
 private static int DefaultItemComparison(IMenuModelItem itemA, IMenuModelItem itemB)
 {
     return(itemA.SortValue - itemB.SortValue);
 }
        private void RemoveViewItem(ToolStripItemCollection parentCollection, ToolStripItem viewItem, IMenuModelItem modelItem)
        {
            ToolStripMenuItem viewMenuItem = viewItem as ToolStripMenuItem;

            parentCollection.Remove(viewItem);
            this.viewItems.Remove(modelItem);
            viewItem.Click -= this.viewMenuItem_Click;
            if (viewMenuItem != null)
            {
                viewMenuItem.CheckedChanged   -= this.viewMenuItem_CheckedChanged;
                viewMenuItem.DropDown.Closing -= this.viewMenuItem_DropDown_Closing;
            }

            this.UpdateSeparatorVisibility(parentCollection);
            this.RaiseItemRemoved(modelItem, viewItem);
        }