Commits

HexRx committed d5bce5b

Tree view file control

Comments (0)

Files changed (1)

KPDataSave/Controls/TreeViewFiles.cs

+/*
+    KPDataSave - KeePass plugin which saves database in Dropbox service
+    Copyright (C) 2011-2012 HexRx
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using DropboxAPI;
+using DropboxAPI.Models;
+
+namespace KPDataSave.Controls
+{
+    public class TreeViewFiles : TreeView
+    {
+        private readonly DropboxClient _client;
+
+        public TreeViewFiles(DropboxClient client)
+        {
+            // Подписываемся на собития двойного клика на элементе дерева
+            NodeMouseDoubleClick +=new TreeNodeMouseClickEventHandler(treeView_NodeMouseDoubleClick);
+            _client = client;
+        }
+
+        public void ShowRootFiles()
+        {
+            // Рут элемент "/"
+            TreeNode root = new TreeNode("/");
+            Nodes.Add(root);
+            ConnectToNodeNodesAndMetaData(root, "/");
+            // Раскрываем рут элемент
+            root.Expand();
+        }
+
+        // Двойное нажатие на элементе дерева
+        private void treeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
+        {
+            TreeNode node = e.Node;
+            MetaData data = (MetaData)node.Tag;
+            // Только к директории можно подцепить узел
+            if (data.is_dir)
+            {
+                ConnectToNodeNodesAndMetaData(node, data.path);
+                // Разкрываем элемент
+                node.Expand();
+            }
+        }
+
+        // Внесение узлов и метаданных в родителя (node), по определенному пути на сервере
+        private void ConnectToNodeNodesAndMetaData(TreeNode node, string path)
+        {
+            // Удаляем все узлы в ноде
+            node.Nodes.Clear();
+            MetaData data = _client.GetMetaData(path);
+            foreach (MetaData val in data.contents)
+            {
+                // Если файл, пропускаем
+                if (!val.is_dir)
+                    continue;
+                string lpath = val.path;
+                // Оставляем только имя файла
+                string name = lpath.Substring(lpath.LastIndexOf("/") + 1);
+                TreeNode lnode = new TreeNode(name);
+                // Сохраняем объект класса MetaData в элементе
+                lnode.Tag = val;
+                node.Nodes.Add(lnode);
+            }
+        }
+    }
+}