Componentes.Terceros.jvcl/official/3.36/devtools/InstallerTests/Installer/Main.pas
2009-02-27 12:23:32 +00:00

273 lines
8.0 KiB
ObjectPascal

unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Contnrs, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, CheckLst, D5CheckLst, DelphiData, ExtCtrls,
Buttons, ConfigurationBase, JvComponentBase, JvComCtrls, JvTabBar,
JvExControls, JvComponent, JvPageList;
type
TFormMain = class(TForm)
clbPersonalities: TCheckListBox;
pnlClient: TPanel;
pnlTitle: TPanel;
lblTitle: TLabel;
lblSubTitle: TLabel;
pnlContent: TPanel;
pglOptions: TJvPageList;
tbrOptions: TJvTabBar;
spgEmpty: TJvStandardPage;
procedure clbPersonalitiesKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure clbPersonalitiesClick(Sender: TObject);
procedure clbPersonalitiesDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
FDelphiIDEList: TDelphiIDEList;
FSupportedPersonalityOptions: TObjectList;
procedure GenerateTabs(PersoOption: TPersonalityOptions);
procedure ShowOptions(PersoOption: TPersonalityOptions);
public
{ Public-Deklarationen }
property DelphiIDEList: TDelphiIDEList read FDelphiIDEList;
end;
var
FormMain: TFormMain;
implementation
uses
InstallerConsts, ConfigOptions, Utils;
{$R *.dfm}
{$R winxp.res}
procedure TFormMain.FormCreate(Sender: TObject);
var
IDEIndex, PersIndex: Integer;
SupportedPersonalities: TList;
UpToDate: Boolean;
PersoOptions: TPersonalityOptions;
begin
FDelphiIDEList := TDelphiIDEList.Create;
FSupportedPersonalityOptions := TObjectList.Create;
Caption := Format(RsInstallerCaption, [Configuration.Name, Configuration.VersionStr]);
Application.Title := Caption;
Application.HintHidePause := MaxInt;
// build supported personality list
clbPersonalities.HeaderBackgroundColor := clBtnFace;
SupportedPersonalities := TList.Create;
try
for IDEIndex := 0 to FDelphiIDEList.Count - 1 do
begin
with FDelphiIDEList[IDEIndex] do
begin
SupportedPersonalities.Clear;
for PersIndex := 0 to PersonalityCount - 1 do
if Configuration.SupportsPersonality(Personalities[PersIndex]) then
SupportedPersonalities.Add(Personalities[PersIndex]);
if SupportedPersonalities.Count > 0 then
begin
UpToDate := Configuration.IsUpToDate(FDelphiIDEList[IDEIndex]);
clbPersonalities.Header[clbPersonalities.Items.AddObject(DisplayName, Pointer(UpToDate))] := True;
if UpToDate then
begin
for PersIndex := 0 to SupportedPersonalities.Count - 1 do
begin
PersoOptions := Configuration.CreateOptionsFor(SupportedPersonalities[PersIndex]);
FSupportedPersonalityOptions.Add(PersoOptions);
clbPersonalities.Items.AddObject(TIDEPersonality(SupportedPersonalities[PersIndex]).Name,
PersoOptions);
clbPersonalities.Checked[clbPersonalities.Items.Count - 1] := PersoOptions.Install;
GenerateTabs(PersoOptions);
end;
end;
end;
end;
end;
finally
SupportedPersonalities.Free;
end;
clbPersonalitiesClick(clbPersonalities);
end;
procedure TFormMain.FormDestroy(Sender: TObject);
begin
FSupportedPersonalityOptions.Free;
FDelphiIDEList.Free;
end;
procedure TFormMain.clbPersonalitiesDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
clb: TCheckListBox;
begin
clb := Control as TCheckListBox;
if clb.Header[Index] then
begin
if not Boolean(clb.Items.Objects[Index]) then
clb.Canvas.Font.Color := clRed;
clb.Canvas.Font.Style := [fsBold]
end
else
clb.Canvas.Font.Style := [];
clb.Canvas.FillRect(Rect);
clb.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, clb.Items[Index]);
if (Index > 0) and clb.Header[Index] then
begin
clb.Canvas.Pen.Color := clGray;
clb.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Top + 1);
end;
end;
procedure TFormMain.clbPersonalitiesClick(Sender: TObject);
var
PersoOptions: TPersonalityOptions;
clb: TCheckListBox;
begin
clb := Sender as TCheckListBox;
if clb.ItemIndex = -1 then
begin
lblTitle.Caption := RsNoIdeOrPersonaltySelected;
lblSubTitle.Caption := '';
ShowOptions(nil);
end
else
begin
if clb.Header[clb.ItemIndex] then
begin
lblTitle.Caption := clb.Items[clb.ItemIndex];
if Boolean(clb.Items.Objects[clb.ItemIndex]) then
begin
if (clb.ItemIndex < clb.Items.Count - 1) and
not clb.Header[clb.ItemIndex + 1] then
begin
// select first personality
clb.ItemIndex := clb.ItemIndex + 1;
clbPersonalitiesClick(clbPersonalities);
end
else
begin
lblSubTitle.Caption := '';
ShowOptions(nil);
end;
end
else
begin
lblSubTitle.Caption := RsIdeNotUpToDate;
ShowOptions(nil);
end;
end
else
begin
PersoOptions := TPersonalityOptions(clb.Items.Objects[clb.ItemIndex]);
lblTitle.Caption := PersoOptions.Personality.IDE.DisplayName;
lblSubTitle.Caption := PersoOptions.Personality.Name;
ShowOptions(PersoOptions);
end;
end;
end;
procedure TFormMain.clbPersonalitiesKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
clb: TCheckListBox;
begin
clb := Sender as TCheckListBox;
if Key = VK_UP then
begin
if (clb.ItemIndex > 1) and clb.Header[clb.ItemIndex - 1] then
begin
clb.ItemIndex := clb.ItemIndex - 2;
clbPersonalitiesClick(clb);
Key := 0;
end;
end;
end;
procedure TFormMain.GenerateTabs(PersoOption: TPersonalityOptions);
var
TabIndex, OptionIndex: Integer;
Page: TJvStandardPage;
TabItem: TJvTabBarItem;
ScrollBox: TScrollBox;
Options: TOptionList;
Control: TControl;
begin
if Assigned(PersoOption) then
begin
for TabIndex := 0 to PersoOption.TabNames.Count - 1 do
begin
TabItem := tbrOptions.AddTab(PersoOption.TabNames[TabIndex]);
TabItem.Visible := False;
Page := TJvStandardPage.Create(nil);
TabItem.AutoDeleteData.Add(Page);
Page.Data := TabItem;
Page.Caption := TabItem.Caption;
Page.BorderWidth := 6;
Page.Visible := False;
ScrollBox := TScrollBox.Create(Page);
ScrollBox.Name := 'ScrollBoxClient';
ScrollBox.Align := alClient;
ScrollBox.BorderStyle := bsNone;
ScrollBox.Parent := Page;
{$IFDEF CONDITIONALEXPRESSIONS}
{$IFNDEF VER140}
ScrollBox.ParentBackground := True;
{$ENDIF !VER140}
{$ENDIF CONDITIONALEXPRESSIONS}
Page.PageList := pglOptions;
Options := PersoOption.GetTabOptions(TabIndex);
TabItem.Data := PersoOption;
Page.Tag := Integer(Options);
if Options <> nil then
begin
for OptionIndex := 0 to Options.Count - 1 do
begin
Control := Options[OptionIndex].CreateControl;
if Control <> nil then
begin
Control.Align := alTop;
Control.Top := MaxInt;
ScrollBox.InsertComponent(Control);
Control.Parent := ScrollBox;
end;
end;
end;
end;
for TabIndex := pglOptions.PageCount - 1 downto 0 do
if pglOptions.Pages[TabIndex].Tag = 0 then
pglOptions.Pages[TabIndex].Data.Free;
end;
spgEmpty.PageIndex := pglOptions.PageCount;
end;
procedure TFormMain.ShowOptions(PersoOption: TPersonalityOptions);
var
i: Integer;
SelTab: string;
begin
if tbrOptions.Tag <> Integer(PersoOption) then
begin
for i := 0 to tbrOptions.Tabs.Count - 1 do
TJvCustomPage(tbrOptions.Tabs[i].AutoDeleteData[0]).Visible := tbrOptions.Tabs[i].Data = PersoOption;
end;
end;
end.