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(); } }