Source

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

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

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

        // Двойное нажатие на элементе дерева
        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.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);
            }
        }

        // Одинарный клик мыши на элементе дерева
        // Происходит получение пути
        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 ProjectModifiedEvent.java.
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.