示例#1
0
        private void Delete()
        {
            if (treeView.SelectedNode == null)
            {
                Message("Nothing selected." + Environment.NewLine);
                return;
            }

            TreeNode parent = treeView.SelectedNode.Parent;

            if ((parent == null) || !(parent.Tag is ValueInfo))
            {
                Message("Cannot remove this node." + Environment.NewLine);
                return;
            }

            ValueInfo valueInfo = (ValueInfo)parent.Tag;

            DatatreeDotNet.dt_type_t t = DatatreeDotNet.dt_value_type(valueInfo.Value);
            if (t == DatatreeDotNet.dt_type_t.DT_ARRAY)
            {
                uint   w = (uint)parent.Nodes.IndexOf(treeView.SelectedNode);
                IntPtr o = IntPtr.Zero;
                DatatreeDotNet.dt_create_value(datatree, ref o, OnError, null, DatatreeDotNet.dt_type_t.DT_NULL);
                DatatreeDotNet.dt_remove_array_elem_at
                (
                    datatree,
                    DatatreeDotNet.dt_value_data(valueInfo.Value),
                    w,
                    o
                );
                DatatreeDotNet.dt_destroy_value(datatree, o);
            }
            else if (t == DatatreeDotNet.dt_type_t.DT_OBJECT)
            {
                uint   w = (uint)parent.Nodes.IndexOf(treeView.SelectedNode);
                IntPtr k = IntPtr.Zero;
                IntPtr v = IntPtr.Zero;
                DatatreeDotNet.dt_create_value(datatree, ref k, OnError, null, DatatreeDotNet.dt_type_t.DT_NULL);
                DatatreeDotNet.dt_create_value(datatree, ref v, OnError, null, DatatreeDotNet.dt_type_t.DT_NULL);
                DatatreeDotNet.dt_remove_object_member_at
                (
                    datatree,
                    DatatreeDotNet.dt_value_data(valueInfo.Value),
                    w,
                    k,
                    v
                );
                DatatreeDotNet.dt_destroy_value(datatree, k);
                DatatreeDotNet.dt_destroy_value(datatree, v);
            }
            else
            {
                Debug.Fail("Impossible");
            }

            parent.Nodes.Remove(treeView.SelectedNode);

            EditState = EditStates.OpenedNotSaved;
        }
示例#2
0
        private void ctrlValue_ValueChanged(object sender, string text)
        {
            if (treeView.SelectedNode == null)
            {
                return;
            }
            if (!(treeView.SelectedNode.Tag is ValueInfo))
            {
                return;
            }

            ValueInfo valueInfo = (ValueInfo)treeView.SelectedNode.Tag;

            if (valueInfo.Readonly)
            {
                return;
            }

            IntPtr v = IntPtr.Zero;
            int    r = DatatreeDotNet.dt_create_value(datatree, ref v, OnError, text);

            if (r == 0)
            {
                ctrlValue.Revert();
                return;
            }

            DatatreeDotNet.dt_value_mem_swap(valueInfo.Value, v);
            DatatreeDotNet.dt_destroy_value(datatree, v);

            EditState = EditStates.OpenedNotSaved;

            UpdateNodes();
        }
示例#3
0
        private void WalkValue(TreeNode node, IntPtr v, bool readOnly)
        {
            DatatreeDotNet.dt_type_t t = DatatreeDotNet.dt_value_type(v);
            switch (t)
            {
            case DatatreeDotNet.dt_type_t.DT_NULL:
            case DatatreeDotNet.dt_type_t.DT_BOOL:
            case DatatreeDotNet.dt_type_t.DT_LONG:
            case DatatreeDotNet.dt_type_t.DT_DOUBLE:
            case DatatreeDotNet.dt_type_t.DT_STRING:
                node.Tag = new ValueInfo(v, readOnly, false);

                string str = Util.FormatValue(datatree, v, false);
                node.Text = str;
                if (node.Nodes.Count != 0)
                {
                    node.Nodes.Clear();
                }
                break;

            case DatatreeDotNet.dt_type_t.DT_OBJECT:
                node.Tag = new ValueInfo(v, readOnly, true);

                node.Text = "{ ... }";
                WalkObject(node, DatatreeDotNet.dt_value_data(v));
                break;

            case DatatreeDotNet.dt_type_t.DT_ARRAY:
                node.Tag = new ValueInfo(v, readOnly, true);

                node.Text = "[ ... ]";
                WalkArray(node, DatatreeDotNet.dt_value_data(v));
                break;
            }
        }
