{****************************************************************************} { } { Project JEDI Code Library (JCL) } { } { The contents of this file are subject to the Mozilla Public License } { Version 1.1 (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.mozilla.org/MPL/ } { } { 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 JclOtaWizardForm.pas. } { } { The Initial Developer of the Original Code is Florent Ouchet } { } { Portions created by Florent Ouchet are Copyright (C) of Florent Ouchet. } { } { Contributors: } { } {****************************************************************************} { } { Last modified: $Date: $ } { } {****************************************************************************} unit JclOtaWizardForm; interface {$I jcl.inc} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ActnList, JclOtaWizardFrame; type TJclWizardForm = class(TForm) ButtonCancel: TButton; ButtonFinish: TButton; ButtonNext: TButton; ButtonPrevious: TButton; Bevel1: TBevel; PanelTitle: TPanel; ImageJcl: TImage; LabelJcl: TLabel; LabelProgression: TLabel; ActionListButtons: TActionList; ActionPrevious: TAction; ActionNext: TAction; ActionFinish: TAction; PanelPages: TPanel; procedure FormCreate(Sender: TObject); procedure ActionPreviousExecute(Sender: TObject); procedure ActionPreviousUpdate(Sender: TObject); procedure ActionNextExecute(Sender: TObject); procedure ActionNextUpdate(Sender: TObject); procedure ActionFinishExecute(Sender: TObject); procedure ActionFinishUpdate(Sender: TObject); private FDescription: string; FPageIndex: Integer; FExecuting: Boolean; function GetPageCount: Integer; function GetPageIndex: Integer; procedure SetPageIndex(const Value: Integer); function GetActivePage: TJclWizardFrame; function GetPage(Index: Integer): TJclWizardFrame; public function AddPage(const WizardFrame: TJclWizardFrame): Integer; function Execute: Boolean; property PageCount: Integer read GetPageCount; property PageIndex: Integer read GetPageIndex write SetPageIndex; property Description: string read FDescription write FDescription; property Pages[Index: Integer]: TJclWizardFrame read GetPage; property ActivePage: TJclWizardFrame read GetActivePage; property Executing: Boolean read FExecuting; end; implementation {$R *.dfm} uses JclOtaResources; //=== { TJclWizardForm } ===================================================== procedure TJclWizardForm.ActionFinishExecute(Sender: TObject); begin PageIndex := -1; ModalResult := mrOk; end; procedure TJclWizardForm.ActionFinishUpdate(Sender: TObject); var CurrentPage: TJclWizardFrame; begin CurrentPage := ActivePage; (Sender as TAction).Enabled := Assigned(CurrentPage) and CurrentPage.SupportsFinish; end; procedure TJclWizardForm.ActionNextExecute(Sender: TObject); begin PageIndex := PageIndex + 1; end; procedure TJclWizardForm.ActionNextUpdate(Sender: TObject); var CurrentPage: TJclWizardFrame; begin CurrentPage := ActivePage; (Sender as TAction).Enabled := (PageIndex < (PageCount - 1)) and Assigned(CurrentPage) and CurrentPage.SupportsNext; end; procedure TJclWizardForm.ActionPreviousExecute(Sender: TObject); begin PageIndex := PageIndex - 1; end; procedure TJclWizardForm.ActionPreviousUpdate(Sender: TObject); var CurrentPage: TJclWizardFrame; begin CurrentPage := ActivePage; (Sender as TAction).Enabled := (PageIndex > 0) and Assigned(CurrentPage) and CurrentPage.SupportsPrevious; end; function TJclWizardForm.AddPage(const WizardFrame: TJclWizardFrame): Integer; begin WizardFrame.Visible := False; WizardFrame.Parent := PanelPages; WizardFrame.Align := alClient; for Result := 0 to PanelPages.ControlCount - 1 do if PanelPages.Controls[Result] = WizardFrame then Exit; Result := -1; end; function TJclWizardForm.Execute: Boolean; begin FExecuting := True; try if PageCount > 0 then begin FPageIndex := -1; PageIndex := 0; Result := ShowModal = mrOk; end else Result := False; finally FExecuting := False; end; end; procedure TJclWizardForm.FormCreate(Sender: TObject); begin ActionPrevious.Caption := RsPrevious; ActionNext.Caption := RsNext; ActionFinish.Caption := RsFinish; ButtonCancel.Caption := RsCancel; LabelJcl.Caption := RsAboutDialogTitle; try ImageJcl.Picture.Bitmap.TransparentMode := tmAuto; ImageJcl.Picture.Bitmap.Transparent := True; ImageJcl.Picture.Bitmap.LoadFromResourceName(FindResourceHInstance(HInstance), 'JCLSPLASH'); except end; end; function TJclWizardForm.GetActivePage: TJclWizardFrame; begin if Executing then Result := Pages[PageIndex] else Result := nil; end; function TJclWizardForm.GetPage(Index: Integer): TJclWizardFrame; begin if (Index >= 0) and (Index < PanelPages.ControlCount) then Result := PanelPages.Controls[Index] as TJclWizardFrame else Result := nil; end; function TJclWizardForm.GetPageCount: Integer; begin Result := PanelPages.ControlCount; end; function TJclWizardForm.GetPageIndex: Integer; begin if Executing then Result := FPageIndex else Result := -1; end; procedure TJclWizardForm.SetPageIndex(const Value: Integer); var Direction: TJclWizardDirection; AFrame: TJclWizardFrame; begin if Value > FPageIndex then Direction := wdForward else Direction := wdBackward; AFrame := Pages[FPageIndex]; if Assigned(AFrame) then begin AFrame.PageDesactivated(Direction); AFrame.Visible := False; end; FPageIndex := Value; AFrame := Pages[FPageIndex]; if Assigned(AFrame) then begin AFrame.PageActivated(Direction); AFrame.Visible := True; LabelProgression.Caption := Format(RsWizardProgression, [PageIndex+1 {one based}, PageCount, AFrame.Caption]); end; end; end.