DirectoryTreeView.cpp
#include "StdAfx.h"
#include "DirectoryTreeView.h"
#include "Settings.h"
using namespace Core;
using namespace System;
using namespace System::Diagnostics;
/// [ Constructor ]
DirectoryTreeView::DirectoryTreeView()
{
}
/// ใใชใผใๆดๆฐใใ
void DirectoryTreeView::RefreshTree()
{
// ๅๆ็ปใ็กๅนใซใใ
BeginUpdate();
// ใในใฆใฎใใชใผใใผใใๅ้คใใ
this->Nodes->Clear();
String^ rootDirectory = Environment::CurrentDirectory; // ใซใผใใใฃใฌใฏใใช
// ... ใใผใใๆง็ฏใใ
Windows::Forms::TreeNode^ treeNode = gcnew Windows::Forms::TreeNode( rootDirectory, 0, 0 );
// ... ใใใใใชใผใฎใใผใใซ่ฟฝๅ ใใ
this->Nodes->Add( treeNode );
// ... ใใใใใฃใฌใฏใใชใซ่ฟฝๅ ใใ
AddDirectories( treeNode );
// ใใชใผใใผใใๅฑ้ใใ
treeNode->Expand();
// ๅๆ็ปใๆๅนใซใใ
EndUpdate();
if( this->SelectedNode == nullptr )
{
// ้ธๆใใใฆใใใใผใใใชใใใฐใใซใผใใ้ธๆใใ
this->SelectedNode = treeNode;
}
Debug::WriteLine( "ใใฃใฌใฏใใช ใใชใผใๆดๆฐใใ" );
}
/// ใใฃใฌใฏใใชใ่ฟฝๅ ใใ
void DirectoryTreeView::AddDirectories( System::Windows::Forms::TreeNode^ treeNode )
{
// ใใชใผใใ็ตถๅฏพใในใๅๅพใใ
String^ absolutePath = treeNode->FullPath;
// ... ใใฃใฌใฏใใชใไฝๆใใ
IO::DirectoryInfo^ directoryInfo = gcnew IO::DirectoryInfo( absolutePath );
Array^ subDirectories; // ใตใใใฃใฌใฏใใชใๆ ผ็ดใใใใใฎ้
ๅ
try
{
// ใตใใใฃใฌใฏใใชใๅๅพใใ
subDirectories = directoryInfo->GetDirectories();
}
catch( System::IO::IOException^ e )
{
Debug::WriteLine( "ใตใใใฃใฌใฏใใชใซใขใฏใปในใงใใชใ : " + e->Message );
// ๅฆ็ใๆใใ
return;
}
catch( System::UnauthorizedAccessException^ e )
{
Debug::WriteLine( "ใชใใฌใผใใฃใณใฐใทในใใ ใซใใ ใขใฏใปในใๆๅฆใใใ : " + e->Message );
// ๅฆ็ใๆใใ
return;
}
for each( IO::DirectoryInfo^ directory in subDirectories )
{
if( directory->FullName != Settings::UserSettingFloder )
{
// ่จญๅฎใใกใคใซใฎใใฃใฌใฏใใชใงใชใใใฐใใใฃใฌใฏใใชใฎใใผใใๆง็ฏใใ
Windows::Forms::TreeNode^ newNode = gcnew Windows::Forms::TreeNode(
directory->Name, // ใใชใผใใผใใฎใฉใใซ
1, // ้ธๆใใใฆใใชใใจใใซ่กจ็คบใใ Image ใฎใคใณใใใฏในๅค
2 // ้ธๆใใใฆใใใจใใซ่กจ็คบใใ Image ใฎใคใณใใใฏในๅค
);
// ... ใใใๆฐใใใใชใผใใผใใจใใฆ่ฟฝๅ ใใ
treeNode->Nodes->Add( newNode );
// ... ใใฎใตใใใฃใฌใฏใใชใไฝๆใใใใ ๅๅธฐ็ใซๅผใณๅบใ
AddDirectories( newNode );
}
}
}
/// ใญใผใๆผใใใ
void DirectoryTreeView::OnKeyDown( System::Windows::Forms::KeyEventArgs^ e )
{
// ๅบๆฌใฏใฉในใฎๅไธ้ขๆฐใๅผใณๅบใ
System::Windows::Forms::TreeView::OnKeyDown( e );
// [ F5 ]ใๆผใใใใชใใฐใ่กจ็คบใๆดๆฐใใ
if( e->KeyCode == Windows::Forms::Keys::F5 )
{
// ็พๅจ ้ธๆใใใฆใใใใผใใฎใใซใในใๅๅพใใ
String^ selectedNode = this->SelectedNode->FullPath;
// ... ใใชใผใๆดๆฐใใ
RefreshTree();
// ... ใใฃใฌใฏใใชใ้ธๆใ็ดใ
SelectSpecifiedDirectory( selectedNode );
}
}
/// ๆๅฎใใใใใฃใฌใฏใใชใ้ธๆใใ
void DirectoryTreeView::SelectSpecifiedDirectory( System::String^ targetPath )
{
// ๆๅฎใใใใใฃใฌใฏใใชใ ใใผใใใๆค็ดขใใ
Windows::Forms::TreeNode^ findedNode = SearchNodeForString( targetPath, this->TopNode );
if( findedNode != nullptr )
{
// ็บ่ฆใใใใผใใ้ธๆใใ
this->SelectedNode = findedNode;
Debug::WriteLine( "้ธๆใใใใใฃใฌใฏใใช : " + findedNode->FullPath );
}
}
/// ๆๅญๅใซไธ่ดใใ ใใผใใๆค็ดขใใ
System::Windows::Forms::TreeNode^ DirectoryTreeView::SearchNodeForString( System::String^ target, System::Windows::Forms::TreeNode^ treeNode )
{
Windows::Forms::TreeNode^ result = nullptr;
if( treeNode->FullPath == target )
{
// ใใผใใฎใใซใในใๅฏพ่ฑกใฎๆๅญๅใจไธ่ดใใใชใใฐใใใฎใใผใใ่ฟใ
result = treeNode;
}
else
{
for each( Windows::Forms::TreeNode^ node in treeNode->Nodes )
{
// ๅ
จใฆใฎใใผใใ ๅๅธฐ็ใซๅผใณๅบใ
result = SearchNodeForString( target, node );
// ็บ่ฆใงใใใชใใฐๅฆ็ใไธญๆญขใใ
if( result != nullptr ) break;
}
}
return result;
}