示例#4
0
        private bool Save()
        {
            Debug.Assert(!string.IsNullOrEmpty(dbPath));

            DatatreeDotNet.dt_save_datatree_file(datatree, dbPath, DatatreeDotNet.dt_bool_t.DT_FALSE);

            EditState = EditStates.Saved;

            return(true);
        }
示例#5
0
        private void Open(string f)
        {
            dbPath = f;

            DatatreeDotNet.dt_load_datatree_file(datatree, dbPath);

            UpdateNodes();

            EditState = EditStates.Saved;
        }
示例#6
0
        private void New()
        {
            dbPath = null;

            if (datatree != IntPtr.Zero)
            {
                DatatreeDotNet.dt_unload_datatree(datatree);
            }
            DatatreeDotNet.dt_load_datatree_string(datatree, "null");

            UpdateNodes();

            EditState = EditStates.New;
        }
示例#7
0
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                self = null;

                DatatreeDotNet.dt_unload_datatree(datatree);
                DatatreeDotNet.dt_destroy_datatree(datatree);

                DatatreeDotNet.dt_destroy_command(command);

                components.Dispose();
            }
            base.Dispose(disposing);
        }
示例#8
0
        private void WalkArray(TreeNode parent, IntPtr a)
        {
            uint c = 0;

            DatatreeDotNet.dt_array_elem_count(datatree, a, ref c);

            EnsureNodeCount(parent, (int)c);

            for (uint i = 0; i < c; i++)
            {
                IntPtr v = IntPtr.Zero;
                DatatreeDotNet.dt_array_elem_at(datatree, a, i, ref v);

                TreeNode node = parent.Nodes[(int)i];
                WalkValue(node, v, false);
            }
        }
示例#9
0
        private void WalkObject(TreeNode parent, IntPtr o)
        {
            uint c = 0;

            DatatreeDotNet.dt_object_member_count(datatree, o, ref c);

            EnsureNodeCount(parent, (int)c);

            for (uint i = 0; i < c; i++)
            {
                IntPtr k = IntPtr.Zero;
                IntPtr v = IntPtr.Zero;
                DatatreeDotNet.dt_object_member_at(datatree, o, i, ref k, ref v);

                WalkPair(parent, k, v, i);
            }
        }
示例#10
0
        public static string FormatValue(IntPtr dt, IntPtr v, bool compact)
        {
            IntPtr s = IntPtr.Zero;

            DatatreeDotNet.dt_format_value
            (
                dt,
                v,
                ref s,
                compact ? DatatreeDotNet.dt_bool_t.DT_TRUE : DatatreeDotNet.dt_bool_t.DT_FALSE
            );
            string str = Marshal.PtrToStringAnsi(s);

            DatatreeDotNet.dt_free(ref s);

            return(str);
        }
示例#11
0
        private void txtCmd_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (string.IsNullOrEmpty(txtCmd.Text))
                {
                    return;
                }

                if (txtCmd.Text == "clear")
                {
                    txtOutput.Clear();
                    if (!txtCmd.Items.Contains(txtCmd.Text))
                    {
                        txtCmd.Items.Add(txtCmd.Text);
                    }
                    txtCmd.Text = string.Empty;
                    return;
                }

                DatatreeDotNet.dt_clear_command(command);
                DatatreeDotNet.dt_parse_command(command, OnError, txtCmd.Text);
                IntPtr ret = IntPtr.Zero;
                DatatreeDotNet.dt_query_status_t status = DatatreeDotNet.dt_query(DatatreeDotNet.dt_root_value(datatree), command, ref ret);
                if (status == DatatreeDotNet.dt_query_status_t.DTQ_GOT_NOTHING)
                {
                }
                else if (status == DatatreeDotNet.dt_query_status_t.DTQ_GOT_REF || status == DatatreeDotNet.dt_query_status_t.DTQ_GOT_NOREF)
                {
                    string str = Util.FormatValue(datatree, ret, false);
                    Message("Queried:" + Environment.NewLine + str + Environment.NewLine);
                    if (status == DatatreeDotNet.dt_query_status_t.DTQ_GOT_NOREF)
                    {
                        DatatreeDotNet.dt_destroy_value(datatree, ret);
                    }

                    if (!txtCmd.Items.Contains(txtCmd.Text))
                    {
                        txtCmd.Items.Add(txtCmd.Text);
                    }
                }

                txtCmd.Text = string.Empty;
            }
        }
