(*  Initial Developer's Public License.
  The contents of this file are subject to the  Initial Developer's Public
  License Version 1.0 (the "License"). You may not use this file except
  in compliance with the License. You may obtain a copy of the License at
    http://www.ibphoenix.com?a=ibphoenix&page=ibp_idpl
  Software distributed under the License is distributed on an "AS IS" basis,
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  for the specific language governing rights and limitations under the
  License.

  The Original Code is copyright 2007 Paul Reeves.

  The Initial Developer of the Original Code is Paul Reeves.

  All Rights Reserved.

  GUI related functions for the Firebird Installer.

  o ResizeWizardFormHeight
     - Change height of Wizard Form
     - Adjust the position of each control to work in new height.

  o ResizeWizardFormWidth
     - Make form wider

  o MoveOuterNoteBook
     - Move OuterNotebook and Bevel.
       Value moved should match value passed to ResizeWizardFormWidth.

  o EnumerateObjectList;
     - Simple demonstration of object enumeration.

  o Show Help
    - CreateHelpDlg;
    - ShowHelpDlg: Integer;
    - CloseHelpDlg;

  o Show some debug info for debugging inno setup script
    - CreateDebugDlg
    - CloseDebugDlg;
    - ShowDebugDlg

*)

var
  CompGroup1Array: array of string;
  CompGroup2Array: array of string;
  CompGroup3Array: array of string;
  CompGroupButtonsArray: array of string;
  CompGroup1, CompGroup2, CompGroup3, CompGroupButtons: TStringList;

// This is a non-exhaustive list of components that need to be repositioned
// and/or resized if the form size is changed. Use EnumerateObjectList to
// get a full list of components.
procedure SetupWizardFormComponentsArrays;
var
  i: integer;
begin

  SetArrayLength(CompGroup1Array,24);

  CompGroup1Array[0]:='WelcomePage';
  CompGroup1Array[1]:='WelcomeLabel2';
  CompGroup1Array[2]:='InnerPage';
  CompGroup1Array[3]:='InnerNotebook';
  CompGroup1Array[4]:='LicensePage';
  CompGroup1Array[5]:='LicenseMemo';
  CompGroup1Array[6]:='PasswordPage';
  CompGroup1Array[7]:='InfoBeforePage';
  CompGroup1Array[8]:='InfoBeforeMemo';
  CompGroup1Array[9]:='UserInfoPage';
  CompGroup1Array[10]:='SelectDirPage';
  CompGroup1Array[11]:='SelectComponentsPage';
  CompGroup1Array[12]:='ComponentsList';
  CompGroup1Array[13]:='SelectProgramGroupPage';
  CompGroup1Array[14]:='SelectTasksPage';
  CompGroup1Array[15]:='TasksList';
  CompGroup1Array[16]:='ReadyPage';
  CompGroup1Array[17]:='ReadyMemo';
  CompGroup1Array[18]:='PreparingPage';
  CompGroup1Array[19]:='InstallingPage';
  CompGroup1Array[20]:='InfoAfterPage';
  CompGroup1Array[21]:='InfoAfterMemo';
  CompGroup1Array[22]:='FinishedPage';
  CompGroup1Array[23]:='OuterNotebook';

  CompGroup1 := TStringList.create;

  for i := 0 to GetArrayLength( CompGroup1Array )-1 do begin
    CompGroup1.add( CompGroup1Array[i] );
    CompGroup1.objects[i] := (WizardForm.FindComponent(CompGroup1Array[i]));
  end;

  SetArrayLength(CompGroup2Array,8);
  CompGroup2Array[0] := 'Bevel';
  CompGroup2Array[1] := 'BeveledLabel';
  CompGroup2Array[2] := 'LicenseAcceptedRadio';
  CompGroup2Array[3] := 'LicenseNotAcceptedRadio';
  CompGroup2Array[4] := 'DiskSpaceLabel';
  CompGroup2Array[5] := 'ComponentsDiskSpaceLabel';
  CompGroup2Array[6] := 'NoIconsCheck';
  CompGroup2Array[7] := 'RunList';

  CompGroup2 := TStringList.create;
  for i := 0 to GetArrayLength( CompGroup2Array )-1 do begin
    CompGroup2.add(CompGroup2Array[i]);
    CompGroup2.objects[i] := (WizardForm.FindComponent(CompGroup2Array[i]));
  end;

  SetArrayLength(CompGroup3Array,1);
  CompGroup3Array[0] := 'WizardBitmapImage';
  CompGroup3 := TStringList.create;
  for i:=0 to GetArrayLength(CompGroup3Array)-1 do begin
    CompGroup3.add(CompGroup3Array[i]);
    CompGroup3.objects[i] := (WizardForm.FindComponent(CompGroup3Array[i]));
  end;

  SetArrayLength(CompGroupButtonsArray,3);
  CompGroupButtonsArray[0] := 'BackButton';
  CompGroupButtonsArray[1] := 'NextButton';
  CompGroupButtonsArray[2] := 'CancelButton';
  CompGroupButtons := TStringList.create;
  for i:=0 to GetArrayLength(CompGroupButtonsArray)-1 do begin
    CompGroupButtons.add(CompGroupButtonsArray[i]);
    CompGroupButtons.objects[i] := (WizardForm.FindComponent(CompGroupButtonsArray[i]));
  end;

