#pragma once

namespace BackgroundWorker {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::Collections::Generic;
	using namespace System::IO;

	/// <summary>
	/// Zusammenfassung für Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
   private: System::Windows::Forms::SplitContainer^  splitContainer1;
   private: System::Windows::Forms::ListBox^  listBox1;
   private: System::Windows::Forms::PictureBox^  pictureBox1;
   private: System::Windows::Forms::MenuStrip^  menuStrip1;
   private: System::Windows::Forms::ToolStripMenuItem^  dateiToolStripMenuItem;
   private: System::Windows::Forms::ToolStripMenuItem^  pNGDateienSuchenToolStripMenuItem;
   private: System::Windows::Forms::ToolStripMenuItem^  beendenToolStripMenuItem;


	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
         this->splitContainer1 = (gcnew System::Windows::Forms::SplitContainer());
         this->listBox1 = (gcnew System::Windows::Forms::ListBox());
         this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
         this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
         this->dateiToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
         this->pNGDateienSuchenToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
         this->beendenToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
         (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->splitContainer1))->BeginInit();
         this->splitContainer1->Panel1->SuspendLayout();
         this->splitContainer1->Panel2->SuspendLayout();
         this->splitContainer1->SuspendLayout();
         (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox1))->BeginInit();
         this->menuStrip1->SuspendLayout();
         this->SuspendLayout();
         // 
         // splitContainer1
         // 
         this->splitContainer1->Dock = System::Windows::Forms::DockStyle::Fill;
         this->splitContainer1->Location = System::Drawing::Point(0, 24);
         this->splitContainer1->Name = L"splitContainer1";
         // 
         // splitContainer1.Panel1
         // 
         this->splitContainer1->Panel1->Controls->Add(this->listBox1);
         // 
         // splitContainer1.Panel2
         // 
         this->splitContainer1->Panel2->Controls->Add(this->pictureBox1);
         this->splitContainer1->Size = System::Drawing::Size(1004, 312);
         this->splitContainer1->SplitterDistance = 700;
         this->splitContainer1->TabIndex = 0;
         // 
         // listBox1
         // 
         this->listBox1->Dock = System::Windows::Forms::DockStyle::Fill;
         this->listBox1->FormattingEnabled = true;
         this->listBox1->Location = System::Drawing::Point(0, 0);
         this->listBox1->Name = L"listBox1";
         this->listBox1->Size = System::Drawing::Size(700, 312);
         this->listBox1->TabIndex = 0;
         this->listBox1->DoubleClick += gcnew System::EventHandler(this, &Form1::listBox1_DoubleClick);
         // 
         // pictureBox1
         // 
         this->pictureBox1->Dock = System::Windows::Forms::DockStyle::Fill;
         this->pictureBox1->Location = System::Drawing::Point(0, 0);
         this->pictureBox1->Name = L"pictureBox1";
         this->pictureBox1->Size = System::Drawing::Size(300, 312);
         this->pictureBox1->SizeMode = System::Windows::Forms::PictureBoxSizeMode::CenterImage;
         this->pictureBox1->TabIndex = 0;
         this->pictureBox1->TabStop = false;
         // 
         // menuStrip1
         // 
         this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) {this->dateiToolStripMenuItem});
         this->menuStrip1->Location = System::Drawing::Point(0, 0);
         this->menuStrip1->Name = L"menuStrip1";
         this->menuStrip1->Size = System::Drawing::Size(1004, 24);
         this->menuStrip1->TabIndex = 1;
         this->menuStrip1->Text = L"menuStrip1";
         // 
         // dateiToolStripMenuItem
         // 
         this->dateiToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(2) {this->pNGDateienSuchenToolStripMenuItem, 
            this->beendenToolStripMenuItem});
         this->dateiToolStripMenuItem->Name = L"dateiToolStripMenuItem";
         this->dateiToolStripMenuItem->Size = System::Drawing::Size(46, 20);
         this->dateiToolStripMenuItem->Text = L"&Datei";
         // 
         // pNGDateienSuchenToolStripMenuItem
         // 
         this->pNGDateienSuchenToolStripMenuItem->Name = L"pNGDateienSuchenToolStripMenuItem";
         this->pNGDateienSuchenToolStripMenuItem->Size = System::Drawing::Size(184, 22);
         this->pNGDateienSuchenToolStripMenuItem->Text = L"&PNG-Dateien suchen";
         this->pNGDateienSuchenToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::pNGDateienSuchenToolStripMenuItem_Click);
         // 
         // beendenToolStripMenuItem
         // 
         this->beendenToolStripMenuItem->Name = L"beendenToolStripMenuItem";
         this->beendenToolStripMenuItem->Size = System::Drawing::Size(184, 22);
         this->beendenToolStripMenuItem->Text = L"&Beenden";
         this->beendenToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::beendenToolStripMenuItem_Click);
         // 
         // Form1
         // 
         this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
         this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
         this->ClientSize = System::Drawing::Size(1004, 336);
         this->Controls->Add(this->splitContainer1);
         this->Controls->Add(this->menuStrip1);
         this->Name = L"Form1";
         this->Text = L"BackgroundWorker";
         this->splitContainer1->Panel1->ResumeLayout(false);
         this->splitContainer1->Panel2->ResumeLayout(false);
         (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->splitContainer1))->EndInit();
         this->splitContainer1->ResumeLayout(false);
         (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox1))->EndInit();
         this->menuStrip1->ResumeLayout(false);
         this->menuStrip1->PerformLayout();
         this->ResumeLayout(false);
         this->PerformLayout();

      }
