158 lines
3.4 KiB
ObjectPascal
158 lines
3.4 KiB
ObjectPascal
unit CmpSwDialog;
|
|
|
|
interface
|
|
uses
|
|
ActnList,
|
|
Classes,
|
|
ComCtrls,
|
|
Controls,
|
|
ExtCtrls,
|
|
ImgList,
|
|
IniFiles,
|
|
Menus,
|
|
StdCtrls,
|
|
|
|
BaseSwDialog,
|
|
BaseSwObjects;
|
|
|
|
|
|
type
|
|
TCmpSwStyleVisitor = class(TBaseSwStyleVisitor)
|
|
private
|
|
FImageList: TImageList;
|
|
FImageMap: TStringHash;
|
|
protected
|
|
procedure VisitItem(const AItem: TBaseSwItem); override;
|
|
|
|
function GetComponentPackage(const AClassName: String): String;
|
|
function LoadComponentImage(const APackageName, AClassName: String): Integer;
|
|
public
|
|
constructor Create(AImageList: TImageList);
|
|
destructor Destroy(); override;
|
|
end;
|
|
|
|
|
|
TfrmCmpSwDialog = class(TfrmBaseSwDialog)
|
|
protected
|
|
function CreateStyleVisitor(): TBaseSwStyleVisitor; override;
|
|
end;
|
|
|
|
|
|
implementation
|
|
uses
|
|
CommCtrl,
|
|
SysUtils,
|
|
ToolsAPI,
|
|
Windows,
|
|
|
|
CmpSwObjects;
|
|
|
|
|
|
{$R *.dfm}
|
|
|
|
|
|
{ TCmpSwStyleVisitor }
|
|
constructor TCmpSwStyleVisitor.Create(AImageList: TImageList);
|
|
begin
|
|
inherited Create();
|
|
|
|
FImageList := AImageList;
|
|
FImageMap := TStringHash.Create();
|
|
end;
|
|
|
|
|
|
destructor TCmpSwStyleVisitor.Destroy();
|
|
begin
|
|
FreeAndNil(FImageMap);
|
|
|
|
inherited;
|
|
end;
|
|
|
|
|
|
procedure TCmpSwStyleVisitor.VisitItem(const AItem: TBaseSwItem);
|
|
var
|
|
component: TCmpSwComponent;
|
|
package: String;
|
|
|
|
begin
|
|
inherited;
|
|
|
|
component := (AItem as TCmpSwComponent);
|
|
ImageIndex := FImageMap.ValueOf(component.ComponentClass);
|
|
|
|
if ImageIndex = -1 then
|
|
begin
|
|
package := GetComponentPackage(component.ComponentClass);
|
|
if Length(package) > 0 then
|
|
ImageIndex := LoadComponentImage(package, component.ComponentClass);
|
|
end;
|
|
|
|
if ImageIndex = -2 then
|
|
ImageIndex := 0;
|
|
end;
|
|
|
|
|
|
function TCmpSwStyleVisitor.GetComponentPackage(const AClassName: String): String;
|
|
var
|
|
packageServices: IOTAPackageServices;
|
|
packageIndex: Integer;
|
|
componentIndex: Integer;
|
|
|
|
begin
|
|
Result := '';
|
|
packageServices := (BorlandIDEServices as IOTAPackageServices);
|
|
|
|
for packageIndex := Pred(packageServices.PackageCount) downto 0 do
|
|
begin
|
|
for componentIndex := Pred(packageServices.ComponentCount[packageIndex]) downto 0 do
|
|
begin
|
|
if SameText(packageServices.ComponentNames[packageIndex, componentIndex],
|
|
AClassName) then
|
|
begin
|
|
Result := packageServices.PackageNames[packageIndex] + '.bpl';
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TCmpSwStyleVisitor.LoadComponentImage(const APackageName, AClassName: String): Integer;
|
|
var
|
|
packageHandle: THandle;
|
|
bitmapHandle: THandle;
|
|
bitmap: TBitmap;
|
|
|
|
begin
|
|
Result := -1;
|
|
packageHandle := LoadLibrary(PChar(APackageName));
|
|
|
|
if packageHandle <> 0 then
|
|
try
|
|
bitmapHandle := LoadBitmap(packageHandle, PChar(AClassName));
|
|
if bitmapHandle <> 0 then
|
|
begin
|
|
bitmap ;=
|
|
// #ToDo1 (MvR) 10-12-2007: proper transparency
|
|
Result := ImageList_AddMasked(FImageList.Handle, bitmapHandle,
|
|
GetTransparentColor(bitmapHandle));
|
|
end;
|
|
finally
|
|
FreeLibrary(packageHandle);
|
|
end;
|
|
|
|
if Result = -1 then
|
|
Result := -2;
|
|
|
|
FImageMap.Add(AClassName, Result);
|
|
end;
|
|
|
|
|
|
{ TfrmCmpSwDialog }
|
|
function TfrmCmpSwDialog.CreateStyleVisitor(): TBaseSwStyleVisitor;
|
|
begin
|
|
Result := TCmpSwStyleVisitor.Create(ilsTypes);
|
|
end;
|
|
|
|
end.
|