end;

procedure ResizeWizardFormHeight(AValue: Integer);
var
  i: integer;
begin
    wizardform.height := wizardform.height+AValue;
    wizardform.top := wizardform.top - (AValue div 2);

    // Group 1 - reset height of components
    for i:=0 to GetArrayLength(CompGroup1Array)-1 do
      TControl(CompGroup1.objects[i]).height := TControl(CompGroup1.objects[i]).height + Avalue;

    // Group 2 - reset top of components
    for i:=0 to GetArrayLength(CompGroup2Array)-1 do
      TControl(CompGroup2.objects[i]).top := TControl(CompGroup2.objects[i]).top + AValue;

    // Group 3 - reset top of components but keep 'centered' vertically.
    for i:=0 to GetArrayLength(CompGroup3Array)-1 do
      TControl( CompGroup3.objects[i]).top := TControl(CompGroup3.objects[i]).top + (AValue div 2);

    // Group Buttons - reset top of components
    for i:=0 to GetArrayLength(CompGroupButtonsArray)-1 do
      TControl(CompGroupButtons.objects[i]).top := TControl(CompGroupButtons.objects[i]).top + AValue;

end;


// This needs more work. for now it is not used by the installer.
procedure ResizeWizardFormWidth(AValue: Integer);
var
  i: integer;
begin
    wizardform.width := wizardform.width + AValue;
    wizardform.left := wizardform.left - (AValue div 2);

    // Group 1 - reset width of components
    for i:=0 to GetArrayLength(CompGroup1Array)-1 do begin
      TControl(CompGroup1.objects[i]).width := TControl(CompGroup1.objects[i]).width + Avalue;
//      TControl(CompGroup1.objects[i]).left := TControl(CompGroup1.objects[i]).left + (Avalue div 2);
    end;

    // Group 2 - reset left of components
    for i:=0 to GetArrayLength(CompGroup2Array)-1 do begin
      TControl(CompGroup2.objects[i]).left := TControl(CompGroup2.objects[i]).left + AValue;
      TControl(CompGroup2.objects[i]).width := TControl(CompGroup2.objects[i]).width + (AValue div 2);
    end;

    // Group 3 - reset left of components but keep 'centered' horizontally.
//		for i:=0 to GetArrayLength(CompGroup3Array)-1 do
//			TControl( CompGroup3.objects[i]).left := TControl(CompGroup3.objects[i]).left - (AValue div 2);

		// Group 4 - reset left of buttons
		for i:=0 to GetArrayLength(CompGroupButtonsArray)-1 do begin
			TControl(CompGroupButtons.objects[i]).left := TControl(CompGroupButtons.objects[i]).left + AValue;
		end;

end;

procedure MoveOuterNoteBookRight(AValue: Integer);
begin
  with wizardform do begin
   OuterNotebook.left := wizardform.OuterNotebook.left + AValue;
   Bevel.left := Bevel.left + AValue;
  end;
end;

