{*------------------------------------------------------------------------------
  Programa principal.
  Búsqueda de rutas mediante el entrenamiento
  de Redes Neuronales con Algoritmos Genéticos.
  Contacto: jolavarriam@elo.utfsm.cl
  @Author jonathan.olavarria&juan.chacon
-------------------------------------------------------------------------------}
unit Main;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
  StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
  ActnList, ToolWin, ImgList,
  NNViewer, MapViewer, NeuronalNetwork;

type
  /// Clase para la ventana principal de la aplicación
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;                          /// Menu de la aplicación
    File1: TMenuItem;                              /// Item del menu
    FileNewItem: TMenuItem;                        /// Item del menu
    FileOpenItem: TMenuItem;                       /// Item del menu
    FileCloseItem: TMenuItem;                      /// Item del menu
    Window1: TMenuItem;                            /// Item del menu
    Help1: TMenuItem;                              /// Item del menu
    N1: TMenuItem;                                 /// Item del menu
    FileExitItem: TMenuItem;                       /// Item del menu
    WindowCascadeItem: TMenuItem;                  /// Item del menu
    WindowTileItem: TMenuItem;                     /// Item del menu
    WindowArrangeItem: TMenuItem;                  /// Item del menu
    HelpAboutItem: TMenuItem;                      /// Item del menu
    OpenDialog: TOpenDialog;                       /// Diálogo para cargar una red neuronal
    FileSaveItem: TMenuItem;                       /// Item del menu
    FileSaveAsItem: TMenuItem;                     /// Item del menu
    Edit1: TMenuItem;                              /// Item del menu
    CutItem: TMenuItem;                            /// Item del menu
    CopyItem: TMenuItem;                           /// Item del menu
    PasteItem: TMenuItem;                          /// Item del menu
    WindowMinimizeItem: TMenuItem;                 /// Item del menu
    StatusBar: TStatusBar;                         /// Status Bar de la aplicación
    ActionList1: TActionList;                      /// Lista de acciones para la toolbar y el menú
    EditCut1: TEditCut;                            /// Accion del menu
    EditCopy1: TEditCopy;                          /// Accion del menu
    EditPaste1: TEditPaste;                        /// Accion del menu
    FileNew1: TAction;                             /// Accion del menu
    FileSave1: TAction;                            /// Accion del menu
    FileExit1: TAction;                            /// Accion del menu
    FileOpen1: TAction;                            /// Accion del menu
    FileSaveAs1: TAction;                          /// Accion del menu
    WindowCascade1: TWindowCascade;                /// Accion del menu
    WindowTileHorizontal1: TWindowTileHorizontal;  /// Accion del menu
    WindowArrangeAll1: TWindowArrange;             /// Accion del menu
    WindowMinimizeAll1: TWindowMinimizeAll;        /// Accion del menu
    HelpAbout1: TAction;                           /// Accion del menu
    FileClose1: TWindowClose;                      /// Accion del menu
    WindowTileVertical1: TWindowTileVertical;      /// Accion del menu
    WindowTileItem2: TMenuItem;                    /// Item del menu
    ToolBar2: TToolBar;                            /// ToolBar de la aplicación
    ToolButton1: TToolButton;                      /// Botón de la ToolBar
    ToolButton2: TToolButton;                      /// Botón de la ToolBar
    ToolButton3: TToolButton;                      /// Botón de la ToolBar
    ToolButton9: TToolButton;                      /// Botón de la ToolBar
    ToolButton7: TToolButton;                      /// Botón de la ToolBar
    ToolButton8: TToolButton;                      /// Botón de la ToolBar
    ImageList1: TImageList;                        /// Lista de imágenes con los íconos de los botones de la ToolBar
    SaveDialog1: TSaveDialog;                      /// Diálogo para cargar una red neuronal
    procedure FileNew1Execute(Sender: TObject);
    procedure FileOpen1Execute(Sender: TObject);
    procedure HelpAbout1Execute(Sender: TObject);
    procedure FileExit1Execute(Sender: TObject);
    procedure CreateChildWindows();
    procedure FileSave1Execute(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;

var
  MainForm: TMainForm;        /// Ventana Principal
  NNView: TMDINNViewer;       /// Referencia a la ventana hija: Viasualizador de red neuronal
  MapView: TMDIMapViewer;     /// Referencia a la ventana hija: Viasualizador de red neuronal
  Population: TPopulation;    /// Población de individuos
  Environment: TEnvironment;  /// Entorno de comunicación entre ventanas

implementation

{$R *.dfm}

uses about;

/// Constructor de la ventana
constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited Create(Application);
end;

/// Crea las ventanas hijas y les enlaza la población y el entorno de comunicación entre ventanas
procedure TMainForm.CreateChildWindows();
begin
  nnView := TMDINNViewer.FormCreate(Application);
  mapView := TMDIMapViewer.FormCreate(Application);
  nnView.setmapViewer(Pointer(mapView));
  Environment := TEnvironment.Create();
  //nnView.setEnvironment(Pointer(TEnvironment));
  mapView.setEnvironment(Pointer(TEnvironment));
end;

/// Gatilla la creación de un nuevo proyecto
procedure TMainForm.FileNew1Execute(Sender: TObject);
begin
  //New project code
  nnView := TMDINNViewer.FormCreate(Application);
  mapView := TMDIMapViewer.FormCreate(Application);
  Population:=TPopulation.Create();
  nnView.SetPopulation(Population);
  mapView.SetPopulation(Population);
  Environment:=TEnvironment.Create();
  nnView.SetEnvironment(Environment);
  mapView.SetEnvironment(Environment);
end;

/// Ejecuta el diálogo de carga de red neuronal y la carga en el programa
procedure TMainForm.FileOpen1Execute(Sender: TObject);
begin
  if OpenDialog.Execute then begin
    if(population.NeuralNetStruct<>nil) then
      population.NeuralNetStruct.Destroy();
    population.NeuralNetStruct:=TNeuronalNetwork.Create();
    population.NeuralNetStruct.loadFromFile(OpenDialog.FileName);
    population.NeuralNet:=population.NeuralNetStruct;
    NNView.updateWindowState();
  end;
end;

/// Ejecuta el diálogo de guardado de red neuronal y la guarda en el disco
procedure TMainForm.FileSave1Execute(Sender: TObject);
begin
  if(saveDialog1.Execute()) then
    population.NeuralNet.saveToFile(saveDialog1.FileName);
end;

/// Ejecuta el diálogo del About
procedure TMainForm.HelpAbout1Execute(Sender: TObject);
begin
  AboutBox.ShowModal;
end;

/// Termina la aplicación
procedure TMainForm.FileExit1Execute(Sender: TObject);
begin
  Close;
end;

end.