示例#12
0
        private void UpdateNodes()
        {
            treeView.Visible = treeView.Enabled = false;

            if (treeView.Nodes.Count == 0)
            {
                TreeNode root = new TreeNode();
                WalkValue(root, DatatreeDotNet.dt_root_value(datatree), false);
                treeView.Nodes.Add(root);
            }
            else
            {
                TreeNode root = treeView.Nodes[0];
                treeView.Nodes.Clear();
                WalkValue(root, DatatreeDotNet.dt_root_value(datatree), false);
                treeView.Nodes.Add(root);
            }

            treeView.Visible = treeView.Enabled = true;
        }
示例#13
0
        private void Constructor()
        {
            self = this;

            InitializeComponent();

            ctrlValue.ValueChanged += ctrlValue_ValueChanged;

            treeView.NodeMouseClick += treeView_NodeMouseClick;

            txtCmd.KeyDown += txtCmd_KeyDown;

            DatatreeDotNet.dt_create_datatree(ref datatree, OnError);
            DatatreeDotNet.dt_create_command(ref command);

            Text = FORM_TITLE;

            New();

            EditState = EditStates.Closed;
        }
示例#14
0
        static void Main(string[] args)
        {
            IntPtr data_tree = IntPtr.Zero;
            IntPtr v0        = IntPtr.Zero;
            IntPtr v1        = IntPtr.Zero;
            IntPtr iv        = IntPtr.Zero;
            IntPtr a         = IntPtr.Zero;
            uint   idx       = 0;
            IntPtr fmt       = IntPtr.Zero;
            IntPtr bin       = IntPtr.Zero;
            uint   sz        = 0;

            DatatreeDotNet.dt_create_datatree(ref data_tree, _on_parse_error);

            // common test
            DatatreeDotNet.dt_load_datatree_string(data_tree, "'dt test'\n{\n  \"hello\" : \"world\",\n  \"data_tree\" : \"test\"\n}");

            // object key test
            DatatreeDotNet.dt_load_datatree_string(data_tree, "{ { \"hello\" : \"world\" } : 123 }");

            // array test
            DatatreeDotNet.dt_load_datatree_string(data_tree, "{ [\"hello\", \"world\"] : [123, 3.14] }");

            // multy types test
            DatatreeDotNet.dt_load_datatree_string(data_tree, "{ null : [2123, 3.1415926535897932384626, \"test\"], true : false, name : paladin_t }");

            // search test
            DatatreeDotNet.dt_create_value(data_tree, ref v0, _on_parse_error, "a_%s_b", "and");
            DatatreeDotNet.dt_destroy_value(data_tree, v0);
            DatatreeDotNet.dt_create_value(data_tree, ref v0, _on_parse_error, null, DatatreeDotNet.dt_type_t.DT_STRING, "name");
            DatatreeDotNet.dt_find_object_member_by_key(data_tree, DatatreeDotNet.dt_root_as_object(data_tree), v0, ref iv, ref idx);
            DatatreeDotNet.dt_destroy_value(data_tree, v0);

            // insert test
            DatatreeDotNet.dt_create_value(data_tree, ref v0, _on_parse_error, null, DatatreeDotNet.dt_type_t.DT_LONG, 123456);
            DatatreeDotNet.dt_create_value(data_tree, ref v1, _on_parse_error, null, DatatreeDotNet.dt_type_t.DT_STRING, "value test");
            DatatreeDotNet.dt_insert_object_member(data_tree, DatatreeDotNet.dt_root_as_object(data_tree), 1, v0, v1);
            DatatreeDotNet.dt_destroy_value(data_tree, v0);
            DatatreeDotNet.dt_destroy_value(data_tree, v1);

            DatatreeDotNet.dt_object_member_at(data_tree, DatatreeDotNet.dt_root_as_object(data_tree), 0, ref v0, ref v1);
            a = DatatreeDotNet.dt_value_data(v1);
            DatatreeDotNet.dt_create_value(data_tree, ref v0, _on_parse_error, null, DatatreeDotNet.dt_type_t.DT_STRING, "inserted");
            DatatreeDotNet.dt_insert_array_elem(data_tree, a, 1, v0);
            DatatreeDotNet.dt_destroy_value(data_tree, v0);

            // delete test
            DatatreeDotNet.dt_delete_array_elem_at(data_tree, a, 1);
            DatatreeDotNet.dt_delete_object_member_at(data_tree, DatatreeDotNet.dt_root_as_object(data_tree), 2);

            // update test

            // foreach test
            DatatreeDotNet.dt_foreach_object_member(data_tree, DatatreeDotNet.dt_root_as_object(data_tree), _walk_object_members);
            DatatreeDotNet.dt_foreach_array_elem(data_tree, a, _walk_array_elements);

            // clone test
            DatatreeDotNet.dt_create_value(data_tree, ref v0, _on_parse_error, null, null);
            DatatreeDotNet.dt_clone_value(data_tree, DatatreeDotNet.dt_root_value(data_tree), v0);
            DatatreeDotNet.dt_format_value(data_tree, v0, ref fmt, DatatreeDotNet.dt_bool_t.DT_FALSE);
            string str = Marshal.PtrToStringAnsi(fmt);

            Debug.Print("cloned value:\n{0}\n", str);
            DatatreeDotNet.dt_free(ref fmt);
            DatatreeDotNet.dt_destroy_value(data_tree, v0);

            // serialize test
            DatatreeDotNet.dt_save_datatree_bin(data_tree, ref bin, ref sz);
            DatatreeDotNet.dt_load_datatree_bin(data_tree, bin);
            DatatreeDotNet.dt_free(ref bin);

            // format test
            DatatreeDotNet.dt_save_datatree_string(data_tree, ref fmt, DatatreeDotNet.dt_bool_t.DT_FALSE);
            str = Marshal.PtrToStringAnsi(fmt);
            Debug.Print("root value:\n{0}\n", str);
            DatatreeDotNet.dt_free(ref fmt);

            // cpp helper test
            //dt::Value vp0(data_tree, null, DT_SHORT, 123);
            //dt::Value vp1(vp0);
            //dt::Value vp2;
            //vp2.cloneFrom(vp1);
            //vp2.cloneFrom(data_tree, dt_root_value(data_tree));
            //std::string vpstr = vp2.toString();
            //int cmp = vp2.compare(vp1);
            //cmp = vp2.compare(dt_root_value(data_tree));

            DatatreeDotNet.dt_unload_datatree(data_tree);
            DatatreeDotNet.dt_destroy_datatree(data_tree);
        }
