using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using Core.Common.Controls.Swf.Properties; using Core.Common.Controls.Swf.TreeViewControls; namespace Core.Common.Controls.Swf { /// /// TODO: migrate to DelftTools.Controls.Swf /// public partial class FileSystemTreeView : TreeView { private string searchPattern; public FileSystemTreeView() { InitializeComponent(); NodePresenters.Add(new ComputerTreeNodePresenter()); NodePresenters.Add(new DriveTreeNodePresenter()); NodePresenters.Add(new DirectoryTreeNodePresenter()); NodePresenters.Add(new FileTreeNodePresenter()); CheckBoxes = true; Data = new ComputerInfo { HostName = "My Computer" }; Nodes[0].Expand(); } /// /// Seach pattern as used in DirectoryInfo.GetFiles() method (Example : *.CSV) /// public string SearchPattern { get { return searchPattern; } set { searchPattern = value; foreach (var directoryTreeNodePresenter in NodePresenters.OfType()) { directoryTreeNodePresenter.SearchPattern = value; } foreach (var driveTreeNodePresenter in NodePresenters.OfType()) { driveTreeNodePresenter.SearchPattern = value; } } } public IEnumerable SelectedFiles { get { return AllLoadedNodes .Where(n => n.Checked && n.Tag is FileInfo) .Select(n => (FileInfo) n.Tag); } } /// /// Expand treeview to given path /// /// /// public bool ExpandTo(string path) { DirectoryInfo directoryInfo = null; if (File.Exists(path)) { directoryInfo = new FileInfo(path).Directory; } if (Directory.Exists(path)) { directoryInfo = new DirectoryInfo(path); } if (directoryInfo == null) { return false; } ITreeNode node = FindDirectoryNode(Nodes[0], directoryInfo); if (node != null) { SelectedNode = node; node.Expand(); return true; } return false; } private ITreeNode FindDirectoryNode(ITreeNode node, DirectoryInfo directoryInfo) { foreach (var child in node.Nodes) { if (child.Tag is DirectoryInfo) { if (directoryInfo.FullName.StartsWith(((DirectoryInfo) child.Tag).FullName, StringComparison.OrdinalIgnoreCase)) { ITreeNode returnNode = FindDirectoryNode(child, directoryInfo); if (returnNode != null) { return returnNode; } return child; } } else if (child.Tag is DriveInfo) { if (directoryInfo.FullName.StartsWith(((DriveInfo) child.Tag).Name, StringComparison.OrdinalIgnoreCase)) { ITreeNode returnNode = FindDirectoryNode(child, directoryInfo); if (returnNode != null) { return returnNode; } return child; } } } return null; } public class ComputerInfo { public string HostName { get; set; } } public class ComputerTreeNodePresenter : TreeViewNodePresenterBase { private static readonly Bitmap ComputerIcon = Resources.computer; public override IEnumerable GetChildNodeObjects(ComputerInfo parentNodeData, ITreeNode node) { foreach (var logicalDrive in Environment.GetLogicalDrives()) { yield return new DriveInfo(logicalDrive); } } public override void UpdateNode(ITreeNode parentNode, ITreeNode node, ComputerInfo data) { node.Text = data.HostName; node.Image = ComputerIcon; node.ShowCheckBox = false; } } public class DirectoryTreeNodePresenter : TreeViewNodePresenterBase { private static readonly Bitmap FolderIcon = Resources.folder; public string SearchPattern { get; set; } public override IEnumerable GetChildNodeObjects(DirectoryInfo parentNodeData, ITreeNode node) { var childDirectories = Enumerable.Empty(); try { childDirectories = parentNodeData.GetDirectories(); } catch (UnauthorizedAccessException) {} catch (IOException) {} foreach (var directoryInfo in childDirectories) { yield return directoryInfo; } var childFiles = Enumerable.Empty(); try { childFiles = parentNodeData.GetFiles(string.IsNullOrEmpty(SearchPattern) ? "*" : SearchPattern); } catch (UnauthorizedAccessException) {} catch (IOException) {} foreach (var fileInfo in childFiles) { yield return fileInfo; } } public override void UpdateNode(ITreeNode parentNode, ITreeNode node, DirectoryInfo data) { node.Text = data.Name; node.Image = FolderIcon; node.Tag = data; } } public class DriveTreeNodePresenter : TreeViewNodePresenterBase { private static readonly Bitmap DriveIcon = Resources.drive; public string SearchPattern { get; set; } public override IEnumerable GetChildNodeObjects(DriveInfo parentNodeData, ITreeNode node) { var list = new List(); if (parentNodeData.IsReady) { list.AddRange(parentNodeData.RootDirectory.GetDirectories()); list.AddRange(parentNodeData.RootDirectory.GetFiles(string.IsNullOrEmpty(SearchPattern) ? "*" : SearchPattern)); } return list; } public override void UpdateNode(ITreeNode parentNode, ITreeNode node, DriveInfo data) { node.Text = data.Name; node.Image = DriveIcon; node.ShowCheckBox = false; } } public class FileTreeNodePresenter : TreeViewNodePresenterBase { private static readonly Bitmap FileIcon = Resources.page_white; public override void UpdateNode(ITreeNode parentNode, ITreeNode node, FileInfo data) { node.Text = data.Name; node.Image = FileIcon; node.Tag = data; } } } }