Salome HOME
Groups creation corrected.
[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    * </UL>
60    */
61   bool init(const CurveCreator_Curve *theCurve);
62
63   /**
64    * This method initializes the difference with an operation with one integer
65    * parameter. It is applicable to the following operations:
66    * <UL>
67    *   <LI>RemoveSection</LI>
68    * </UL>
69    */
70   bool init(const CurveCreator_Curve *theCurve,
71             const CurveCreator_Operation::Type theType,
72             const int theIntParam);
73
74   /**
75    * This method initializes the difference with an operation with two integer
76    * parameters. It is applicable to the following operations:
77    * <UL>
78    *   <LI>SetType</LI>
79    *   <LI>SetClosed</LI>
80    *   <LI>MoveSection</LI>
81    *   <LI>Join (with 2 int arguments)</LI>
82    * </UL>
83    */
84   bool init(const CurveCreator_Curve *theCurve,
85             const CurveCreator_Operation::Type theType,
86             const int theIntParam1,
87             const int theIntParam2);
88
89   /**
90    * This method initializes the difference with an operation with one
91    * Name, one CurveCreator::Coordinates parameter and two integer parameters.
92    * It is applicable to the following operations:
93    * <UL>
94    *   <LI>AddSection</LI>
95    * </UL>
96    */
97   bool init(const CurveCreator_Curve *theCurve,
98             const CurveCreator_Operation::Type theType,
99             const std::string& theName,
100             const CurveCreator::Coordinates &theCoords,
101             const int theIntParam1,
102             const int theIntParam2);
103
104   /**
105    * This method initializes the difference with an operation with one
106    * string and one integer parameters.
107    * It is applicable to the following operations:
108    * <UL>
109    *   <LI>RenameSection</LI>
110    * </UL>
111    */
112   bool init(const CurveCreator_Curve *theCurve,
113             const CurveCreator_Operation::Type theType,
114             const std::string &theName,
115             const int theIntParam1 );
116
117   /**
118    * This method initializes the difference with an operation with 
119    * list of pairs of integer parameters.
120    * It is applicable to the following operations:
121    * <UL>
122    *   <LI>RemovePoints</LI>
123    * </UL>
124    */
125   bool init(const CurveCreator_Curve *theCurve,
126             const CurveCreator_Operation::Type theType,
127             const CurveCreator_ICurve::SectionToPointList &theParamList);
128
129   /**
130    * This method initializes the difference with an operation with 
131    * list of pairs of integer parameters with point coordinates.
132    * It is applicable to the following operations:
133    * <UL>
134    *   <LI>RemovePoints</LI>
135    * </UL>
136    */
137   bool init(const CurveCreator_Curve *theCurve,
138             const CurveCreator_Operation::Type theType,
139             const CurveCreator_ICurve::SectionToPointCoordsList &theParamList);
140
141   /**
142    * This method initializes the difference with an operation with 
143    * list of pairs of integer parameters with point coordinates.
144    * \param theCurve the modified curve
145    * \param theOldParamList the old parameters (to be saved for undo)
146    */
147   bool init(const CurveCreator_Curve *theCurve,
148             const CurveCreator_ICurve::SectionToPointCoordsList &theOldParamList);
149
150   /**
151    * This method applies undo operation to theCurve.
152    */
153   void applyUndo(CurveCreator_Curve *theCurve);
154
155   /**
156    * This method applies redo operation to theCurve.
157    */
158   void applyRedo(CurveCreator_Curve *theCurve);
159
160 private:
161
162   /**
163    * This method clears initialized data pointers.
164    */
165   void clear();
166
167   /**
168    * This method sets the number of undos and allocates the required
169    * space for myPUndo.
170    */
171   void setNbUndos(const int theNbUndos);
172
173   /**
174    * This method returns the section index. It returns theIndex if it is
175    * a real index and the last section's index if theIndex is equal to -1.
176    */
177   int getSectionIndex(const CurveCreator_Curve *theCurve,
178                       const int theIndex) const;
179
180   /**
181    * Convert theIndex'th section of theCurve into AddSection command
182    * and store it in theOperation. Returns true in case of success and
183    * false otherwise.
184    */
185   bool addSectionToUndo(const CurveCreator_Curve *theCurve,
186                         const int theIndex,
187                         CurveCreator_Operation &theOperation) const;
188
189   /**
190    * Construct undos for SetType and SetClosed operations. Note: the
191    * algorithm is optimized taking into account that there are only 2 types
192    * and 2 values of isClosed flag. If the number of types is increased,
193    * this algorithm should be re-implemented.
194    */
195   bool setTypeOrClosedToUndo(const CurveCreator_Curve *theCurve,
196                              const CurveCreator_Operation::Type theType,
197                              const int theIntParam1,
198                              const int theIntParam2);
199
200 private:
201
202   int                     myNbUndos;
203   CurveCreator_Operation *myPUndo;
204   CurveCreator_Operation *myPRedo;
205
206 };
207
208 #endif