Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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;
        }