/*
    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.

    This file is part of Threading Building Blocks.

    Threading Building Blocks is free software; you can redistribute it
    and/or modify it under the terms of the GNU General Public License
    version 2 as published by the Free Software Foundation.

    Threading Building Blocks is distributed in the hope that it will be
    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Threading Building Blocks; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    As a special exception, you may use this file as part of a free software
    library without restriction.  Specifically, if other files instantiate
    templates or use macros or inline functions from this file, or you compile
    this file and link it with other files to produce an executable, this
    file does not by itself cause the resulting executable to be covered by
    the GNU General Public License.  This exception does not however
    invalidate any other reasons why the executable file might be covered by
    the GNU General Public License.
*/

#ifndef _CONSOLE
#ifndef __FORM1_H__
#define __FORM1_H__

#include <time.h>
#include "Board.h"
#include "Evolution.h"

#define BOARD_SQUARE_SIZE 2

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

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();

            FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog;
            ClientSize = System::Drawing::Size(1206, 600+m_ribbonHeight+menuStrip1->Height);

            int boardWidth = (ClientRectangle.Width/2-m_sepWidth/2)/BOARD_SQUARE_SIZE;
            int boardHeight = (ClientRectangle.Height-menuStrip1->Height-m_ribbonHeight)/BOARD_SQUARE_SIZE;

            m_board1 = gcnew Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, seqGen);
            m_board2 = gcnew Board(boardWidth, boardHeight, BOARD_SQUARE_SIZE, parGen);
            
            Controls->Add(m_board1);
            Controls->Add(m_board2);

            m_board1->Location = System::Drawing::Point(2, m_ribbonHeight + menuStrip1->Height);
            m_board2->Location = System::Drawing::Point(2 + boardWidth*BOARD_SQUARE_SIZE + m_sepWidth/2, m_ribbonHeight + menuStrip1->Height);

            m_seq = gcnew SequentialEvolution(m_board1->m_matrix, m_board1);
            m_par = gcnew ParallelEvolution(m_board2->m_matrix, m_board2);

            m_seqThread = gcnew Thread(gcnew ThreadStart(m_seq, &SequentialEvolution::Run));
            m_parThread = gcnew Thread(gcnew ThreadStart(m_par, &ParallelEvolution::Run));        

            Thread::CurrentThread->Priority = ThreadPriority::AboveNormal;

            m_suspend = true;
        }
    protected:
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::MenuStrip^  menuStrip1;
    private: System::Windows::Forms::ToolStripMenuItem^  fileToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  exitToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  gameToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  seedToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  runToolStripMenuItem;
    private: System::Windows::Forms::ToolStripMenuItem^  pauseToolStripMenuItem;
    private: Board^ m_board1;
    private: Board^ m_board2;
    private: System::Windows::Forms::Label^  Sequential;
    private: System::Windows::Forms::Label^  label1;
    private: static const int m_sepWidth = 5;
    private: static const int m_ribbonHeight = 26;
    private: SequentialEvolution^ m_seq;
    private: ParallelEvolution^ m_par;
    private: Thread^ m_seqThread;
    private: Thread^ m_parThread;
    private: System::Windows::Forms::Label^  seqGen;
    private: System::Windows::Forms::Label^  parGen;
    private: bool m_suspend;

    private:
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        void InitializeComponent(void)
        {
            this->menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());
            this->fileToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->exitToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->gameToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->seedToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->runToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->pauseToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());
            this->Sequential = (gcnew System::Windows::Forms::Label());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->seqGen = (gcnew System::Windows::Forms::Label());
            this->parGen = (gcnew System::Windows::Forms::Label());
            this->menuStrip1->SuspendLayout();
            this->SuspendLayout();
            // 
            // menuStrip1
            // 
            this->menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(2) 
                {this->fileToolStripMenuItem, this->gameToolStripMenuItem});
            this->menuStrip1->Location = System::Drawing::Point(0, 0);
            this->menuStrip1->Name = L"menuStrip1";
            this->menuStrip1->Padding = System::Windows::Forms::Padding(8, 2, 0, 2);
            this->menuStrip1->Size = System::Drawing::Size(1600, 26);
            this->menuStrip1->TabIndex = 0;
            this->menuStrip1->Text = L"menuStrip1";
            this->menuStrip1->ItemClicked += gcnew System::Windows::Forms::ToolStripItemClickedEventHandler(this, &Form1::menuStrip1_ItemClicked);
            // 
            // fileToolStripMenuItem
            // 
            this->fileToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(1) {this->exitToolStripMenuItem});
            this->fileToolStripMenuItem->Name = L"fileToolStripMenuItem";
            this->fileToolStripMenuItem->Size = System::Drawing::Size(40, 22);
            this->fileToolStripMenuItem->Text = L"File";
            // 
            // exitToolStripMenuItem
            // 
            this->exitToolStripMenuItem->Name = L"exitToolStripMenuItem";
            this->exitToolStripMenuItem->Size = System::Drawing::Size(99, 22);
            this->exitToolStripMenuItem->Text = L"Exit";
            this->exitToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnExit);
            // 
            // gameToolStripMenuItem
            // 
            this->gameToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(3) {this->seedToolStripMenuItem, 
                this->runToolStripMenuItem, this->pauseToolStripMenuItem});
            this->gameToolStripMenuItem->Name = L"gameToolStripMenuItem";
            this->gameToolStripMenuItem->Size = System::Drawing::Size(59, 22);
            this->gameToolStripMenuItem->Text = L"Game";
            // 
            // seedToolStripMenuItem
            // 
            this->seedToolStripMenuItem->Name = L"seedToolStripMenuItem";
            this->seedToolStripMenuItem->Size = System::Drawing::Size(115, 22);
            this->seedToolStripMenuItem->Text = L"Seed";
            this->seedToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnSeed);
            // 
            // runToolStripMenuItem
            // 
            this->runToolStripMenuItem->Enabled = false;
            this->runToolStripMenuItem->Name = L"runToolStripMenuItem";
            this->runToolStripMenuItem->Size = System::Drawing::Size(115, 22);
            this->runToolStripMenuItem->Text = L"Run";
            this->runToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnRun);
            // 
            // pauseToolStripMenuItem
            // 
            this->pauseToolStripMenuItem->Enabled = false;
            this->pauseToolStripMenuItem->Name = L"pauseToolStripMenuItem";
            this->pauseToolStripMenuItem->Size = System::Drawing::Size(115, 22);
            this->pauseToolStripMenuItem->Text = L"Pause";
            this->pauseToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::OnPauseResume);
            // 
            // Sequential
            // 
            this->Sequential->AutoSize = true;
            this->Sequential->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->Sequential->Location = System::Drawing::Point(12, 32);
            this->Sequential->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
            this->Sequential->Name = L"Sequential";
            this->Sequential->Size = System::Drawing::Size(239, 18);
            this->Sequential->TabIndex = 1;
            this->Sequential->Text = L"Sequential Algorithm      generation:";
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(0)));
            this->label1->Location = System::Drawing::Point(813, 32);
            this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(219, 18);
            this->label1->TabIndex = 2;
            this->label1->Text = L"Parallel Algorithm     generation: ";
            // 
            // seqGen
            // 
            this->seqGen->AutoSize = true;
            this->seqGen->Location = System::Drawing::Point(289, 35);
            this->seqGen->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
            this->seqGen->Name = L"seqGen";
            this->seqGen->Size = System::Drawing::Size(16, 17);
            this->seqGen->TabIndex = 3;
            this->seqGen->Text = L"0";
            // 
            // parGen
            // 
            this->parGen->AutoSize = true;
            this->parGen->Location = System::Drawing::Point(1068, 35);
            this->parGen->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
            this->parGen->Name = L"parGen";
            this->parGen->Size = System::Drawing::Size(16, 17);
            this->parGen->TabIndex = 4;
            this->parGen->Text = L"0";
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(1600, 738);
            this->Controls->Add(this->parGen);
            this->Controls->Add(this->seqGen);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->Sequential);
            this->Controls->Add(this->menuStrip1);
            this->MainMenuStrip = this->menuStrip1;
            this->Margin = System::Windows::Forms::Padding(4);
            this->MaximizeBox = false;
            this->Name = L"Form1";
            this->Text = L"Game of Life";
            this->menuStrip1->ResumeLayout(false);
            this->menuStrip1->PerformLayout();
            this->ResumeLayout(false);
            this->PerformLayout();

        }
