📄 designeditors.~pas
字号:
{ ********************************************************************** }
{ }
{ Delphi and Kylix Cross-Platform Open Tools API }
{ }
{ Copyright (C) 1995, 2001 Borland Software Corporation }
{ }
{ All Rights Reserved. }
{ }
{ ********************************************************************** }
unit DesignEditors;
interface
uses
Types, SysUtils, Classes, TypInfo, Variants, DesignIntf, DesignMenus
{$IFDEF LINUX}
, QtThread
{$ENDIF LINUX}
;
{ Property Editors }
type
TInstProp = record
Instance: TPersistent;
PropInfo: PPropInfo;
end;
PInstPropList = ^TInstPropList;
TInstPropList = array[0..1023] of TInstProp;
TPropertyEditor = class(TBasePropertyEditor, IProperty)
private
FDesigner: IDesigner;
FPropList: PInstPropList;
FPropCount: Integer;
function GetPrivateDirectory: string;
protected
procedure SetPropEntry(Index: Integer; AInstance: TPersistent;
APropInfo: PPropInfo); override;
protected
function GetFloatValue: Extended;
function GetFloatValueAt(Index: Integer): Extended;
function GetInt64Value: Int64;
function GetInt64ValueAt(Index: Integer): Int64;
function GetMethodValue: TMethod;
function GetMethodValueAt(Index: Integer): TMethod;
function GetOrdValue: Longint;
function GetOrdValueAt(Index: Integer): Longint;
function GetStrValue: string;
function GetStrValueAt(Index: Integer): string;
function GetVarValue: Variant;
function GetVarValueAt(Index: Integer): Variant;
function GetIntfValue: IInterface;
function GetIntfValueAt(Index: Integer): IInterface;
procedure Modified;
procedure SetFloatValue(Value: Extended);
procedure SetMethodValue(const Value: TMethod);
procedure SetInt64Value(Value: Int64);
procedure SetOrdValue(Value: Longint);
procedure SetStrValue(const Value: string);
procedure SetVarValue(const Value: Variant);
procedure SetIntfValue(const Value: IInterface);
protected
{ IProperty }
function GetEditValue(out Value: string): Boolean;
function HasInstance(Instance: TPersistent): Boolean;
public
constructor Create(const ADesigner: IDesigner; APropCount: Integer); override;
destructor Destroy; override;
procedure Activate; virtual;
function AllEqual: Boolean; virtual;
function AutoFill: Boolean; virtual;
procedure Edit; virtual;
function GetAttributes: TPropertyAttributes; virtual;
function GetComponent(Index: Integer): TPersistent;
function GetEditLimit: Integer; virtual;
function GetName: string; virtual;
procedure GetProperties(Proc: TGetPropProc); virtual;
function GetPropInfo: PPropInfo; virtual;
function GetPropType: PTypeInfo;
function GetValue: string; virtual;
function GetVisualValue: string;
procedure GetValues(Proc: TGetStrProc); virtual;
procedure Initialize; override;
procedure Revert;
procedure SetValue(const Value: string); virtual;
function ValueAvailable: Boolean;
property Designer: IDesigner read FDesigner;
property PrivateDirectory: string read GetPrivateDirectory;
property PropCount: Integer read FPropCount;
property Value: string read GetValue write SetValue;
end;
{ TOrdinalProperty
The base class of all ordinal property editors. It established that ordinal
properties are all equal if the GetOrdValue all return the same value. }
TOrdinalProperty = class(TPropertyEditor)
function AllEqual: Boolean; override;
function GetEditLimit: Integer; override;
end;
{ TIntegerProperty
Default editor for all Longint properties and all subtypes of the Longint
type (i.e. Integer, Word, 1..10, etc.). Restricts the value entered into
the property to the range of the sub-type. }
TIntegerProperty = class(TOrdinalProperty)
public
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TCharProperty
Default editor for all Char properties and sub-types of Char (i.e. Char,
'A'..'Z', etc.). }
TCharProperty = class(TOrdinalProperty)
public
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TEnumProperty
The default property editor for all enumerated properties (e.g. TShape =
(sCircle, sTriangle, sSquare), etc.). }
TEnumProperty = class(TOrdinalProperty)
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TBoolProperty is now obsolete. TEnumProperty handles bool types. }
TBoolProperty = class(TEnumProperty)
end deprecated;
{ TInt64Property
Default editor for all Int64 properties and all subtypes of Int64. }
TInt64Property = class(TPropertyEditor)
public
function AllEqual: Boolean; override;
function GetEditLimit: Integer; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TFloatProperty
The default property editor for all floating point types (e.g. Float,
Single, Double, etc.) }
TFloatProperty = class(TPropertyEditor)
public
function AllEqual: Boolean; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TStringProperty
The default property editor for all strings and sub types (e.g. string,
string[20], etc.). }
TStringProperty = class(TPropertyEditor)
public
function AllEqual: Boolean; override;
function GetEditLimit: Integer; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TNestedProperty
A property editor that uses the parent's Designer, PropList and PropCount.
The constructor and destructor do not call inherited, but all derived classes
should. This is useful for properties like the TSetElementProperty. }
TNestedProperty = class(TPropertyEditor)
public
constructor Create(Parent: TPropertyEditor); reintroduce;
destructor Destroy; override;
end;
{ TSetElementProperty
A property editor that edits an individual set element. GetName is
changed to display the set element name instead of the property name and
Get/SetValue is changed to reflect the individual element state. This
editor is created by the TSetProperty editor. }
TSetElementProperty = class(TNestedProperty)
private
FElement: Integer;
protected
constructor Create(Parent: TPropertyEditor; AElement: Integer); reintroduce;
property Element: Integer read FElement;
public
function AllEqual: Boolean; override;
function GetAttributes: TPropertyAttributes; override;
function GetName: string; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TSetProperty
Default property editor for all set properties. This editor does not edit
the set directly but will display sub-properties for each element of the
set. GetValue displays the value of the set in standard set syntax. }
TSetProperty = class(TOrdinalProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetProperties(Proc: TGetPropProc); override;
function GetValue: string; override;
end;
{ TClassProperty
Default property editor for all objects. Does not allow modifying the
property but does display the class name of the object and will allow the
editing of the object's properties as sub-properties of the property. }
TClassProperty = class(TPropertyEditor)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetProperties(Proc: TGetPropProc); override;
function GetValue: string; override;
end;
{ TMethodProperty
Property editor for all method properties. }
TMethodProperty = class(TPropertyEditor, IMethodProperty)
public
function AllNamed: Boolean; virtual;
function AllEqual: Boolean; override;
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetEditLimit: Integer; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const AValue: string); override;
function GetFormMethodName: string; virtual;
function GetTrimmedEventName: string;
end;
{ TComponentProperty
The default editor for TComponents. It does not allow editing of the
properties of the component. It allow the user to set the value of this
property to point to a component in the same form that is type compatible
with the property being edited (e.g. the ActiveControl property). }
TComponentProperty = class(TPropertyEditor, IReferenceProperty)
protected
function FilterFunc(const ATestEditor: IProperty): Boolean;
function GetComponentReference: TComponent; virtual;
function GetSelections: IDesignerSelections; virtual;
public
function AllEqual: Boolean; override;
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
procedure GetProperties(Proc: TGetPropProc); override;
function GetEditLimit: Integer; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TInterfaceProperty
The default editor for interface references. It allows the user to set
the value of this property to refer to an interface implemented by
a component on the form (or via form linking) that is type compatible
with the property being edited. }
TInterfaceProperty = class(TComponentProperty)
private
FGetValuesStrProc: TGetStrProc;
protected
procedure ReceiveComponentNames(const S: string);
function GetComponent(const AInterface: IInterface): TComponent;
function GetComponentReference: TComponent; override;
function GetSelections: IDesignerSelections; override;
public
function AllEqual: Boolean; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
{ TComponentNameProperty
Property editor for the Name property. It restricts the name property
from being displayed when more than one component is selected. }
TComponentNameProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
function GetEditLimit: Integer; override;
end;
{ TDateProperty
Property editor for date portion of TDateTime type. }
TDateProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TTimeProperty
Property editor for time portion of TDateTime type. }
TTimeProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TDateTimeProperty
Edits both date and time data simultaneously }
TDateTimeProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
end;
{ TVariantProperty }
TVariantProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure SetValue(const Value: string); override;
procedure GetProperties(Proc: TGetPropProc); override;
end;
procedure GetComponentProperties(const Components: IDesignerSelections;
Filter: TTypeKinds; const Designer: IDesigner; Proc: TGetPropProc;
EditorFilterFunc: TPropertyEditorFilterFunc = nil);
{ Component Editors }
type
{ TComponentEditor
This class provides a default implementation for the IComponentEditor
interface. There is no assumption by the designer that you use this class
only that your class derive from TBaseComponentEditor and implement
IComponentEditor. This class is provided to help you implement a class
that meets those requirements. }
TComponentEditor = class(TBaseComponentEditor, IComponentEditor)
private
FComponent: TComponent;
FDesigner: IDesigner;
public
constructor Create(AComponent: TComponent; ADesigner: IDesigner); override;
procedure Edit; virtual;
procedure ExecuteVerb(Index: Integer); virtual;
function GetComponent: TComponent;
function GetDesigner: IDesigner;
function GetVerb(Index: Integer): string; virtual;
function GetVerbCount: Integer; virtual;
function IsInInlined: Boolean;
procedure Copy; virtual;
procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
property Component: TComponent read FComponent;
property Designer: IDesigner read GetDesigner;
end;
{ TDefaultEditor
An editor that provides default behavior for the double-click that will
iterate through the properties looking the the most appropriate method
property to edit }
TDefaultEditor = class(TComponentEditor, IDefaultEditor)
private
FFirst: IProperty;
FBest: IProperty;
FContinue: Boolean;
procedure CheckEdit(const Prop: IProperty);
protected
procedure EditProperty(const Prop: IProperty; var Continue: Boolean); virtual;
public
procedure Edit; override;
end;
function GetComponentEditor(Component: TComponent;
const Designer: IDesigner): IComponentEditor;
{ Selection Editors }
type
{ TSelectionEditor
This provides a default implementation of the ISelectionEditor interface.
There is no assumption by the designer that you use this class only that
you have a class derived from TBaseSelectionEditor and implements the
ISelectionEdtior interface. This class is provided to help you implement a
class the meets those requirements. This class is also the selection editor
that will be created if no other selection editor is registered for a class. }
TSelectionEditor = class(TBaseSelectionEditor, ISelectionEditor)
private
FDesigner: IDesigner;
public
constructor Create(const ADesigner: IDesigner); override;
procedure ExecuteVerb(Index: Integer; const List: IDesignerSelections); virtual;
function GetVerb(Index: Integer): string; virtual;
function GetVerbCount: Integer; virtual;
procedure RequiresUnits(Proc: TGetStrProc); virtual;
procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
property Designer: IDesigner read FDesigner;
end;
function GetSelectionEditors(const Designer: IDesigner): ISelectionEditorList; overload;
function GetSelectionEditors(const Designer: IDesigner;
const Selections: IDesignerSelections): ISelectionEditorList; overload;
function GetSelectionEditors(const Designer: IDesigner;
Component: TComponent): ISelectionEditorList; overload;
type
{ TEditActionSelectionEditor }
TEditActionSelectionEditor = class(TSelectionEditor)
private
procedure HandleToBack(Sender: TObject);
procedure HandleToFront(Sender: TObject);
protected
function GetEditState: TEditState;
procedure EditAction(Action: TEditAction);
procedure HandleCopy(Sender: TObject);
procedure HandleCut(Sender: TObject);
procedure HandleDelete(Sender: TObject);
procedure HandlePaste(Sender: TObject);
procedure HandleSelectAll(Sender: TObject);
procedure HandleUndo(Sender: TObject);
public
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
procedure PrepareItem(Index: Integer; const AItem: IMenuItem); override;
end;
{ Custom Modules }
type
{ TCustomModule
This class provides a default implementation of the ICustomModule interface.
There is no assumption by the designer that a custom module derives form
this class only that it derive from TBaseCustomModule and implement the
ICustomModule interface. This class is provided to help you implement a
class that meets those requirements. }
TCustomModule = class(TBaseCustomModule, ICustomModule)
private
FRoot: TComponent;
FDesigner: IDesigner;
FFinder: TClassFinder;
public
constructor Create(ARoot: TComponent; const ADesigner: IDesigner); override;
destructor Destroy; override;
procedure ExecuteVerb(Index: Integer); virtual;
function GetAttributes: TCustomModuleAttributes; virtual;
function GetVerb(Index: Integer): string; virtual;
function GetVerbCount: Integer; virtual;
procedure Saving; virtual;
procedure PrepareItem(Index: Integer; const AItem: IMenuItem); virtual;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -