KPDataSave / 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
    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 <>.

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;
        // Хранит выбранный путь
        private string _selectedPath;

        public TreeViewFiles(DropboxClient client)
            // Подписываемся на собития двойного клика на элементе дерева
            NodeMouseDoubleClick +=new TreeNodeMouseClickEventHandler(TreeViewNodeMouseDoubleClick);
            NodeMouseClick +=new TreeNodeMouseClickEventHandler(TreeViewFilesNodeMouseClick);
            _client = client;

        public void ShowRootFiles()
            // Рут элемент "/"
            TreeNode root = new TreeNode("/");
            root.Tag = new MetaData {path = "/"};
            ConnectToNodeNodesAndMetaData(root, "/");
            // Раскрываем рут элемент

        // Двойное нажатие на элементе дерева
        private void TreeViewNodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
            TreeNode node = e.Node;
            MetaData data = (MetaData)node.Tag;
            // Только к директории можно подцепить узел
            if (data.is_dir)
                ConnectToNodeNodesAndMetaData(node, data.path);
                // Разкрываем элемент

        // Внесение узлов и метаданных в родителя (node), по определенному пути на сервере
        private void ConnectToNodeNodesAndMetaData(TreeNode node, string path)
            // Удаляем все узлы в ноде
            MetaData data = _client.GetMetaData(path);
            foreach (MetaData val in data.contents)
                // Если файл, пропускаем
                if (!val.is_dir)
                string lpath = val.path;
                // Оставляем только имя файла
                string name = lpath.Substring(lpath.LastIndexOf("/") + 1);
                TreeNode lnode = new TreeNode(name);
                // Сохраняем объект класса MetaData в элементе
                lnode.Tag = val;

        // Одинарный клик мыши на элементе дерева
        // Происходит получение пути
        private void TreeViewFilesNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            TreeNode node = e.Node;
            MetaData data = (MetaData)node.Tag;
            _selectedPath = data.path;

        public string SelectedPath
            get { return _selectedPath; }
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.