#pragma endregion    
    protected: 
        void CloseApp ()
        {
            m_seq->Quit();
            m_par->Quit();
            //! Perform a very ungracious exit, should coordinate the threads
            System::Environment::Exit(0);            
        }
    
    protected: 
        virtual void OnPaint(PaintEventArgs^ e) override
        {
        }

        virtual void OnFormClosing(FormClosingEventArgs^ e) override
        { 
            CloseApp();
        }
    
        void OnExit(System::Object^ sender, System::EventArgs^ e)
        {                
            CloseApp();
        }

        void OnSeed(System::Object^ sender, System::EventArgs^ e)
        {
            this->seedToolStripMenuItem->Enabled = false;
            this->runToolStripMenuItem->Enabled = true;            
            time_t now = time(NULL);
            this->m_board1->seed((int)now);
            this->m_board2->seed(this->m_board1);
            this->Invalidate();
        }

        void OnRun(System::Object^ sender, System::EventArgs^ e)
        {    
            this->runToolStripMenuItem->Enabled = false;        
            this->pauseToolStripMenuItem->Enabled = true;
            m_seqThread->Start();
            m_parThread->Start();    
        }

        void OnPauseResume(System::Object^ sender, System::EventArgs^ e)
        {    
            if (m_suspend)
            {
                m_seq->SetPause(true);
                m_par->SetPause(true);
                this->pauseToolStripMenuItem->Text = L"Resume";
            }
            else
            {
                m_seq->SetPause(false);
                m_par->SetPause(false);            
                this->pauseToolStripMenuItem->Text = L"Pause";
            }
            m_suspend = !m_suspend;
        }

    private: 
        System::Void menuStrip1_ItemClicked(System::Object^  sender, System::Windows::Forms::ToolStripItemClickedEventArgs^  e) 
        {}
};
#endif
#endif
