#pragma once


namespace Texteditor {

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

	/// <summary>
	/// Zusammenfassung für Form1
	///
	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
	///          arbeiten, die diesem Formular zugewiesen sind.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
    private:
        bool dirty;									// gibt es ungespeicherte Änderungen?
        String ^dateiname;							// speichert den Dateinamen
        OpenFileDialog ^openFileDialog1;			// Öffnen-Dialog
        SaveFileDialog ^saveFileDialog1;			// Speichern-Dialog
		System::Windows::Forms::Timer^  timer1;		// für Aktivierung des Einfügen-Befehls

	public:
		Form1(void)
		{
			 InitializeComponent();
			
			 dirty = false;
			 dateiname = nullptr;

			 // Öffnen-Dialog erzeugen und für ersten Aufruf konfigurieren
			 openFileDialog1 = gcnew OpenFileDialog();
			 openFileDialog1->InitialDirectory = ".";
			 openFileDialog1->Filter = "Quelltextdateien (*.cpp)|*.cpp|"
									 + "Headerateien (*.h)|*.h|"
									 + "Textdateien (*.txt)|*.txt";
			 openFileDialog1->FilterIndex = 1;
			 openFileDialog1->Multiselect = false;

			 // Speichern-Dialog erzeugen und für ersten Aufruf konfigurieren
			 saveFileDialog1 = gcnew SaveFileDialog();
			 saveFileDialog1->InitialDirectory = ".";
			 saveFileDialog1->Filter = "Quelltextdateien (*.cpp)|*.cpp|"
									 + "Headerateien (*.h)|*.h|"
									 + "Textdateien (*.txt)|*.txt";
			 saveFileDialog1->FilterIndex = 1;

			 timer1->Start();
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
    private: System::Windows::Forms::MenuStrip^  menuStrip1;
    private: System::Windows::Forms::ToolStripMenuItem^  miDatei;
    private: System::Windows::Forms::ToolStripMenuItem^  miDateiNeu;
    private: System::Windows::Forms::ToolStripMenuItem^  miDateiOeffnen;
    private: System::Windows::Forms::ToolStripMenuItem^  miDateiSpeichern;
    private: System::Windows::Forms::ToolStripMenuItem^  miDateiSpeichernunter;


    private: System::Windows::Forms::ToolStripSeparator^  toolStripMenuItem1;
    private: System::Windows::Forms::ToolStripMenuItem^  miDateiBeenden;
    private: System::Windows::Forms::ToolStripMenuItem^  miBearbeiten;
    private: System::Windows::Forms::ToolStripMenuItem^  miBearbeitenAusschneiden;
    private: System::Windows::Forms::ToolStripMenuItem^  miBearbeitenKopieren;
    private: System::Windows::Forms::ToolStripMenuItem^  miBearbeitenEinfuegen;
    private: System::Windows::Forms::TextBox^  textBox1;
    private: System::ComponentModel::IContainer^  components;


	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>


#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->components = (gcnew System::ComponentModel::Container());
			this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
			this->miDatei = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miDateiNeu = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miDateiOeffnen = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miDateiSpeichern = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miDateiSpeichernunter = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->toolStripMenuItem1 = (gcnew System::Windows::Forms::ToolStripSeparator());
			this->miDateiBeenden = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miBearbeiten = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miBearbeitenAusschneiden = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miBearbeitenKopieren = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->miBearbeitenEinfuegen = (gcnew System::Windows::Forms::ToolStripMenuItem());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
			this->menuStrip1->SuspendLayout();
			this->SuspendLayout();
			// 
			// menuStrip1
			// 
			this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(2) {this->miDatei, this->miBearbeiten});
			this->menuStrip1->Location = System::Drawing::Point(0, 0);
			this->menuStrip1->Name = L"menuStrip1";
			this->menuStrip1->Size = System::Drawing::Size(399, 24);
			this->menuStrip1->TabIndex = 0;
			this->menuStrip1->Text = L"menuStrip1";
			// 
			// miDatei
			// 
			this->miDatei->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(6) {this->miDateiNeu, 
				this->miDateiOeffnen, this->miDateiSpeichern, this->miDateiSpeichernunter, this->toolStripMenuItem1, this->miDateiBeenden});
			this->miDatei->Name = L"miDatei";
			this->miDatei->Size = System::Drawing::Size(46, 20);
			this->miDatei->Text = L"&Datei";
			// 
			// miDateiNeu
			// 
			this->miDateiNeu->Name = L"miDateiNeu";
			this->miDateiNeu->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::N));
			this->miDateiNeu->Size = System::Drawing::Size(168, 22);
			this->miDateiNeu->Text = L"&Neu";
			this->miDateiNeu->Click += gcnew System::EventHandler(this, &Form1::miDateiNeu_Click);
			// 
			// miDateiOeffnen
			// 
			this->miDateiOeffnen->Name = L"miDateiOeffnen";
			this->miDateiOeffnen->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::O));
			this->miDateiOeffnen->Size = System::Drawing::Size(168, 22);
			this->miDateiOeffnen->Text = L"Ö&ffnen";
			this->miDateiOeffnen->Click += gcnew System::EventHandler(this, &Form1::miDateiOeffnen_Click);
			// 
			// miDateiSpeichern
			// 
			this->miDateiSpeichern->Name = L"miDateiSpeichern";
			this->miDateiSpeichern->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::S));
			this->miDateiSpeichern->Size = System::Drawing::Size(168, 22);
			this->miDateiSpeichern->Text = L"&Speichern";
			this->miDateiSpeichern->Click += gcnew System::EventHandler(this, &Form1::miDateiSpeichern_Click);
			// 
			// miDateiSpeichernunter
			// 
			this->miDateiSpeichernunter->Name = L"miDateiSpeichernunter";
			this->miDateiSpeichernunter->Size = System::Drawing::Size(168, 22);
			this->miDateiSpeichernunter->Text = L"Speichern &unter";
			this->miDateiSpeichernunter->Click += gcnew System::EventHandler(this, &Form1::miDateiSpeichernunter_Click);
			// 
			// toolStripMenuItem1
			// 
			this->toolStripMenuItem1->Name = L"toolStripMenuItem1";
			this->toolStripMenuItem1->Size = System::Drawing::Size(165, 6);
			// 
			// miDateiBeenden
			// 
			this->miDateiBeenden->Name = L"miDateiBeenden";
			this->miDateiBeenden->Size = System::Drawing::Size(168, 22);
			this->miDateiBeenden->Text = L"&Beenden";
			this->miDateiBeenden->Click += gcnew System::EventHandler(this, &Form1::miDateiBeenden_Click);
			// 
			// miBearbeiten
			// 
			this->miBearbeiten->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(3) {this->miBearbeitenAusschneiden, 
				this->miBearbeitenKopieren, this->miBearbeitenEinfuegen});
			this->miBearbeiten->Name = L"miBearbeiten";
			this->miBearbeiten->Size = System::Drawing::Size(75, 20);
			this->miBearbeiten->Text = L"&Bearbeiten";
			// 
			// miBearbeitenAusschneiden
			// 
			this->miBearbeitenAusschneiden->Name = L"miBearbeitenAusschneiden";
			this->miBearbeitenAusschneiden->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::X));
			this->miBearbeitenAusschneiden->Size = System::Drawing::Size(191, 22);
			this->miBearbeitenAusschneiden->Text = L"&Ausschneiden";
			this->miBearbeitenAusschneiden->Click += gcnew System::EventHandler(this, &Form1::miBearbeitenAusschneiden_Click);
			// 
			// miBearbeitenKopieren
			// 
			this->miBearbeitenKopieren->Name = L"miBearbeitenKopieren";
			this->miBearbeitenKopieren->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::C));
			this->miBearbeitenKopieren->Size = System::Drawing::Size(191, 22);
			this->miBearbeitenKopieren->Text = L"&Kopieren";
			this->miBearbeitenKopieren->Click += gcnew System::EventHandler(this, &Form1::miBearbeitenKopieren_Click);
			// 
			// miBearbeitenEinfuegen
			// 
			this->miBearbeitenEinfuegen->Name = L"miBearbeitenEinfuegen";
			this->miBearbeitenEinfuegen->ShortcutKeys = static_cast<System::Windows::Forms::Keys>((System::Windows::Forms::Keys::Control | System::Windows::Forms::Keys::V));
			this->miBearbeitenEinfuegen->Size = System::Drawing::Size(191, 22);
			this->miBearbeitenEinfuegen->Text = L"&Einfügen";
			this->miBearbeitenEinfuegen->Click += gcnew System::EventHandler(this, &Form1::miBearbeitenEinfuegen_Click);
			// 
			// textBox1
			// 
			this->textBox1->AllowDrop = true;
			this->textBox1->Dock = System::Windows::Forms::DockStyle::Fill;
			this->textBox1->Location = System::Drawing::Point(0, 24);
			this->textBox1->Multiline = true;
			this->textBox1->Name = L"textBox1";
			this->textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Both;
			this->textBox1->Size = System::Drawing::Size(399, 203);
			this->textBox1->TabIndex = 1;
			this->textBox1->Text = L"Tippen Sie hier Ihren Text ein.";
			this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);
			this->textBox1->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::textBox1_DragDrop);
			this->textBox1->DragOver += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::textBox1_DragOver);
			// 
			// timer1
			// 
			this->timer1->Enabled = true;
			this->timer1->Interval = 200;
			this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(399, 227);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->menuStrip1);
			this->MainMenuStrip = this->menuStrip1;
			this->Name = L"Form1";
			this->Text = L"Texteditor";
			this->menuStrip1->ResumeLayout(false);
			this->menuStrip1->PerformLayout();
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion

    private: 

#pragma region Datei-Menü (Laden, Speichern, Beenden)

         void setFormTitle()
         {
             String^ title;
             
             if (dateiname == nullptr)
                 title = "Unbenannt";
             else
             {
                 // Nur den reinen Dateinamen ohne Pfad übernehmen
                 title = dateiname->Substring(dateiname->LastIndexOf('\\')+1);
             }
                 
             this->Text = "Texteditor - " + title;
         }

         bool nothingToSave()
         {
             if (!dirty)
             {
                 return true;
             }
             
             switch (MessageBox::Show("Änderungen speichern?", "Texteditor",
                                      MessageBoxButtons::YesNoCancel))
             {
                case System::Windows::Forms::DialogResult::Yes:    return save(dateiname);
                case System::Windows::Forms::DialogResult::No:     return true;
                case System::Windows::Forms::DialogResult::Cancel:
                default:                   return false;
             }
         }

         void miDateiNeu_Click(Object^  sender, EventArgs^  e) 
         {
            if (nothingToSave())
            {
               // Inhalt des Textfelds löschen
               textBox1->Text = "";

               // kein Dateiname
               dateiname = nullptr;

               // Keine ungespeicherten Änderungen
               dirty = false;

               // Fensteroberfläche aktualisieren
               miDateiSpeichern->Enabled = false;
               miDateiSpeichernunter->Enabled = false;
               setFormTitle();
            }
         }
         void miDateiOeffnen_Click(Object^  sender, EventArgs^  e) 
         {
            if (!nothingToSave())
              return;
              
            if (openFileDialog1->ShowDialog() 
                            == System::Windows::Forms::DialogResult::OK)
            {
               // Dateiinhalt einlesen
               open(openFileDialog1->FileName);                
            }
         }
         void open(String ^dateiname)
         {
            try
            {
              StreamReader^ sr = gcnew StreamReader(dateiname, 
                                                    Encoding::GetEncoding("windows-1252"), false);
              textBox1->Text = sr->ReadToEnd();
              sr->Close();
              
              // Fensteroberfläche und interne Felder aktualisieren
              this->dateiname = dateiname;
              dirty = false;
              miDateiSpeichern->Enabled = false;
              miDateiSpeichernunter->Enabled = false;
              setFormTitle();
            }
            catch (IOException^)
            {
               MessageBox::Show("Datei konnte nicht geöffnet werden.", "Fehler");
            }
         }
         void miDateiSpeichern_Click(Object^  sender, EventArgs^  e) 
         {
            save(dateiname);
         }
         void miDateiSpeichernunter_Click(Object^  sender, EventArgs^  e) 
         {
            save(nullptr);
         }
         bool save(String ^dateiname)
         {
             if (dateiname == nullptr)
             {
                 if (saveFileDialog1->ShowDialog() 
                               == System::Windows::Forms::DialogResult::OK)
                     dateiname = saveFileDialog1->FileName;                
                 else
                     return false;
             }
             
             try
             {
                 StreamWriter^ sw = gcnew StreamWriter(dateiname, false, 
                                    Encoding::GetEncoding("windows-1252"));

                 sw->Write(textBox1->Text);
                 sw->Close();
                 
                 // Fensteroberfläche und interne Felder aktualisieren
                 this->dateiname = dateiname;
                 dirty = false;
                 miDateiSpeichern->Enabled = false;
                 miDateiSpeichernunter->Enabled = false;
                 setFormTitle();
                 
                 return true;
             }
             catch (IOException^)
             {
                 MessageBox::Show("Datei konnte nicht gespeichert werden.",
                                  "Fehler");
             }
             
             return false;
         }
         void miDateiBeenden_Click(Object^  sender, EventArgs^  e) 
         {
            this->Close();
         }


         void textBox1_TextChanged(Object^  sender, EventArgs^  e) 
         {
            if (!dirty)
            {
              dirty = true;
              
              miDateiSpeichern->Enabled = true;
              miDateiSpeichernunter->Enabled = true;
            }                        
         }
#pragma endregion

#pragma region Zwischenablage

         void miBearbeitenAusschneiden_Click(Object^  sender, EventArgs^  e) 
         {
            // textBox1->Cut();
            if (textBox1->SelectionLength > 0)
            {
                Clipboard::SetData(DataFormats::UnicodeText, textBox1->SelectedText);
                textBox1->SelectedText = "";
            }
         }
         void miBearbeitenKopieren_Click(Object^  sender, EventArgs^  e) 
         {
            // textBox1->Copy();
            if (textBox1->SelectionLength > 0)
            {
               Clipboard::SetData(DataFormats::Text, textBox1->SelectedText);
            }
         }
         void miBearbeitenEinfuegen_Click(Object^  sender, EventArgs^  e) 
         {
            //textBox1->Paste();
            if(Clipboard::ContainsText() == true)
            {
               textBox1->SelectedText = dynamic_cast<String^>(Clipboard::GetData(DataFormats::UnicodeText));
            }
         }


		 // Zum Aktivieren des Einfügen-Befehls
		 void timer1_Tick(Object^  sender, EventArgs^  e) 
         {
             if (textBox1->SelectionLength > 0)
             {
                 miBearbeitenAusschneiden->Enabled = true;
                 miBearbeitenKopieren->Enabled = true;
             }
             else
             {
                 miBearbeitenAusschneiden->Enabled = false;
                 miBearbeitenKopieren->Enabled = false;
             }
             
             if (Clipboard::ContainsText() == true)
             {
                 miBearbeitenEinfuegen->Enabled = true;
             }
             else
             {
                 miBearbeitenEinfuegen->Enabled = false;
             }
         }
#pragma endregion

#pragma region DragAndDrop

		void textBox1_DragOver(Object^  sender, DragEventArgs^  e) 
		{
		   if (e->Data->GetDataPresent(DataFormats::FileDrop))
		   {
			  e->Effect = DragDropEffects::Copy;
			  return;
		   }
		   else
		   {
			  e->Effect = DragDropEffects::None;
			  return;
		   }

		}
		void textBox1_DragDrop(Object^  sender, DragEventArgs^  e) 
		{
		   if (e->Data->GetDataPresent(DataFormats::FileDrop))
		   {
			  array<String^>^ dateien = 
						   (array<String^>^) e->Data->GetData(DataFormats::FileDrop);

			  // nur den Inhalt der ersten Datei einlesen
			  try
			  {
				 StreamReader^ sr = gcnew StreamReader(dateien[0]);

				 textBox1->Clear();
				 textBox1->Text = sr->ReadToEnd();

				 sr->Close();
			  }
			  catch (IOException^)
			  {
				 MessageBox::Show("Datei konnte nicht geöffnet werden.", "Fehler");
			  }
			  return;
		   }
		}
#pragma endregion


};
}