procedure MoveOuterNoteBookLeft(AValue: Integer);
begin
  with wizardform do begin
   OuterNotebook.left := wizardform.OuterNotebook.left - AValue;
   Bevel.left := Bevel.left - AValue;
  end;
end;

const
  group1 = ' group one';
  group2 = ' group two';
  group3 = ' group three';
  group4 = ' group not allocated.';

procedure EnumerateObjectList;
//Walk through the components on the InnoSetup install wizard
var
  Alist: TStringList;
  i: integer;
  aComponent: string;

begin
  Alist := TStringList.create;
  for i := 0 to WizardForm.ComponentCount -1 do begin
    aComponent := WizardForm.Components[i].name;
    if CompGroup1.IndexOf( aComponent ) > -1 then
      aComponent := aComponent + group1
    else if CompGroup2.IndexOf( aComponent ) > -1 then
      aComponent := aComponent + group2
    else if CompGroup3.IndexOf( aComponent ) > -1 then
      aComponent := aComponent + group3
    else
      aComponent := aComponent + group4;


    AList.add( aComponent );
  end;
  WizardForm.INFOBEFOREMEMO.lines.assign(Alist);
end;


var
  HelpDlg: TForm;

procedure CreateHelpDlg;
var
  HelpFileName: String;
  HelpMemo: TMemo;
  OKButton: TButton;
begin
  ExtractTemporaryFile ('installation_scripted.txt');
  HelpFileName := ExpandConstant ('{tmp}\installation_scripted.txt');
  HelpDlg := TForm.create(nil);
  with HelpDlg do begin
      BorderStyle := bsDialog;
      Position := poScreenCenter;
      ClientWidth := 450;
      ClientHeight := 550;
      Caption := 'Firebird Installation - command-line parameters.';
  end;
  HelpMemo := TMemo.Create(HelpDlg);
  with HelpMemo do begin
      Parent := HelpDlg;
      ScrollBars := ssVertical;
      Lines.LoadFromFile(HelpFileName);
      Align := alTop;
      Height := 500;
      ReadOnly := True;
    end;
  OKButton := TButton.create(HelpDlg);
  with OKButton do begin
      Parent := HelpDlg;
      Left := (Parent.width  div 2) - width div 2;
      top := Parent.ClientHeight - 40;
      Caption := 'OK';
      ModalResult := mrOK;
  end;
  HelpDlg.ActiveControl := OKButton;
end;


procedure CloseHelpDlg;
begin
  with HelpDlg do begin
     Close;
     Free;
  end;
end;


function ShowHelpDlg: Integer;
begin
  CreateHelpDlg;
  result := HelpDlg.ShowModal;
  CloseHelpDlg;
end;


// Add a simple debug dialogue
var
  DebugDlg: TForm;

procedure CreateDebugDlg(aString: String; ADescription: String);
var
  DebugText: TMemo;
//  DebugDescription: TLabel;
  OKButton: TButton;
begin
  DebugDlg := TForm.create(nil);
  with DebugDlg do begin
      BorderStyle := bsSizeable;
      Position := poScreenCenter;
      ClientWidth := 450;
      ClientHeight := 350;
      Caption := 'Firebird Installation - command-line parameters.';
  end;
  DebugText := TMemo.Create(DebugDlg);
  with DebugText do begin
      Parent := DebugDlg;
      ScrollBars := ssVertical;
      Lines.Text :=aString;
      Align := alTop;
      Height := 200;
      ReadOnly := True;
    end;
  OKButton := TButton.create(DebugDlg);
  with OKButton do begin
      Parent := DebugDlg;
      Left := (Parent.width  div 2) - width div 2;
      top := Parent.ClientHeight - 40;
      Caption := 'OK';
      ModalResult := mrOK;
  end;
  DebugDlg.ActiveControl := OKButton;

end;


procedure CloseDebugDlg;
begin
  with DebugDlg do begin
     Close;
     Free;
  end;
end;


function ShowDebugDlg(aString: String; aDescription: String): Integer;
begin
  CreateDebugDlg(aString,aDescription);
  result := DebugDlg.ShowModal;
  CloseDebugDlg;
end;

