⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmpackageselection.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{-----------------------------------------------------------------------------
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 + -