📄 frmpackageselection.pas
字号:
{-----------------------------------------------------------------------------
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/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: FrmPackageSelections.pas, released on 2004-03-29.
The Initial Developer of the Original Code is Andreas Hausladen
(Andreas dott Hausladen att gmx dott de)
Portions created by Andreas Hausladen are Copyright (C) 2004 Andreas Hausladen.
All Rights Reserved.
Contributor(s): -
You may retrieve the latest version of this file at the Project JEDI's JVCL
home page, located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: FrmPackageSelection.pas,v 1.9 2004/12/23 00:25:12 ahuser Exp $
unit FrmPackageSelection;
{$I jvcl.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, CheckLst, ImgList, ExtCtrls, Menus, ActnList,
ShellAPI, CommCtrl,
JVCL3Install, JVCLData, PackageInformation, PackageUtils, HtHint;
type
TFramePackageSelection = class(TFrame)
CheckListBoxPackages: TCheckListBox;
ComboBoxDisplayMode: TComboBox;
ImageListPackages: TImageList;
LblTarget: TLabel;
ListViewTargetIDEs: TListView;
LblIDEs: TLabel;
ImageListTargets: TImageList;
CheckListBoxFrameworks: TCheckListBox;
PopupMenuPackages: TPopupMenu;
MenuInstallAll: TMenuItem;
MenuInstallNone: TMenuItem;
ActionList: TActionList;
ActionInstallAll: TAction;
ActionInstallNone: TAction;
LblFrameworks: TLabel;
BtnReset: TButton;
ActionResetPackages: TAction;
LblShowMode: TLabel;
N2: TMenuItem;
ResetPackages1: TMenuItem;
TimerHint: TTimer;
procedure ListViewTargetIDEsSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
procedure CheckListBoxFrameworksClick(Sender: TObject);
procedure ComboBoxDisplayModeChange(Sender: TObject);
procedure CheckListBoxFrameworksClickCheck(Sender: TObject);
procedure CheckListBoxPackagesClickCheck(Sender: TObject);
procedure CheckListBoxPackagesDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure ActionInstallAllUpdate(Sender: TObject);
procedure ActionInstallAllExecute(Sender: TObject);
procedure CheckListBoxPackagesMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
procedure TimerHintTimer(Sender: TObject);
private
function GetSelProjectGroup: TProjectGroup;
function GetSelTargetConfig: TTargetConfig;
private
FInitializing: Boolean;
FInstaller: TInstaller;
procedure Init;
protected
property Installer: TInstaller read FInstaller;
private
FOrgWndProc: TWndMethod;
procedure HookWndProc(var Msg: TMessage);
private
FInSelection: Integer;
procedure SelectTargetIde(TargetConfig: TTargetConfig);
procedure SelectPackageList(ProjectGroup: TProjectGroup);
procedure UpdatePackageState;
function GetStateOfPackage(Pkg: TPackageTarget): TCheckBoxState;
property SelTargetConfig: TTargetConfig read GetSelTargetConfig;
property SelProjectGroup: TProjectGroup read GetSelProjectGroup;
public
constructor Create(AOwner: TComponent); override;
class function Build(Installer: TInstaller; Client: TWinControl): TFramePackageSelection;
end;
implementation
uses
InstallerConsts, Core, Intf, Utils;
{$R *.dfm}
function IsUseJVCL(Info: TPackageInfo): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to Info.RequireCount - 1 do
if CompareText(Info.Requires[i].Condition, 'USEJVCL') = 0 then
Exit;
Result := False;
end;
{ TFramePackageSelection }
class function TFramePackageSelection.Build(Installer: TInstaller;
Client: TWinControl): TFramePackageSelection;
begin
Result := TFramePackageSelection.Create(Client);
Installer.PackageInstaller.Translate(Result);
Result.FInstaller := Installer;
Result.ComboBoxDisplayMode.ItemIndex := 0;
Result.Parent := Client;
Result.Align := alClient;
Result.Init;
end;
procedure TFramePackageSelection.Init;
var
i: Integer;
ListItem: TListItem;
begin
FInitializing := True;
try
TimerHint.Interval := Application.HintPause;
// fill target IDEs list
ImageListTargets.Clear;
ListViewTargetIDEs.Items.BeginUpdate;
try
ListViewTargetIDEs.Items.Clear;
for i := 0 to Installer.SelTargetCount - 1 do
begin
with Installer.SelTargets[i] do
begin
if InstallJVCL then
begin
ListItem := ListViewTargetIDEs.Items.Add;
ListItem.Caption := Target.DisplayName;
ListItem.Data := Installer.SelTargets[i];
AddIconFileToImageList(ImageListTargets, Target.Executable);
ListItem.ImageIndex := ImageListTargets.Count - 1;
end;
end;
end;
if ListViewTargetIDEs.Items.Count > 0 then
SelectTargetIde(ListViewTargetIDEs.Items[0].Data)
else
SelectTargetIde(nil);
finally
ListViewTargetIDEs.Items.EndUpdate;
end;
finally
FInitializing := False;
end;
end;
function TFramePackageSelection.GetSelProjectGroup: TProjectGroup;
begin
with CheckListBoxFrameworks do
begin
if ItemIndex <> -1 then
Result := TProjectGroup(Items.Objects[ItemIndex])
else
Result := nil;
end;
end;
function TFramePackageSelection.GetSelTargetConfig: TTargetConfig;
begin
if ListViewTargetIDEs.Selected <> nil then
Result := ListViewTargetIDEs.Selected.Data
else
Result := nil;
end;
procedure TFramePackageSelection.ListViewTargetIDEsSelectItem(
Sender: TObject; Item: TListItem; Selected: Boolean);
begin
if (csDestroying in ComponentState) then
Exit;
if (Item <> nil) and (Selected) then
SelectTargetIde(Item.Data)
else
SelectTargetIde(nil);
end;
procedure TFramePackageSelection.SelectTargetIde(TargetConfig: TTargetConfig);
var
Kind: TPackageGroupKind;
Group: TProjectGroup;
Idx: Integer;
Item: TListItem;
begin
if FInSelection <> 0 then
Exit;
Inc(FInSelection);
CheckListBoxFrameworks.Items.BeginUpdate;
try
// clear sub targets
CheckListBoxFrameworks.Items.Clear;
if TargetConfig <> nil then
begin
LblTarget.Caption := TargetConfig.Target.DisplayName;
Item := ListViewTargetIDEs.FindData(0, TargetConfig, True, False);
if not Item.Selected then
Item.Selected := True;
CheckListBoxFrameworks.ItemIndex := -1;
for Kind := pkFirst to pkLast do
begin
// find first selected item
Group := TargetConfig.Frameworks.Items[TargetConfig.Target.IsPersonal, Kind];
if Group <> nil then
begin
with CheckListBoxFrameworks do
begin
Idx := Items.AddObject(PackageGroupKindToStr[Kind], Group);
Checked[Idx] := Kind in TargetConfig.InstallMode;
if Checked[Idx] and (ItemIndex = -1) then
ItemIndex := Idx;
end;
end;
end;
end
else
LblTarget.Caption := RsSelectTargetIDE;
finally
CheckListBoxFrameworks.Items.EndUpdate;
Dec(FInSelection);
end;
// select package list
CheckListBoxFrameworksClick(CheckListBoxFrameworks);
end;
procedure TFramePackageSelection.CheckListBoxFrameworksClick(Sender: TObject);
begin
SelectPackageList(SelProjectGroup);
end;
procedure TFramePackageSelection.SelectPackageList(ProjectGroup: TProjectGroup);
var
i, Idx: Integer;
DisplayMode: Integer;
begin
if FInSelection <> 0 then
Exit;
DisplayMode := ComboBoxDisplayMode.ItemIndex;
ActionResetPackages.Visible := (SelTargetConfig <> nil) and
(SelTargetConfig.InstalledJVCLVersion = 3) and
(DisplayMode <> -1);
CheckListBoxPackages.Items.BeginUpdate;
try
CheckListBoxPackages.Items.Clear;
if ProjectGroup <> nil then
begin
Idx := CheckListBoxFrameworks.Items.IndexOfObject(ProjectGroup);
LblTarget.Caption := TTargetConfig(ListViewTargetIDEs.Selected.Data).Target.DisplayName +
' - ' + CheckListBoxFrameworks.Items[Idx];
for i := 0 to ProjectGroup.Count - 1 do
begin
case DisplayMode of
0: // designtime
if not ProjectGroup.Packages[i].Info.IsDesign then
Continue;
1: // runtime
if ProjectGroup.Packages[i].Info.IsDesign then
Continue;
2: // both
;
end;
CheckListBoxPackages.Items.AddObject(ProjectGroup.Packages[i].Info.DisplayName,
ProjectGroup.Packages[i]);
end;
end
else
LblTarget.Caption := RsSelectTargetIDE;
UpdatePackageState;
finally
CheckListBoxPackages.Items.EndUpdate;
end;
end;
procedure TFramePackageSelection.ComboBoxDisplayModeChange(Sender: TObject);
begin
CheckListBoxFrameworksClick(CheckListBoxFrameworks);
end;
procedure TFramePackageSelection.CheckListBoxFrameworksClickCheck(Sender: TObject);
var
i: Integer;
Kind: TPackageGroupKind;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -