123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- //
- // The graphics rendering engine GLScene http://glscene.org
- //
- unit DWS.Classes;
- (* DelphiWebScript symbol creation for base Delphi classes. *)
- interface
- uses
- System.Classes,
- System.SysUtils,
- dwsExprs,
- dwsSymbols,
- dwsComp,
- dwsCompStrings,
- dwsStack,
- dwsFunctions,
- dwsHelperFunc;
- type
- TdwsClassesUnit = class(TdwsUnitComponent)
- private
- procedure AddClassTPersistent(SymbolTable: TSymbolTable);
- procedure AddClassTComponent(SymbolTable: TSymbolTable);
- protected
- procedure AddUnitSymbols(SymbolTable: TSymbolTable); override;
- public
- constructor Create(AOwner: TComponent); override;
- end;
- procedure Register;
- // ===============================================================
- implementation
- // ===============================================================
- // ----------
- // ---------- Internal class method class declarations ----------
- // ----------
- type
- TPersistentAssignMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TPersistentGetNamePathMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentCreateMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentSetTagMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetTagMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentSetNameMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetNameMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetOwnerMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentSetComponentIndexMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetComponentIndexMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetComponentCountMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetComponentMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentFindComponentMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentFreeNotificationMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentRemoveFreeNotificationMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetParentComponentMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentGetNamePathMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- TComponentHasParentMethod = class(TInternalMethod)
- public
- procedure Execute(var ExternalObject: TObject); override;
- end;
- // ----------
- // ---------- Internal class method execute procedures ----------
- // ----------
- procedure TPersistentAssignMethod.Execute(var ExternalObject: TObject);
- var
- Source: TObject;
- begin
- ValidateExternalObject(ExternalObject, TPersistent);
- Source := Info.GetExternalObjForVar('Source');
- if not Assigned(Source) then
- raise Exception.Create('Source parameter is unassigned.');
- if not(Source is TPersistent) then
- Exception.Create('Source parameter is not inheriting from TPersistent.');
- TPersistent(ExternalObject).Assign(TPersistent(Source));
- end;
- procedure TPersistentGetNamePathMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TPersistent);
- Info.Result.Value := TPersistent(ExternalObject).GetNamePath;
- end;
- procedure TComponentCreateMethod.Execute(var ExternalObject: TObject);
- var
- AOwner: TComponent;
- begin
- AOwner := TComponent(Info.GetExternalObjForVar('AOwner'));
- ExternalObject := TComponent.Create(AOwner);
- end;
- procedure TComponentSetTagMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- TComponent(ExternalObject).Tag := Info['Value'];
- end;
- procedure TComponentGetTagMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).Tag;
- end;
- procedure TComponentSetNameMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- TComponent(ExternalObject).Name := Info['Value'];
- end;
- procedure TComponentGetNameMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).Name;
- end;
- procedure TComponentGetOwnerMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := Info.RegisterExternalObject(TComponent(ExternalObject).Owner,
- False, False);
- end;
- procedure TComponentSetComponentIndexMethod.Execute(var ExternalObject
- : TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- TComponent(ExternalObject).ComponentIndex := Info['Value'];
- end;
- procedure TComponentGetComponentIndexMethod.Execute(var ExternalObject
- : TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).ComponentIndex;
- end;
- procedure TComponentGetComponentCountMethod.Execute(var ExternalObject
- : TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).ComponentCount;
- end;
- procedure TComponentGetComponentMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := Info.RegisterExternalObject(TComponent(ExternalObject)
- .Components[Info['Index']], False, False);
- end;
- procedure TComponentFindComponentMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := Info.RegisterExternalObject(TComponent(ExternalObject)
- .FindComponent(Info['AName']), False, False);
- end;
- procedure TComponentFreeNotificationMethod.Execute(var ExternalObject: TObject);
- var
- AComponent: TComponent;
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- AComponent := TComponent(Info.GetExternalObjForVar('AComponent'));
- if Assigned(AComponent) then
- TComponent(ExternalObject).FreeNotification(AComponent);
- end;
- procedure TComponentRemoveFreeNotificationMethod.Execute(var ExternalObject
- : TObject);
- var
- AComponent: TComponent;
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- AComponent := TComponent(Info.GetExternalObjForVar('AComponent'));
- if Assigned(AComponent) then
- TComponent(ExternalObject).RemoveFreeNotification(AComponent);
- end;
- procedure TComponentGetParentComponentMethod.Execute(var ExternalObject
- : TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := Info.RegisterExternalObject(TComponent(ExternalObject)
- .GetParentComponent, False, False);
- end;
- procedure TComponentGetNamePathMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).GetNamePath;
- end;
- procedure TComponentHasParentMethod.Execute(var ExternalObject: TObject);
- begin
- ValidateExternalObject(ExternalObject, TComponent);
- Info.Result := TComponent(ExternalObject).HasParent;
- end;
- // ----------
- // ---------- TdwsClassesUnit ----------
- // ----------
- constructor TdwsClassesUnit.Create(AOwner: TComponent);
- begin
- inherited;
- FUnitName := 'Classes';
- end;
- procedure TdwsClassesUnit.AddClassTPersistent(SymbolTable: TSymbolTable);
- var
- ClassSym: TClassSymbol;
- begin
- ClassSym := TClassSymbol(AddClassSymbol(SymbolTable, 'TPersistent',
- 'TObject'));
- if not Assigned(ClassSym.Members.FindLocal('Assign')) then
- TPersistentAssignMethod.Create(mkProcedure, [maVirtual], 0, 'Assign',
- ['Source', 'TPersistent'], '', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetNamePath')) then
- TPersistentGetNamePathMethod.Create(mkFunction, [maVirtual], 0,
- 'GetNamePath', [], 'String', ClassSym, SymbolTable);
- end;
- procedure TdwsClassesUnit.AddClassTComponent(SymbolTable: TSymbolTable);
- var
- ClassSym: TClassSymbol;
- begin
- ClassSym := TClassSymbol(AddClassSymbol(SymbolTable, 'TComponent',
- 'TPersistent'));
- // Methods
- if not Assigned(ClassSym.Members.FindLocal('Create')) then
- TComponentCreateMethod.Create(mkConstructor, [maVirtual], 0, 'Create',
- ['AOwner', 'TComponent'], '', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('SetTag')) then
- TComponentSetTagMethod.Create(mkProcedure, [], 0, 'SetTag',
- ['Value', 'Integer'], '', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetTag')) then
- TComponentGetTagMethod.Create(mkFunction, [], 0, 'GetTag', [], 'Integer',
- ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('SetName')) then
- TComponentSetNameMethod.Create(mkProcedure, [], 0, 'SetName',
- ['Value', 'String'], '', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetName')) then
- TComponentGetNameMethod.Create(mkFunction, [], 0, 'GetName', [], 'String',
- ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetOwner')) then
- TComponentGetOwnerMethod.Create(mkFunction, [], 0, 'GetOwner', [],
- 'TComponent', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('SetComponentIndex')) then
- TComponentSetComponentIndexMethod.Create(mkProcedure, [], 0,
- 'SetComponentIndex', ['Value', 'Integer'], '', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetComponentIndex')) then
- TComponentGetComponentIndexMethod.Create(mkFunction, [], 0,
- 'GetComponentIndex', [], 'Integer', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetComponentCount')) then
- TComponentGetComponentCountMethod.Create(mkFunction, [], 0,
- 'GetComponentCount', [], 'Integer', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetComponent')) then
- TComponentGetComponentMethod.Create(mkFunction, [], 0, 'GetComponent',
- ['Index', 'Integer'], 'TComponent', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('FindComponent')) then
- TComponentFindComponentMethod.Create(mkFunction, [], 0, 'FindComponent',
- ['AName', 'String'], 'TComponent', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('FreeNotification')) then
- TComponentFreeNotificationMethod.Create(mkProcedure, [], 0,
- 'FreeNotification', ['AComponent', 'TComponent'], '', ClassSym,
- SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('RemoveFreeNotification')) then
- TComponentRemoveFreeNotificationMethod.Create(mkProcedure, [], 0,
- 'RemoveFreeNotification', ['AComponent', 'TComponent'], '', ClassSym,
- SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetParentComponent')) then
- TComponentGetParentComponentMethod.Create(mkFunction, [maVirtual], 0,
- 'GetParentComponent', [], 'TComponent', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('GetNamePath')) then
- TComponentGetNamePathMethod.Create(mkFunction, [maOverride], 0,
- 'GetNamePath', [], 'String', ClassSym, SymbolTable);
- if not Assigned(ClassSym.Members.FindLocal('HasParent')) then
- TComponentHasParentMethod.Create(mkFunction, [maVirtual], 0, 'HasParent',
- [], 'Boolean', ClassSym, SymbolTable);
- // Properties
- AddPropertyToClass('Tag', 'Integer', 'GetTag', 'SetTag', '', False, ClassSym,
- SymbolTable);
- AddPropertyToClass('Name', 'String', 'GetName', 'SetName', '', False,
- ClassSym, SymbolTable);
- AddPropertyToClass('Owner', 'TComponent', 'GetOwner', '', '', False, ClassSym,
- SymbolTable);
- AddPropertyToClass('ComponentIndex', 'Integer', 'GetComponentIndex',
- 'SetComponentIndex', '', False, ClassSym, SymbolTable);
- AddPropertyToClass('Components', 'TComponent', 'GetComponent', 'SetComponent',
- 'Integer', True, ClassSym, SymbolTable);
- end;
- procedure TdwsClassesUnit.AddUnitSymbols(SymbolTable: TSymbolTable);
- begin
- // Forward class declaration
- AddForwardDeclaration('TPersistent', SymbolTable);
- AddForwardDeclaration('TComponent', SymbolTable);
- // Class types
- AddClassTPersistent(SymbolTable);
- AddClassTComponent(SymbolTable);
- end;
- // ----------
- // ---------- Global procedures/functions ----------
- // ----------
- procedure Register;
- begin
- RegisterComponents('GLScene DWS2', [Tdws2ClassesUnit]);
- end;
- end.
|