#pragma endregion



private: 
   
   /* Ereignisbehandlungsmethode zu dem Menübefehl PNG-Dateien suchen
    * leert zuerst das Listenfeld (für den Fall, dass der Befehl erneut aufgerufen wird
    * ruft dann die interne Methode suchePNGs auf, mit der das Laufwerk C:\ nach 
    * PNG-Dateien durchsucht und FileInfo-Instanzen für die gefundenen Dateien 
    * in die Auflistung pngdateien eingetragen wird.
    * Nach Abschluss der Suche wird eine Datenbindung zwischen dem Listenfeld und der 
    * Auflistung pngdateien hergestellt, wodurch die Dateinamen 
    * (FileInfo-Eigenschaft FullName) im Listenfeld erscheinen.
    */
   void pNGDateienSuchenToolStripMenuItem_Click(Object^  sender, EventArgs^  e) 
   {
         List<FileInfo^>^ pngdateien = gcnew List<FileInfo^>();      

         // Liste leeren
         listBox1->DataSource = nullptr;
         listBox1->Items->Clear();

         // PNG-Dateien suchen
         suchePNGs(gcnew DirectoryInfo("C:\\"), pngdateien);

         // Liste mit gefundenen Dateien füllen
         listBox1->DisplayMember = "FullName";
         listBox1->DataSource = pngdateien;
   }

   void beendenToolStripMenuItem_Click(Object^  sender, EventArgs^  e) 
   {
      this->Close();
   }

   void listBox1_DoubleClick(Object^  sender, EventArgs^  e) 
   {
      // angeklickte Bilddatei in die PictureBox laden
      if (listBox1->SelectedItem != nullptr)
      {
         FileInfo^ fi = dynamic_cast<FileInfo^>(listBox1->SelectedItem);
         pictureBox1->Image = Image::FromFile(fi->FullName);
      }
   }

   /* rekursive Methode, welche das im 1. Argument übergebene Verzeichnis und alle
    * Unterverzeichnisse nach PNG-Dateien durchsucht. Für jede gefundene Datei wird
    * das zugehörige FileInfo-Objekt in die Auflistung eingetragen, die als 2. Argument
    * übergeben wurde.
    */
   void suchePNGs(DirectoryInfo^ verzeichnis, List<FileInfo^>^ pngdateien)
   {
      // Liste der Unterverzeichnisse erstellen und in Unterverzeichnisse verzweigen
      array<DirectoryInfo^>^ verzeichnisse = verzeichnis->GetDirectories();

      for each (DirectoryInfo^ verz in verzeichnisse)
      {
         // Application::DoEvents();

         try
         {
            suchePNGs(verz, pngdateien);
         }
         catch (UnauthorizedAccessException^ e) {}
      }

      // PNG-Dateien in aktuellem Verzeichnis abfragen ...
      array<FileInfo^>^ dateien = verzeichnis->GetFiles("*.png");

      // ... und in pngdateien-Auflistung eintragen
      pngdateien->AddRange(dateien);
   }

};
}

