示例#1
0
        internal void Update()
        {
            CommandTargetRoute targetRoute = new CommandTargetRoute(initialCommandTarget);

            foreach (Gtk.Widget item in Children)
            {
                if (item is ICommandUserItem)
                {
                    ((ICommandUserItem)item).Update(targetRoute);
                }
                else if (item is Gtk.MenuItem)
                {
                    Gtk.MenuItem mitem = (Gtk.MenuItem)item;
                    CommandMenu  men   = mitem.Submenu as CommandMenu;
                    if (men != null)
                    {
                        men.InitialCommandTarget = initialCommandTarget;
                    }
                    item.Show();
                    if (item is AutoHideMenuItem)
                    {
                        men.Update();
                        if (!((AutoHideMenuItem)item).HasVisibleChildren)
                        {
                            item.Hide();
                        }
                    }
                }
                else
                {
                    item.Show();
                }
            }

            // After updating the menu, hide the separators which don't actually
            // separate items.
            bool prevWasItem = false;

            Gtk.Widget lastSeparator = null;
            foreach (Gtk.Widget item in Children)
            {
                if (item is Gtk.SeparatorMenuItem)
                {
                    if (!prevWasItem)
                    {
                        item.Hide();
                    }
                    else
                    {
                        prevWasItem   = false;
                        lastSeparator = item;
                    }
                }
                else if (item.Visible)
                {
                    prevWasItem = true;
                }
            }
            if (!prevWasItem && lastSeparator != null)
            {
                lastSeparator.Hide();
            }
        }