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;
}