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; }
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(); }
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; } }
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); }
private void Open(string f) { dbPath = f; DatatreeDotNet.dt_load_datatree_file(datatree, dbPath); UpdateNodes(); EditState = EditStates.Saved; }
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; }
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); }
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); } }
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); } }
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); }
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; } }
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; }
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; }
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); }
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; }
public static string FormatDatatree(IntPtr dt, bool compact) { return(FormatValue(dt, DatatreeDotNet.dt_root_value(dt), compact)); }