void PropRendererEditingStarted(object o, EditingStartedArgs args) { try { valueStore.Clear(); TreeIter iter; if (!treeStore.GetIterFromString(out iter, args.Path)) { return; } var obj = (PObject)treeStore.GetValue(iter, 1); var values = PListScheme.AvailableValues(obj, CurrentTree); if (values != null) { var descr = new List <string> (values.Select(v => ShowDescriptions ? v.Description : v.Identifier)); descr.Sort(); foreach (var val in descr) { valueStore.AppendValues(val); } } } catch (Exception ex) { GLib.ExceptionManager.RaiseUnhandledException(ex, false); } }
void PropRendererEditingFinished(object o, EditedArgs args) { try { TreeIter iter; string newText = args.NewText; if (!treeStore.GetIterFromString(out iter, args.Path)) { return; } var obj = (PObject)treeStore.GetValue(iter, 1); var values = PListScheme.AvailableValues(obj, CurrentTree); if (values != null) { var value = values.FirstOrDefault(v => v.Description == newText || v.Identifier == newText); if (value != null) { newText = value.Identifier; } } obj.SetValue(newText); } catch (Exception ex) { GLib.ExceptionManager.RaiseUnhandledException(ex, false); } }
public CustomPropertiesWidget(PListScheme scheme) { Scheme = scheme ?? PListScheme.Empty; CurrentTree = new Dictionary <PObject, PListScheme.SchemaItem> (); treeview = new PopupTreeView(this) { DoubleBuffered = true }; treeview.HeadersClickable = true; RefreshKeyStore(); PackStart(treeview, true, true, 0); FindOrAddNewEntry(TreeIter.Zero); ShowAll(); var keyRenderer = new CellRendererCombo(); keyRenderer.Editable = true; keyRenderer.Model = keyStore; keyRenderer.Mode = CellRendererMode.Editable; keyRenderer.TextColumn = 0; keyRenderer.EditingStarted += KeyRendererEditingStarted; keyRenderer.Edited += KeyRendererEditingFinished; var col = new TreeViewColumn(); col.Resizable = true; col.Title = GettextCatalog.GetString("Property"); col.PackStart(keyRenderer, true); col.SetCellDataFunc(keyRenderer, delegate(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var renderer = (CellRendererCombo)cell; string id = (string)tree_model.GetValue(iter, 0) ?? ""; var obj = (PObject)tree_model.GetValue(iter, 1); if (obj == null) { renderer.Text = id; renderer.Editable = false; renderer.Sensitive = false; return; } var key = (PListScheme.SchemaItem)tree_model.GetValue(iter, 2); var parentPArray = obj.Parent is PArray; renderer.Editable = !parentPArray; renderer.Sensitive = !parentPArray; if (parentPArray) { renderer.Text = ""; } else { renderer.Text = key != null && ShowDescriptions ? key.Description : id; } }); treeview.AppendColumn(col); col = new TreeViewColumn { MinWidth = 25, Resizable = false, Sizing = Gtk.TreeViewColumnSizing.Fixed }; var removeRenderer = new CellRendererButton(ImageService.GetPixbuf("gtk-remove", IconSize.Menu)); removeRenderer.Clicked += RemoveElement; col.PackEnd(removeRenderer, false); col.SetCellDataFunc(removeRenderer, delegate(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { removeRenderer.Visible = treeview.Selection.IterIsSelected(iter) && !AddKeyNode.Equals(treeStore.GetValue(iter, 0)); }); var addRenderer = new CellRendererButton(ImageService.GetPixbuf("gtk-add", IconSize.Menu)); addRenderer.Clicked += AddElement; col.PackEnd(addRenderer, false); col.SetCellDataFunc(addRenderer, delegate(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { addRenderer.Visible = treeview.Selection.IterIsSelected(iter) && AddKeyNode.Equals(treeStore.GetValue(iter, 0)); }); treeview.AppendColumn(col); treeview.RowActivated += delegate(object o, RowActivatedArgs args) { TreeIter iter; if (treeStore.GetIter(out iter, args.Path) && AddKeyNode.Equals(treeStore.GetValue(iter, 0))) { AddElement(o, EventArgs.Empty); } }; var comboRenderer = new CellRendererCombo(); var typeModel = new ListStore(typeof(string)); typeModel.AppendValues(PArray.Type); typeModel.AppendValues(PDictionary.Type); typeModel.AppendValues(PBoolean.Type); typeModel.AppendValues(PData.Type); typeModel.AppendValues(PData.Type); typeModel.AppendValues(PNumber.Type); typeModel.AppendValues(PString.Type); comboRenderer.Model = typeModel; comboRenderer.Mode = CellRendererMode.Editable; comboRenderer.HasEntry = false; comboRenderer.TextColumn = 0; comboRenderer.Edited += delegate(object o, EditedArgs args) { TreeIter selIter; if (!treeStore.GetIterFromString(out selIter, args.Path)) { return; } PObject oldObj = (PObject)treeStore.GetValue(selIter, 1); if (oldObj != null && oldObj.TypeString != args.NewText) { oldObj.Replace(PObject.Create(args.NewText)); } }; treeview.AppendColumn(GettextCatalog.GetString("Type"), comboRenderer, delegate(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var renderer = (CellRendererCombo)cell; var value = (string)tree_model.GetValue(iter, 0); var obj = (PObject)tree_model.GetValue(iter, 1); var key = (PListScheme.SchemaItem)tree_model.GetValue(iter, 2); renderer.Editable = key == null && !AddKeyNode.Equals(value); renderer.ForegroundGdk = Style.Text(renderer.Editable ? StateType.Normal : StateType.Insensitive); renderer.Text = obj == null ? "" : obj.TypeString; }); var propRenderer = new CellRendererCombo(); propRenderer.Model = valueStore; propRenderer.Mode = CellRendererMode.Editable; propRenderer.TextColumn = 0; propRenderer.EditingStarted += PropRendererEditingStarted; propRenderer.Edited += PropRendererEditingFinished; treeview.AppendColumn(GettextCatalog.GetString("Value"), propRenderer, delegate(TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter) { var renderer = (CellRendererCombo)cell; var obj = (PObject)tree_model.GetValue(iter, 1); renderer.Sensitive = obj != null && !(obj is PDictionary || obj is PArray || obj is PData); renderer.Editable = renderer.Sensitive; if (!renderer.Sensitive) { renderer.Text = ""; return; } if (ShowDescriptions) { var identifier = (string)tree_model.GetValue(iter, 0); var values = PListScheme.AvailableValues(obj, CurrentTree); var item = values == null ? null : values.FirstOrDefault(v => v.Identifier == identifier); if (item != null) { renderer.Text = item.Description ?? item.Identifier; return; } } switch (obj.TypeString) { case PDictionary.Type: renderer.Text = string.Format(GettextCatalog.GetPluralString("({0} item)", "({0} items)", ((PDictionary)obj).Count), ((PDictionary)obj).Count); break; case PArray.Type: renderer.Text = string.Format(GettextCatalog.GetPluralString("({0} item)", "({0} items)", ((PArray)obj).Count, ((PArray)obj).Count)); break; case PBoolean.Type: renderer.Text = ((PBoolean)obj).Value ? GettextCatalog.GetString("Yes") : GettextCatalog.GetString("No"); break; case PData.Type: renderer.Text = string.Format("byte[{0}]", ((PData)obj).Value.Length); break; default: if (obj is IPValueObject) { renderer.Text = (((IPValueObject)obj).Value ?? "").ToString(); } else { renderer.Sensitive = false; renderer.Text = GettextCatalog.GetString("Could not render {0}.", obj.GetType().Name); } break; } }); treeview.EnableGridLines = TreeViewGridLines.Horizontal; treeview.Model = treeStore; }