Salome HOME
Fix JoinAll operation
[modules/hydro.git] / src / HYDROCurveCreator / CurveCreator_Diff.hxx
1 // Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 // File:        CurveCreator_Diff.hxx
21 // Author:      Sergey KHROMOV
22
23 #ifndef _CurveCreator_Diff_HeaderFile
24 #define _CurveCreator_Diff_HeaderFile
25
26 #include "CurveCreator_Operation.hxx"
27
28 class CurveCreator_Curve;
29
30
31 /**
32  * This is the support class for store/retrieve differences of undo/redo
33  * operations. To fill the difference it is necessary to create it with
34  * an appropriate type and to call the method initialize with required
35  * parameters.
36  */
37 class CurveCreator_Diff
38 {
39
40 private:
41
42 public:
43
44   /**
45    * Constructor.
46    */
47   CurveCreator_Diff();
48
49   /**
50    * Destructor.
51    */
52   ~CurveCreator_Diff();
53
54   /**
55    * This method initializes the difference with an operation without
56    * parameters. It is applicable to the following operations:
57    * <UL>
58    *   <LI>Clear</LI>
59    *   <LI>Join (without arguments)</LI>
60    * </UL>
61    */
62   bool init(const CurveCreator_Curve *theCurve,
63             const CurveCreator_Operation::Type theType);
64
65   /**
66    * This method initializes the difference with an operation with one integer
67    * parameter. It is applicable to the following operations:
68    * <UL>
69    *   <LI>RemoveSection</LI>
70    * </UL>
71    */
72   bool init(const CurveCreator_Curve *theCurve,
73             const CurveCreator_Operation::Type theType,
74             const int theIntParam);
75
76   /**
77    * This method initializes the difference with an operation with two integer
78    * parameters. It is applicable to the following operations:
79    * <UL>
80    *   <LI>SetType</LI>
81    *   <LI>SetClosed</LI>
82    *   <LI>MoveSection</LI>
83    *   <LI>Join (with 2 int arguments)</LI>
84    * </UL>
85    */
86   bool init(const CurveCreator_Curve *theCurve,
87             const CurveCreator_Operation::Type theType,
88             const int theIntParam1,
89             const int theIntParam2);
90
91   /**
92    * This method initializes the difference with an operation with three
93    * integer parameters. It is applicable to the following operations:
94    * <UL>
95    *   <LI>RemovePoints</LI>
96    * </UL>
97    */
98   bool init(const CurveCreator_Curve *theCurve,
99             const CurveCreator_Operation::Type theType,
100             const int theIntParam1,
101             const int theIntParam2,
102             const int theIntParam3);
103
104   /**
105    * This method initializes the difference with an operation with one
106    * CurveCreator::Coordinates parameter and one integer parameter.
107    * It is applicable to the following operations:
108    * <UL>
109    *   <LI>AddPoints</LI>
110    * </UL>
111    */
112   bool init(const CurveCreator_Curve *theCurve,
113             const CurveCreator_Operation::Type theType,
114             const CurveCreator::Coordinates &theCoords,
115             const int theIntParam);
116
117   /**
118    * This method initializes the difference with an operation with one
119    * Name, one CurveCreator::Coordinates parameter and two integer parameters.
120    * It is applicable to the following operations:
121    * <UL>
122    *   <LI>AddSection</LI>
123    * </UL>
124    */
125   bool init(const CurveCreator_Curve *theCurve,
126             const CurveCreator_Operation::Type theType,
127             const std::string& theName,
128             const CurveCreator::Coordinates &theCoords,
129             const int theIntParam1,
130             const int theIntParam2);
131
132   /**
133    * This method initializes the difference with an operation with one
134    * string and one integer parameters.
135    * It is applicable to the following operations:
136    * <UL>
137    *   <LI>RenameSection</LI>
138    * </UL>
139    */
140   bool init(const CurveCreator_Curve *theCurve,
141             const CurveCreator_Operation::Type theType,
142             const std::string &theName,
143             const int theIntParam1 );
144
145   /**
146    * This method initializes the difference with an operation with 
147    * list of pairs of integer parameters.
148    * It is applicable to the following operations:
149    * <UL>
150    *   <LI>RemovePoints</LI>
151    * </UL>
152    */
153   bool init(const CurveCreator_Curve *theCurve,
154             const CurveCreator_Operation::Type theType,
155             const CurveCreator_ICurve::SectionToPointList &theParamList);
156
157   /**
158    * This method initializes the difference with an operation with 
159    * list of pairs of integer parameters with point coordinates.
160    * It is applicable to the following operations:
161    * <UL>
162    *   <LI>RemovePoints</LI>
163    * </UL>
164    */
165   bool init(const CurveCreator_Curve *theCurve,
166             const CurveCreator_Operation::Type theType,
167             const CurveCreator_ICurve::SectionToPointCoordsList &theParamList);
168
169   /**
170    * This method applies undo operation to theCurve.
171    */
172   void applyUndo(CurveCreator_Curve *theCurve);
173
174   /**
175    * This method applies redo operation to theCurve.
176    */
177   void applyRedo(CurveCreator_Curve *theCurve);
178
179 private:
180
181   /**
182    * This method clears initialized data pointers.
183    */
184   void clear();
185
186   /**
187    * This method sets the number of undos and allocates the required
188    * space for myPUndo.
189    */
190   void setNbUndos(const int theNbUndos);
191
192   /**
193    * This method returns the section index. It returns theIndex if it is
194    * a real index and the last section's index if theIndex is equal to -1.
195    */
196   int getSectionIndex(const CurveCreator_Curve *theCurve,
197                       const int theIndex) const;
198
199   /**
200    * Convert theIndex'th section of theCurve into AddSection command
201    * and store it in theOperation. Returns true in case of success and
202    * false otherwise.
203    */
204   bool addSectionToUndo(const CurveCreator_Curve *theCurve,
205                         const int theIndex,
206                         CurveCreator_Operation &theOperation) const;
207
208   /**
209    * Construct undos for SetType and SetClosed operations. Note: the
210    * algorithm is optimized taking into account that there are only 2 types
211    * and 2 values of isClosed flag. If the number of types is increased,
212    * this algorithm should be re-implemented.
213    */
214   bool setTypeOrClosedToUndo(const CurveCreator_Curve *theCurve,
215                              const CurveCreator_Operation::Type theType,
216                              const int theIntParam1,
217                              const int theIntParam2);
218
219 private:
220
221   int                     myNbUndos;
222   CurveCreator_Operation *myPUndo;
223   CurveCreator_Operation *myPRedo;
224
225 };
226
227 #endif