From: <wp...@us...> - 2009-07-08 06:55:54
|
Revision: 805 http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=805&view=rev Author: wp2udk Date: 2009-07-08 06:55:49 +0000 (Wed, 08 Jul 2009) Log Message: ----------- Import a model from an existing .res or .xml file and generate the equivalent Delphi source code. Only tested on Delphi 2006. Modified Paths: -------------- trunk/Source/Core/InstantCode.pas trunk/Source/Design/D2006/DclIOCore.dpk trunk/Source/Design/InstantModelExplorer.dfm trunk/Source/Design/InstantModelExplorer.pas trunk/Source/Design/iodesimages.res Modified: trunk/Source/Core/InstantCode.pas =================================================================== --- trunk/Source/Core/InstantCode.pas 2009-07-08 06:34:35 UTC (rev 804) +++ trunk/Source/Core/InstantCode.pas 2009-07-08 06:55:49 UTC (rev 805) @@ -962,6 +962,19 @@ property UnitName: string read GetUnitName write SetUnitName; end; + TInstantCodeClassList = class(TList) + private + function GetItem(Index: Integer): TInstantCodeClass; + procedure SetItem(Index: Integer; const Value: TInstantCodeClass); + public + function Add(Item: TInstantCodeClass): Integer; + procedure Insert(Index: Integer; Item: TInstantCodeClass); + + procedure SortByBaseClass; + + property Items[Index: Integer]: TInstantCodeClass read GetItem write SetItem; default; + end; + TInstantCodeClassRef = class(TInstantCodeType) protected class function InternalAtInstance(Reader: TInstantCodeReader; out Name: string): Boolean; override; @@ -5461,6 +5474,55 @@ (TInstantCodeMember(Sender).Visibility in Visibilities) end; +{ TInstantCodeClassList } + +function CompareCodeClasses(Item1, Item2: Pointer): Integer; +var + CodeClass1, CodeClass2: TInstantCodeClass; +begin + CodeClass1 := Item1; + CodeClass2 := Item2; + + if (CodeClass1.BaseClass = nil) and (CodeClass2.BaseClass <> nil) then + Result := -1 else + if (CodeClass2.BaseClass = nil) and (CodeClass1.BaseClass <> nil) then + Result := 1 else + if CodeClass1.BaseClass = CodeClass2.BaseClass then + Result := 0 else + if CodeClass1.DerivesFrom(CodeClass2) then + Result := 1 else + if CodeClass2.DerivesFrom(CodeClass1) then + Result := -1 else + // CodeClass1.BaseClass <> CodeClass2.BaseClass + Result := CompareCodeClasses(CodeClass1.BaseClass, CodeClass2.BaseClass); +end; + +function TInstantCodeClassList.Add(Item: TInstantCodeClass): Integer; +begin + Result := inherited Add(Item); +end; + +procedure TInstantCodeClassList.Insert(Index: Integer; Item: TInstantCodeClass); +begin + inherited Insert(Index, Item); +end; + +procedure TInstantCodeClassList.SortByBaseClass; +begin + Sort(CompareCodeClasses); +end; + +function TInstantCodeClassList.GetItem(Index: Integer): TInstantCodeClass; +begin + Result := inherited Items[Index]; +end; + +procedure TInstantCodeClassList.SetItem(Index: Integer; + const Value: TInstantCodeClass); +begin + inherited Items[Index] := Value; +end; + { TInstantCodeClassRef } class function TInstantCodeClassRef.Identifier: string; Modified: trunk/Source/Design/D2006/DclIOCore.dpk =================================================================== --- trunk/Source/Design/D2006/DclIOCore.dpk 2009-07-08 06:34:35 UTC (rev 804) +++ trunk/Source/Design/D2006/DclIOCore.dpk 2009-07-08 06:55:49 UTC (rev 805) @@ -7,7 +7,6 @@ {$R '..\..\Core\InstantConnectionManager.dcr'} {$R '..\..\Core\InstantPump.dcr'} {$R '..\..\Core\InstantDBEvolution.dcr'} - {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} @@ -58,7 +57,8 @@ InstantReg in '..\InstantReg.pas', InstantUnitSelect in '..\InstantUnitSelect.pas' {InstantUnitSelectForm}, InstantAttributeEditor in '..\InstantAttributeEditor.pas' {InstantAttributeEditorForm}, - InstantAbout in '..\InstantAbout.pas' {InstantAboutForm}; + InstantAbout in '..\InstantAbout.pas' {InstantAboutForm}, + InstantModelImport in '..\InstantModelImport.pas' {InstantImportModelForm}; end. Modified: trunk/Source/Design/InstantModelExplorer.dfm =================================================================== --- trunk/Source/Design/InstantModelExplorer.dfm 2009-07-08 06:34:35 UTC (rev 804) +++ trunk/Source/Design/InstantModelExplorer.dfm 2009-07-08 06:55:49 UTC (rev 805) @@ -4,7 +4,6 @@ Width = 259 Height = 433 VertScrollBar.Range = 20 - AutoScroll = False Caption = 'InstantObjects Model Explorer' Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -23,7 +22,7 @@ Left = 0 Top = 27 Width = 251 - Height = 379 + Height = 372 Align = alClient BevelOuter = bvNone TabOrder = 0 @@ -35,8 +34,6 @@ Height = 27 BorderWidth = 1 ButtonHeight = 23 - EdgeBorders = [] - Flat = True Images = ActionImages ParentShowHint = False ShowHint = True @@ -104,6 +101,9 @@ object N3: TMenuItem Caption = '-' end + object ImportModelItem: TMenuItem + Action = ImportModelAction + end object ExportModelItem: TMenuItem Action = ExportModelAction end @@ -189,6 +189,12 @@ Hint = 'Collapse All' OnExecute = CollapseAllActionExecute end + object ImportModelAction: TAction + Caption = '&Import Model...' + Hint = 'Import model' + ImageIndex = 11 + OnExecute = ImportModelActionExecute + end object ExportModelAction: TAction Caption = '&Export Model...' Hint = 'Export Model' Modified: trunk/Source/Design/InstantModelExplorer.pas =================================================================== --- trunk/Source/Design/InstantModelExplorer.pas 2009-07-08 06:34:35 UTC (rev 804) +++ trunk/Source/Design/InstantModelExplorer.pas 2009-07-08 06:55:49 UTC (rev 805) @@ -24,7 +24,8 @@ * the Initial Developer. All Rights Reserved. * * Contributor(s): - * Carlo Barazzetta, Adrea Petrelli, Nando Dessena, Steven Mitchell + * Carlo Barazzetta, Adrea Petrelli, Nando Dessena, Steven Mitchell, + * Brian Andersen * * ***** END LICENSE BLOCK ***** *) @@ -120,6 +121,8 @@ ViewRelationsAction: TAction; ViewSourceAction: TAction; ViewSourceItem: TMenuItem; + ImportModelItem: TMenuItem; + ImportModelAction: TAction; procedure AboutActionExecute(Sender: TObject); procedure BuildDatabaseActionExecute(Sender: TObject); procedure CollapseAllActionExecute(Sender: TObject); @@ -138,6 +141,7 @@ procedure ViewInheritanceActionExecute(Sender: TObject); procedure ViewRelationsActionExecute(Sender: TObject); procedure ViewSourceActionExecute(Sender: TObject); + procedure ImportModelActionExecute(Sender: TObject); private FError: TInstantModelError; FModel: TInstantCodeModel; @@ -195,7 +199,7 @@ InstantModelExpert, {$ENDIF} InstantDesignUtils, InstantPersistence, InstantDesignHook, InstantAbout, - InstantImageUtils; + InstantImageUtils, InstantMetadata, InstantModelImport; resourcestring SDeleteClass = 'Delete Class ''%s''?'; @@ -381,6 +385,93 @@ SelectedNode.Expand(True); end; +procedure TInstantModelExplorerForm.ImportModelActionExecute(Sender: TObject); +var + ClassIndex, AttributeIndex: Integer; + ImportModule: TInstantCodeModule; + ImportFileName: string; + ImportFileType: TInstantStreamFormat; + ImportModel: TInstantModel; + ImportClassMetadata: TInstantClassMetadata; + ImportBaseClassName: string; + ImportAttributeMetadata: TInstantAttributeMetadata; + NewClasses: TInstantCodeClassList; + NewClass: TInstantCodeClass; + NewAttribute: TInstantCodeAttribute; +begin + with TInstantImportModelForm.Create(nil) do + try + if Execute(FModel) then + begin + ImportModule := SelectedModule; + ImportFileName := SelectedFileName; + ImportFileType := SelectedFileType; + end else + Exit; + finally + Free; + end; + + ImportModel := TInstantModel.Create; + try + if ImportFileType = sfBinary then + ImportModel.LoadFromResFile(ImportFileName) else + ImportModel.LoadFromFile(ImportFileName); + + FModelView.Items.BeginUpdate; + try + NewClasses := TInstantCodeClassList.Create; + try + for ClassIndex := 0 to ImportModel.ClassMetadatas.Count - 1 do + begin + ImportClassMetadata := ImportModel.ClassMetadatas[ClassIndex]; + + NewClass := ImportModule.InterfaceSection.AddClass; + ImportBaseClassName := ImportClassMetadata.ParentName; + if ImportBaseClassName = '' then + ImportBaseClassName := TInstantObject.ClassName; + NewClass.BaseClassName := ImportBaseClassName; + NewClass.Name := ImportClassMetadata.Name; + NewClass.Metadata.Assign(ImportClassMetadata); + + for AttributeIndex := 0 to ImportClassMetadata.AttributeMetadatas.Count - 1 do + begin + ImportAttributeMetadata := ImportClassMetadata.AttributeMetadatas[AttributeIndex]; + + NewAttribute := NewClass.AddAttribute; + NewAttribute.IsIndexed := ImportAttributeMetadata.IsIndexed; + NewAttribute.IsRequired := ImportAttributeMetadata.IsRequired; + NewAttribute.IsDefault := ImportAttributeMetadata.IsDefault; + NewAttribute.AttributeType := ImportAttributeMetadata.AttributeType; + NewAttribute.AttributeTypeName := ImportAttributeMetadata.AttributeTypeName; + NewAttribute.Name := ImportAttributeMetadata.FieldName; + NewAttribute.StorageKind := ImportAttributeMetadata.StorageKind; + NewAttribute.StorageName := ImportAttributeMetadata.StorageName; + NewAttribute.ObjectClassName := ImportAttributeMetadata.ObjectClassName; + NewAttribute.Realize; + end; + NewClasses.Add(NewClass) + end; + + // Classes needs to be sorted with base classes first or else the code + // generation might not be done correct. + NewClasses.SortByBaseClass; + + for ClassIndex := 0 to NewClasses.Count - 1 do + ApplyClass(NewClasses[ClassIndex], ctNew, ''); + finally + NewClasses.Free; + end; + finally + FModelView.Items.EndUpdate; + end; + finally + ImportModel.Free; + end; + + Refresh; +end; + procedure TInstantModelExplorerForm.ExportModelActionExecute( Sender: TObject); begin @@ -590,6 +681,7 @@ SelectUnitsAction.Enabled := HasProject; BuildDatabaseAction.Enabled := HasClasses; NewClassAction.Enabled := HasModel; + ImportModelAction.Enabled := HasModel; ExportModelAction.Enabled := HasModel; EditClassAction.Enabled := AtClass; ViewSourceAction.Enabled := AtClass; Modified: trunk/Source/Design/iodesimages.res =================================================================== (Binary files differ) |