1 {
2 *****************************************************************************
3 * *
4 * This file is part of the ZCAD *
5 * *
6 * See the file COPYING.modifiedLGPL.txt, included in this distribution, *
7 * for details about the copyright. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
12 * *
13 *****************************************************************************
14 }
15 {
16 @author(Andrey Zubarev <zamtmn@yandex.ru>)
17 }
18 {$MODE OBJFPC}
19 unit zebaseundocommands;
20 {$INCLUDE def.inc}
21 interface
22 uses varmandef,uzbtypesbase,sysutils,
23 gzctnrvectortypes,uzbtypes,uzbmemman;
24 type
25 TTypeCommand=(TTC_MBegin,TTC_MEnd,TTC_MNotUndableIfOverlay,TTC_Command,TTC_ChangeCommand);
26 PTElementaryCommand=^TElementaryCommand;
27 TElementaryCommand=object(GDBaseObject)
28 AutoProcessGDB:GDBBoolean;
29 AfterAction:GDBBoolean;
GetCommandTypenull30 function GetCommandType:TTypeCommand;virtual;
31 procedure UnDo;virtual;abstract;
32 procedure Comit;virtual;abstract;
33 destructor Done;virtual;
34 end;
35 PTMarkerCommand=^TMarkerCommand;
36 TMarkerCommand=object(TElementaryCommand)
37 Name:GDBstring;
38 PrevIndex:TArrayIndex;
39 constructor init(_name:GDBString;_index:TArrayIndex);
GetCommandTypenull40 function GetCommandType:TTypeCommand;virtual;
41 procedure UnDo;virtual;
42 procedure Comit;virtual;
43 end;
44 PTCustomChangeCommand=^TCustomChangeCommand;
45 TCustomChangeCommand=object(TElementaryCommand)
46 Addr:GDBPointer;
GetCommandTypenull47 function GetCommandType:TTypeCommand;virtual;
48 end;
49 PTChangeCommand=^TChangeCommand;
50 TChangeCommand=object(TCustomChangeCommand)
51 datasize:PtrInt;
52 tempdata:GDBPointer;
53 constructor init(obj:GDBPointer;_datasize:PtrInt);
54 procedure undo;virtual;
GetDataTypeSizenull55 function GetDataTypeSize:PtrInt;virtual;
56
57 end;
58 PTTypedChangeCommand=^TTypedChangeCommand;
59 TTypedChangeCommand=object(TCustomChangeCommand)
60 public
61 OldData,NewData:GDBPointer;
62 PTypeManager:PUserTypeDescriptor;
63 PDataOwner:{PGDBObjEntity}pointer;//PEntity
64 constructor Assign(PDataInstance:GDBPointer;PType:PUserTypeDescriptor);
65 procedure UnDo;virtual;
66 procedure Comit;virtual;
67 procedure ComitFromObj;virtual;
GetDataTypeSizenull68 function GetDataTypeSize:PtrInt;virtual;
69 destructor Done;virtual;
70 end;
71 TUndableMethod=procedure of object;
72 TOnUndoRedoDataOwner=procedure(PDataOwner:Pointer) of object;
73 var
74 onUndoRedoDataOwner:TOnUndoRedoDataOwner;
75 implementation
76 constructor TTypedChangeCommand.Assign(PDataInstance:GDBPointer;PType:PUserTypeDescriptor);
77 begin
78 Addr:=PDataInstance;
79 PTypeManager:=PType;
80 GDBGetMem({$IFDEF DEBUGBUILD}'{49289E94-F423-4497-B0B2-32215E6D5D40}',{$ENDIF}OldData,PTypeManager^.SizeInGDBBytes);
81 GDBGetMem({$IFDEF DEBUGBUILD}'{49289E94-F423-4497-B0B2-32215E6D5D40}',{$ENDIF}NewData,PTypeManager^.SizeInGDBBytes);
82 PTypeManager^.CopyInstanceTo(Addr,OldData);
83 PTypeManager^.CopyInstanceTo(Addr,NewData);
84 PDataOwner:=nil;
85 end;
86 procedure TTypedChangeCommand.UnDo;
87 //var
88 // DC:TDrawContext;
89 begin
90 PTypeManager^.MagicFreeInstance(Addr);
91 PTypeManager^.CopyInstanceTo(OldData,Addr);
92 if assigned(onUndoRedoDataOwner)then
93 onUndoRedoDataOwner(PDataOwner);
94 {if assigned(PDataOwner)then
95 begin
96 //PDataOwner^.YouChanged(gdb.GetCurrentDWG^);
97 if PDataOwner^.bp.ListPos.Owner=gdb.GetCurrentDWG^.GetCurrentRootSimple
98 then
99 PDataOwner^.YouChanged(gdb.GetCurrentDWG^)
100 else
101 begin
102 dc:=gdb.GetCurrentDWG^.CreateDrawingRC;
103 PDataOwner^.FormatEntity(gdb.GetCurrentDWG^,dc);
104 gdb.GetCurrentDWG^.GetCurrentROOT^.FormatAfterEdit(gdb.GetCurrentDWG^,dc);
105 end;
106 end;
107 if assigned(SetVisuaProplProc)then
108 SetVisuaProplProc;}
109 end;
110 procedure TTypedChangeCommand.Comit;
111 //var
112 // DC:TDrawContext;
113 begin
114 PTypeManager^.MagicFreeInstance(Addr);
115 PTypeManager^.CopyInstanceTo(NewData,Addr);
116 if assigned(onUndoRedoDataOwner)then
117 onUndoRedoDataOwner(PDataOwner);
118 {if assigned(PDataOwner)then
119 begin
120 //PDataOwner^.YouChanged(gdb.GetCurrentDWG^);
121 if PDataOwner^.bp.ListPos.Owner=gdb.GetCurrentDWG^.GetCurrentRootSimple
122 then
123 PDataOwner^.YouChanged(gdb.GetCurrentDWG^)
124 else
125 begin
126 dc:=gdb.GetCurrentDWG^.CreateDrawingRC;
127 PDataOwner^.FormatEntity(gdb.GetCurrentDWG^,dc);
128 gdb.GetCurrentDWG^.GetCurrentROOT^.FormatAfterEdit(gdb.GetCurrentDWG^,dc);
129 end;
130 end;
131 if assigned(SetVisuaProplProc)then
132 SetVisuaProplProc;}
133 end;
134 procedure TTypedChangeCommand.ComitFromObj;
135 begin
136 PTypeManager^.MagicFreeInstance(NewData);
137 PTypeManager^.CopyInstanceTo(Addr,NewData);
138 end;
TTypedChangeCommand.GetDataTypeSizenull139 function TTypedChangeCommand.GetDataTypeSize:PtrInt;
140 begin
141 result:=PTypeManager^.SizeInGDBBytes;
142 end;
143 destructor TTypedChangeCommand.Done;
144 begin
145 inherited;
146 PTypeManager^.MagicFreeInstance(NewData);
147 PTypeManager^.MagicFreeInstance(OldData);
148 GDBFreeMem(NewData);
149 GDBFreeMem(OldData);
150 end;
TElementaryCommand.GetCommandTypenull151 function TElementaryCommand.GetCommandType:TTypeCommand;
152 begin
153 result:=TTC_Command;
154 end;
155 destructor TElementaryCommand.Done;
156 begin
157 end;
158
159 constructor TChangeCommand.init(obj:GDBPointer;_datasize:PtrInt);
160 begin
161 Addr:=obj;
162 datasize:=_datasize;
163 GDBGetMem({$IFDEF DEBUGBUILD}'{E438B065-CE41-4BB2-B1C9-1DC526190A85}',{$ENDIF}pointer(tempdata),datasize);
164 Move(Addr^,tempdata^,datasize);
165 end;
166
TCustomChangeCommand.GetCommandTypenull167 function TCustomChangeCommand.GetCommandType:TTypeCommand;
168 begin
169 result:=TTC_ChangeCommand;
170 end;
171 procedure TChangeCommand.undo;
172 begin
173 Move(tempdata^,Addr^,datasize);
174 end;
TChangeCommand.GetDataTypeSizenull175 function TChangeCommand.GetDataTypeSize:PtrInt;
176 begin
177 result:=self.datasize;
178 end;
179
GetCommandTypenull180 function TMarkerCommand.GetCommandType:TTypeCommand;
181 begin //TTC_MNotUndableIfOverlay
182 case PrevIndex of
183 -1:result:=TTC_MBegin;
184 -2:result:=TTC_MNotUndableIfOverlay;
185 else
186 result:=TTC_MEnd
187 end;
188 { if PrevIndex<>-1 then
189 result:=TTC_MEnd
190 else
191 result:=TTC_MBegin;}
192 end;
193 procedure TMarkerCommand.UnDo;
194 //var
195 // DC:TDrawContext;
196 begin
197 // dc:=gdb.GetCurrentDWG^.CreateDrawingRC;
198 // gdb.GetCurrentROOT^.FormatAfterEdit(gdb.GetCurrentDWG^,dc);
199 end;
200
201 procedure TMarkerCommand.Comit;
202 //var
203 // DC:TDrawContext;
204 begin
205 // dc:=gdb.GetCurrentDWG^.CreateDrawingRC;
206 // gdb.GetCurrentROOT^.FormatAfterEdit(gdb.GetCurrentDWG^,dc);
207 end;
208
209 constructor TMarkerCommand.init(_name:GDBString;_index:TArrayIndex);
210 begin
211 name:=_name;
212 PrevIndex:=_index;
213 end;
214
215 begin
216 onUndoRedoDataOwner:=nil;
217 end.
218
219