1 /******************************************************************************************************
2  * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released      *
3  * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4  * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission.     *
5  ******************************************************************************************************/
6 
7 #include "CmdMediator.h"
8 #include "DocumentModelGridRemoval.h"
9 #include "DocumentSerialize.h"
10 #include "Logger.h"
11 #include <QObject>
12 #include <QTextStream>
13 #include <QXmlStreamWriter>
14 #include "Xml.h"
15 
16 const double CLOSE_DISTANCE_DEFAULT = 10.0;
17 
18 // These defaults should always be overwritten when Document coordinates are defined
19 const int DEFAULT_COUNT = 2;
20 const double DEFAULT_NON_COUNT = 0.0;
21 
DocumentModelGridRemoval()22 DocumentModelGridRemoval::DocumentModelGridRemoval() :
23   m_stable (false),
24   m_removeDefinedGridLines (false),
25   m_closeDistance (CLOSE_DISTANCE_DEFAULT),
26   m_gridCoordDisableX (GRID_COORD_DISABLE_COUNT),
27   m_countX (DEFAULT_COUNT),
28   m_startX (DEFAULT_NON_COUNT),
29   m_stepX (DEFAULT_NON_COUNT),
30   m_stopX (DEFAULT_NON_COUNT),
31   m_gridCoordDisableY (GRID_COORD_DISABLE_COUNT),
32   m_countY (DEFAULT_COUNT),
33   m_startY (DEFAULT_NON_COUNT),
34   m_stepY (DEFAULT_NON_COUNT),
35   m_stopY (DEFAULT_NON_COUNT)
36 {
37 }
38 
DocumentModelGridRemoval(double startX,double startY,double stepX,double stepY,int countX,int countY)39 DocumentModelGridRemoval::DocumentModelGridRemoval (double startX,
40                                                     double startY,
41                                                     double stepX,
42                                                     double stepY,
43                                                     int countX,
44                                                     int countY) :
45   m_stable (false),
46   m_removeDefinedGridLines (false),
47   m_closeDistance (CLOSE_DISTANCE_DEFAULT),
48   m_gridCoordDisableX (GRID_COORD_DISABLE_COUNT),
49   m_countX (countX),
50   m_startX (startX),
51   m_stepX (stepX),
52   m_stopX (startX + (countX - 1.0) * stepX),
53   m_gridCoordDisableY (GRID_COORD_DISABLE_COUNT),
54   m_countY (countY),
55   m_startY (startY),
56   m_stepY (stepY),
57   m_stopY (startY + (countY - 1.0) * stepY)
58 {
59 }
60 
DocumentModelGridRemoval(const Document & document)61 DocumentModelGridRemoval::DocumentModelGridRemoval(const Document &document) :
62   m_stable (document.modelGridRemoval().stable()),
63   m_removeDefinedGridLines (document.modelGridRemoval().removeDefinedGridLines()),
64   m_closeDistance (document.modelGridRemoval().closeDistance()),
65   m_gridCoordDisableX (document.modelGridRemoval().gridCoordDisableX()),
66   m_countX (document.modelGridRemoval().countX()),
67   m_startX (document.modelGridRemoval().startX()),
68   m_stepX (document.modelGridRemoval().stepX()),
69   m_stopX (document.modelGridRemoval().stopX()),
70   m_gridCoordDisableY (document.modelGridRemoval().gridCoordDisableY()),
71   m_countY (document.modelGridRemoval().countY()),
72   m_startY (document.modelGridRemoval().startY()),
73   m_stepY (document.modelGridRemoval().stepY()),
74   m_stopY (document.modelGridRemoval().stopY())
75 {
76 }
77 
DocumentModelGridRemoval(const DocumentModelGridRemoval & other)78 DocumentModelGridRemoval::DocumentModelGridRemoval(const DocumentModelGridRemoval &other) :
79   m_stable (other.stable()),
80   m_removeDefinedGridLines (other.removeDefinedGridLines()),
81   m_closeDistance (other.closeDistance()),
82   m_gridCoordDisableX (other.gridCoordDisableX()),
83   m_countX (other.countX()),
84   m_startX (other.startX()),
85   m_stepX (other.stepX()),
86   m_stopX (other.stopX()),
87   m_gridCoordDisableY (other.gridCoordDisableX()),
88   m_countY (other.countY()),
89   m_startY (other.startY()),
90   m_stepY (other.stepY()),
91   m_stopY (other.stopY())
92 {
93 }
94 
operator =(const DocumentModelGridRemoval & other)95 DocumentModelGridRemoval &DocumentModelGridRemoval::operator=(const DocumentModelGridRemoval &other)
96 {
97   m_stable = other.stable();
98   m_removeDefinedGridLines = other.removeDefinedGridLines();
99   m_closeDistance = other.closeDistance();
100   m_gridCoordDisableX = other.gridCoordDisableX();
101   m_countX = other.countX();
102   m_startX = other.startX();
103   m_stepX = other.stepX();
104   m_stopX = other.stopX();
105   m_gridCoordDisableY = other.gridCoordDisableY();
106   m_countY = other.countY();
107   m_startY = other.startY();
108   m_stepY = other.stepY();
109   m_stopY = other.stopY();
110 
111   return *this;
112 }
113 
closeDistance() const114 double DocumentModelGridRemoval::closeDistance() const
115 {
116   return m_closeDistance;
117 }
118 
countX() const119 int DocumentModelGridRemoval::countX() const
120 {
121   return m_countX;
122 }
123 
countY() const124 int DocumentModelGridRemoval::countY() const
125 {
126   return m_countY;
127 }
128 
gridCoordDisableX() const129 GridCoordDisable DocumentModelGridRemoval::gridCoordDisableX () const
130 {
131   return m_gridCoordDisableX;
132 }
133 
gridCoordDisableY() const134 GridCoordDisable DocumentModelGridRemoval::gridCoordDisableY () const
135 {
136   return m_gridCoordDisableY;
137 }
138 
loadXml(QXmlStreamReader & reader)139 void DocumentModelGridRemoval::loadXml(QXmlStreamReader &reader)
140 {
141   LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelGridRemoval::loadXml";
142 
143   bool success = true;
144 
145   QXmlStreamAttributes attributes = reader.attributes();
146 
147   if (attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STABLE) &&
148       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_DEFINED_GRID_LINES) &&
149       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_CLOSE_DISTANCE) &&
150       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_X) &&
151       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_X) &&
152       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_X) &&
153       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_X) &&
154       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_X) &&
155       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_Y) &&
156       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_Y) &&
157       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_Y) &&
158       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_Y) &&
159       attributes.hasAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_Y)) {
160 
161     // Boolean values
162     QString stableValue = attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_STABLE).toString();
163     QString definedValue = attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_DEFINED_GRID_LINES).toString();
164 
165     setStable (stableValue == DOCUMENT_SERIALIZE_BOOL_TRUE);
166     setRemoveDefinedGridLines (definedValue == DOCUMENT_SERIALIZE_BOOL_TRUE);
167     setCloseDistance (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_CLOSE_DISTANCE).toDouble());
168     setGridCoordDisableX (static_cast<GridCoordDisable> (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_X).toInt()));
169     setCountX (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_X).toInt());
170     setStartX (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_X).toDouble());
171     setStepX (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_X).toDouble());
172     setStopX (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_X).toDouble());
173     setGridCoordDisableY (static_cast<GridCoordDisable> (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_Y).toInt()));
174     setCountY (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_Y).toInt());
175     setStartY (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_Y).toDouble());
176     setStepY (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_Y).toDouble());
177     setStopY (attributes.value(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_Y).toDouble());
178 
179     // Read until end of this subtree
180     while ((reader.tokenType() != QXmlStreamReader::EndElement) ||
181     (reader.name() != DOCUMENT_SERIALIZE_GRID_REMOVAL)){
182       loadNextFromReader(reader);
183       if (reader.atEnd()) {
184         success = false;
185         break;
186       }
187     }
188   }
189 
190   if (!success) {
191     reader.raiseError (QObject::tr ("Cannot read grid removal data"));
192   }
193 }
194 
printStream(QString indentation,QTextStream & str) const195 void DocumentModelGridRemoval::printStream(QString indentation,
196                                            QTextStream &str) const
197 {
198   str << indentation << "DocumentModelGridRemoval\n";
199 
200   indentation += INDENTATION_DELTA;
201 
202   str << indentation << "stable=" << (m_stable ? "true" : "false") << "\n";
203   str << indentation << "removeDefinedGridLines=" << (m_removeDefinedGridLines ? "true" : "false") << "\n";
204   str << indentation << "closeDistance=" << m_closeDistance << "\n";
205   str << indentation << "gridCoordDisableX=" << gridCoordDisableToString (m_gridCoordDisableX) << "\n";
206   str << indentation << "countX=" << m_countX << "\n";
207   str << indentation << "startX=" << m_startX << "\n";
208   str << indentation << "stepX=" << m_stepX << "\n";
209   str << indentation << "stopX=" << m_stopX << "\n";
210   str << indentation << "gridCoordDisableY=" << gridCoordDisableToString (m_gridCoordDisableY) << "\n";
211   str << indentation << "countY=" << m_countY << "\n";
212   str << indentation << "startY=" << m_startY << "\n";
213   str << indentation << "stepY=" << m_stepY << "\n";
214   str << indentation << "stopY=" << m_stopY << "\n";
215 }
216 
removeDefinedGridLines() const217 bool DocumentModelGridRemoval::removeDefinedGridLines () const
218 {
219   return m_removeDefinedGridLines;
220 }
221 
saveXml(QXmlStreamWriter & writer) const222 void DocumentModelGridRemoval::saveXml(QXmlStreamWriter &writer) const
223 {
224   LOG4CPP_INFO_S ((*mainCat)) << "DocumentModelGridRemoval::saveXml";
225 
226   writer.writeStartElement(DOCUMENT_SERIALIZE_GRID_REMOVAL);
227   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STABLE, m_stable ?
228                           DOCUMENT_SERIALIZE_BOOL_TRUE :
229                           DOCUMENT_SERIALIZE_BOOL_FALSE);
230   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_DEFINED_GRID_LINES, m_removeDefinedGridLines ?
231                           DOCUMENT_SERIALIZE_BOOL_TRUE :
232                           DOCUMENT_SERIALIZE_BOOL_FALSE);
233   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_CLOSE_DISTANCE, QString::number (m_closeDistance));
234   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_X, QString::number (m_gridCoordDisableX));
235   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_X_STRING, gridCoordDisableToString (m_gridCoordDisableX));
236   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_X, QString::number (m_countX));
237   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_X, QString::number (m_startX));
238   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_X, QString::number (m_stepX));
239   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_X, QString::number (m_stopX));
240   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_Y, QString::number (m_gridCoordDisableY));
241   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COORD_DISABLE_Y_STRING, gridCoordDisableToString (m_gridCoordDisableY));
242   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_COUNT_Y, QString::number (m_countY));
243   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_START_Y, QString::number (m_startY));
244   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STEP_Y, QString::number (m_stepY));
245   writer.writeAttribute(DOCUMENT_SERIALIZE_GRID_REMOVAL_STOP_Y, QString::number (m_stopY));
246 
247   writer.writeEndElement();
248 }
249 
setCloseDistance(double closeDistance)250 void DocumentModelGridRemoval::setCloseDistance(double closeDistance)
251 {
252   m_closeDistance = closeDistance;
253 }
254 
setCountX(int countX)255 void DocumentModelGridRemoval::setCountX(int countX)
256 {
257   m_countX = countX;
258 }
259 
setCountY(int countY)260 void DocumentModelGridRemoval::setCountY(int countY)
261 {
262   m_countY = countY;
263 }
264 
setGridCoordDisableX(GridCoordDisable gridCoordDisable)265 void DocumentModelGridRemoval::setGridCoordDisableX (GridCoordDisable gridCoordDisable)
266 {
267   m_gridCoordDisableX = gridCoordDisable;
268 }
269 
setGridCoordDisableY(GridCoordDisable gridCoordDisable)270 void DocumentModelGridRemoval::setGridCoordDisableY (GridCoordDisable gridCoordDisable)
271 {
272   m_gridCoordDisableY = gridCoordDisable;
273 }
274 
setRemoveDefinedGridLines(bool removeDefinedGridLines)275 void DocumentModelGridRemoval::setRemoveDefinedGridLines (bool removeDefinedGridLines)
276 {
277   m_removeDefinedGridLines = removeDefinedGridLines;
278 }
279 
setStable()280 void DocumentModelGridRemoval::setStable ()
281 {
282   m_stable = true;
283 }
284 
setStable(bool stable)285 void DocumentModelGridRemoval::setStable (bool stable)
286 {
287   m_stable = stable;
288 }
289 
setStartX(double startX)290 void DocumentModelGridRemoval::setStartX(double startX)
291 {
292   m_startX = startX;
293 }
294 
setStartY(double startY)295 void DocumentModelGridRemoval::setStartY(double startY)
296 {
297   m_startY = startY;
298 }
299 
setStepX(double stepX)300 void DocumentModelGridRemoval::setStepX(double stepX)
301 {
302   m_stepX = stepX;
303 }
304 
setStepY(double stepY)305 void DocumentModelGridRemoval::setStepY(double stepY)
306 {
307   m_stepY = stepY;
308 }
309 
setStopX(double stopX)310 void DocumentModelGridRemoval::setStopX(double stopX)
311 {
312   m_stopX = stopX;
313 }
314 
setStopY(double stopY)315 void DocumentModelGridRemoval::setStopY(double stopY)
316 {
317   m_stopY = stopY;
318 }
319 
stable() const320 bool DocumentModelGridRemoval::stable () const
321 {
322   return m_stable;
323 }
324 
startX() const325 double DocumentModelGridRemoval::startX() const
326 {
327   return m_startX;
328 }
329 
startY() const330 double DocumentModelGridRemoval::startY() const
331 {
332   return m_startY;
333 }
334 
stepX() const335 double DocumentModelGridRemoval::stepX() const
336 {
337   return m_stepX;
338 }
339 
stepY() const340 double DocumentModelGridRemoval::stepY() const
341 {
342   return m_stepY;
343 }
344 
stopX() const345 double DocumentModelGridRemoval::stopX() const
346 {
347   return m_stopX;
348 }
349 
stopY() const350 double DocumentModelGridRemoval::stopY() const
351 {
352   return m_stopY;
353 }
354