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