218 lines
6.2 KiB
ObjectPascal
218 lines
6.2 KiB
ObjectPascal
|
|
{-----------------------------------------------------------------------------
|
|||
|
|
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: JvgCompDescription.PAS, released on 2003-01-15.
|
|||
|
|
|
|||
|
|
The Initial Developer of the Original Code is Andrey V. Chudin, [chudin att yandex dott ru]
|
|||
|
|
Portions created by Andrey V. Chudin are Copyright (C) 2003 Andrey V. Chudin.
|
|||
|
|
All Rights Reserved.
|
|||
|
|
|
|||
|
|
Contributor(s):
|
|||
|
|
Michael Beck [mbeck att bigfoot dott com].
|
|||
|
|
Burov Dmitry, translation of russian text.
|
|||
|
|
|
|||
|
|
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: JvgCompDescription.pas 10610 2006-05-19 13:35:08Z elahn $
|
|||
|
|
|
|||
|
|
unit JvgCompDescription;
|
|||
|
|
|
|||
|
|
{$I jvcl.inc}
|
|||
|
|
|
|||
|
|
interface
|
|||
|
|
|
|||
|
|
uses
|
|||
|
|
Classes, TypInfo,
|
|||
|
|
{$IFDEF USEJVCL}
|
|||
|
|
JvComponentBase,
|
|||
|
|
{$ENDIF USEJVCL}
|
|||
|
|
{$IFDEF COMPILER6_UP}
|
|||
|
|
DesignIntf, DesignEditors, PropertyCategories;
|
|||
|
|
{$ELSE}
|
|||
|
|
DsgnIntf;
|
|||
|
|
{$ENDIF COMPILER6_UP}
|
|||
|
|
|
|||
|
|
type
|
|||
|
|
TJvgPropInfos = class;
|
|||
|
|
TJvgPropInform = class;
|
|||
|
|
|
|||
|
|
{$IFDEF USEJVCL}
|
|||
|
|
TJvgComponentDescription = class(TJvComponent)
|
|||
|
|
{$ELSE}
|
|||
|
|
TJvgComponentDescription = class(TComponent)
|
|||
|
|
{$ENDIF USEJVCL}
|
|||
|
|
private
|
|||
|
|
FPropInfos: TJvgPropInfos;
|
|||
|
|
FNote: string;
|
|||
|
|
FClass_Name: string;
|
|||
|
|
FPropList: PPropList;
|
|||
|
|
FNumProps: Word;
|
|||
|
|
public
|
|||
|
|
constructor Create(AOwner, Component: TComponent); reintroduce;
|
|||
|
|
destructor Destroy; override;
|
|||
|
|
procedure LoadProperties(Component: TComponent);
|
|||
|
|
published
|
|||
|
|
property Class_Name: string read FClass_Name write FClass_Name;
|
|||
|
|
property Note: string read FNote write FNote;
|
|||
|
|
property PropInfos: TJvgPropInfos read FPropInfos write FPropInfos;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TJvgPropInfos = class(TCollection)
|
|||
|
|
private
|
|||
|
|
procedure AddPropInfo(PropInfo: PPropInfo; Component: TComponent);
|
|||
|
|
function GetItem(Index: Integer): TJvgPropInform;
|
|||
|
|
procedure SetItem(Index: Integer; const Value: TJvgPropInform);
|
|||
|
|
public
|
|||
|
|
function Add: TJvgPropInform;
|
|||
|
|
function Insert(Index: Integer): TJvgPropInform;
|
|||
|
|
property Items[Index: Integer]: TJvgPropInform read GetItem write SetItem;
|
|||
|
|
default;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
TJvgPropInform = class(TCollectionItem)
|
|||
|
|
private
|
|||
|
|
FName: string;
|
|||
|
|
FTypeName: string;
|
|||
|
|
FTypeKind: TTypeKind;
|
|||
|
|
FChecked: Boolean;
|
|||
|
|
FMakeHref: Boolean;
|
|||
|
|
FNote: string;
|
|||
|
|
public
|
|||
|
|
Info: PPropInfo;
|
|||
|
|
published
|
|||
|
|
property Name: string read FName write FName;
|
|||
|
|
property TypeName: string read FTypeName write FTypeName;
|
|||
|
|
property TypeKind: TTypeKind read FTypeKind write FTypeKind;
|
|||
|
|
property Checked: Boolean read FChecked write FChecked;
|
|||
|
|
property MakeHref: Boolean read FMakeHref write FMakeHref;
|
|||
|
|
property Note: string read FNote write FNote;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
implementation
|
|||
|
|
|
|||
|
|
//=== { TJvgComponentDescription } ===========================================
|
|||
|
|
|
|||
|
|
constructor TJvgComponentDescription.Create(AOwner, Component: TComponent);
|
|||
|
|
begin
|
|||
|
|
inherited Create(AOwner);
|
|||
|
|
PropInfos := TJvgPropInfos.Create(TJvgPropInform);
|
|||
|
|
LoadProperties(Component);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
destructor TJvgComponentDescription.Destroy;
|
|||
|
|
begin
|
|||
|
|
FreeMem(FPropList, FNumProps * SizeOf(Pointer));
|
|||
|
|
PropInfos.Free;
|
|||
|
|
inherited Destroy;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure TJvgComponentDescription.LoadProperties(Component: TComponent);
|
|||
|
|
var
|
|||
|
|
TypeInf: PTypeInfo;
|
|||
|
|
TypeData: PTypeData;
|
|||
|
|
I: Integer;
|
|||
|
|
AName, PropName: string;
|
|||
|
|
begin
|
|||
|
|
if FNumProps > 0 then
|
|||
|
|
FreeMem(FPropList, FNumProps * SizeOf(Pointer));
|
|||
|
|
|
|||
|
|
{ Playing with RTTI }
|
|||
|
|
TypeInf := Component.ClassInfo;
|
|||
|
|
AName := TypeInf^.Name;
|
|||
|
|
TypeData := GetTypeData(TypeInf);
|
|||
|
|
FNumProps := TypeData^.PropCount;
|
|||
|
|
|
|||
|
|
GetMem(FPropList, FNumProps * SizeOf(Pointer));
|
|||
|
|
try
|
|||
|
|
//{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
|
|||
|
|
{ Retrieving list of properties [translated] }
|
|||
|
|
GetPropInfos(TypeInf, FPropList);
|
|||
|
|
|
|||
|
|
for I := 0 to FNumProps - 1 do
|
|||
|
|
begin
|
|||
|
|
PropInfos.AddPropInfo(FPropList^[I], Component);
|
|||
|
|
|
|||
|
|
PropName := FPropList^[I]^.Name;
|
|||
|
|
// PropTypeInf := FPropList^[I]^.PropType^;
|
|||
|
|
// PropInfo := FPropList^[I];
|
|||
|
|
end;
|
|||
|
|
finally
|
|||
|
|
end;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
//=== { TJvgPropInfos } ======================================================
|
|||
|
|
|
|||
|
|
procedure TJvgPropInfos.AddPropInfo(PropInfo: PPropInfo; Component: TComponent);
|
|||
|
|
var
|
|||
|
|
TypeData: PTypeData;
|
|||
|
|
TypeInfo: PTypeInfo;
|
|||
|
|
J: Integer;
|
|||
|
|
NoteStr: string;
|
|||
|
|
begin
|
|||
|
|
with TJvgPropInform(Add) do
|
|||
|
|
begin
|
|||
|
|
Name := PropInfo^.Name;
|
|||
|
|
TypeName := PropInfo^.PropType^.Name;
|
|||
|
|
TypeKind := PropInfo^.PropType^.Kind;
|
|||
|
|
Info := PropInfo;
|
|||
|
|
NoteStr := '';
|
|||
|
|
|
|||
|
|
if TypeKind in [tkEnumeration, tkSet] then
|
|||
|
|
begin
|
|||
|
|
if TypeKind = tkSet then
|
|||
|
|
TypeInfo := GetTypeData(PropInfo^.PropType^)^.CompType^
|
|||
|
|
else
|
|||
|
|
TypeInfo := PropInfo.PropType^;
|
|||
|
|
|
|||
|
|
TypeData := GetTypeData(TypeInfo);
|
|||
|
|
|
|||
|
|
for J := TypeData^.MinValue to TypeData^.MaxValue do
|
|||
|
|
begin
|
|||
|
|
if NoteStr <> '' then
|
|||
|
|
if TypeKind = tkSet then
|
|||
|
|
NoteStr := NoteStr + ' | '
|
|||
|
|
else
|
|||
|
|
NoteStr := NoteStr + ', ';
|
|||
|
|
NoteStr := NoteStr + GetEnumName(TypeInfo, J);
|
|||
|
|
end;
|
|||
|
|
NoteStr := '[' + NoteStr + ']';
|
|||
|
|
end;
|
|||
|
|
Note := NoteStr;
|
|||
|
|
|
|||
|
|
Checked := not IsPublishedProp(Component.ClassParent, Name);
|
|||
|
|
end;
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
function TJvgPropInfos.Add: TJvgPropInform;
|
|||
|
|
begin
|
|||
|
|
Result := TJvgPropInform(inherited Add);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
function TJvgPropInfos.Insert(Index: Integer): TJvgPropInform;
|
|||
|
|
begin
|
|||
|
|
Result := TJvgPropInform(inherited Insert(Index));
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
function TJvgPropInfos.GetItem(Index: Integer): TJvgPropInform;
|
|||
|
|
begin
|
|||
|
|
Result := TJvgPropInform(inherited Items[Index]);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure TJvgPropInfos.SetItem(Index: Integer; const Value: TJvgPropInform);
|
|||
|
|
begin
|
|||
|
|
Items[Index].Assign(Value);
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
end.
|
|||
|
|
|