3
using System.Collections;
4
using System.Reflection;
9
class ContextMenu : Gtk.Menu {
12
IEditableObject editable;
14
public ContextMenu (Placeholder ph)
21
item = LabelItem (ph);
22
item.Sensitive = false;
25
item = new MenuItem (Catalog.GetString ("_Select"));
26
item.Sensitive = false;
29
BuildContextMenu (Stetic.Wrapper.Container.LookupParent (ph), true, ph);
32
public ContextMenu (Stetic.Wrapper.Widget wrapper) : this (wrapper, wrapper.Wrapped) {}
34
public ContextMenu (Stetic.Wrapper.Widget wrapper, Gtk.Widget context)
39
widget = wrapper.Wrapped;
41
if (widget == context) {
42
item = LabelItem (widget);
43
item.Sensitive = false;
47
item = new MenuItem (Catalog.GetString ("_Select"));
48
item.Activated += DoSelect;
51
ClassDescriptor klass = wrapper.ClassDescriptor;
53
foreach (ItemDescriptor id in klass.ContextMenu) {
54
CommandDescriptor cmd = (CommandDescriptor)id;
55
if (!cmd.VisibleFor (widget))
57
item = new MenuItem (cmd.Label);
58
if (cmd.Enabled (widget, context)) {
59
Gtk.Widget wdup = widget, cdup = context; // FIXME bxc 75689
60
item.Activated += delegate (object o, EventArgs args) {
64
item.Sensitive = false;
69
BuildContextMenu (wrapper.ParentWrapper, widget == context, context);
72
void BuildContextMenu (Stetic.Wrapper.Widget parentWrapper, bool top, Widget context)
76
item = new ImageMenuItem (Gtk.Stock.Cut, null);
78
item.Activated += DoCut;
80
item.Sensitive = false;
83
item = new ImageMenuItem (Gtk.Stock.Copy, null);
85
item.Activated += DoCopy;
87
item.Sensitive = false;
90
item = new ImageMenuItem (Gtk.Stock.Paste, null);
91
if (editable.CanPaste)
92
item.Activated += DoPaste;
94
item.Sensitive = false;
97
if (editable.CanDelete) {
98
item = new ImageMenuItem (Gtk.Stock.Delete, null);
99
item.Activated += DoDelete;
104
for (; parentWrapper != null; parentWrapper = parentWrapper.ParentWrapper) {
105
Add (new SeparatorMenuItem ());
107
item = LabelItem (parentWrapper.Wrapped);
108
item.Submenu = new ContextMenu (parentWrapper, context);
116
protected override void OnSelectionDone ()
121
void DoSelect (object obj, EventArgs args)
123
Stetic.Wrapper.Widget wrapper = Stetic.Wrapper.Widget.Lookup (widget);
128
void DoCut (object obj, EventArgs args)
133
void DoCopy (object obj, EventArgs args)
138
void DoPaste (object obj, EventArgs args)
143
void DoDelete (object obj, EventArgs args)
148
static MenuItem LabelItem (Gtk.Widget widget)
153
label = new Label (widget is Placeholder ? Catalog.GetString ("Placeholder") : widget.Name);
154
label.UseUnderline = false;
155
label.SetAlignment (0.0f, 0.5f);
156
item = new ImageMenuItem ();
159
Wrapper.Widget wrapper = Stetic.Wrapper.Widget.Lookup (widget);
161
if (wrapper != null) {
162
ClassDescriptor klass = wrapper.ClassDescriptor;
164
Gdk.Pixbuf pixbuf = klass.Icon;
166
Gtk.Icon.SizeLookup (Gtk.IconSize.Menu, out width, out height);
167
item.Image = new Gtk.Image (pixbuf.ScaleSimple (width, height, Gdk.InterpType.Bilinear));