Bool ZGameWindow_Programmable::MouseButtonClick  (UShort nButton, Short Absolute_x, Short Absolute_y)
{
  Bool Res;
  Res = ZFrame::MouseButtonClick(nButton, Absolute_x, Absolute_y);

  if (RobotProgramLoad.Is_MouseClick(true))
  {
    // VoxelExtension->SetScriptNum(floor(RobotProgramNum.GetValue()));
    VoxelExtension->CompileAndRunScript(ZVoxelExtension_Programmable::CONTEXT_PROGRAMCHANGE, floor(RobotProgramNum.GetValue()));
  }

  if (CloseBox.Is_MouseClick())
  {
    Hide();
  }

  if (RobotProgramNum.Is_MouseClick())
  {
    DisplayProgramName();
  }

  if (RobotProgramEdit.Is_MouseClick(true))
  {
    ZString FileName, FileSpec;

    FileName << (ULong)floor(RobotProgramNum.GetValue()) << ".nut";
    FileSpec = GameEnv->Path_UserScripts_Squirrel;
    FileSpec.AddToPath(FileName);

    // If the file does not exists, create it.

    if (!ZStream_File::File_IsExists(FileSpec.String))
    {
      ZString InFileSpec, Template;
      ZStream_File Stream;
      InFileSpec = GameEnv->Path_GameFiles;
      InFileSpec.AddToPath("Misc");
      InFileSpec.AddToPath("new_file_squirrel.nut");
      Stream.SetFileName(InFileSpec.String);
      Stream.GetFileContent(Template);
      Stream.SetFileName(FileSpec.String);
      Stream.PutFileContent(Template);
    }

    ZEditCode::EditCode(&GameEnv->Settings_Hardware->Setting_Favorite_Editor,&FileSpec);
  }

  return (Res);
}
void ZGameWindow_Programmable::Show()
{
  ZVector2f Rp, Ip, Size;
  ZActor * Actor;
  ULong x,y;

  Actor = GameEnv->PhysicEngine->GetSelectedActor(); if (!Actor) return;

  // Running position computing

  Ip.x = 32.0f; Ip.y = 25.0f;
  Rp.x = Ip.x; Rp.y = Ip.y;

  // Main Window

  ZVector2f MainWindow_Pos,MainWindow_Size;
  MainWindow_Size.x = 758.0f; MainWindow_Size.y = 600.0f;
  MainWindow_Pos.x = ((float)GameEnv->ScreenResolution.x - MainWindow_Size.x) / 2.0f;
  MainWindow_Pos.y = ((float)GameEnv->ScreenResolution.y - MainWindow_Size.y) / 2.0f;

  MainWindow->SetPosition( MainWindow_Pos.x, MainWindow_Pos.y );
  MainWindow->SetSize(MainWindow_Size.x,MainWindow_Size.y);
  MainWindow->SetTexture(8);
  GameEnv->GuiManager.AddFrame(MainWindow);

  // CloseBox

  Size.x = 32.0f; Size.y = 32.0f;
  CloseBox.SetPosition(MainWindow_Size.x - Size.x - 5.0f, 5.0f);
  CloseBox.SetSize(Size.x, Size.y);
  CloseBox.SetTileSet(GameEnv->GuiTileset);
  CloseBox.SetTile(11);
  MainWindow->AddFrame(&CloseBox);

  // Inventory main title

  MainTitle.SetStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_3));
  MainTitle.SetDisplayText(Text_MainTitle.String);
  MainTitle.GetTextDisplaySize(&Size);
  MainTitle.SetPosition(MainWindow_Size.x / 2.0f - Size.x / 2.0f ,Rp.y);
  MainTitle.SetSize(Size.x,Size.y);
  MainTitle.SetColor(255.0f,255.0f,255.0f);
  MainWindow->AddFrame(&MainTitle);
  Rp.y += Size.y + 10.0f;

  // Robot program title

  RobotProgramTitle.SetStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1));
  RobotProgramTitle.SetDisplayText(Text_RobotZoneTitle.String);
  RobotProgramTitle.GetTextDisplaySize(&Size);
  RobotProgramTitle.SetPosition(Rp.x ,Rp.y);
  RobotProgramTitle.SetSize(Size.x,Size.y);
  RobotProgramTitle.SetColor(255.0f,255.0f,255.0f);
  MainWindow->AddFrame(&RobotProgramTitle);
  Rp.y += Size.y + 10.0f;

  // Robot Program choice

  RobotProgramNum.SetFontTileStyle(GameEnv->TileSetStyles->GetStyle(2));
  RobotProgramNum.SetGUITileset(GameEnv->GuiTileset);
  RobotProgramNum.SetPosition(Rp.x , Rp.y);
  RobotProgramNum.SetMinDigits(3);
  RobotProgramNum.SetParameters(0.0,999.0, ProgramNum, 1.0, 0);
  RobotProgramNum.GetTextDisplaySize(&Size);
  RobotProgramNum.SetSize(Size.x + 1.0f, Size.y);
  RobotProgramNum.SetValue(VoxelExtension->ScriptNum);

  MainWindow->AddFrame(&RobotProgramNum);
  Rp.x += Size.x + 20.0f;
  Rp.y -= 15.0f;

  float Alignment = Rp.x;

  // Robot program Edit

  RobotProgramEdit.SetDisplayText(Text_RobotProgramEdit.String);
  RobotProgramEdit.SetTextStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_2));
  RobotProgramEdit.GetEffectiveDisplaySize(&Size);
  RobotProgramEdit.SetPosition(Rp.x,Rp.y + (32.0 - Size.y / 2.0f));
  RobotProgramEdit.SetSize(Size.x,Size.y);
  //GetButton.SetColor(1.0f,0.0f,0.0f);
  MainWindow->AddFrame(&RobotProgramEdit);
  Rp.x += Size.x + 10.0f;

  // Robot program Load/Compile

  RobotProgramLoad.SetDisplayText(Text_RobotProgramLoad.String);
  RobotProgramLoad.SetTextStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_2));
  RobotProgramLoad.GetEffectiveDisplaySize(&Size);
  RobotProgramLoad.SetPosition(Rp.x,Rp.y + (32.0 - Size.y / 2.0f));
  RobotProgramLoad.SetSize(Size.x,Size.y);
  //GetButton.SetColor(1.0f,0.0f,0.0f);
  MainWindow->AddFrame(&RobotProgramLoad);
  Rp.y += Size.y + 24.0f;
  Rp.x = Alignment;

  // Program Name

  DisplayProgramName();

  ProgramName.SetStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1));
  ProgramName.SetDisplayText(Text_ProgramName.String);
  ProgramName.GetTextDisplaySize(&Size);
  Size.y = ProgramName.GetStandardLineHeight();  // In case of null string, force line height to something.
  ProgramName.SetPosition(Rp.x ,Rp.y);
  Size.x = 480;
  ProgramName.SetSize(Size.x,Size.y);
  ProgramName.SetColor(255.0f,255.0f,255.0f);
  MainWindow->AddFrame(&ProgramName);
  Rp.y += Size.y + 8.0f;
  Rp.x = Ip.x;

  // Tools Title

  StorageTitle.SetStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1));
  StorageTitle.SetDisplayText(Text_StorageTitle.String);
  StorageTitle.GetTextDisplaySize(&Size);
  StorageTitle.SetPosition(Rp.x ,Rp.y);
  StorageTitle.SetSize(Size.x,Size.y);
  StorageTitle.SetColor(255.0f,255.0f,255.0f);
  MainWindow->AddFrame(&StorageTitle);
  Rp.y += Size.y + 5.0f;

  // Tools

  for (y=0;y<2;y++)
  {
    for (x=0;x<10;x++)
    {
      ULong Indice = 0 + x + y * 10;
      MainStorage[Indice].SetVoxelTypeManager(&GameEnv->VoxelTypeManager);
      MainStorage[Indice].SetPosition(32.0f + x*70.0f, Rp.y );
      MainStorage[Indice].SetSize(64.0f,64.0f);
      MainStorage[Indice].SetTileStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_2), ZInventoryBox::FONTTYPE_MAIN);
      MainStorage[Indice].SetTileStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1), ZInventoryBox::FONTTYPE_REDUCED);
      MainStorage[Indice].SetVoxelType(&VoxelExtension->VoxelType[Indice]);
      MainStorage[Indice].SetQuantity(&VoxelExtension->VoxelQuantity[Indice]);
      MainStorage[Indice].SetColor(128.0f,128.0f,128.0f);
      MainWindow->AddFrame(&MainStorage[Indice]);
    }
    Rp.y += 64.0f + 6.0f;
  }
  Rp.y += 12.0f;

  // Inventory Zone Title

  InventoryTitle.SetStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1));
  InventoryTitle.SetDisplayText(Text_InventoryTitle.String);
  InventoryTitle.GetTextDisplaySize(&Size);
  InventoryTitle.SetPosition(Rp.x ,Rp.y);
  InventoryTitle.SetSize(Size.x,Size.y);
  InventoryTitle.SetColor(255.0f,255.0f,255.0f);
  MainWindow->AddFrame(&InventoryTitle);
  Rp.y += Size.y + 5.0f;


  // Inventory

  for (y=0;y<4;y++)
  {
    for (x=0;x<10;x++)
    {
      /*
      ULong Indice = ZInventory::Inventory_StartSlot + x + y * 10;
      ZInventory::Entry * Entry = Actor->Inventory->GetSlotRef(Indice);
      MainStorage[Indice+40].SetVoxelTypeManager(&GameEnv->VoxelTypeManager);
      MainStorage[Indice+40].SetPosition(32.0f + x*70.0f, Rp.y );
      MainStorage[Indice+40].SetSize(48.0f,48.0f);
      MainStorage[Indice+40].SetTileStyle(GameEnv->TileSetStyles->GetStyle(3));
      MainStorage[Indice+40].SetVoxelType(&Entry->VoxelType);
      MainStorage[Indice+40].SetQuantity(&Entry->Quantity);
      MainStorage[Indice+40].SetColor(128.0f,128.0f,128.0f);
      MainWindow->AddFrame(&MainStorage[Indice+40]);
      */

      ULong Indice = ZInventory::Inventory_StartSlot + x + y * 10;
      ZInventory::Entry * Entry = Actor->Inventory->GetSlotRef(Indice);
      MainStorage[Indice+20].SetVoxelTypeManager(&GameEnv->VoxelTypeManager);
      MainStorage[Indice+20].SetPosition(32.0f + x*70.0f, Rp.y );
      MainStorage[Indice+20].SetSize(64.0f,64.0f);
      MainStorage[Indice+20].SetTileStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_2), ZInventoryBox::FONTTYPE_MAIN);
      MainStorage[Indice+20].SetTileStyle(GameEnv->TileSetStyles->GetStyle(ZGame::FONTSIZE_1), ZInventoryBox::FONTTYPE_REDUCED);
      MainStorage[Indice+20].SetVoxelType(&Entry->VoxelType);
      MainStorage[Indice+20].SetQuantity(&Entry->Quantity);
      MainStorage[Indice+20].SetColor(128.0f,128.0f,128.0f);
      MainWindow->AddFrame(&MainStorage[Indice+20]);
    }
    Rp.y += 64.0f + 6.0f;
    //Rp.y += 48.0f + 6.0f;
  }
  Rp.y += 12.0f;


  SDL_ShowCursor(SDL_ENABLE);
  SDL_WM_GrabInput(SDL_GRAB_OFF);
  SDL_WarpMouse((Uint16)(MainWindow_Pos.x + MainWindow_Size.x / 2.0f),(Uint16)(MainWindow_Pos.y + MainWindow_Size.y / 2.0f));
  GameEnv->Game_Events->SetDisableMouseEvents();
  Flag_Shown = true;
}
Bool ZGameWindow_ProgRobot_Asm::MouseButtonClick  (UShort nButton, Short Absolute_x, Short Absolute_y)
{
  Bool Res;
  Res = ZFrame::MouseButtonClick(nButton, Absolute_x, Absolute_y);

  if (RobotProgramLoad.Is_MouseClick(true))
  {
    // VoxelExtension->SetScriptNum(floor(RobotProgramNum.GetValue()));
    VoxelExtension->CompileAndRunScript(ZVoxelExtension_Programmable::CONTEXT_PROGRAMCHANGE, floor(RobotProgramNum.GetValue()));
  }

  if (RobotProgramDebug.Is_MouseClick(true))
  {
    if (VoxelExtension->CompileAndRunScript(ZVoxelExtension_Programmable::CONTEXT_PROGRAMCHANGE, floor(RobotProgramNum.GetValue()), true ))
    {
      //Hide();
      GameEnv->GuiManager.RemoveFrame(MainWindow);
      Flag_Shown = false;
      GameEnv->GameWindow_AsmDebug->SetVoxelExtension(VoxelExtension);
      GameEnv->GameWindow_AsmDebug->Show();
    }
    else
    {
      ZString ErrorMessage, ErrorExp, ErrorDetail;
      ZMacroAssembler::ZError * Error;
      ZMemSize Pos, Pos2, i;

      Error = VoxelExtension->Status.Error;

      if (!Error)
      {
        ErrorMessage  = "ERROR IN FILE";
        ErrorExp = " ";
      }
      else if (Error->CantLoadFile)
      {
        ErrorMessage  = "UNABLE TO READ PROGRAM FILE";
        ErrorExp = " ";
        ErrorDetail << Error->FileName;
      }
      else
      {
        //ErrorMessage = Error->ErrorMessage;
        ErrorDetail<< "ERROR : " << Error->ErrorMessage << "\n";
        ErrorDetail<< "WHERE : AT LINE " << (ULong)Error->Offset_ErrorLine << "\n";
        ErrorDetail<< "FILE  : " << Error->FileName << "\n\n";
        ErrorDetail<< "...............................ERROR DETAIL.............................\n\n";

        Pos = Error->Offset_ErrorLine;
        for (i=0;i<4;i++) Error->FileText.SearchPredLineStart(Pos);
        ErrorDetail.Append_Mids(&Error->FileText, Pos, Error->Offset_ErrorLine-1);
        ErrorDetail.Append_Mids(&Error->FileText, Error->Offset_ErrorLine, Error->Offset_ErrorStart - 1);
        ErrorDetail<<"~01:FF0000:[";
        ErrorDetail.Append_Mids(&Error->FileText, Error->Offset_ErrorStart, Error->Offset_ErrorEnd - 1);
        ErrorDetail<<"]~01:FFFFFF:";
        Pos = Error->Offset_ErrorEnd;
        Error->FileText.SearchNextLineStart(Pos);
        ErrorDetail.Append_Mids(&Error->FileText, Error->Offset_ErrorEnd,Pos-1);
        Pos2 = Pos;
        for (i=0;i<4;i++) Error->FileText.SearchNextLineStart(Pos2);
        ErrorDetail.Append_Mids(&Error->FileText, Pos, Pos2);

        //ErrorDetail.SearchReplace(' ', '.');
      }

      GameEnv->GameWindow_Compilation_Result->SetError(ErrorMessage.String, ErrorExp.String, ErrorDetail.String);
      GameEnv->GameWindow_Compilation_Result->Show();
    }

    //VoxelExtension->CompileAndRunScript(ZVoxelExtension_Programmable::CONTEXT_PROGRAMCHANGE, floor(RobotProgramNum.GetValue()));
  }

  if (RobotProgramDebugShow.Is_MouseClick(true))
  {
    if (VoxelExtension->IsAllowedToRun)
    {
      //Hide();
      GameEnv->GuiManager.RemoveFrame(MainWindow);
      Flag_Shown = false;
      GameEnv->GameWindow_AsmDebug->SetVoxelExtension(VoxelExtension);
      GameEnv->GameWindow_AsmDebug->Show();
    }

    //VoxelExtension->CompileAndRunScript(ZVoxelExtension_Programmable::CONTEXT_PROGRAMCHANGE, floor(RobotProgramNum.GetValue()));
  }

  if (CloseBox.Is_MouseClick(true))
  {
    Hide();
  }

  if (Manual.Is_MouseClick(true))
  {
    ZViewDoc::ViewDocPage(1585,false);
  }

  if (RobotProgramNum.Is_MouseClick())
  {
    DisplayProgramName();
  }

  if (RobotProgramEdit.Is_MouseClick(true))
  {
    ZString FileName, FileSpec;

    FileName << (ULong)floor(RobotProgramNum.GetValue()) << ".asm";
    FileSpec = GameEnv->Path_UserScripts_Asm_1;
    FileSpec.AddToPath(FileName);

    // If the file does not exists, create it.

    if (!ZStream_File::File_IsExists(FileSpec.String))
    {
      ZString InFileSpec, Template;
      ZStream_File Stream;
      InFileSpec = GameEnv->Path_GameFiles;
      InFileSpec.AddToPath("Misc");
      InFileSpec.AddToPath("new_file_asm1.tmasm");
      Stream.SetFileName(InFileSpec.String);
      Stream.GetFileContent(Template);
      Stream.SetFileName(FileSpec.String);
      Stream.PutFileContent(Template);
    }

    ZEditCode::EditCode(&GameEnv->Settings_Hardware->Setting_Favorite_Editor,&FileSpec);
  }


  return (Res);
}