internal void RestoreStatus(ArrayList status, int index) { int pos = (int)status [index]; if (pos >= menuItems.Count) { return; } ActionMenuItem item = (ActionMenuItem)menuItems [pos]; if (index == status.Count - 1) { // The last position in the status is the selected item item.Select(); if (item.Node.Action != null && item.Node.Action.Name.Length == 0) { // Then only case when there can have an action when an empty name // is when the user clicked on the "add action" link. In this case, // start editing the item again item.EditingDone += OnEditingDone; item.StartEditing(); } } else { item.ShowSubmenu(); if (OpenSubmenu != null) { OpenSubmenu.RestoreStatus(status, index + 1); } } }
protected override bool OnDragMotion(Gdk.DragContext context, int x, int y, uint time) { ActionPaletteItem dragItem = DND.DragWidget as ActionPaletteItem; if (dragItem == null) { return(false); } if (actionTree.Children.Count > 0) { ActionMenuItem item = LocateWidget(x, y); if (item != null) { Widget wrapper = Widget.Lookup(this); // Show the submenu to allow droping to it, but avoid // droping a submenu inside itself if (item.HasSubmenu && item.Node != dragItem.Node) { item.ShowSubmenu(wrapper.GetDesignArea(), item); } // Look for the index where to insert the new item dropIndex = actionTree.Children.IndexOf(item.Node); int mpos = item.Allocation.X + item.Allocation.Width / 2; if (x > mpos) { dropIndex++; } // Calculate the drop position, used to show the drop bar if (dropIndex == 0) { dropPosition = item.Allocation.X; } else if (dropIndex == menuItems.Count) { dropPosition = item.Allocation.Right; } else { item = (ActionMenuItem)menuItems [dropIndex]; ActionMenuItem prevItem = (ActionMenuItem)menuItems [dropIndex - 1]; dropPosition = prevItem.Allocation.Right + (item.Allocation.X - prevItem.Allocation.Right) / 2; } } } else { dropIndex = 0; } QueueDraw(); return(base.OnDragMotion(context, x, y, time)); }
void OnItemKeyPress(object s, Gtk.KeyPressEventArgs args) { int pos = menuItems.IndexOf(s); ActionMenuItem item = (ActionMenuItem)s; switch (args.Event.Key) { case Gdk.Key.Left: if (pos > 0) { ((ActionMenuItem)menuItems[pos - 1]).Select(); } break; case Gdk.Key.Right: if (pos < menuItems.Count - 1) { ((ActionMenuItem)menuItems[pos + 1]).Select(); } else if (pos == menuItems.Count - 1) { InsertAction(menuItems.Count); } break; case Gdk.Key.Down: if (item.HasSubmenu) { item.ShowSubmenu(); if (openSubmenu != null) { openSubmenu.Select(null); } } break; case Gdk.Key.Up: OpenSubmenu = null; break; } args.RetVal = true; }
public void DropMenu(ActionTreeNode node) { ActionMenuItem item = FindMenuItem(node); if (item != null) { if (item.HasSubmenu) { item.ShowSubmenu(); if (openSubmenu != null) { openSubmenu.Select(null); } } else { item.Select(); } } }
void ProcessKey (ActionMenuItem item, Gdk.Key key, Gdk.ModifierType modifier) { int pos = menuItems.IndexOf (item); switch (key) { case Gdk.Key.Up: if (pos > 0) ((ActionMenuItem)menuItems[pos - 1]).Select (); else if (parentMenu.Widget is ActionMenuBar) { ActionMenuBar bar = (ActionMenuBar) parentMenu.Widget; bar.Select (parentNode); } break; case Gdk.Key.Down: if (pos < menuItems.Count - 1) ((ActionMenuItem)menuItems[pos + 1]).Select (); else if (pos == menuItems.Count - 1) { InsertAction (menuItems.Count); } break; case Gdk.Key.Right: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menuitem) { // Create a submenu using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menu; } item.Node.Action.NotifyChanged (); } if (item.HasSubmenu) { item.ShowSubmenu (); if (openSubmenu != null) openSubmenu.Select (null); } else if (parentNode != null) { ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf (parentNode); if (i < parentNode.ParentNode.Children.Count - 1) parentMB.DropMenu (parentNode.ParentNode.Children [i + 1]); } } break; case Gdk.Key.Left: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menu) { // Remove the submenu OpenSubmenu = null; using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menuitem; item.Node.Children.Clear (); } item.Node.Action.NotifyChanged (); break; } if (parentNode != null) { ActionMenu parentAM = parentMenu.Widget as ActionMenu; if (parentAM != null) { parentAM.Select (parentNode); } ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf (parentNode); if (i > 0) parentMB.DropMenu (parentNode.ParentNode.Children [i - 1]); } } break; case Gdk.Key.Return: item.EditingDone += OnEditingDone; item.StartEditing (); break; case Gdk.Key.Insert: if ((modifier & Gdk.ModifierType.ControlMask) != 0) InsertActionAt (item, true, true); else InsertActionAt (item, false, false); break; case Gdk.Key.Delete: DeleteAction (item); break; } }
void ProcessKey(ActionMenuItem item, Gdk.Key key, Gdk.ModifierType modifier) { int pos = menuItems.IndexOf(item); switch (key) { case Gdk.Key.Up: if (pos > 0) { ((ActionMenuItem)menuItems[pos - 1]).Select(); } else if (parentMenu.Widget is ActionMenuBar) { ActionMenuBar bar = (ActionMenuBar)parentMenu.Widget; bar.Select(parentNode); } break; case Gdk.Key.Down: if (pos < menuItems.Count - 1) { ((ActionMenuItem)menuItems[pos + 1]).Select(); } else if (pos == menuItems.Count - 1) { InsertAction(menuItems.Count); } break; case Gdk.Key.Right: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menuitem) { // Create a submenu using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menu; } item.Node.Action.NotifyChanged(); } if (item.HasSubmenu) { item.ShowSubmenu(); if (openSubmenu != null) { openSubmenu.Select(null); } } else if (parentNode != null) { ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf(parentNode); if (i < parentNode.ParentNode.Children.Count - 1) { parentMB.DropMenu(parentNode.ParentNode.Children [i + 1]); } } } break; case Gdk.Key.Left: if ((modifier & Gdk.ModifierType.ControlMask) != 0 && item.Node.Type == Gtk.UIManagerItemType.Menu) { // Remove the submenu OpenSubmenu = null; using (item.Node.Action.UndoManager.AtomicChange) { item.Node.Type = Gtk.UIManagerItemType.Menuitem; item.Node.Children.Clear(); } item.Node.Action.NotifyChanged(); break; } if (parentNode != null) { ActionMenu parentAM = parentMenu.Widget as ActionMenu; if (parentAM != null) { parentAM.Select(parentNode); } ActionMenuBar parentMB = parentMenu.Widget as ActionMenuBar; if (parentMB != null) { int i = parentNode.ParentNode.Children.IndexOf(parentNode); if (i > 0) { parentMB.DropMenu(parentNode.ParentNode.Children [i - 1]); } } } break; case Gdk.Key.Return: item.EditingDone += OnEditingDone; item.StartEditing(); break; case Gdk.Key.Insert: if ((modifier & Gdk.ModifierType.ControlMask) != 0) { InsertActionAt(item, true, true); } else { InsertActionAt(item, false, false); } break; case Gdk.Key.Delete: DeleteAction(item); break; } }