Advertisement
inoonan

JsonTreeViewLoader

Jan 20th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.92 KB | None | 0 0
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using SampleServiceWinForm.Properties;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Drawing;
  8. using System.Globalization;
  9. using System.Windows.Forms;
  10.  
  11. namespace SampleServiceWinForm.Helpers
  12. {
  13.     public static class JsonTreeViewLoader
  14.     {
  15.         private static bool _initialized;
  16.  
  17.         #region *** [TreeViewToJson] ***
  18.  
  19.         public static string TreeViewToJson(this TreeView treeView)
  20.         {
  21.             Dictionary<string, dynamic> result = new Dictionary<string, dynamic>();
  22.  
  23.             TreeNodeCollection nodes = treeView.Nodes;
  24.             foreach (TreeNode n in nodes)
  25.             {
  26.                 result.Add(n.Text, PrintRecursive(n));
  27.             }
  28.  
  29.             //return result;
  30.             return JsonConvert.SerializeObject(result, Formatting.Indented).Replace("{}",string.Empty);
  31.         }
  32.  
  33.         private static Dictionary<string, dynamic> PrintRecursive(this TreeNode treeNode)
  34.         {
  35.             Dictionary<string, dynamic> result = new Dictionary<string, dynamic>();
  36.  
  37.             foreach (TreeNode tn in treeNode.Nodes)
  38.             {
  39.                 result.Add(tn.Text, PrintRecursive(tn));
  40.             }
  41.             return result;
  42.         }
  43.  
  44.         #endregion *** [TreeViewToJson] ***
  45.  
  46.         #region *** [JsonToTreeView] ***
  47.  
  48.         public static void JsonToTreeView(this TreeView treeView, string json, string name)
  49.         {
  50.             if (string.IsNullOrWhiteSpace(json))
  51.             {
  52.                 return;
  53.             }
  54.  
  55.             treeView.Nodes.Clear();
  56.             InitializeImages(treeView);
  57.  
  58.             var token = JToken.Parse(json);
  59.             switch (token.Type)
  60.             {
  61.                 case JTokenType.Array:
  62.                     var objArray = JArray.Parse(json);
  63.                     AddArrayNodes(objArray, name, treeView.Nodes);
  64.                     break;
  65.  
  66.                 case JTokenType.Object:
  67.                     var objObject = JObject.Parse(json);
  68.                     AddObjectNodes(objObject, name, treeView.Nodes);
  69.                     break;
  70.  
  71.                 default:
  72.                     throw new NotImplementedException();
  73.             }
  74.         }
  75.  
  76.         private static void AddObjectNodes(JObject @object, string name, TreeNodeCollection parent)
  77.         {
  78.             var node = BuildBasicNode(@object.Type, name);
  79.             parent.Add(node);
  80.             foreach (var property in @object.Properties())
  81.             {
  82.                 AddTokenNodes(property.Value, property.Name, node.Nodes);
  83.             }
  84.         }
  85.  
  86.         private static void AddArrayNodes(JContainer array, string name, TreeNodeCollection parent)
  87.         {
  88.             var node = BuildBasicNode(array.Type, name);
  89.             parent.Add(node);
  90.             for (var i = 0; i < array.Count; i++)
  91.             {
  92.                 AddTokenNodes(array[i], $"[{i}]", node.Nodes);
  93.             }
  94.         }
  95.  
  96.         private static void AddTokenNodes(JToken token, string name, TreeNodeCollection parent)
  97.         {
  98.             switch (token)
  99.             {
  100.                 case JValue value:
  101.  
  102.                     TreeNode node = BuildBasicNode(value.Type, $"{name}: {value.Value}");
  103.                     parent.Add(node);
  104.                     break;
  105.  
  106.                 case JArray array:
  107.                     AddArrayNodes(array, name, parent);
  108.                     break;
  109.  
  110.                 case JObject jObject:
  111.                     AddObjectNodes(jObject, name, parent);
  112.                     break;
  113.             }
  114.         }
  115.  
  116.         private static TreeNode BuildBasicNode(JTokenType type, string name)
  117.         {
  118.             var node = new TreeNode(name)
  119.             {
  120.                 ImageKey = type.ToString(),
  121.                 SelectedImageKey = @"Selected"
  122.             };
  123.             return node;
  124.         }
  125.  
  126.         private static void InitializeImages(this TreeView treeView)
  127.         {
  128.             if (_initialized) return;
  129.  
  130.             // Load the images in an ImageList.
  131.             var imageList = new ImageList();
  132.             var resourceSet = JsonTreeViewImages.ResourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, false);
  133.             if (resourceSet != null)
  134.             {
  135.                 foreach (DictionaryEntry entry in resourceSet)
  136.                 {
  137.                     if (entry.Value is Bitmap value)
  138.                     {
  139.                         imageList.Images.Add((string)entry.Key, value);
  140.                     }
  141.                 }
  142.             }
  143.  
  144.             // Assign the ImageList to the TreeView.
  145.             treeView.ImageList = imageList;
  146.  
  147.             // Set the TreeView control's default image and selected image indexes.
  148.             treeView.ImageIndex = 0;
  149.             treeView.SelectedImageIndex = 1;
  150.  
  151.             // set our flag
  152.             _initialized = true;
  153.         }
  154.  
  155.         #endregion *** [JsonToTreeView] ***
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement