/// <summary>
        /// Creates a heirarchial data structure of the data elements from the file system's
        /// directory layout, later used to produce the displayed item
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        private HashSet <DataTreeViewItem> CreateTreeViewItemStructure(HashSet <FileDeclaration> files)
        {
            HashSet <DataTreeViewItem> items = new HashSet <DataTreeViewItem>();

            foreach (FileDeclaration d in files)
            {
                string   path      = Files.PathRelativeTo(d.Info.FullName, Files.MacroDirectory);
                string[] fileitems = path.Split(Path.DirectorySeparatorChar).Where <string>(x => !String.IsNullOrEmpty(x)).ToArray <string>();

                System.Diagnostics.Debug.WriteLine(fileitems.Count() + "  " + path);

                if (fileitems.Any())
                {
                    DataTreeViewItem root = items.FirstOrDefault(x => x.name.Equals(fileitems[0]) && x.level.Equals(1));

                    if (root == null)
                    {
                        root = new DataTreeViewItem()
                        {
                            level = 1, name = fileitems[0], decl = d, root = "/", folder = !Path.HasExtension(fileitems[0]), children = new List <DataTreeViewItem>()
                        };
                        items.Add(root);
                    }

                    if (fileitems.Length > 1)
                    {
                        DataTreeViewItem parent = root;
                        int lev = 2;

                        for (int i = 1; i < fileitems.Length; i++)
                        {
                            DataTreeViewItem child = parent.children.FirstOrDefault(x => x.name.Equals(fileitems[i]) && x.level.Equals(lev));

                            if (child == null)
                            {
                                child = new DataTreeViewItem()
                                {
                                    level = lev, name = fileitems[i], decl = d, root = parent.root + "/" + parent.name, folder = !Path.HasExtension(fileitems[i]), children = new List <DataTreeViewItem>()
                                };
                                parent.children.Add(child);
                            }

                            parent = child;
                            lev++;
                        }
                    }
                }
            }

            return(items);
        }
        /// <summary>
        /// Creates an item from a data source and adds it to its parent
        /// </summary>
        /// <param name="parent">The parent of the item</param>
        /// <param name="data">The data of the macro, for the tree view item</param>
        /// <returns></returns>
        private DisplayableTreeViewItem CreateTreeViewItem(DisplayableTreeViewItem parent, DataTreeViewItem data)
        {
            DisplayableTreeViewItem item = new DisplayableTreeViewItem();

            item.Header     = data.name;
            item.IsFolder   = data.folder;
            item.IsExpanded = false;
            item.Parent     = parent;

            if (data.children != null)
            {
                foreach (DataTreeViewItem child in data.children)
                {
                    DisplayableTreeViewItem node = CreateTreeViewItem(item, child);

                    if (node != null)
                    {
                        item.Items.Add(node);
                    }
                }
            }

            if (!data.folder)
            {
                item.Declaration = data.decl;

                item.SelectedEvent    += delegate(object sender, RoutedEventArgs args) { SelectedItem = item; };
                item.DoubleClickEvent += delegate(object sender, MouseButtonEventArgs args) { OpenMacro(data.decl); args.Handled = true; };
            }

            item.Root             = data.root;
            item.RightClickEvent += TreeViewItem_OnPreviewMouseRightButtonDown;

            return(item);
        }