示例#15
0
        private void Add(Func <string> source)
        {
            if (treeView.SelectedNode == null)
            {
                Message("Nothing selected." + Environment.NewLine);
                return;
            }

            if (!(treeView.SelectedNode.Tag is ValueInfo))
            {
                Message("Cannot add to this node." + Environment.NewLine);
                return;
            }

            ValueInfo valueInfo = (ValueInfo)treeView.SelectedNode.Tag;

            DatatreeDotNet.dt_type_t t = DatatreeDotNet.dt_value_type(valueInfo.Value);
            if (t == DatatreeDotNet.dt_type_t.DT_ARRAY)
            {
                string ipt = source();

                IntPtr o = IntPtr.Zero;
                DatatreeDotNet.dt_create_value(datatree, ref o, OnError, ipt);
                uint idx = 0;
                DatatreeDotNet.dt_add_array_elem
                (
                    datatree,
                    DatatreeDotNet.dt_value_data(valueInfo.Value),
                    o,
                    ref idx
                );
            }
            else if (t == DatatreeDotNet.dt_type_t.DT_OBJECT)
            {
                string ipt = source();

                IntPtr k = IntPtr.Zero;
                IntPtr v = IntPtr.Zero;
                DatatreeDotNet.dt_create_value(datatree, ref k, OnError, ipt);
                DatatreeDotNet.dt_create_value(datatree, ref v, OnError, "null");
                uint idx = 0;
                DatatreeDotNet.dt_status_t status = DatatreeDotNet.dt_add_object_member
                                                    (
                    datatree,
                    DatatreeDotNet.dt_value_data(valueInfo.Value),
                    k,
                    v,
                    ref idx
                                                    );
                if (status == DatatreeDotNet.dt_status_t.DT_KEY_EXISTS)
                {
                    Message("A key-value pair with the same key already exists." + Environment.NewLine);
                    return;
                }
            }
            else
            {
                Message("Cannot add to this node." + Environment.NewLine);
                return;
            }

            treeView.SelectedNode.Nodes.Add(new TreeNode());

            UpdateNodes();

            EditState = EditStates.OpenedNotSaved;
        }
示例#16
0
 public static string FormatDatatree(IntPtr dt, bool compact)
 {
     return(FormatValue(dt, DatatreeDotNet.dt_root_value(dt), compact));
 }