1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the tools applications of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 // THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
30 
31 #include "ui4.h"
32 
33 
34 QT_BEGIN_NAMESPACE
35 #ifdef QFORMINTERNAL_NAMESPACE
36 using namespace QFormInternal;
37 #endif
38 
39 /*******************************************************************************
40 ** Implementations
41 */
42 
~DomUI()43 DomUI::~DomUI()
44 {
45     delete m_widget;
46     delete m_layoutDefault;
47     delete m_layoutFunction;
48     delete m_customWidgets;
49     delete m_tabStops;
50     delete m_includes;
51     delete m_resources;
52     delete m_connections;
53     delete m_designerdata;
54     delete m_slots;
55     delete m_buttonGroups;
56 }
57 
read(QXmlStreamReader & reader)58 void DomUI::read(QXmlStreamReader &reader)
59 {
60     const QXmlStreamAttributes &attributes = reader.attributes();
61     for (const QXmlStreamAttribute &attribute : attributes) {
62         const auto name = attribute.name();
63         if (name == QLatin1String("version")) {
64             setAttributeVersion(attribute.value().toString());
65             continue;
66         }
67         if (name == QLatin1String("language")) {
68             setAttributeLanguage(attribute.value().toString());
69             continue;
70         }
71         if (name == QLatin1String("displayname")) {
72             setAttributeDisplayname(attribute.value().toString());
73             continue;
74         }
75         if (name == QLatin1String("idbasedtr")) {
76             setAttributeIdbasedtr(attribute.value() == QLatin1String("true"));
77             continue;
78         }
79         if (name == QLatin1String("connectslotsbyname")) {
80             setAttributeConnectslotsbyname(attribute.value() == QLatin1String("true"));
81             continue;
82         }
83         if (name == QLatin1String("stdsetdef")) {
84             setAttributeStdsetdef(attribute.value().toInt());
85             continue;
86         }
87         if (name == QLatin1String("stdSetDef")) {
88             setAttributeStdSetDef(attribute.value().toInt());
89             continue;
90         }
91         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
92     }
93 
94     while (!reader.hasError()) {
95         switch (reader.readNext()) {
96         case QXmlStreamReader::StartElement : {
97             const auto tag = reader.name();
98             if (!tag.compare(QLatin1String("author"), Qt::CaseInsensitive)) {
99                 setElementAuthor(reader.readElementText());
100                 continue;
101             }
102             if (!tag.compare(QLatin1String("comment"), Qt::CaseInsensitive)) {
103                 setElementComment(reader.readElementText());
104                 continue;
105             }
106             if (!tag.compare(QLatin1String("exportmacro"), Qt::CaseInsensitive)) {
107                 setElementExportMacro(reader.readElementText());
108                 continue;
109             }
110             if (!tag.compare(QLatin1String("class"), Qt::CaseInsensitive)) {
111                 setElementClass(reader.readElementText());
112                 continue;
113             }
114             if (!tag.compare(QLatin1String("widget"), Qt::CaseInsensitive)) {
115                 auto *v = new DomWidget();
116                 v->read(reader);
117                 setElementWidget(v);
118                 continue;
119             }
120             if (!tag.compare(QLatin1String("layoutdefault"), Qt::CaseInsensitive)) {
121                 auto *v = new DomLayoutDefault();
122                 v->read(reader);
123                 setElementLayoutDefault(v);
124                 continue;
125             }
126             if (!tag.compare(QLatin1String("layoutfunction"), Qt::CaseInsensitive)) {
127                 auto *v = new DomLayoutFunction();
128                 v->read(reader);
129                 setElementLayoutFunction(v);
130                 continue;
131             }
132             if (!tag.compare(QLatin1String("pixmapfunction"), Qt::CaseInsensitive)) {
133                 setElementPixmapFunction(reader.readElementText());
134                 continue;
135             }
136             if (!tag.compare(QLatin1String("customwidgets"), Qt::CaseInsensitive)) {
137                 auto *v = new DomCustomWidgets();
138                 v->read(reader);
139                 setElementCustomWidgets(v);
140                 continue;
141             }
142             if (!tag.compare(QLatin1String("tabstops"), Qt::CaseInsensitive)) {
143                 auto *v = new DomTabStops();
144                 v->read(reader);
145                 setElementTabStops(v);
146                 continue;
147             }
148             if (!tag.compare(QLatin1String("images"), Qt::CaseInsensitive)) {
149                 qWarning("Omitting deprecated element <images>.");
150                 reader.skipCurrentElement();
151                 continue;
152             }
153             if (!tag.compare(QLatin1String("includes"), Qt::CaseInsensitive)) {
154                 auto *v = new DomIncludes();
155                 v->read(reader);
156                 setElementIncludes(v);
157                 continue;
158             }
159             if (!tag.compare(QLatin1String("resources"), Qt::CaseInsensitive)) {
160                 auto *v = new DomResources();
161                 v->read(reader);
162                 setElementResources(v);
163                 continue;
164             }
165             if (!tag.compare(QLatin1String("connections"), Qt::CaseInsensitive)) {
166                 auto *v = new DomConnections();
167                 v->read(reader);
168                 setElementConnections(v);
169                 continue;
170             }
171             if (!tag.compare(QLatin1String("designerdata"), Qt::CaseInsensitive)) {
172                 auto *v = new DomDesignerData();
173                 v->read(reader);
174                 setElementDesignerdata(v);
175                 continue;
176             }
177             if (!tag.compare(QLatin1String("slots"), Qt::CaseInsensitive)) {
178                 auto *v = new DomSlots();
179                 v->read(reader);
180                 setElementSlots(v);
181                 continue;
182             }
183             if (!tag.compare(QLatin1String("buttongroups"), Qt::CaseInsensitive)) {
184                 auto *v = new DomButtonGroups();
185                 v->read(reader);
186                 setElementButtonGroups(v);
187                 continue;
188             }
189             reader.raiseError(QLatin1String("Unexpected element ") + tag);
190         }
191             break;
192         case QXmlStreamReader::EndElement :
193             return;
194         default :
195             break;
196         }
197     }
198 }
199 
write(QXmlStreamWriter & writer,const QString & tagName) const200 void DomUI::write(QXmlStreamWriter &writer, const QString &tagName) const
201 {
202     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("ui") : tagName.toLower());
203 
204     if (hasAttributeVersion())
205         writer.writeAttribute(QStringLiteral("version"), attributeVersion());
206 
207     if (hasAttributeLanguage())
208         writer.writeAttribute(QStringLiteral("language"), attributeLanguage());
209 
210     if (hasAttributeDisplayname())
211         writer.writeAttribute(QStringLiteral("displayname"), attributeDisplayname());
212 
213     if (hasAttributeIdbasedtr())
214         writer.writeAttribute(QStringLiteral("idbasedtr"), (attributeIdbasedtr() ? QLatin1String("true") : QLatin1String("false")));
215 
216     if (hasAttributeConnectslotsbyname())
217         writer.writeAttribute(QStringLiteral("connectslotsbyname"), (attributeConnectslotsbyname() ? QLatin1String("true") : QLatin1String("false")));
218 
219     if (hasAttributeStdsetdef())
220         writer.writeAttribute(QStringLiteral("stdsetdef"), QString::number(attributeStdsetdef()));
221 
222     if (hasAttributeStdSetDef())
223         writer.writeAttribute(QStringLiteral("stdsetdef"), QString::number(attributeStdSetDef()));
224 
225     if (m_children & Author)
226         writer.writeTextElement(QStringLiteral("author"), m_author);
227 
228     if (m_children & Comment)
229         writer.writeTextElement(QStringLiteral("comment"), m_comment);
230 
231     if (m_children & ExportMacro)
232         writer.writeTextElement(QStringLiteral("exportmacro"), m_exportMacro);
233 
234     if (m_children & Class)
235         writer.writeTextElement(QStringLiteral("class"), m_class);
236 
237     if (m_children & Widget)
238         m_widget->write(writer, QStringLiteral("widget"));
239 
240     if (m_children & LayoutDefault)
241         m_layoutDefault->write(writer, QStringLiteral("layoutdefault"));
242 
243     if (m_children & LayoutFunction)
244         m_layoutFunction->write(writer, QStringLiteral("layoutfunction"));
245 
246     if (m_children & PixmapFunction)
247         writer.writeTextElement(QStringLiteral("pixmapfunction"), m_pixmapFunction);
248 
249     if (m_children & CustomWidgets)
250         m_customWidgets->write(writer, QStringLiteral("customwidgets"));
251 
252     if (m_children & TabStops)
253         m_tabStops->write(writer, QStringLiteral("tabstops"));
254 
255     if (m_children & Includes)
256         m_includes->write(writer, QStringLiteral("includes"));
257 
258     if (m_children & Resources)
259         m_resources->write(writer, QStringLiteral("resources"));
260 
261     if (m_children & Connections)
262         m_connections->write(writer, QStringLiteral("connections"));
263 
264     if (m_children & Designerdata)
265         m_designerdata->write(writer, QStringLiteral("designerdata"));
266 
267     if (m_children & Slots)
268         m_slots->write(writer, QStringLiteral("slots"));
269 
270     if (m_children & ButtonGroups)
271         m_buttonGroups->write(writer, QStringLiteral("buttongroups"));
272 
273     writer.writeEndElement();
274 }
275 
setElementAuthor(const QString & a)276 void DomUI::setElementAuthor(const QString &a)
277 {
278     m_children |= Author;
279     m_author = a;
280 }
281 
setElementComment(const QString & a)282 void DomUI::setElementComment(const QString &a)
283 {
284     m_children |= Comment;
285     m_comment = a;
286 }
287 
setElementExportMacro(const QString & a)288 void DomUI::setElementExportMacro(const QString &a)
289 {
290     m_children |= ExportMacro;
291     m_exportMacro = a;
292 }
293 
setElementClass(const QString & a)294 void DomUI::setElementClass(const QString &a)
295 {
296     m_children |= Class;
297     m_class = a;
298 }
299 
takeElementWidget()300 DomWidget *DomUI::takeElementWidget()
301 {
302     DomWidget *a = m_widget;
303     m_widget = nullptr;
304     m_children ^= Widget;
305     return a;
306 }
307 
setElementWidget(DomWidget * a)308 void DomUI::setElementWidget(DomWidget *a)
309 {
310     delete m_widget;
311     m_children |= Widget;
312     m_widget = a;
313 }
314 
takeElementLayoutDefault()315 DomLayoutDefault *DomUI::takeElementLayoutDefault()
316 {
317     DomLayoutDefault *a = m_layoutDefault;
318     m_layoutDefault = nullptr;
319     m_children ^= LayoutDefault;
320     return a;
321 }
322 
setElementLayoutDefault(DomLayoutDefault * a)323 void DomUI::setElementLayoutDefault(DomLayoutDefault *a)
324 {
325     delete m_layoutDefault;
326     m_children |= LayoutDefault;
327     m_layoutDefault = a;
328 }
329 
takeElementLayoutFunction()330 DomLayoutFunction *DomUI::takeElementLayoutFunction()
331 {
332     DomLayoutFunction *a = m_layoutFunction;
333     m_layoutFunction = nullptr;
334     m_children ^= LayoutFunction;
335     return a;
336 }
337 
setElementLayoutFunction(DomLayoutFunction * a)338 void DomUI::setElementLayoutFunction(DomLayoutFunction *a)
339 {
340     delete m_layoutFunction;
341     m_children |= LayoutFunction;
342     m_layoutFunction = a;
343 }
344 
setElementPixmapFunction(const QString & a)345 void DomUI::setElementPixmapFunction(const QString &a)
346 {
347     m_children |= PixmapFunction;
348     m_pixmapFunction = a;
349 }
350 
takeElementCustomWidgets()351 DomCustomWidgets *DomUI::takeElementCustomWidgets()
352 {
353     DomCustomWidgets *a = m_customWidgets;
354     m_customWidgets = nullptr;
355     m_children ^= CustomWidgets;
356     return a;
357 }
358 
setElementCustomWidgets(DomCustomWidgets * a)359 void DomUI::setElementCustomWidgets(DomCustomWidgets *a)
360 {
361     delete m_customWidgets;
362     m_children |= CustomWidgets;
363     m_customWidgets = a;
364 }
365 
takeElementTabStops()366 DomTabStops *DomUI::takeElementTabStops()
367 {
368     DomTabStops *a = m_tabStops;
369     m_tabStops = nullptr;
370     m_children ^= TabStops;
371     return a;
372 }
373 
setElementTabStops(DomTabStops * a)374 void DomUI::setElementTabStops(DomTabStops *a)
375 {
376     delete m_tabStops;
377     m_children |= TabStops;
378     m_tabStops = a;
379 }
380 
takeElementIncludes()381 DomIncludes *DomUI::takeElementIncludes()
382 {
383     DomIncludes *a = m_includes;
384     m_includes = nullptr;
385     m_children ^= Includes;
386     return a;
387 }
388 
setElementIncludes(DomIncludes * a)389 void DomUI::setElementIncludes(DomIncludes *a)
390 {
391     delete m_includes;
392     m_children |= Includes;
393     m_includes = a;
394 }
395 
takeElementResources()396 DomResources *DomUI::takeElementResources()
397 {
398     DomResources *a = m_resources;
399     m_resources = nullptr;
400     m_children ^= Resources;
401     return a;
402 }
403 
setElementResources(DomResources * a)404 void DomUI::setElementResources(DomResources *a)
405 {
406     delete m_resources;
407     m_children |= Resources;
408     m_resources = a;
409 }
410 
takeElementConnections()411 DomConnections *DomUI::takeElementConnections()
412 {
413     DomConnections *a = m_connections;
414     m_connections = nullptr;
415     m_children ^= Connections;
416     return a;
417 }
418 
setElementConnections(DomConnections * a)419 void DomUI::setElementConnections(DomConnections *a)
420 {
421     delete m_connections;
422     m_children |= Connections;
423     m_connections = a;
424 }
425 
takeElementDesignerdata()426 DomDesignerData *DomUI::takeElementDesignerdata()
427 {
428     DomDesignerData *a = m_designerdata;
429     m_designerdata = nullptr;
430     m_children ^= Designerdata;
431     return a;
432 }
433 
setElementDesignerdata(DomDesignerData * a)434 void DomUI::setElementDesignerdata(DomDesignerData *a)
435 {
436     delete m_designerdata;
437     m_children |= Designerdata;
438     m_designerdata = a;
439 }
440 
takeElementSlots()441 DomSlots *DomUI::takeElementSlots()
442 {
443     DomSlots *a = m_slots;
444     m_slots = nullptr;
445     m_children ^= Slots;
446     return a;
447 }
448 
setElementSlots(DomSlots * a)449 void DomUI::setElementSlots(DomSlots *a)
450 {
451     delete m_slots;
452     m_children |= Slots;
453     m_slots = a;
454 }
455 
takeElementButtonGroups()456 DomButtonGroups *DomUI::takeElementButtonGroups()
457 {
458     DomButtonGroups *a = m_buttonGroups;
459     m_buttonGroups = nullptr;
460     m_children ^= ButtonGroups;
461     return a;
462 }
463 
setElementButtonGroups(DomButtonGroups * a)464 void DomUI::setElementButtonGroups(DomButtonGroups *a)
465 {
466     delete m_buttonGroups;
467     m_children |= ButtonGroups;
468     m_buttonGroups = a;
469 }
470 
clearElementAuthor()471 void DomUI::clearElementAuthor()
472 {
473     m_children &= ~Author;
474 }
475 
clearElementComment()476 void DomUI::clearElementComment()
477 {
478     m_children &= ~Comment;
479 }
480 
clearElementExportMacro()481 void DomUI::clearElementExportMacro()
482 {
483     m_children &= ~ExportMacro;
484 }
485 
clearElementClass()486 void DomUI::clearElementClass()
487 {
488     m_children &= ~Class;
489 }
490 
clearElementWidget()491 void DomUI::clearElementWidget()
492 {
493     delete m_widget;
494     m_widget = nullptr;
495     m_children &= ~Widget;
496 }
497 
clearElementLayoutDefault()498 void DomUI::clearElementLayoutDefault()
499 {
500     delete m_layoutDefault;
501     m_layoutDefault = nullptr;
502     m_children &= ~LayoutDefault;
503 }
504 
clearElementLayoutFunction()505 void DomUI::clearElementLayoutFunction()
506 {
507     delete m_layoutFunction;
508     m_layoutFunction = nullptr;
509     m_children &= ~LayoutFunction;
510 }
511 
clearElementPixmapFunction()512 void DomUI::clearElementPixmapFunction()
513 {
514     m_children &= ~PixmapFunction;
515 }
516 
clearElementCustomWidgets()517 void DomUI::clearElementCustomWidgets()
518 {
519     delete m_customWidgets;
520     m_customWidgets = nullptr;
521     m_children &= ~CustomWidgets;
522 }
523 
clearElementTabStops()524 void DomUI::clearElementTabStops()
525 {
526     delete m_tabStops;
527     m_tabStops = nullptr;
528     m_children &= ~TabStops;
529 }
530 
clearElementIncludes()531 void DomUI::clearElementIncludes()
532 {
533     delete m_includes;
534     m_includes = nullptr;
535     m_children &= ~Includes;
536 }
537 
clearElementResources()538 void DomUI::clearElementResources()
539 {
540     delete m_resources;
541     m_resources = nullptr;
542     m_children &= ~Resources;
543 }
544 
clearElementConnections()545 void DomUI::clearElementConnections()
546 {
547     delete m_connections;
548     m_connections = nullptr;
549     m_children &= ~Connections;
550 }
551 
clearElementDesignerdata()552 void DomUI::clearElementDesignerdata()
553 {
554     delete m_designerdata;
555     m_designerdata = nullptr;
556     m_children &= ~Designerdata;
557 }
558 
clearElementSlots()559 void DomUI::clearElementSlots()
560 {
561     delete m_slots;
562     m_slots = nullptr;
563     m_children &= ~Slots;
564 }
565 
clearElementButtonGroups()566 void DomUI::clearElementButtonGroups()
567 {
568     delete m_buttonGroups;
569     m_buttonGroups = nullptr;
570     m_children &= ~ButtonGroups;
571 }
572 
~DomIncludes()573 DomIncludes::~DomIncludes()
574 {
575     qDeleteAll(m_include);
576     m_include.clear();
577 }
578 
read(QXmlStreamReader & reader)579 void DomIncludes::read(QXmlStreamReader &reader)
580 {
581     while (!reader.hasError()) {
582         switch (reader.readNext()) {
583         case QXmlStreamReader::StartElement : {
584             const auto tag = reader.name();
585             if (!tag.compare(QLatin1String("include"), Qt::CaseInsensitive)) {
586                 auto *v = new DomInclude();
587                 v->read(reader);
588                 m_include.append(v);
589                 continue;
590             }
591             reader.raiseError(QLatin1String("Unexpected element ") + tag);
592         }
593             break;
594         case QXmlStreamReader::EndElement :
595             return;
596         default :
597             break;
598         }
599     }
600 }
601 
write(QXmlStreamWriter & writer,const QString & tagName) const602 void DomIncludes::write(QXmlStreamWriter &writer, const QString &tagName) const
603 {
604     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("includes") : tagName.toLower());
605 
606     for (DomInclude *v : m_include)
607         v->write(writer, QStringLiteral("include"));
608 
609     writer.writeEndElement();
610 }
611 
setElementInclude(const QVector<DomInclude * > & a)612 void DomIncludes::setElementInclude(const QVector<DomInclude *> &a)
613 {
614     m_children |= Include;
615     m_include = a;
616 }
617 
618 DomInclude::~DomInclude() = default;
619 
read(QXmlStreamReader & reader)620 void DomInclude::read(QXmlStreamReader &reader)
621 {
622     const QXmlStreamAttributes &attributes = reader.attributes();
623     for (const QXmlStreamAttribute &attribute : attributes) {
624         const auto name = attribute.name();
625         if (name == QLatin1String("location")) {
626             setAttributeLocation(attribute.value().toString());
627             continue;
628         }
629         if (name == QLatin1String("impldecl")) {
630             setAttributeImpldecl(attribute.value().toString());
631             continue;
632         }
633         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
634     }
635 
636     while (!reader.hasError()) {
637         switch (reader.readNext()) {
638         case QXmlStreamReader::StartElement : {
639             const auto tag = reader.name();
640             reader.raiseError(QLatin1String("Unexpected element ") + tag);
641         }
642             break;
643         case QXmlStreamReader::EndElement :
644             return;
645         case QXmlStreamReader::Characters :
646             if (!reader.isWhitespace())
647                 m_text.append(reader.text().toString());
648             break;
649         default :
650             break;
651         }
652     }
653 }
654 
write(QXmlStreamWriter & writer,const QString & tagName) const655 void DomInclude::write(QXmlStreamWriter &writer, const QString &tagName) const
656 {
657     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("include") : tagName.toLower());
658 
659     if (hasAttributeLocation())
660         writer.writeAttribute(QStringLiteral("location"), attributeLocation());
661 
662     if (hasAttributeImpldecl())
663         writer.writeAttribute(QStringLiteral("impldecl"), attributeImpldecl());
664 
665     if (!m_text.isEmpty())
666         writer.writeCharacters(m_text);
667 
668     writer.writeEndElement();
669 }
670 
~DomResources()671 DomResources::~DomResources()
672 {
673     qDeleteAll(m_include);
674     m_include.clear();
675 }
676 
read(QXmlStreamReader & reader)677 void DomResources::read(QXmlStreamReader &reader)
678 {
679     const QXmlStreamAttributes &attributes = reader.attributes();
680     for (const QXmlStreamAttribute &attribute : attributes) {
681         const auto name = attribute.name();
682         if (name == QLatin1String("name")) {
683             setAttributeName(attribute.value().toString());
684             continue;
685         }
686         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
687     }
688 
689     while (!reader.hasError()) {
690         switch (reader.readNext()) {
691         case QXmlStreamReader::StartElement : {
692             const auto tag = reader.name();
693             if (!tag.compare(QLatin1String("include"), Qt::CaseInsensitive)) {
694                 auto *v = new DomResource();
695                 v->read(reader);
696                 m_include.append(v);
697                 continue;
698             }
699             reader.raiseError(QLatin1String("Unexpected element ") + tag);
700         }
701             break;
702         case QXmlStreamReader::EndElement :
703             return;
704         default :
705             break;
706         }
707     }
708 }
709 
write(QXmlStreamWriter & writer,const QString & tagName) const710 void DomResources::write(QXmlStreamWriter &writer, const QString &tagName) const
711 {
712     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("resources") : tagName.toLower());
713 
714     if (hasAttributeName())
715         writer.writeAttribute(QStringLiteral("name"), attributeName());
716 
717     for (DomResource *v : m_include)
718         v->write(writer, QStringLiteral("include"));
719 
720     writer.writeEndElement();
721 }
722 
setElementInclude(const QVector<DomResource * > & a)723 void DomResources::setElementInclude(const QVector<DomResource *> &a)
724 {
725     m_children |= Include;
726     m_include = a;
727 }
728 
729 DomResource::~DomResource() = default;
730 
read(QXmlStreamReader & reader)731 void DomResource::read(QXmlStreamReader &reader)
732 {
733     const QXmlStreamAttributes &attributes = reader.attributes();
734     for (const QXmlStreamAttribute &attribute : attributes) {
735         const auto name = attribute.name();
736         if (name == QLatin1String("location")) {
737             setAttributeLocation(attribute.value().toString());
738             continue;
739         }
740         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
741     }
742 
743     while (!reader.hasError()) {
744         switch (reader.readNext()) {
745         case QXmlStreamReader::StartElement : {
746             const auto tag = reader.name();
747             reader.raiseError(QLatin1String("Unexpected element ") + tag);
748         }
749             break;
750         case QXmlStreamReader::EndElement :
751             return;
752         default :
753             break;
754         }
755     }
756 }
757 
write(QXmlStreamWriter & writer,const QString & tagName) const758 void DomResource::write(QXmlStreamWriter &writer, const QString &tagName) const
759 {
760     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("resource") : tagName.toLower());
761 
762     if (hasAttributeLocation())
763         writer.writeAttribute(QStringLiteral("location"), attributeLocation());
764 
765     writer.writeEndElement();
766 }
767 
~DomActionGroup()768 DomActionGroup::~DomActionGroup()
769 {
770     qDeleteAll(m_action);
771     m_action.clear();
772     qDeleteAll(m_actionGroup);
773     m_actionGroup.clear();
774     qDeleteAll(m_property);
775     m_property.clear();
776     qDeleteAll(m_attribute);
777     m_attribute.clear();
778 }
779 
read(QXmlStreamReader & reader)780 void DomActionGroup::read(QXmlStreamReader &reader)
781 {
782     const QXmlStreamAttributes &attributes = reader.attributes();
783     for (const QXmlStreamAttribute &attribute : attributes) {
784         const auto name = attribute.name();
785         if (name == QLatin1String("name")) {
786             setAttributeName(attribute.value().toString());
787             continue;
788         }
789         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
790     }
791 
792     while (!reader.hasError()) {
793         switch (reader.readNext()) {
794         case QXmlStreamReader::StartElement : {
795             const auto tag = reader.name();
796             if (!tag.compare(QLatin1String("action"), Qt::CaseInsensitive)) {
797                 auto *v = new DomAction();
798                 v->read(reader);
799                 m_action.append(v);
800                 continue;
801             }
802             if (!tag.compare(QLatin1String("actiongroup"), Qt::CaseInsensitive)) {
803                 auto *v = new DomActionGroup();
804                 v->read(reader);
805                 m_actionGroup.append(v);
806                 continue;
807             }
808             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
809                 auto *v = new DomProperty();
810                 v->read(reader);
811                 m_property.append(v);
812                 continue;
813             }
814             if (!tag.compare(QLatin1String("attribute"), Qt::CaseInsensitive)) {
815                 auto *v = new DomProperty();
816                 v->read(reader);
817                 m_attribute.append(v);
818                 continue;
819             }
820             reader.raiseError(QLatin1String("Unexpected element ") + tag);
821         }
822             break;
823         case QXmlStreamReader::EndElement :
824             return;
825         default :
826             break;
827         }
828     }
829 }
830 
write(QXmlStreamWriter & writer,const QString & tagName) const831 void DomActionGroup::write(QXmlStreamWriter &writer, const QString &tagName) const
832 {
833     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("actiongroup") : tagName.toLower());
834 
835     if (hasAttributeName())
836         writer.writeAttribute(QStringLiteral("name"), attributeName());
837 
838     for (DomAction *v : m_action)
839         v->write(writer, QStringLiteral("action"));
840 
841     for (DomActionGroup *v : m_actionGroup)
842         v->write(writer, QStringLiteral("actiongroup"));
843 
844     for (DomProperty *v : m_property)
845         v->write(writer, QStringLiteral("property"));
846 
847     for (DomProperty *v : m_attribute)
848         v->write(writer, QStringLiteral("attribute"));
849 
850     writer.writeEndElement();
851 }
852 
setElementAction(const QVector<DomAction * > & a)853 void DomActionGroup::setElementAction(const QVector<DomAction *> &a)
854 {
855     m_children |= Action;
856     m_action = a;
857 }
858 
setElementActionGroup(const QVector<DomActionGroup * > & a)859 void DomActionGroup::setElementActionGroup(const QVector<DomActionGroup *> &a)
860 {
861     m_children |= ActionGroup;
862     m_actionGroup = a;
863 }
864 
setElementProperty(const QList<DomProperty * > & a)865 void DomActionGroup::setElementProperty(const QList<DomProperty *> &a)
866 {
867     m_children |= Property;
868     m_property = a;
869 }
870 
setElementAttribute(const QList<DomProperty * > & a)871 void DomActionGroup::setElementAttribute(const QList<DomProperty *> &a)
872 {
873     m_children |= Attribute;
874     m_attribute = a;
875 }
876 
~DomAction()877 DomAction::~DomAction()
878 {
879     qDeleteAll(m_property);
880     m_property.clear();
881     qDeleteAll(m_attribute);
882     m_attribute.clear();
883 }
884 
read(QXmlStreamReader & reader)885 void DomAction::read(QXmlStreamReader &reader)
886 {
887     const QXmlStreamAttributes &attributes = reader.attributes();
888     for (const QXmlStreamAttribute &attribute : attributes) {
889         const auto name = attribute.name();
890         if (name == QLatin1String("name")) {
891             setAttributeName(attribute.value().toString());
892             continue;
893         }
894         if (name == QLatin1String("menu")) {
895             setAttributeMenu(attribute.value().toString());
896             continue;
897         }
898         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
899     }
900 
901     while (!reader.hasError()) {
902         switch (reader.readNext()) {
903         case QXmlStreamReader::StartElement : {
904             const auto tag = reader.name();
905             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
906                 auto *v = new DomProperty();
907                 v->read(reader);
908                 m_property.append(v);
909                 continue;
910             }
911             if (!tag.compare(QLatin1String("attribute"), Qt::CaseInsensitive)) {
912                 auto *v = new DomProperty();
913                 v->read(reader);
914                 m_attribute.append(v);
915                 continue;
916             }
917             reader.raiseError(QLatin1String("Unexpected element ") + tag);
918         }
919             break;
920         case QXmlStreamReader::EndElement :
921             return;
922         default :
923             break;
924         }
925     }
926 }
927 
write(QXmlStreamWriter & writer,const QString & tagName) const928 void DomAction::write(QXmlStreamWriter &writer, const QString &tagName) const
929 {
930     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("action") : tagName.toLower());
931 
932     if (hasAttributeName())
933         writer.writeAttribute(QStringLiteral("name"), attributeName());
934 
935     if (hasAttributeMenu())
936         writer.writeAttribute(QStringLiteral("menu"), attributeMenu());
937 
938     for (DomProperty *v : m_property)
939         v->write(writer, QStringLiteral("property"));
940 
941     for (DomProperty *v : m_attribute)
942         v->write(writer, QStringLiteral("attribute"));
943 
944     writer.writeEndElement();
945 }
946 
setElementProperty(const QList<DomProperty * > & a)947 void DomAction::setElementProperty(const QList<DomProperty *> &a)
948 {
949     m_children |= Property;
950     m_property = a;
951 }
952 
setElementAttribute(const QList<DomProperty * > & a)953 void DomAction::setElementAttribute(const QList<DomProperty *> &a)
954 {
955     m_children |= Attribute;
956     m_attribute = a;
957 }
958 
959 DomActionRef::~DomActionRef() = default;
960 
read(QXmlStreamReader & reader)961 void DomActionRef::read(QXmlStreamReader &reader)
962 {
963     const QXmlStreamAttributes &attributes = reader.attributes();
964     for (const QXmlStreamAttribute &attribute : attributes) {
965         const auto name = attribute.name();
966         if (name == QLatin1String("name")) {
967             setAttributeName(attribute.value().toString());
968             continue;
969         }
970         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
971     }
972 
973     while (!reader.hasError()) {
974         switch (reader.readNext()) {
975         case QXmlStreamReader::StartElement : {
976             const auto tag = reader.name();
977             reader.raiseError(QLatin1String("Unexpected element ") + tag);
978         }
979             break;
980         case QXmlStreamReader::EndElement :
981             return;
982         default :
983             break;
984         }
985     }
986 }
987 
write(QXmlStreamWriter & writer,const QString & tagName) const988 void DomActionRef::write(QXmlStreamWriter &writer, const QString &tagName) const
989 {
990     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("actionref") : tagName.toLower());
991 
992     if (hasAttributeName())
993         writer.writeAttribute(QStringLiteral("name"), attributeName());
994 
995     writer.writeEndElement();
996 }
997 
~DomButtonGroup()998 DomButtonGroup::~DomButtonGroup()
999 {
1000     qDeleteAll(m_property);
1001     m_property.clear();
1002     qDeleteAll(m_attribute);
1003     m_attribute.clear();
1004 }
1005 
read(QXmlStreamReader & reader)1006 void DomButtonGroup::read(QXmlStreamReader &reader)
1007 {
1008     const QXmlStreamAttributes &attributes = reader.attributes();
1009     for (const QXmlStreamAttribute &attribute : attributes) {
1010         const auto name = attribute.name();
1011         if (name == QLatin1String("name")) {
1012             setAttributeName(attribute.value().toString());
1013             continue;
1014         }
1015         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1016     }
1017 
1018     while (!reader.hasError()) {
1019         switch (reader.readNext()) {
1020         case QXmlStreamReader::StartElement : {
1021             const auto tag = reader.name();
1022             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
1023                 auto *v = new DomProperty();
1024                 v->read(reader);
1025                 m_property.append(v);
1026                 continue;
1027             }
1028             if (!tag.compare(QLatin1String("attribute"), Qt::CaseInsensitive)) {
1029                 auto *v = new DomProperty();
1030                 v->read(reader);
1031                 m_attribute.append(v);
1032                 continue;
1033             }
1034             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1035         }
1036             break;
1037         case QXmlStreamReader::EndElement :
1038             return;
1039         default :
1040             break;
1041         }
1042     }
1043 }
1044 
write(QXmlStreamWriter & writer,const QString & tagName) const1045 void DomButtonGroup::write(QXmlStreamWriter &writer, const QString &tagName) const
1046 {
1047     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("buttongroup") : tagName.toLower());
1048 
1049     if (hasAttributeName())
1050         writer.writeAttribute(QStringLiteral("name"), attributeName());
1051 
1052     for (DomProperty *v : m_property)
1053         v->write(writer, QStringLiteral("property"));
1054 
1055     for (DomProperty *v : m_attribute)
1056         v->write(writer, QStringLiteral("attribute"));
1057 
1058     writer.writeEndElement();
1059 }
1060 
setElementProperty(const QList<DomProperty * > & a)1061 void DomButtonGroup::setElementProperty(const QList<DomProperty *> &a)
1062 {
1063     m_children |= Property;
1064     m_property = a;
1065 }
1066 
setElementAttribute(const QList<DomProperty * > & a)1067 void DomButtonGroup::setElementAttribute(const QList<DomProperty *> &a)
1068 {
1069     m_children |= Attribute;
1070     m_attribute = a;
1071 }
1072 
~DomButtonGroups()1073 DomButtonGroups::~DomButtonGroups()
1074 {
1075     qDeleteAll(m_buttonGroup);
1076     m_buttonGroup.clear();
1077 }
1078 
read(QXmlStreamReader & reader)1079 void DomButtonGroups::read(QXmlStreamReader &reader)
1080 {
1081     while (!reader.hasError()) {
1082         switch (reader.readNext()) {
1083         case QXmlStreamReader::StartElement : {
1084             const auto tag = reader.name();
1085             if (!tag.compare(QLatin1String("buttongroup"), Qt::CaseInsensitive)) {
1086                 auto *v = new DomButtonGroup();
1087                 v->read(reader);
1088                 m_buttonGroup.append(v);
1089                 continue;
1090             }
1091             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1092         }
1093             break;
1094         case QXmlStreamReader::EndElement :
1095             return;
1096         default :
1097             break;
1098         }
1099     }
1100 }
1101 
write(QXmlStreamWriter & writer,const QString & tagName) const1102 void DomButtonGroups::write(QXmlStreamWriter &writer, const QString &tagName) const
1103 {
1104     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("buttongroups") : tagName.toLower());
1105 
1106     for (DomButtonGroup *v : m_buttonGroup)
1107         v->write(writer, QStringLiteral("buttongroup"));
1108 
1109     writer.writeEndElement();
1110 }
1111 
setElementButtonGroup(const QVector<DomButtonGroup * > & a)1112 void DomButtonGroups::setElementButtonGroup(const QVector<DomButtonGroup *> &a)
1113 {
1114     m_children |= ButtonGroup;
1115     m_buttonGroup = a;
1116 }
1117 
~DomCustomWidgets()1118 DomCustomWidgets::~DomCustomWidgets()
1119 {
1120     qDeleteAll(m_customWidget);
1121     m_customWidget.clear();
1122 }
1123 
read(QXmlStreamReader & reader)1124 void DomCustomWidgets::read(QXmlStreamReader &reader)
1125 {
1126     while (!reader.hasError()) {
1127         switch (reader.readNext()) {
1128         case QXmlStreamReader::StartElement : {
1129             const auto tag = reader.name();
1130             if (!tag.compare(QLatin1String("customwidget"), Qt::CaseInsensitive)) {
1131                 auto *v = new DomCustomWidget();
1132                 v->read(reader);
1133                 m_customWidget.append(v);
1134                 continue;
1135             }
1136             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1137         }
1138             break;
1139         case QXmlStreamReader::EndElement :
1140             return;
1141         default :
1142             break;
1143         }
1144     }
1145 }
1146 
write(QXmlStreamWriter & writer,const QString & tagName) const1147 void DomCustomWidgets::write(QXmlStreamWriter &writer, const QString &tagName) const
1148 {
1149     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("customwidgets") : tagName.toLower());
1150 
1151     for (DomCustomWidget *v : m_customWidget)
1152         v->write(writer, QStringLiteral("customwidget"));
1153 
1154     writer.writeEndElement();
1155 }
1156 
setElementCustomWidget(const QVector<DomCustomWidget * > & a)1157 void DomCustomWidgets::setElementCustomWidget(const QVector<DomCustomWidget *> &a)
1158 {
1159     m_children |= CustomWidget;
1160     m_customWidget = a;
1161 }
1162 
1163 DomHeader::~DomHeader() = default;
1164 
read(QXmlStreamReader & reader)1165 void DomHeader::read(QXmlStreamReader &reader)
1166 {
1167     const QXmlStreamAttributes &attributes = reader.attributes();
1168     for (const QXmlStreamAttribute &attribute : attributes) {
1169         const auto name = attribute.name();
1170         if (name == QLatin1String("location")) {
1171             setAttributeLocation(attribute.value().toString());
1172             continue;
1173         }
1174         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1175     }
1176 
1177     while (!reader.hasError()) {
1178         switch (reader.readNext()) {
1179         case QXmlStreamReader::StartElement : {
1180             const auto tag = reader.name();
1181             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1182         }
1183             break;
1184         case QXmlStreamReader::EndElement :
1185             return;
1186         case QXmlStreamReader::Characters :
1187             if (!reader.isWhitespace())
1188                 m_text.append(reader.text().toString());
1189             break;
1190         default :
1191             break;
1192         }
1193     }
1194 }
1195 
write(QXmlStreamWriter & writer,const QString & tagName) const1196 void DomHeader::write(QXmlStreamWriter &writer, const QString &tagName) const
1197 {
1198     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("header") : tagName.toLower());
1199 
1200     if (hasAttributeLocation())
1201         writer.writeAttribute(QStringLiteral("location"), attributeLocation());
1202 
1203     if (!m_text.isEmpty())
1204         writer.writeCharacters(m_text);
1205 
1206     writer.writeEndElement();
1207 }
1208 
~DomCustomWidget()1209 DomCustomWidget::~DomCustomWidget()
1210 {
1211     delete m_header;
1212     delete m_sizeHint;
1213     delete m_slots;
1214     delete m_propertyspecifications;
1215 }
1216 
read(QXmlStreamReader & reader)1217 void DomCustomWidget::read(QXmlStreamReader &reader)
1218 {
1219     while (!reader.hasError()) {
1220         switch (reader.readNext()) {
1221         case QXmlStreamReader::StartElement : {
1222             const auto tag = reader.name();
1223             if (!tag.compare(QLatin1String("class"), Qt::CaseInsensitive)) {
1224                 setElementClass(reader.readElementText());
1225                 continue;
1226             }
1227             if (!tag.compare(QLatin1String("extends"), Qt::CaseInsensitive)) {
1228                 setElementExtends(reader.readElementText());
1229                 continue;
1230             }
1231             if (!tag.compare(QLatin1String("header"), Qt::CaseInsensitive)) {
1232                 auto *v = new DomHeader();
1233                 v->read(reader);
1234                 setElementHeader(v);
1235                 continue;
1236             }
1237             if (!tag.compare(QLatin1String("sizehint"), Qt::CaseInsensitive)) {
1238                 auto *v = new DomSize();
1239                 v->read(reader);
1240                 setElementSizeHint(v);
1241                 continue;
1242             }
1243             if (!tag.compare(QLatin1String("addpagemethod"), Qt::CaseInsensitive)) {
1244                 setElementAddPageMethod(reader.readElementText());
1245                 continue;
1246             }
1247             if (!tag.compare(QLatin1String("container"), Qt::CaseInsensitive)) {
1248                 setElementContainer(reader.readElementText().toInt());
1249                 continue;
1250             }
1251             if (!tag.compare(QLatin1String("sizepolicy"), Qt::CaseInsensitive)) {
1252                 qWarning("Omitting deprecated element <sizepolicy>.");
1253                 reader.skipCurrentElement();
1254                 continue;
1255             }
1256             if (!tag.compare(QLatin1String("pixmap"), Qt::CaseInsensitive)) {
1257                 setElementPixmap(reader.readElementText());
1258                 continue;
1259             }
1260             if (!tag.compare(QLatin1String("script"), Qt::CaseInsensitive)) {
1261                 qWarning("Omitting deprecated element <script>.");
1262                 reader.skipCurrentElement();
1263                 continue;
1264             }
1265             if (!tag.compare(QLatin1String("properties"), Qt::CaseInsensitive)) {
1266                 qWarning("Omitting deprecated element <properties>.");
1267                 reader.skipCurrentElement();
1268                 continue;
1269             }
1270             if (!tag.compare(QLatin1String("slots"), Qt::CaseInsensitive)) {
1271                 auto *v = new DomSlots();
1272                 v->read(reader);
1273                 setElementSlots(v);
1274                 continue;
1275             }
1276             if (!tag.compare(QLatin1String("propertyspecifications"), Qt::CaseInsensitive)) {
1277                 auto *v = new DomPropertySpecifications();
1278                 v->read(reader);
1279                 setElementPropertyspecifications(v);
1280                 continue;
1281             }
1282             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1283         }
1284             break;
1285         case QXmlStreamReader::EndElement :
1286             return;
1287         default :
1288             break;
1289         }
1290     }
1291 }
1292 
write(QXmlStreamWriter & writer,const QString & tagName) const1293 void DomCustomWidget::write(QXmlStreamWriter &writer, const QString &tagName) const
1294 {
1295     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("customwidget") : tagName.toLower());
1296 
1297     if (m_children & Class)
1298         writer.writeTextElement(QStringLiteral("class"), m_class);
1299 
1300     if (m_children & Extends)
1301         writer.writeTextElement(QStringLiteral("extends"), m_extends);
1302 
1303     if (m_children & Header)
1304         m_header->write(writer, QStringLiteral("header"));
1305 
1306     if (m_children & SizeHint)
1307         m_sizeHint->write(writer, QStringLiteral("sizehint"));
1308 
1309     if (m_children & AddPageMethod)
1310         writer.writeTextElement(QStringLiteral("addpagemethod"), m_addPageMethod);
1311 
1312     if (m_children & Container)
1313         writer.writeTextElement(QStringLiteral("container"), QString::number(m_container));
1314 
1315     if (m_children & Pixmap)
1316         writer.writeTextElement(QStringLiteral("pixmap"), m_pixmap);
1317 
1318     if (m_children & Slots)
1319         m_slots->write(writer, QStringLiteral("slots"));
1320 
1321     if (m_children & Propertyspecifications)
1322         m_propertyspecifications->write(writer, QStringLiteral("propertyspecifications"));
1323 
1324     writer.writeEndElement();
1325 }
1326 
setElementClass(const QString & a)1327 void DomCustomWidget::setElementClass(const QString &a)
1328 {
1329     m_children |= Class;
1330     m_class = a;
1331 }
1332 
setElementExtends(const QString & a)1333 void DomCustomWidget::setElementExtends(const QString &a)
1334 {
1335     m_children |= Extends;
1336     m_extends = a;
1337 }
1338 
takeElementHeader()1339 DomHeader *DomCustomWidget::takeElementHeader()
1340 {
1341     DomHeader *a = m_header;
1342     m_header = nullptr;
1343     m_children ^= Header;
1344     return a;
1345 }
1346 
setElementHeader(DomHeader * a)1347 void DomCustomWidget::setElementHeader(DomHeader *a)
1348 {
1349     delete m_header;
1350     m_children |= Header;
1351     m_header = a;
1352 }
1353 
takeElementSizeHint()1354 DomSize *DomCustomWidget::takeElementSizeHint()
1355 {
1356     DomSize *a = m_sizeHint;
1357     m_sizeHint = nullptr;
1358     m_children ^= SizeHint;
1359     return a;
1360 }
1361 
setElementSizeHint(DomSize * a)1362 void DomCustomWidget::setElementSizeHint(DomSize *a)
1363 {
1364     delete m_sizeHint;
1365     m_children |= SizeHint;
1366     m_sizeHint = a;
1367 }
1368 
setElementAddPageMethod(const QString & a)1369 void DomCustomWidget::setElementAddPageMethod(const QString &a)
1370 {
1371     m_children |= AddPageMethod;
1372     m_addPageMethod = a;
1373 }
1374 
setElementContainer(int a)1375 void DomCustomWidget::setElementContainer(int a)
1376 {
1377     m_children |= Container;
1378     m_container = a;
1379 }
1380 
setElementPixmap(const QString & a)1381 void DomCustomWidget::setElementPixmap(const QString &a)
1382 {
1383     m_children |= Pixmap;
1384     m_pixmap = a;
1385 }
1386 
takeElementSlots()1387 DomSlots *DomCustomWidget::takeElementSlots()
1388 {
1389     DomSlots *a = m_slots;
1390     m_slots = nullptr;
1391     m_children ^= Slots;
1392     return a;
1393 }
1394 
setElementSlots(DomSlots * a)1395 void DomCustomWidget::setElementSlots(DomSlots *a)
1396 {
1397     delete m_slots;
1398     m_children |= Slots;
1399     m_slots = a;
1400 }
1401 
takeElementPropertyspecifications()1402 DomPropertySpecifications *DomCustomWidget::takeElementPropertyspecifications()
1403 {
1404     DomPropertySpecifications *a = m_propertyspecifications;
1405     m_propertyspecifications = nullptr;
1406     m_children ^= Propertyspecifications;
1407     return a;
1408 }
1409 
setElementPropertyspecifications(DomPropertySpecifications * a)1410 void DomCustomWidget::setElementPropertyspecifications(DomPropertySpecifications *a)
1411 {
1412     delete m_propertyspecifications;
1413     m_children |= Propertyspecifications;
1414     m_propertyspecifications = a;
1415 }
1416 
clearElementClass()1417 void DomCustomWidget::clearElementClass()
1418 {
1419     m_children &= ~Class;
1420 }
1421 
clearElementExtends()1422 void DomCustomWidget::clearElementExtends()
1423 {
1424     m_children &= ~Extends;
1425 }
1426 
clearElementHeader()1427 void DomCustomWidget::clearElementHeader()
1428 {
1429     delete m_header;
1430     m_header = nullptr;
1431     m_children &= ~Header;
1432 }
1433 
clearElementSizeHint()1434 void DomCustomWidget::clearElementSizeHint()
1435 {
1436     delete m_sizeHint;
1437     m_sizeHint = nullptr;
1438     m_children &= ~SizeHint;
1439 }
1440 
clearElementAddPageMethod()1441 void DomCustomWidget::clearElementAddPageMethod()
1442 {
1443     m_children &= ~AddPageMethod;
1444 }
1445 
clearElementContainer()1446 void DomCustomWidget::clearElementContainer()
1447 {
1448     m_children &= ~Container;
1449 }
1450 
clearElementPixmap()1451 void DomCustomWidget::clearElementPixmap()
1452 {
1453     m_children &= ~Pixmap;
1454 }
1455 
clearElementSlots()1456 void DomCustomWidget::clearElementSlots()
1457 {
1458     delete m_slots;
1459     m_slots = nullptr;
1460     m_children &= ~Slots;
1461 }
1462 
clearElementPropertyspecifications()1463 void DomCustomWidget::clearElementPropertyspecifications()
1464 {
1465     delete m_propertyspecifications;
1466     m_propertyspecifications = nullptr;
1467     m_children &= ~Propertyspecifications;
1468 }
1469 
1470 DomLayoutDefault::~DomLayoutDefault() = default;
1471 
read(QXmlStreamReader & reader)1472 void DomLayoutDefault::read(QXmlStreamReader &reader)
1473 {
1474     const QXmlStreamAttributes &attributes = reader.attributes();
1475     for (const QXmlStreamAttribute &attribute : attributes) {
1476         const auto name = attribute.name();
1477         if (name == QLatin1String("spacing")) {
1478             setAttributeSpacing(attribute.value().toInt());
1479             continue;
1480         }
1481         if (name == QLatin1String("margin")) {
1482             setAttributeMargin(attribute.value().toInt());
1483             continue;
1484         }
1485         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1486     }
1487 
1488     while (!reader.hasError()) {
1489         switch (reader.readNext()) {
1490         case QXmlStreamReader::StartElement : {
1491             const auto tag = reader.name();
1492             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1493         }
1494             break;
1495         case QXmlStreamReader::EndElement :
1496             return;
1497         default :
1498             break;
1499         }
1500     }
1501 }
1502 
write(QXmlStreamWriter & writer,const QString & tagName) const1503 void DomLayoutDefault::write(QXmlStreamWriter &writer, const QString &tagName) const
1504 {
1505     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("layoutdefault") : tagName.toLower());
1506 
1507     if (hasAttributeSpacing())
1508         writer.writeAttribute(QStringLiteral("spacing"), QString::number(attributeSpacing()));
1509 
1510     if (hasAttributeMargin())
1511         writer.writeAttribute(QStringLiteral("margin"), QString::number(attributeMargin()));
1512 
1513     writer.writeEndElement();
1514 }
1515 
1516 DomLayoutFunction::~DomLayoutFunction() = default;
1517 
read(QXmlStreamReader & reader)1518 void DomLayoutFunction::read(QXmlStreamReader &reader)
1519 {
1520     const QXmlStreamAttributes &attributes = reader.attributes();
1521     for (const QXmlStreamAttribute &attribute : attributes) {
1522         const auto name = attribute.name();
1523         if (name == QLatin1String("spacing")) {
1524             setAttributeSpacing(attribute.value().toString());
1525             continue;
1526         }
1527         if (name == QLatin1String("margin")) {
1528             setAttributeMargin(attribute.value().toString());
1529             continue;
1530         }
1531         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1532     }
1533 
1534     while (!reader.hasError()) {
1535         switch (reader.readNext()) {
1536         case QXmlStreamReader::StartElement : {
1537             const auto tag = reader.name();
1538             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1539         }
1540             break;
1541         case QXmlStreamReader::EndElement :
1542             return;
1543         default :
1544             break;
1545         }
1546     }
1547 }
1548 
write(QXmlStreamWriter & writer,const QString & tagName) const1549 void DomLayoutFunction::write(QXmlStreamWriter &writer, const QString &tagName) const
1550 {
1551     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("layoutfunction") : tagName.toLower());
1552 
1553     if (hasAttributeSpacing())
1554         writer.writeAttribute(QStringLiteral("spacing"), attributeSpacing());
1555 
1556     if (hasAttributeMargin())
1557         writer.writeAttribute(QStringLiteral("margin"), attributeMargin());
1558 
1559     writer.writeEndElement();
1560 }
1561 
~DomTabStops()1562 DomTabStops::~DomTabStops()
1563 {
1564     m_tabStop.clear();
1565 }
1566 
read(QXmlStreamReader & reader)1567 void DomTabStops::read(QXmlStreamReader &reader)
1568 {
1569     while (!reader.hasError()) {
1570         switch (reader.readNext()) {
1571         case QXmlStreamReader::StartElement : {
1572             const auto tag = reader.name();
1573             if (!tag.compare(QLatin1String("tabstop"), Qt::CaseInsensitive)) {
1574                 m_tabStop.append(reader.readElementText());
1575                 continue;
1576             }
1577             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1578         }
1579             break;
1580         case QXmlStreamReader::EndElement :
1581             return;
1582         default :
1583             break;
1584         }
1585     }
1586 }
1587 
write(QXmlStreamWriter & writer,const QString & tagName) const1588 void DomTabStops::write(QXmlStreamWriter &writer, const QString &tagName) const
1589 {
1590     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("tabstops") : tagName.toLower());
1591 
1592     for (const QString &v : m_tabStop)
1593         writer.writeTextElement(QStringLiteral("tabstop"), v);
1594 
1595     writer.writeEndElement();
1596 }
1597 
setElementTabStop(const QStringList & a)1598 void DomTabStops::setElementTabStop(const QStringList &a)
1599 {
1600     m_children |= TabStop;
1601     m_tabStop = a;
1602 }
1603 
~DomLayout()1604 DomLayout::~DomLayout()
1605 {
1606     qDeleteAll(m_property);
1607     m_property.clear();
1608     qDeleteAll(m_attribute);
1609     m_attribute.clear();
1610     qDeleteAll(m_item);
1611     m_item.clear();
1612 }
1613 
read(QXmlStreamReader & reader)1614 void DomLayout::read(QXmlStreamReader &reader)
1615 {
1616     const QXmlStreamAttributes &attributes = reader.attributes();
1617     for (const QXmlStreamAttribute &attribute : attributes) {
1618         const auto name = attribute.name();
1619         if (name == QLatin1String("class")) {
1620             setAttributeClass(attribute.value().toString());
1621             continue;
1622         }
1623         if (name == QLatin1String("name")) {
1624             setAttributeName(attribute.value().toString());
1625             continue;
1626         }
1627         if (name == QLatin1String("stretch")) {
1628             setAttributeStretch(attribute.value().toString());
1629             continue;
1630         }
1631         if (name == QLatin1String("rowstretch")) {
1632             setAttributeRowStretch(attribute.value().toString());
1633             continue;
1634         }
1635         if (name == QLatin1String("columnstretch")) {
1636             setAttributeColumnStretch(attribute.value().toString());
1637             continue;
1638         }
1639         if (name == QLatin1String("rowminimumheight")) {
1640             setAttributeRowMinimumHeight(attribute.value().toString());
1641             continue;
1642         }
1643         if (name == QLatin1String("columnminimumwidth")) {
1644             setAttributeColumnMinimumWidth(attribute.value().toString());
1645             continue;
1646         }
1647         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1648     }
1649 
1650     while (!reader.hasError()) {
1651         switch (reader.readNext()) {
1652         case QXmlStreamReader::StartElement : {
1653             const auto tag = reader.name();
1654             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
1655                 auto *v = new DomProperty();
1656                 v->read(reader);
1657                 m_property.append(v);
1658                 continue;
1659             }
1660             if (!tag.compare(QLatin1String("attribute"), Qt::CaseInsensitive)) {
1661                 auto *v = new DomProperty();
1662                 v->read(reader);
1663                 m_attribute.append(v);
1664                 continue;
1665             }
1666             if (!tag.compare(QLatin1String("item"), Qt::CaseInsensitive)) {
1667                 auto *v = new DomLayoutItem();
1668                 v->read(reader);
1669                 m_item.append(v);
1670                 continue;
1671             }
1672             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1673         }
1674             break;
1675         case QXmlStreamReader::EndElement :
1676             return;
1677         default :
1678             break;
1679         }
1680     }
1681 }
1682 
write(QXmlStreamWriter & writer,const QString & tagName) const1683 void DomLayout::write(QXmlStreamWriter &writer, const QString &tagName) const
1684 {
1685     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("layout") : tagName.toLower());
1686 
1687     if (hasAttributeClass())
1688         writer.writeAttribute(QStringLiteral("class"), attributeClass());
1689 
1690     if (hasAttributeName())
1691         writer.writeAttribute(QStringLiteral("name"), attributeName());
1692 
1693     if (hasAttributeStretch())
1694         writer.writeAttribute(QStringLiteral("stretch"), attributeStretch());
1695 
1696     if (hasAttributeRowStretch())
1697         writer.writeAttribute(QStringLiteral("rowstretch"), attributeRowStretch());
1698 
1699     if (hasAttributeColumnStretch())
1700         writer.writeAttribute(QStringLiteral("columnstretch"), attributeColumnStretch());
1701 
1702     if (hasAttributeRowMinimumHeight())
1703         writer.writeAttribute(QStringLiteral("rowminimumheight"), attributeRowMinimumHeight());
1704 
1705     if (hasAttributeColumnMinimumWidth())
1706         writer.writeAttribute(QStringLiteral("columnminimumwidth"), attributeColumnMinimumWidth());
1707 
1708     for (DomProperty *v : m_property)
1709         v->write(writer, QStringLiteral("property"));
1710 
1711     for (DomProperty *v : m_attribute)
1712         v->write(writer, QStringLiteral("attribute"));
1713 
1714     for (DomLayoutItem *v : m_item)
1715         v->write(writer, QStringLiteral("item"));
1716 
1717     writer.writeEndElement();
1718 }
1719 
setElementProperty(const QList<DomProperty * > & a)1720 void DomLayout::setElementProperty(const QList<DomProperty *> &a)
1721 {
1722     m_children |= Property;
1723     m_property = a;
1724 }
1725 
setElementAttribute(const QList<DomProperty * > & a)1726 void DomLayout::setElementAttribute(const QList<DomProperty *> &a)
1727 {
1728     m_children |= Attribute;
1729     m_attribute = a;
1730 }
1731 
setElementItem(const QVector<DomLayoutItem * > & a)1732 void DomLayout::setElementItem(const QVector<DomLayoutItem *> &a)
1733 {
1734     m_children |= Item;
1735     m_item = a;
1736 }
1737 
~DomLayoutItem()1738 DomLayoutItem::~DomLayoutItem()
1739 {
1740     delete m_widget;
1741     delete m_layout;
1742     delete m_spacer;
1743 }
1744 
clear()1745 void DomLayoutItem::clear()
1746 {
1747     delete m_widget;
1748     delete m_layout;
1749     delete m_spacer;
1750 
1751     m_kind = Unknown;
1752 
1753     m_widget = nullptr;
1754     m_layout = nullptr;
1755     m_spacer = nullptr;
1756 }
1757 
read(QXmlStreamReader & reader)1758 void DomLayoutItem::read(QXmlStreamReader &reader)
1759 {
1760     const QXmlStreamAttributes &attributes = reader.attributes();
1761     for (const QXmlStreamAttribute &attribute : attributes) {
1762         const auto name = attribute.name();
1763         if (name == QLatin1String("row")) {
1764             setAttributeRow(attribute.value().toInt());
1765             continue;
1766         }
1767         if (name == QLatin1String("column")) {
1768             setAttributeColumn(attribute.value().toInt());
1769             continue;
1770         }
1771         if (name == QLatin1String("rowspan")) {
1772             setAttributeRowSpan(attribute.value().toInt());
1773             continue;
1774         }
1775         if (name == QLatin1String("colspan")) {
1776             setAttributeColSpan(attribute.value().toInt());
1777             continue;
1778         }
1779         if (name == QLatin1String("alignment")) {
1780             setAttributeAlignment(attribute.value().toString());
1781             continue;
1782         }
1783         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
1784     }
1785 
1786     while (!reader.hasError()) {
1787         switch (reader.readNext()) {
1788         case QXmlStreamReader::StartElement : {
1789             const auto tag = reader.name();
1790             if (!tag.compare(QLatin1String("widget"), Qt::CaseInsensitive)) {
1791                 auto *v = new DomWidget();
1792                 v->read(reader);
1793                 setElementWidget(v);
1794                 continue;
1795             }
1796             if (!tag.compare(QLatin1String("layout"), Qt::CaseInsensitive)) {
1797                 auto *v = new DomLayout();
1798                 v->read(reader);
1799                 setElementLayout(v);
1800                 continue;
1801             }
1802             if (!tag.compare(QLatin1String("spacer"), Qt::CaseInsensitive)) {
1803                 auto *v = new DomSpacer();
1804                 v->read(reader);
1805                 setElementSpacer(v);
1806                 continue;
1807             }
1808             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1809         }
1810             break;
1811         case QXmlStreamReader::EndElement :
1812             return;
1813         default :
1814             break;
1815         }
1816     }
1817 }
1818 
write(QXmlStreamWriter & writer,const QString & tagName) const1819 void DomLayoutItem::write(QXmlStreamWriter &writer, const QString &tagName) const
1820 {
1821     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("layoutitem") : tagName.toLower());
1822 
1823     if (hasAttributeRow())
1824         writer.writeAttribute(QStringLiteral("row"), QString::number(attributeRow()));
1825 
1826     if (hasAttributeColumn())
1827         writer.writeAttribute(QStringLiteral("column"), QString::number(attributeColumn()));
1828 
1829     if (hasAttributeRowSpan())
1830         writer.writeAttribute(QStringLiteral("rowspan"), QString::number(attributeRowSpan()));
1831 
1832     if (hasAttributeColSpan())
1833         writer.writeAttribute(QStringLiteral("colspan"), QString::number(attributeColSpan()));
1834 
1835     if (hasAttributeAlignment())
1836         writer.writeAttribute(QStringLiteral("alignment"), attributeAlignment());
1837 
1838     switch (kind()) {
1839     case Widget:
1840         if (m_widget != nullptr)
1841             m_widget->write(writer, QStringLiteral("widget"));
1842         break;
1843 
1844     case Layout:
1845         if (m_layout != nullptr)
1846             m_layout->write(writer, QStringLiteral("layout"));
1847         break;
1848 
1849     case Spacer:
1850         if (m_spacer != nullptr)
1851             m_spacer->write(writer, QStringLiteral("spacer"));
1852         break;
1853 
1854     default:
1855         break;
1856     }
1857     writer.writeEndElement();
1858 }
1859 
takeElementWidget()1860 DomWidget *DomLayoutItem::takeElementWidget()
1861 {
1862     DomWidget *a = m_widget;
1863     m_widget = nullptr;
1864     return a;
1865 }
1866 
setElementWidget(DomWidget * a)1867 void DomLayoutItem::setElementWidget(DomWidget *a)
1868 {
1869     clear();
1870     m_kind = Widget;
1871     m_widget = a;
1872 }
1873 
takeElementLayout()1874 DomLayout *DomLayoutItem::takeElementLayout()
1875 {
1876     DomLayout *a = m_layout;
1877     m_layout = nullptr;
1878     return a;
1879 }
1880 
setElementLayout(DomLayout * a)1881 void DomLayoutItem::setElementLayout(DomLayout *a)
1882 {
1883     clear();
1884     m_kind = Layout;
1885     m_layout = a;
1886 }
1887 
takeElementSpacer()1888 DomSpacer *DomLayoutItem::takeElementSpacer()
1889 {
1890     DomSpacer *a = m_spacer;
1891     m_spacer = nullptr;
1892     return a;
1893 }
1894 
setElementSpacer(DomSpacer * a)1895 void DomLayoutItem::setElementSpacer(DomSpacer *a)
1896 {
1897     clear();
1898     m_kind = Spacer;
1899     m_spacer = a;
1900 }
1901 
~DomRow()1902 DomRow::~DomRow()
1903 {
1904     qDeleteAll(m_property);
1905     m_property.clear();
1906 }
1907 
read(QXmlStreamReader & reader)1908 void DomRow::read(QXmlStreamReader &reader)
1909 {
1910     while (!reader.hasError()) {
1911         switch (reader.readNext()) {
1912         case QXmlStreamReader::StartElement : {
1913             const auto tag = reader.name();
1914             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
1915                 auto *v = new DomProperty();
1916                 v->read(reader);
1917                 m_property.append(v);
1918                 continue;
1919             }
1920             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1921         }
1922             break;
1923         case QXmlStreamReader::EndElement :
1924             return;
1925         default :
1926             break;
1927         }
1928     }
1929 }
1930 
write(QXmlStreamWriter & writer,const QString & tagName) const1931 void DomRow::write(QXmlStreamWriter &writer, const QString &tagName) const
1932 {
1933     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("row") : tagName.toLower());
1934 
1935     for (DomProperty *v : m_property)
1936         v->write(writer, QStringLiteral("property"));
1937 
1938     writer.writeEndElement();
1939 }
1940 
setElementProperty(const QList<DomProperty * > & a)1941 void DomRow::setElementProperty(const QList<DomProperty *> &a)
1942 {
1943     m_children |= Property;
1944     m_property = a;
1945 }
1946 
~DomColumn()1947 DomColumn::~DomColumn()
1948 {
1949     qDeleteAll(m_property);
1950     m_property.clear();
1951 }
1952 
read(QXmlStreamReader & reader)1953 void DomColumn::read(QXmlStreamReader &reader)
1954 {
1955     while (!reader.hasError()) {
1956         switch (reader.readNext()) {
1957         case QXmlStreamReader::StartElement : {
1958             const auto tag = reader.name();
1959             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
1960                 auto *v = new DomProperty();
1961                 v->read(reader);
1962                 m_property.append(v);
1963                 continue;
1964             }
1965             reader.raiseError(QLatin1String("Unexpected element ") + tag);
1966         }
1967             break;
1968         case QXmlStreamReader::EndElement :
1969             return;
1970         default :
1971             break;
1972         }
1973     }
1974 }
1975 
write(QXmlStreamWriter & writer,const QString & tagName) const1976 void DomColumn::write(QXmlStreamWriter &writer, const QString &tagName) const
1977 {
1978     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("column") : tagName.toLower());
1979 
1980     for (DomProperty *v : m_property)
1981         v->write(writer, QStringLiteral("property"));
1982 
1983     writer.writeEndElement();
1984 }
1985 
setElementProperty(const QList<DomProperty * > & a)1986 void DomColumn::setElementProperty(const QList<DomProperty *> &a)
1987 {
1988     m_children |= Property;
1989     m_property = a;
1990 }
1991 
~DomItem()1992 DomItem::~DomItem()
1993 {
1994     qDeleteAll(m_property);
1995     m_property.clear();
1996     qDeleteAll(m_item);
1997     m_item.clear();
1998 }
1999 
read(QXmlStreamReader & reader)2000 void DomItem::read(QXmlStreamReader &reader)
2001 {
2002     const QXmlStreamAttributes &attributes = reader.attributes();
2003     for (const QXmlStreamAttribute &attribute : attributes) {
2004         const auto name = attribute.name();
2005         if (name == QLatin1String("row")) {
2006             setAttributeRow(attribute.value().toInt());
2007             continue;
2008         }
2009         if (name == QLatin1String("column")) {
2010             setAttributeColumn(attribute.value().toInt());
2011             continue;
2012         }
2013         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2014     }
2015 
2016     while (!reader.hasError()) {
2017         switch (reader.readNext()) {
2018         case QXmlStreamReader::StartElement : {
2019             const auto tag = reader.name();
2020             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
2021                 auto *v = new DomProperty();
2022                 v->read(reader);
2023                 m_property.append(v);
2024                 continue;
2025             }
2026             if (!tag.compare(QLatin1String("item"), Qt::CaseInsensitive)) {
2027                 auto *v = new DomItem();
2028                 v->read(reader);
2029                 m_item.append(v);
2030                 continue;
2031             }
2032             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2033         }
2034             break;
2035         case QXmlStreamReader::EndElement :
2036             return;
2037         default :
2038             break;
2039         }
2040     }
2041 }
2042 
write(QXmlStreamWriter & writer,const QString & tagName) const2043 void DomItem::write(QXmlStreamWriter &writer, const QString &tagName) const
2044 {
2045     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("item") : tagName.toLower());
2046 
2047     if (hasAttributeRow())
2048         writer.writeAttribute(QStringLiteral("row"), QString::number(attributeRow()));
2049 
2050     if (hasAttributeColumn())
2051         writer.writeAttribute(QStringLiteral("column"), QString::number(attributeColumn()));
2052 
2053     for (DomProperty *v : m_property)
2054         v->write(writer, QStringLiteral("property"));
2055 
2056     for (DomItem *v : m_item)
2057         v->write(writer, QStringLiteral("item"));
2058 
2059     writer.writeEndElement();
2060 }
2061 
setElementProperty(const QList<DomProperty * > & a)2062 void DomItem::setElementProperty(const QList<DomProperty *> &a)
2063 {
2064     m_children |= Property;
2065     m_property = a;
2066 }
2067 
setElementItem(const QVector<DomItem * > & a)2068 void DomItem::setElementItem(const QVector<DomItem *> &a)
2069 {
2070     m_children |= Item;
2071     m_item = a;
2072 }
2073 
~DomWidget()2074 DomWidget::~DomWidget()
2075 {
2076     m_class.clear();
2077     qDeleteAll(m_property);
2078     m_property.clear();
2079     qDeleteAll(m_attribute);
2080     m_attribute.clear();
2081     qDeleteAll(m_row);
2082     m_row.clear();
2083     qDeleteAll(m_column);
2084     m_column.clear();
2085     qDeleteAll(m_item);
2086     m_item.clear();
2087     qDeleteAll(m_layout);
2088     m_layout.clear();
2089     qDeleteAll(m_widget);
2090     m_widget.clear();
2091     qDeleteAll(m_action);
2092     m_action.clear();
2093     qDeleteAll(m_actionGroup);
2094     m_actionGroup.clear();
2095     qDeleteAll(m_addAction);
2096     m_addAction.clear();
2097     m_zOrder.clear();
2098 }
2099 
read(QXmlStreamReader & reader)2100 void DomWidget::read(QXmlStreamReader &reader)
2101 {
2102     const QXmlStreamAttributes &attributes = reader.attributes();
2103     for (const QXmlStreamAttribute &attribute : attributes) {
2104         const auto name = attribute.name();
2105         if (name == QLatin1String("class")) {
2106             setAttributeClass(attribute.value().toString());
2107             continue;
2108         }
2109         if (name == QLatin1String("name")) {
2110             setAttributeName(attribute.value().toString());
2111             continue;
2112         }
2113         if (name == QLatin1String("native")) {
2114             setAttributeNative(attribute.value() == QLatin1String("true"));
2115             continue;
2116         }
2117         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2118     }
2119 
2120     while (!reader.hasError()) {
2121         switch (reader.readNext()) {
2122         case QXmlStreamReader::StartElement : {
2123             const auto tag = reader.name();
2124             if (!tag.compare(QLatin1String("class"), Qt::CaseInsensitive)) {
2125                 m_class.append(reader.readElementText());
2126                 continue;
2127             }
2128             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
2129                 auto *v = new DomProperty();
2130                 v->read(reader);
2131                 m_property.append(v);
2132                 continue;
2133             }
2134             if (!tag.compare(QLatin1String("script"), Qt::CaseInsensitive)) {
2135                 qWarning("Omitting deprecated element <script>.");
2136                 reader.skipCurrentElement();
2137                 continue;
2138             }
2139             if (!tag.compare(QLatin1String("widgetdata"), Qt::CaseInsensitive)) {
2140                 qWarning("Omitting deprecated element <widgetdata>.");
2141                 reader.skipCurrentElement();
2142                 continue;
2143             }
2144             if (!tag.compare(QLatin1String("attribute"), Qt::CaseInsensitive)) {
2145                 auto *v = new DomProperty();
2146                 v->read(reader);
2147                 m_attribute.append(v);
2148                 continue;
2149             }
2150             if (!tag.compare(QLatin1String("row"), Qt::CaseInsensitive)) {
2151                 auto *v = new DomRow();
2152                 v->read(reader);
2153                 m_row.append(v);
2154                 continue;
2155             }
2156             if (!tag.compare(QLatin1String("column"), Qt::CaseInsensitive)) {
2157                 auto *v = new DomColumn();
2158                 v->read(reader);
2159                 m_column.append(v);
2160                 continue;
2161             }
2162             if (!tag.compare(QLatin1String("item"), Qt::CaseInsensitive)) {
2163                 auto *v = new DomItem();
2164                 v->read(reader);
2165                 m_item.append(v);
2166                 continue;
2167             }
2168             if (!tag.compare(QLatin1String("layout"), Qt::CaseInsensitive)) {
2169                 auto *v = new DomLayout();
2170                 v->read(reader);
2171                 m_layout.append(v);
2172                 continue;
2173             }
2174             if (!tag.compare(QLatin1String("widget"), Qt::CaseInsensitive)) {
2175                 auto *v = new DomWidget();
2176                 v->read(reader);
2177                 m_widget.append(v);
2178                 continue;
2179             }
2180             if (!tag.compare(QLatin1String("action"), Qt::CaseInsensitive)) {
2181                 auto *v = new DomAction();
2182                 v->read(reader);
2183                 m_action.append(v);
2184                 continue;
2185             }
2186             if (!tag.compare(QLatin1String("actiongroup"), Qt::CaseInsensitive)) {
2187                 auto *v = new DomActionGroup();
2188                 v->read(reader);
2189                 m_actionGroup.append(v);
2190                 continue;
2191             }
2192             if (!tag.compare(QLatin1String("addaction"), Qt::CaseInsensitive)) {
2193                 auto *v = new DomActionRef();
2194                 v->read(reader);
2195                 m_addAction.append(v);
2196                 continue;
2197             }
2198             if (!tag.compare(QLatin1String("zorder"), Qt::CaseInsensitive)) {
2199                 m_zOrder.append(reader.readElementText());
2200                 continue;
2201             }
2202             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2203         }
2204             break;
2205         case QXmlStreamReader::EndElement :
2206             return;
2207         default :
2208             break;
2209         }
2210     }
2211 }
2212 
write(QXmlStreamWriter & writer,const QString & tagName) const2213 void DomWidget::write(QXmlStreamWriter &writer, const QString &tagName) const
2214 {
2215     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("widget") : tagName.toLower());
2216 
2217     if (hasAttributeClass())
2218         writer.writeAttribute(QStringLiteral("class"), attributeClass());
2219 
2220     if (hasAttributeName())
2221         writer.writeAttribute(QStringLiteral("name"), attributeName());
2222 
2223     if (hasAttributeNative())
2224         writer.writeAttribute(QStringLiteral("native"), (attributeNative() ? QLatin1String("true") : QLatin1String("false")));
2225 
2226     for (const QString &v : m_class)
2227         writer.writeTextElement(QStringLiteral("class"), v);
2228 
2229     for (DomProperty *v : m_property)
2230         v->write(writer, QStringLiteral("property"));
2231 
2232     for (DomProperty *v : m_attribute)
2233         v->write(writer, QStringLiteral("attribute"));
2234 
2235     for (DomRow *v : m_row)
2236         v->write(writer, QStringLiteral("row"));
2237 
2238     for (DomColumn *v : m_column)
2239         v->write(writer, QStringLiteral("column"));
2240 
2241     for (DomItem *v : m_item)
2242         v->write(writer, QStringLiteral("item"));
2243 
2244     for (DomLayout *v : m_layout)
2245         v->write(writer, QStringLiteral("layout"));
2246 
2247     for (DomWidget *v : m_widget)
2248         v->write(writer, QStringLiteral("widget"));
2249 
2250     for (DomAction *v : m_action)
2251         v->write(writer, QStringLiteral("action"));
2252 
2253     for (DomActionGroup *v : m_actionGroup)
2254         v->write(writer, QStringLiteral("actiongroup"));
2255 
2256     for (DomActionRef *v : m_addAction)
2257         v->write(writer, QStringLiteral("addaction"));
2258 
2259     for (const QString &v : m_zOrder)
2260         writer.writeTextElement(QStringLiteral("zorder"), v);
2261 
2262     writer.writeEndElement();
2263 }
2264 
setElementClass(const QStringList & a)2265 void DomWidget::setElementClass(const QStringList &a)
2266 {
2267     m_children |= Class;
2268     m_class = a;
2269 }
2270 
setElementProperty(const QList<DomProperty * > & a)2271 void DomWidget::setElementProperty(const QList<DomProperty *> &a)
2272 {
2273     m_children |= Property;
2274     m_property = a;
2275 }
2276 
setElementAttribute(const QList<DomProperty * > & a)2277 void DomWidget::setElementAttribute(const QList<DomProperty *> &a)
2278 {
2279     m_children |= Attribute;
2280     m_attribute = a;
2281 }
2282 
setElementRow(const QVector<DomRow * > & a)2283 void DomWidget::setElementRow(const QVector<DomRow *> &a)
2284 {
2285     m_children |= Row;
2286     m_row = a;
2287 }
2288 
setElementColumn(const QVector<DomColumn * > & a)2289 void DomWidget::setElementColumn(const QVector<DomColumn *> &a)
2290 {
2291     m_children |= Column;
2292     m_column = a;
2293 }
2294 
setElementItem(const QVector<DomItem * > & a)2295 void DomWidget::setElementItem(const QVector<DomItem *> &a)
2296 {
2297     m_children |= Item;
2298     m_item = a;
2299 }
2300 
setElementLayout(const QVector<DomLayout * > & a)2301 void DomWidget::setElementLayout(const QVector<DomLayout *> &a)
2302 {
2303     m_children |= Layout;
2304     m_layout = a;
2305 }
2306 
setElementWidget(const QVector<DomWidget * > & a)2307 void DomWidget::setElementWidget(const QVector<DomWidget *> &a)
2308 {
2309     m_children |= Widget;
2310     m_widget = a;
2311 }
2312 
setElementAction(const QVector<DomAction * > & a)2313 void DomWidget::setElementAction(const QVector<DomAction *> &a)
2314 {
2315     m_children |= Action;
2316     m_action = a;
2317 }
2318 
setElementActionGroup(const QVector<DomActionGroup * > & a)2319 void DomWidget::setElementActionGroup(const QVector<DomActionGroup *> &a)
2320 {
2321     m_children |= ActionGroup;
2322     m_actionGroup = a;
2323 }
2324 
setElementAddAction(const QVector<DomActionRef * > & a)2325 void DomWidget::setElementAddAction(const QVector<DomActionRef *> &a)
2326 {
2327     m_children |= AddAction;
2328     m_addAction = a;
2329 }
2330 
setElementZOrder(const QStringList & a)2331 void DomWidget::setElementZOrder(const QStringList &a)
2332 {
2333     m_children |= ZOrder;
2334     m_zOrder = a;
2335 }
2336 
~DomSpacer()2337 DomSpacer::~DomSpacer()
2338 {
2339     qDeleteAll(m_property);
2340     m_property.clear();
2341 }
2342 
read(QXmlStreamReader & reader)2343 void DomSpacer::read(QXmlStreamReader &reader)
2344 {
2345     const QXmlStreamAttributes &attributes = reader.attributes();
2346     for (const QXmlStreamAttribute &attribute : attributes) {
2347         const auto name = attribute.name();
2348         if (name == QLatin1String("name")) {
2349             setAttributeName(attribute.value().toString());
2350             continue;
2351         }
2352         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2353     }
2354 
2355     while (!reader.hasError()) {
2356         switch (reader.readNext()) {
2357         case QXmlStreamReader::StartElement : {
2358             const auto tag = reader.name();
2359             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
2360                 auto *v = new DomProperty();
2361                 v->read(reader);
2362                 m_property.append(v);
2363                 continue;
2364             }
2365             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2366         }
2367             break;
2368         case QXmlStreamReader::EndElement :
2369             return;
2370         default :
2371             break;
2372         }
2373     }
2374 }
2375 
write(QXmlStreamWriter & writer,const QString & tagName) const2376 void DomSpacer::write(QXmlStreamWriter &writer, const QString &tagName) const
2377 {
2378     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("spacer") : tagName.toLower());
2379 
2380     if (hasAttributeName())
2381         writer.writeAttribute(QStringLiteral("name"), attributeName());
2382 
2383     for (DomProperty *v : m_property)
2384         v->write(writer, QStringLiteral("property"));
2385 
2386     writer.writeEndElement();
2387 }
2388 
setElementProperty(const QList<DomProperty * > & a)2389 void DomSpacer::setElementProperty(const QList<DomProperty *> &a)
2390 {
2391     m_children |= Property;
2392     m_property = a;
2393 }
2394 
2395 DomColor::~DomColor() = default;
2396 
read(QXmlStreamReader & reader)2397 void DomColor::read(QXmlStreamReader &reader)
2398 {
2399     const QXmlStreamAttributes &attributes = reader.attributes();
2400     for (const QXmlStreamAttribute &attribute : attributes) {
2401         const auto name = attribute.name();
2402         if (name == QLatin1String("alpha")) {
2403             setAttributeAlpha(attribute.value().toInt());
2404             continue;
2405         }
2406         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2407     }
2408 
2409     while (!reader.hasError()) {
2410         switch (reader.readNext()) {
2411         case QXmlStreamReader::StartElement : {
2412             const auto tag = reader.name();
2413             if (!tag.compare(QLatin1String("red"), Qt::CaseInsensitive)) {
2414                 setElementRed(reader.readElementText().toInt());
2415                 continue;
2416             }
2417             if (!tag.compare(QLatin1String("green"), Qt::CaseInsensitive)) {
2418                 setElementGreen(reader.readElementText().toInt());
2419                 continue;
2420             }
2421             if (!tag.compare(QLatin1String("blue"), Qt::CaseInsensitive)) {
2422                 setElementBlue(reader.readElementText().toInt());
2423                 continue;
2424             }
2425             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2426         }
2427             break;
2428         case QXmlStreamReader::EndElement :
2429             return;
2430         default :
2431             break;
2432         }
2433     }
2434 }
2435 
write(QXmlStreamWriter & writer,const QString & tagName) const2436 void DomColor::write(QXmlStreamWriter &writer, const QString &tagName) const
2437 {
2438     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("color") : tagName.toLower());
2439 
2440     if (hasAttributeAlpha())
2441         writer.writeAttribute(QStringLiteral("alpha"), QString::number(attributeAlpha()));
2442 
2443     if (m_children & Red)
2444         writer.writeTextElement(QStringLiteral("red"), QString::number(m_red));
2445 
2446     if (m_children & Green)
2447         writer.writeTextElement(QStringLiteral("green"), QString::number(m_green));
2448 
2449     if (m_children & Blue)
2450         writer.writeTextElement(QStringLiteral("blue"), QString::number(m_blue));
2451 
2452     writer.writeEndElement();
2453 }
2454 
setElementRed(int a)2455 void DomColor::setElementRed(int a)
2456 {
2457     m_children |= Red;
2458     m_red = a;
2459 }
2460 
setElementGreen(int a)2461 void DomColor::setElementGreen(int a)
2462 {
2463     m_children |= Green;
2464     m_green = a;
2465 }
2466 
setElementBlue(int a)2467 void DomColor::setElementBlue(int a)
2468 {
2469     m_children |= Blue;
2470     m_blue = a;
2471 }
2472 
clearElementRed()2473 void DomColor::clearElementRed()
2474 {
2475     m_children &= ~Red;
2476 }
2477 
clearElementGreen()2478 void DomColor::clearElementGreen()
2479 {
2480     m_children &= ~Green;
2481 }
2482 
clearElementBlue()2483 void DomColor::clearElementBlue()
2484 {
2485     m_children &= ~Blue;
2486 }
2487 
~DomGradientStop()2488 DomGradientStop::~DomGradientStop()
2489 {
2490     delete m_color;
2491 }
2492 
read(QXmlStreamReader & reader)2493 void DomGradientStop::read(QXmlStreamReader &reader)
2494 {
2495     const QXmlStreamAttributes &attributes = reader.attributes();
2496     for (const QXmlStreamAttribute &attribute : attributes) {
2497         const auto name = attribute.name();
2498         if (name == QLatin1String("position")) {
2499             setAttributePosition(attribute.value().toDouble());
2500             continue;
2501         }
2502         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2503     }
2504 
2505     while (!reader.hasError()) {
2506         switch (reader.readNext()) {
2507         case QXmlStreamReader::StartElement : {
2508             const auto tag = reader.name();
2509             if (!tag.compare(QLatin1String("color"), Qt::CaseInsensitive)) {
2510                 auto *v = new DomColor();
2511                 v->read(reader);
2512                 setElementColor(v);
2513                 continue;
2514             }
2515             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2516         }
2517             break;
2518         case QXmlStreamReader::EndElement :
2519             return;
2520         default :
2521             break;
2522         }
2523     }
2524 }
2525 
write(QXmlStreamWriter & writer,const QString & tagName) const2526 void DomGradientStop::write(QXmlStreamWriter &writer, const QString &tagName) const
2527 {
2528     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("gradientstop") : tagName.toLower());
2529 
2530     if (hasAttributePosition())
2531         writer.writeAttribute(QStringLiteral("position"), QString::number(attributePosition(), 'f', 15));
2532 
2533     if (m_children & Color)
2534         m_color->write(writer, QStringLiteral("color"));
2535 
2536     writer.writeEndElement();
2537 }
2538 
takeElementColor()2539 DomColor *DomGradientStop::takeElementColor()
2540 {
2541     DomColor *a = m_color;
2542     m_color = nullptr;
2543     m_children ^= Color;
2544     return a;
2545 }
2546 
setElementColor(DomColor * a)2547 void DomGradientStop::setElementColor(DomColor *a)
2548 {
2549     delete m_color;
2550     m_children |= Color;
2551     m_color = a;
2552 }
2553 
clearElementColor()2554 void DomGradientStop::clearElementColor()
2555 {
2556     delete m_color;
2557     m_color = nullptr;
2558     m_children &= ~Color;
2559 }
2560 
~DomGradient()2561 DomGradient::~DomGradient()
2562 {
2563     qDeleteAll(m_gradientStop);
2564     m_gradientStop.clear();
2565 }
2566 
read(QXmlStreamReader & reader)2567 void DomGradient::read(QXmlStreamReader &reader)
2568 {
2569     const QXmlStreamAttributes &attributes = reader.attributes();
2570     for (const QXmlStreamAttribute &attribute : attributes) {
2571         const auto name = attribute.name();
2572         if (name == QLatin1String("startx")) {
2573             setAttributeStartX(attribute.value().toDouble());
2574             continue;
2575         }
2576         if (name == QLatin1String("starty")) {
2577             setAttributeStartY(attribute.value().toDouble());
2578             continue;
2579         }
2580         if (name == QLatin1String("endx")) {
2581             setAttributeEndX(attribute.value().toDouble());
2582             continue;
2583         }
2584         if (name == QLatin1String("endy")) {
2585             setAttributeEndY(attribute.value().toDouble());
2586             continue;
2587         }
2588         if (name == QLatin1String("centralx")) {
2589             setAttributeCentralX(attribute.value().toDouble());
2590             continue;
2591         }
2592         if (name == QLatin1String("centraly")) {
2593             setAttributeCentralY(attribute.value().toDouble());
2594             continue;
2595         }
2596         if (name == QLatin1String("focalx")) {
2597             setAttributeFocalX(attribute.value().toDouble());
2598             continue;
2599         }
2600         if (name == QLatin1String("focaly")) {
2601             setAttributeFocalY(attribute.value().toDouble());
2602             continue;
2603         }
2604         if (name == QLatin1String("radius")) {
2605             setAttributeRadius(attribute.value().toDouble());
2606             continue;
2607         }
2608         if (name == QLatin1String("angle")) {
2609             setAttributeAngle(attribute.value().toDouble());
2610             continue;
2611         }
2612         if (name == QLatin1String("type")) {
2613             setAttributeType(attribute.value().toString());
2614             continue;
2615         }
2616         if (name == QLatin1String("spread")) {
2617             setAttributeSpread(attribute.value().toString());
2618             continue;
2619         }
2620         if (name == QLatin1String("coordinatemode")) {
2621             setAttributeCoordinateMode(attribute.value().toString());
2622             continue;
2623         }
2624         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2625     }
2626 
2627     while (!reader.hasError()) {
2628         switch (reader.readNext()) {
2629         case QXmlStreamReader::StartElement : {
2630             const auto tag = reader.name();
2631             if (!tag.compare(QLatin1String("gradientstop"), Qt::CaseInsensitive)) {
2632                 auto *v = new DomGradientStop();
2633                 v->read(reader);
2634                 m_gradientStop.append(v);
2635                 continue;
2636             }
2637             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2638         }
2639             break;
2640         case QXmlStreamReader::EndElement :
2641             return;
2642         default :
2643             break;
2644         }
2645     }
2646 }
2647 
write(QXmlStreamWriter & writer,const QString & tagName) const2648 void DomGradient::write(QXmlStreamWriter &writer, const QString &tagName) const
2649 {
2650     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("gradient") : tagName.toLower());
2651 
2652     if (hasAttributeStartX())
2653         writer.writeAttribute(QStringLiteral("startx"), QString::number(attributeStartX(), 'f', 15));
2654 
2655     if (hasAttributeStartY())
2656         writer.writeAttribute(QStringLiteral("starty"), QString::number(attributeStartY(), 'f', 15));
2657 
2658     if (hasAttributeEndX())
2659         writer.writeAttribute(QStringLiteral("endx"), QString::number(attributeEndX(), 'f', 15));
2660 
2661     if (hasAttributeEndY())
2662         writer.writeAttribute(QStringLiteral("endy"), QString::number(attributeEndY(), 'f', 15));
2663 
2664     if (hasAttributeCentralX())
2665         writer.writeAttribute(QStringLiteral("centralx"), QString::number(attributeCentralX(), 'f', 15));
2666 
2667     if (hasAttributeCentralY())
2668         writer.writeAttribute(QStringLiteral("centraly"), QString::number(attributeCentralY(), 'f', 15));
2669 
2670     if (hasAttributeFocalX())
2671         writer.writeAttribute(QStringLiteral("focalx"), QString::number(attributeFocalX(), 'f', 15));
2672 
2673     if (hasAttributeFocalY())
2674         writer.writeAttribute(QStringLiteral("focaly"), QString::number(attributeFocalY(), 'f', 15));
2675 
2676     if (hasAttributeRadius())
2677         writer.writeAttribute(QStringLiteral("radius"), QString::number(attributeRadius(), 'f', 15));
2678 
2679     if (hasAttributeAngle())
2680         writer.writeAttribute(QStringLiteral("angle"), QString::number(attributeAngle(), 'f', 15));
2681 
2682     if (hasAttributeType())
2683         writer.writeAttribute(QStringLiteral("type"), attributeType());
2684 
2685     if (hasAttributeSpread())
2686         writer.writeAttribute(QStringLiteral("spread"), attributeSpread());
2687 
2688     if (hasAttributeCoordinateMode())
2689         writer.writeAttribute(QStringLiteral("coordinatemode"), attributeCoordinateMode());
2690 
2691     for (DomGradientStop *v : m_gradientStop)
2692         v->write(writer, QStringLiteral("gradientstop"));
2693 
2694     writer.writeEndElement();
2695 }
2696 
setElementGradientStop(const QVector<DomGradientStop * > & a)2697 void DomGradient::setElementGradientStop(const QVector<DomGradientStop *> &a)
2698 {
2699     m_children |= GradientStop;
2700     m_gradientStop = a;
2701 }
2702 
~DomBrush()2703 DomBrush::~DomBrush()
2704 {
2705     delete m_color;
2706     delete m_texture;
2707     delete m_gradient;
2708 }
2709 
clear()2710 void DomBrush::clear()
2711 {
2712     delete m_color;
2713     delete m_texture;
2714     delete m_gradient;
2715 
2716     m_kind = Unknown;
2717 
2718     m_color = nullptr;
2719     m_texture = nullptr;
2720     m_gradient = nullptr;
2721 }
2722 
read(QXmlStreamReader & reader)2723 void DomBrush::read(QXmlStreamReader &reader)
2724 {
2725     const QXmlStreamAttributes &attributes = reader.attributes();
2726     for (const QXmlStreamAttribute &attribute : attributes) {
2727         const auto name = attribute.name();
2728         if (name == QLatin1String("brushstyle")) {
2729             setAttributeBrushStyle(attribute.value().toString());
2730             continue;
2731         }
2732         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2733     }
2734 
2735     while (!reader.hasError()) {
2736         switch (reader.readNext()) {
2737         case QXmlStreamReader::StartElement : {
2738             const auto tag = reader.name();
2739             if (!tag.compare(QLatin1String("color"), Qt::CaseInsensitive)) {
2740                 auto *v = new DomColor();
2741                 v->read(reader);
2742                 setElementColor(v);
2743                 continue;
2744             }
2745             if (!tag.compare(QLatin1String("texture"), Qt::CaseInsensitive)) {
2746                 auto *v = new DomProperty();
2747                 v->read(reader);
2748                 setElementTexture(v);
2749                 continue;
2750             }
2751             if (!tag.compare(QLatin1String("gradient"), Qt::CaseInsensitive)) {
2752                 auto *v = new DomGradient();
2753                 v->read(reader);
2754                 setElementGradient(v);
2755                 continue;
2756             }
2757             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2758         }
2759             break;
2760         case QXmlStreamReader::EndElement :
2761             return;
2762         default :
2763             break;
2764         }
2765     }
2766 }
2767 
write(QXmlStreamWriter & writer,const QString & tagName) const2768 void DomBrush::write(QXmlStreamWriter &writer, const QString &tagName) const
2769 {
2770     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("brush") : tagName.toLower());
2771 
2772     if (hasAttributeBrushStyle())
2773         writer.writeAttribute(QStringLiteral("brushstyle"), attributeBrushStyle());
2774 
2775     switch (kind()) {
2776     case Color:
2777         if (m_color != nullptr)
2778             m_color->write(writer, QStringLiteral("color"));
2779         break;
2780 
2781     case Texture:
2782         if (m_texture != nullptr)
2783             m_texture->write(writer, QStringLiteral("texture"));
2784         break;
2785 
2786     case Gradient:
2787         if (m_gradient != nullptr)
2788             m_gradient->write(writer, QStringLiteral("gradient"));
2789         break;
2790 
2791     default:
2792         break;
2793     }
2794     writer.writeEndElement();
2795 }
2796 
takeElementColor()2797 DomColor *DomBrush::takeElementColor()
2798 {
2799     DomColor *a = m_color;
2800     m_color = nullptr;
2801     return a;
2802 }
2803 
setElementColor(DomColor * a)2804 void DomBrush::setElementColor(DomColor *a)
2805 {
2806     clear();
2807     m_kind = Color;
2808     m_color = a;
2809 }
2810 
takeElementTexture()2811 DomProperty *DomBrush::takeElementTexture()
2812 {
2813     DomProperty *a = m_texture;
2814     m_texture = nullptr;
2815     return a;
2816 }
2817 
setElementTexture(DomProperty * a)2818 void DomBrush::setElementTexture(DomProperty *a)
2819 {
2820     clear();
2821     m_kind = Texture;
2822     m_texture = a;
2823 }
2824 
takeElementGradient()2825 DomGradient *DomBrush::takeElementGradient()
2826 {
2827     DomGradient *a = m_gradient;
2828     m_gradient = nullptr;
2829     return a;
2830 }
2831 
setElementGradient(DomGradient * a)2832 void DomBrush::setElementGradient(DomGradient *a)
2833 {
2834     clear();
2835     m_kind = Gradient;
2836     m_gradient = a;
2837 }
2838 
~DomColorRole()2839 DomColorRole::~DomColorRole()
2840 {
2841     delete m_brush;
2842 }
2843 
read(QXmlStreamReader & reader)2844 void DomColorRole::read(QXmlStreamReader &reader)
2845 {
2846     const QXmlStreamAttributes &attributes = reader.attributes();
2847     for (const QXmlStreamAttribute &attribute : attributes) {
2848         const auto name = attribute.name();
2849         if (name == QLatin1String("role")) {
2850             setAttributeRole(attribute.value().toString());
2851             continue;
2852         }
2853         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
2854     }
2855 
2856     while (!reader.hasError()) {
2857         switch (reader.readNext()) {
2858         case QXmlStreamReader::StartElement : {
2859             const auto tag = reader.name();
2860             if (!tag.compare(QLatin1String("brush"), Qt::CaseInsensitive)) {
2861                 auto *v = new DomBrush();
2862                 v->read(reader);
2863                 setElementBrush(v);
2864                 continue;
2865             }
2866             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2867         }
2868             break;
2869         case QXmlStreamReader::EndElement :
2870             return;
2871         default :
2872             break;
2873         }
2874     }
2875 }
2876 
write(QXmlStreamWriter & writer,const QString & tagName) const2877 void DomColorRole::write(QXmlStreamWriter &writer, const QString &tagName) const
2878 {
2879     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("colorrole") : tagName.toLower());
2880 
2881     if (hasAttributeRole())
2882         writer.writeAttribute(QStringLiteral("role"), attributeRole());
2883 
2884     if (m_children & Brush)
2885         m_brush->write(writer, QStringLiteral("brush"));
2886 
2887     writer.writeEndElement();
2888 }
2889 
takeElementBrush()2890 DomBrush *DomColorRole::takeElementBrush()
2891 {
2892     DomBrush *a = m_brush;
2893     m_brush = nullptr;
2894     m_children ^= Brush;
2895     return a;
2896 }
2897 
setElementBrush(DomBrush * a)2898 void DomColorRole::setElementBrush(DomBrush *a)
2899 {
2900     delete m_brush;
2901     m_children |= Brush;
2902     m_brush = a;
2903 }
2904 
clearElementBrush()2905 void DomColorRole::clearElementBrush()
2906 {
2907     delete m_brush;
2908     m_brush = nullptr;
2909     m_children &= ~Brush;
2910 }
2911 
~DomColorGroup()2912 DomColorGroup::~DomColorGroup()
2913 {
2914     qDeleteAll(m_colorRole);
2915     m_colorRole.clear();
2916     qDeleteAll(m_color);
2917     m_color.clear();
2918 }
2919 
read(QXmlStreamReader & reader)2920 void DomColorGroup::read(QXmlStreamReader &reader)
2921 {
2922     while (!reader.hasError()) {
2923         switch (reader.readNext()) {
2924         case QXmlStreamReader::StartElement : {
2925             const auto tag = reader.name();
2926             if (!tag.compare(QLatin1String("colorrole"), Qt::CaseInsensitive)) {
2927                 auto *v = new DomColorRole();
2928                 v->read(reader);
2929                 m_colorRole.append(v);
2930                 continue;
2931             }
2932             if (!tag.compare(QLatin1String("color"), Qt::CaseInsensitive)) {
2933                 auto *v = new DomColor();
2934                 v->read(reader);
2935                 m_color.append(v);
2936                 continue;
2937             }
2938             reader.raiseError(QLatin1String("Unexpected element ") + tag);
2939         }
2940             break;
2941         case QXmlStreamReader::EndElement :
2942             return;
2943         default :
2944             break;
2945         }
2946     }
2947 }
2948 
write(QXmlStreamWriter & writer,const QString & tagName) const2949 void DomColorGroup::write(QXmlStreamWriter &writer, const QString &tagName) const
2950 {
2951     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("colorgroup") : tagName.toLower());
2952 
2953     for (DomColorRole *v : m_colorRole)
2954         v->write(writer, QStringLiteral("colorrole"));
2955 
2956     for (DomColor *v : m_color)
2957         v->write(writer, QStringLiteral("color"));
2958 
2959     writer.writeEndElement();
2960 }
2961 
setElementColorRole(const QVector<DomColorRole * > & a)2962 void DomColorGroup::setElementColorRole(const QVector<DomColorRole *> &a)
2963 {
2964     m_children |= ColorRole;
2965     m_colorRole = a;
2966 }
2967 
setElementColor(const QVector<DomColor * > & a)2968 void DomColorGroup::setElementColor(const QVector<DomColor *> &a)
2969 {
2970     m_children |= Color;
2971     m_color = a;
2972 }
2973 
~DomPalette()2974 DomPalette::~DomPalette()
2975 {
2976     delete m_active;
2977     delete m_inactive;
2978     delete m_disabled;
2979 }
2980 
read(QXmlStreamReader & reader)2981 void DomPalette::read(QXmlStreamReader &reader)
2982 {
2983     while (!reader.hasError()) {
2984         switch (reader.readNext()) {
2985         case QXmlStreamReader::StartElement : {
2986             const auto tag = reader.name();
2987             if (!tag.compare(QLatin1String("active"), Qt::CaseInsensitive)) {
2988                 auto *v = new DomColorGroup();
2989                 v->read(reader);
2990                 setElementActive(v);
2991                 continue;
2992             }
2993             if (!tag.compare(QLatin1String("inactive"), Qt::CaseInsensitive)) {
2994                 auto *v = new DomColorGroup();
2995                 v->read(reader);
2996                 setElementInactive(v);
2997                 continue;
2998             }
2999             if (!tag.compare(QLatin1String("disabled"), Qt::CaseInsensitive)) {
3000                 auto *v = new DomColorGroup();
3001                 v->read(reader);
3002                 setElementDisabled(v);
3003                 continue;
3004             }
3005             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3006         }
3007             break;
3008         case QXmlStreamReader::EndElement :
3009             return;
3010         default :
3011             break;
3012         }
3013     }
3014 }
3015 
write(QXmlStreamWriter & writer,const QString & tagName) const3016 void DomPalette::write(QXmlStreamWriter &writer, const QString &tagName) const
3017 {
3018     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("palette") : tagName.toLower());
3019 
3020     if (m_children & Active)
3021         m_active->write(writer, QStringLiteral("active"));
3022 
3023     if (m_children & Inactive)
3024         m_inactive->write(writer, QStringLiteral("inactive"));
3025 
3026     if (m_children & Disabled)
3027         m_disabled->write(writer, QStringLiteral("disabled"));
3028 
3029     writer.writeEndElement();
3030 }
3031 
takeElementActive()3032 DomColorGroup *DomPalette::takeElementActive()
3033 {
3034     DomColorGroup *a = m_active;
3035     m_active = nullptr;
3036     m_children ^= Active;
3037     return a;
3038 }
3039 
setElementActive(DomColorGroup * a)3040 void DomPalette::setElementActive(DomColorGroup *a)
3041 {
3042     delete m_active;
3043     m_children |= Active;
3044     m_active = a;
3045 }
3046 
takeElementInactive()3047 DomColorGroup *DomPalette::takeElementInactive()
3048 {
3049     DomColorGroup *a = m_inactive;
3050     m_inactive = nullptr;
3051     m_children ^= Inactive;
3052     return a;
3053 }
3054 
setElementInactive(DomColorGroup * a)3055 void DomPalette::setElementInactive(DomColorGroup *a)
3056 {
3057     delete m_inactive;
3058     m_children |= Inactive;
3059     m_inactive = a;
3060 }
3061 
takeElementDisabled()3062 DomColorGroup *DomPalette::takeElementDisabled()
3063 {
3064     DomColorGroup *a = m_disabled;
3065     m_disabled = nullptr;
3066     m_children ^= Disabled;
3067     return a;
3068 }
3069 
setElementDisabled(DomColorGroup * a)3070 void DomPalette::setElementDisabled(DomColorGroup *a)
3071 {
3072     delete m_disabled;
3073     m_children |= Disabled;
3074     m_disabled = a;
3075 }
3076 
clearElementActive()3077 void DomPalette::clearElementActive()
3078 {
3079     delete m_active;
3080     m_active = nullptr;
3081     m_children &= ~Active;
3082 }
3083 
clearElementInactive()3084 void DomPalette::clearElementInactive()
3085 {
3086     delete m_inactive;
3087     m_inactive = nullptr;
3088     m_children &= ~Inactive;
3089 }
3090 
clearElementDisabled()3091 void DomPalette::clearElementDisabled()
3092 {
3093     delete m_disabled;
3094     m_disabled = nullptr;
3095     m_children &= ~Disabled;
3096 }
3097 
3098 DomFont::~DomFont() = default;
3099 
read(QXmlStreamReader & reader)3100 void DomFont::read(QXmlStreamReader &reader)
3101 {
3102     while (!reader.hasError()) {
3103         switch (reader.readNext()) {
3104         case QXmlStreamReader::StartElement : {
3105             const auto tag = reader.name();
3106             if (!tag.compare(QLatin1String("family"), Qt::CaseInsensitive)) {
3107                 setElementFamily(reader.readElementText());
3108                 continue;
3109             }
3110             if (!tag.compare(QLatin1String("pointsize"), Qt::CaseInsensitive)) {
3111                 setElementPointSize(reader.readElementText().toInt());
3112                 continue;
3113             }
3114             if (!tag.compare(QLatin1String("weight"), Qt::CaseInsensitive)) {
3115                 setElementWeight(reader.readElementText().toInt());
3116                 continue;
3117             }
3118             if (!tag.compare(QLatin1String("italic"), Qt::CaseInsensitive)) {
3119                 setElementItalic(reader.readElementText() == QLatin1String("true"));
3120                 continue;
3121             }
3122             if (!tag.compare(QLatin1String("bold"), Qt::CaseInsensitive)) {
3123                 setElementBold(reader.readElementText() == QLatin1String("true"));
3124                 continue;
3125             }
3126             if (!tag.compare(QLatin1String("underline"), Qt::CaseInsensitive)) {
3127                 setElementUnderline(reader.readElementText() == QLatin1String("true"));
3128                 continue;
3129             }
3130             if (!tag.compare(QLatin1String("strikeout"), Qt::CaseInsensitive)) {
3131                 setElementStrikeOut(reader.readElementText() == QLatin1String("true"));
3132                 continue;
3133             }
3134             if (!tag.compare(QLatin1String("antialiasing"), Qt::CaseInsensitive)) {
3135                 setElementAntialiasing(reader.readElementText() == QLatin1String("true"));
3136                 continue;
3137             }
3138             if (!tag.compare(QLatin1String("stylestrategy"), Qt::CaseInsensitive)) {
3139                 setElementStyleStrategy(reader.readElementText());
3140                 continue;
3141             }
3142             if (!tag.compare(QLatin1String("kerning"), Qt::CaseInsensitive)) {
3143                 setElementKerning(reader.readElementText() == QLatin1String("true"));
3144                 continue;
3145             }
3146             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3147         }
3148             break;
3149         case QXmlStreamReader::EndElement :
3150             return;
3151         default :
3152             break;
3153         }
3154     }
3155 }
3156 
write(QXmlStreamWriter & writer,const QString & tagName) const3157 void DomFont::write(QXmlStreamWriter &writer, const QString &tagName) const
3158 {
3159     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("font") : tagName.toLower());
3160 
3161     if (m_children & Family)
3162         writer.writeTextElement(QStringLiteral("family"), m_family);
3163 
3164     if (m_children & PointSize)
3165         writer.writeTextElement(QStringLiteral("pointsize"), QString::number(m_pointSize));
3166 
3167     if (m_children & Weight)
3168         writer.writeTextElement(QStringLiteral("weight"), QString::number(m_weight));
3169 
3170     if (m_children & Italic)
3171         writer.writeTextElement(QStringLiteral("italic"), (m_italic ? QLatin1String("true") : QLatin1String("false")));
3172 
3173     if (m_children & Bold)
3174         writer.writeTextElement(QStringLiteral("bold"), (m_bold ? QLatin1String("true") : QLatin1String("false")));
3175 
3176     if (m_children & Underline)
3177         writer.writeTextElement(QStringLiteral("underline"), (m_underline ? QLatin1String("true") : QLatin1String("false")));
3178 
3179     if (m_children & StrikeOut)
3180         writer.writeTextElement(QStringLiteral("strikeout"), (m_strikeOut ? QLatin1String("true") : QLatin1String("false")));
3181 
3182     if (m_children & Antialiasing)
3183         writer.writeTextElement(QStringLiteral("antialiasing"), (m_antialiasing ? QLatin1String("true") : QLatin1String("false")));
3184 
3185     if (m_children & StyleStrategy)
3186         writer.writeTextElement(QStringLiteral("stylestrategy"), m_styleStrategy);
3187 
3188     if (m_children & Kerning)
3189         writer.writeTextElement(QStringLiteral("kerning"), (m_kerning ? QLatin1String("true") : QLatin1String("false")));
3190 
3191     writer.writeEndElement();
3192 }
3193 
setElementFamily(const QString & a)3194 void DomFont::setElementFamily(const QString &a)
3195 {
3196     m_children |= Family;
3197     m_family = a;
3198 }
3199 
setElementPointSize(int a)3200 void DomFont::setElementPointSize(int a)
3201 {
3202     m_children |= PointSize;
3203     m_pointSize = a;
3204 }
3205 
setElementWeight(int a)3206 void DomFont::setElementWeight(int a)
3207 {
3208     m_children |= Weight;
3209     m_weight = a;
3210 }
3211 
setElementItalic(bool a)3212 void DomFont::setElementItalic(bool a)
3213 {
3214     m_children |= Italic;
3215     m_italic = a;
3216 }
3217 
setElementBold(bool a)3218 void DomFont::setElementBold(bool a)
3219 {
3220     m_children |= Bold;
3221     m_bold = a;
3222 }
3223 
setElementUnderline(bool a)3224 void DomFont::setElementUnderline(bool a)
3225 {
3226     m_children |= Underline;
3227     m_underline = a;
3228 }
3229 
setElementStrikeOut(bool a)3230 void DomFont::setElementStrikeOut(bool a)
3231 {
3232     m_children |= StrikeOut;
3233     m_strikeOut = a;
3234 }
3235 
setElementAntialiasing(bool a)3236 void DomFont::setElementAntialiasing(bool a)
3237 {
3238     m_children |= Antialiasing;
3239     m_antialiasing = a;
3240 }
3241 
setElementStyleStrategy(const QString & a)3242 void DomFont::setElementStyleStrategy(const QString &a)
3243 {
3244     m_children |= StyleStrategy;
3245     m_styleStrategy = a;
3246 }
3247 
setElementKerning(bool a)3248 void DomFont::setElementKerning(bool a)
3249 {
3250     m_children |= Kerning;
3251     m_kerning = a;
3252 }
3253 
clearElementFamily()3254 void DomFont::clearElementFamily()
3255 {
3256     m_children &= ~Family;
3257 }
3258 
clearElementPointSize()3259 void DomFont::clearElementPointSize()
3260 {
3261     m_children &= ~PointSize;
3262 }
3263 
clearElementWeight()3264 void DomFont::clearElementWeight()
3265 {
3266     m_children &= ~Weight;
3267 }
3268 
clearElementItalic()3269 void DomFont::clearElementItalic()
3270 {
3271     m_children &= ~Italic;
3272 }
3273 
clearElementBold()3274 void DomFont::clearElementBold()
3275 {
3276     m_children &= ~Bold;
3277 }
3278 
clearElementUnderline()3279 void DomFont::clearElementUnderline()
3280 {
3281     m_children &= ~Underline;
3282 }
3283 
clearElementStrikeOut()3284 void DomFont::clearElementStrikeOut()
3285 {
3286     m_children &= ~StrikeOut;
3287 }
3288 
clearElementAntialiasing()3289 void DomFont::clearElementAntialiasing()
3290 {
3291     m_children &= ~Antialiasing;
3292 }
3293 
clearElementStyleStrategy()3294 void DomFont::clearElementStyleStrategy()
3295 {
3296     m_children &= ~StyleStrategy;
3297 }
3298 
clearElementKerning()3299 void DomFont::clearElementKerning()
3300 {
3301     m_children &= ~Kerning;
3302 }
3303 
3304 DomPoint::~DomPoint() = default;
3305 
read(QXmlStreamReader & reader)3306 void DomPoint::read(QXmlStreamReader &reader)
3307 {
3308     while (!reader.hasError()) {
3309         switch (reader.readNext()) {
3310         case QXmlStreamReader::StartElement : {
3311             const auto tag = reader.name();
3312             if (!tag.compare(QLatin1String("x"), Qt::CaseInsensitive)) {
3313                 setElementX(reader.readElementText().toInt());
3314                 continue;
3315             }
3316             if (!tag.compare(QLatin1String("y"), Qt::CaseInsensitive)) {
3317                 setElementY(reader.readElementText().toInt());
3318                 continue;
3319             }
3320             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3321         }
3322             break;
3323         case QXmlStreamReader::EndElement :
3324             return;
3325         default :
3326             break;
3327         }
3328     }
3329 }
3330 
write(QXmlStreamWriter & writer,const QString & tagName) const3331 void DomPoint::write(QXmlStreamWriter &writer, const QString &tagName) const
3332 {
3333     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("point") : tagName.toLower());
3334 
3335     if (m_children & X)
3336         writer.writeTextElement(QString(QLatin1Char('x')), QString::number(m_x));
3337 
3338     if (m_children & Y)
3339         writer.writeTextElement(QString(QLatin1Char('y')), QString::number(m_y));
3340 
3341     writer.writeEndElement();
3342 }
3343 
setElementX(int a)3344 void DomPoint::setElementX(int a)
3345 {
3346     m_children |= X;
3347     m_x = a;
3348 }
3349 
setElementY(int a)3350 void DomPoint::setElementY(int a)
3351 {
3352     m_children |= Y;
3353     m_y = a;
3354 }
3355 
clearElementX()3356 void DomPoint::clearElementX()
3357 {
3358     m_children &= ~X;
3359 }
3360 
clearElementY()3361 void DomPoint::clearElementY()
3362 {
3363     m_children &= ~Y;
3364 }
3365 
3366 DomRect::~DomRect() = default;
3367 
read(QXmlStreamReader & reader)3368 void DomRect::read(QXmlStreamReader &reader)
3369 {
3370     while (!reader.hasError()) {
3371         switch (reader.readNext()) {
3372         case QXmlStreamReader::StartElement : {
3373             const auto tag = reader.name();
3374             if (!tag.compare(QLatin1String("x"), Qt::CaseInsensitive)) {
3375                 setElementX(reader.readElementText().toInt());
3376                 continue;
3377             }
3378             if (!tag.compare(QLatin1String("y"), Qt::CaseInsensitive)) {
3379                 setElementY(reader.readElementText().toInt());
3380                 continue;
3381             }
3382             if (!tag.compare(QLatin1String("width"), Qt::CaseInsensitive)) {
3383                 setElementWidth(reader.readElementText().toInt());
3384                 continue;
3385             }
3386             if (!tag.compare(QLatin1String("height"), Qt::CaseInsensitive)) {
3387                 setElementHeight(reader.readElementText().toInt());
3388                 continue;
3389             }
3390             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3391         }
3392             break;
3393         case QXmlStreamReader::EndElement :
3394             return;
3395         default :
3396             break;
3397         }
3398     }
3399 }
3400 
write(QXmlStreamWriter & writer,const QString & tagName) const3401 void DomRect::write(QXmlStreamWriter &writer, const QString &tagName) const
3402 {
3403     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("rect") : tagName.toLower());
3404 
3405     if (m_children & X)
3406         writer.writeTextElement(QString(QLatin1Char('x')), QString::number(m_x));
3407 
3408     if (m_children & Y)
3409         writer.writeTextElement(QString(QLatin1Char('y')), QString::number(m_y));
3410 
3411     if (m_children & Width)
3412         writer.writeTextElement(QStringLiteral("width"), QString::number(m_width));
3413 
3414     if (m_children & Height)
3415         writer.writeTextElement(QStringLiteral("height"), QString::number(m_height));
3416 
3417     writer.writeEndElement();
3418 }
3419 
setElementX(int a)3420 void DomRect::setElementX(int a)
3421 {
3422     m_children |= X;
3423     m_x = a;
3424 }
3425 
setElementY(int a)3426 void DomRect::setElementY(int a)
3427 {
3428     m_children |= Y;
3429     m_y = a;
3430 }
3431 
setElementWidth(int a)3432 void DomRect::setElementWidth(int a)
3433 {
3434     m_children |= Width;
3435     m_width = a;
3436 }
3437 
setElementHeight(int a)3438 void DomRect::setElementHeight(int a)
3439 {
3440     m_children |= Height;
3441     m_height = a;
3442 }
3443 
clearElementX()3444 void DomRect::clearElementX()
3445 {
3446     m_children &= ~X;
3447 }
3448 
clearElementY()3449 void DomRect::clearElementY()
3450 {
3451     m_children &= ~Y;
3452 }
3453 
clearElementWidth()3454 void DomRect::clearElementWidth()
3455 {
3456     m_children &= ~Width;
3457 }
3458 
clearElementHeight()3459 void DomRect::clearElementHeight()
3460 {
3461     m_children &= ~Height;
3462 }
3463 
3464 DomLocale::~DomLocale() = default;
3465 
read(QXmlStreamReader & reader)3466 void DomLocale::read(QXmlStreamReader &reader)
3467 {
3468     const QXmlStreamAttributes &attributes = reader.attributes();
3469     for (const QXmlStreamAttribute &attribute : attributes) {
3470         const auto name = attribute.name();
3471         if (name == QLatin1String("language")) {
3472             setAttributeLanguage(attribute.value().toString());
3473             continue;
3474         }
3475         if (name == QLatin1String("country")) {
3476             setAttributeCountry(attribute.value().toString());
3477             continue;
3478         }
3479         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
3480     }
3481 
3482     while (!reader.hasError()) {
3483         switch (reader.readNext()) {
3484         case QXmlStreamReader::StartElement : {
3485             const auto tag = reader.name();
3486             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3487         }
3488             break;
3489         case QXmlStreamReader::EndElement :
3490             return;
3491         default :
3492             break;
3493         }
3494     }
3495 }
3496 
write(QXmlStreamWriter & writer,const QString & tagName) const3497 void DomLocale::write(QXmlStreamWriter &writer, const QString &tagName) const
3498 {
3499     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("locale") : tagName.toLower());
3500 
3501     if (hasAttributeLanguage())
3502         writer.writeAttribute(QStringLiteral("language"), attributeLanguage());
3503 
3504     if (hasAttributeCountry())
3505         writer.writeAttribute(QStringLiteral("country"), attributeCountry());
3506 
3507     writer.writeEndElement();
3508 }
3509 
3510 DomSizePolicy::~DomSizePolicy() = default;
3511 
read(QXmlStreamReader & reader)3512 void DomSizePolicy::read(QXmlStreamReader &reader)
3513 {
3514     const QXmlStreamAttributes &attributes = reader.attributes();
3515     for (const QXmlStreamAttribute &attribute : attributes) {
3516         const auto name = attribute.name();
3517         if (name == QLatin1String("hsizetype")) {
3518             setAttributeHSizeType(attribute.value().toString());
3519             continue;
3520         }
3521         if (name == QLatin1String("vsizetype")) {
3522             setAttributeVSizeType(attribute.value().toString());
3523             continue;
3524         }
3525         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
3526     }
3527 
3528     while (!reader.hasError()) {
3529         switch (reader.readNext()) {
3530         case QXmlStreamReader::StartElement : {
3531             const auto tag = reader.name();
3532             if (!tag.compare(QLatin1String("hsizetype"), Qt::CaseInsensitive)) {
3533                 setElementHSizeType(reader.readElementText().toInt());
3534                 continue;
3535             }
3536             if (!tag.compare(QLatin1String("vsizetype"), Qt::CaseInsensitive)) {
3537                 setElementVSizeType(reader.readElementText().toInt());
3538                 continue;
3539             }
3540             if (!tag.compare(QLatin1String("horstretch"), Qt::CaseInsensitive)) {
3541                 setElementHorStretch(reader.readElementText().toInt());
3542                 continue;
3543             }
3544             if (!tag.compare(QLatin1String("verstretch"), Qt::CaseInsensitive)) {
3545                 setElementVerStretch(reader.readElementText().toInt());
3546                 continue;
3547             }
3548             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3549         }
3550             break;
3551         case QXmlStreamReader::EndElement :
3552             return;
3553         default :
3554             break;
3555         }
3556     }
3557 }
3558 
write(QXmlStreamWriter & writer,const QString & tagName) const3559 void DomSizePolicy::write(QXmlStreamWriter &writer, const QString &tagName) const
3560 {
3561     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("sizepolicy") : tagName.toLower());
3562 
3563     if (hasAttributeHSizeType())
3564         writer.writeAttribute(QStringLiteral("hsizetype"), attributeHSizeType());
3565 
3566     if (hasAttributeVSizeType())
3567         writer.writeAttribute(QStringLiteral("vsizetype"), attributeVSizeType());
3568 
3569     if (m_children & HSizeType)
3570         writer.writeTextElement(QStringLiteral("hsizetype"), QString::number(m_hSizeType));
3571 
3572     if (m_children & VSizeType)
3573         writer.writeTextElement(QStringLiteral("vsizetype"), QString::number(m_vSizeType));
3574 
3575     if (m_children & HorStretch)
3576         writer.writeTextElement(QStringLiteral("horstretch"), QString::number(m_horStretch));
3577 
3578     if (m_children & VerStretch)
3579         writer.writeTextElement(QStringLiteral("verstretch"), QString::number(m_verStretch));
3580 
3581     writer.writeEndElement();
3582 }
3583 
setElementHSizeType(int a)3584 void DomSizePolicy::setElementHSizeType(int a)
3585 {
3586     m_children |= HSizeType;
3587     m_hSizeType = a;
3588 }
3589 
setElementVSizeType(int a)3590 void DomSizePolicy::setElementVSizeType(int a)
3591 {
3592     m_children |= VSizeType;
3593     m_vSizeType = a;
3594 }
3595 
setElementHorStretch(int a)3596 void DomSizePolicy::setElementHorStretch(int a)
3597 {
3598     m_children |= HorStretch;
3599     m_horStretch = a;
3600 }
3601 
setElementVerStretch(int a)3602 void DomSizePolicy::setElementVerStretch(int a)
3603 {
3604     m_children |= VerStretch;
3605     m_verStretch = a;
3606 }
3607 
clearElementHSizeType()3608 void DomSizePolicy::clearElementHSizeType()
3609 {
3610     m_children &= ~HSizeType;
3611 }
3612 
clearElementVSizeType()3613 void DomSizePolicy::clearElementVSizeType()
3614 {
3615     m_children &= ~VSizeType;
3616 }
3617 
clearElementHorStretch()3618 void DomSizePolicy::clearElementHorStretch()
3619 {
3620     m_children &= ~HorStretch;
3621 }
3622 
clearElementVerStretch()3623 void DomSizePolicy::clearElementVerStretch()
3624 {
3625     m_children &= ~VerStretch;
3626 }
3627 
3628 DomSize::~DomSize() = default;
3629 
read(QXmlStreamReader & reader)3630 void DomSize::read(QXmlStreamReader &reader)
3631 {
3632     while (!reader.hasError()) {
3633         switch (reader.readNext()) {
3634         case QXmlStreamReader::StartElement : {
3635             const auto tag = reader.name();
3636             if (!tag.compare(QLatin1String("width"), Qt::CaseInsensitive)) {
3637                 setElementWidth(reader.readElementText().toInt());
3638                 continue;
3639             }
3640             if (!tag.compare(QLatin1String("height"), Qt::CaseInsensitive)) {
3641                 setElementHeight(reader.readElementText().toInt());
3642                 continue;
3643             }
3644             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3645         }
3646             break;
3647         case QXmlStreamReader::EndElement :
3648             return;
3649         default :
3650             break;
3651         }
3652     }
3653 }
3654 
write(QXmlStreamWriter & writer,const QString & tagName) const3655 void DomSize::write(QXmlStreamWriter &writer, const QString &tagName) const
3656 {
3657     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("size") : tagName.toLower());
3658 
3659     if (m_children & Width)
3660         writer.writeTextElement(QStringLiteral("width"), QString::number(m_width));
3661 
3662     if (m_children & Height)
3663         writer.writeTextElement(QStringLiteral("height"), QString::number(m_height));
3664 
3665     writer.writeEndElement();
3666 }
3667 
setElementWidth(int a)3668 void DomSize::setElementWidth(int a)
3669 {
3670     m_children |= Width;
3671     m_width = a;
3672 }
3673 
setElementHeight(int a)3674 void DomSize::setElementHeight(int a)
3675 {
3676     m_children |= Height;
3677     m_height = a;
3678 }
3679 
clearElementWidth()3680 void DomSize::clearElementWidth()
3681 {
3682     m_children &= ~Width;
3683 }
3684 
clearElementHeight()3685 void DomSize::clearElementHeight()
3686 {
3687     m_children &= ~Height;
3688 }
3689 
3690 DomDate::~DomDate() = default;
3691 
read(QXmlStreamReader & reader)3692 void DomDate::read(QXmlStreamReader &reader)
3693 {
3694     while (!reader.hasError()) {
3695         switch (reader.readNext()) {
3696         case QXmlStreamReader::StartElement : {
3697             const auto tag = reader.name();
3698             if (!tag.compare(QLatin1String("year"), Qt::CaseInsensitive)) {
3699                 setElementYear(reader.readElementText().toInt());
3700                 continue;
3701             }
3702             if (!tag.compare(QLatin1String("month"), Qt::CaseInsensitive)) {
3703                 setElementMonth(reader.readElementText().toInt());
3704                 continue;
3705             }
3706             if (!tag.compare(QLatin1String("day"), Qt::CaseInsensitive)) {
3707                 setElementDay(reader.readElementText().toInt());
3708                 continue;
3709             }
3710             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3711         }
3712             break;
3713         case QXmlStreamReader::EndElement :
3714             return;
3715         default :
3716             break;
3717         }
3718     }
3719 }
3720 
write(QXmlStreamWriter & writer,const QString & tagName) const3721 void DomDate::write(QXmlStreamWriter &writer, const QString &tagName) const
3722 {
3723     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("date") : tagName.toLower());
3724 
3725     if (m_children & Year)
3726         writer.writeTextElement(QStringLiteral("year"), QString::number(m_year));
3727 
3728     if (m_children & Month)
3729         writer.writeTextElement(QStringLiteral("month"), QString::number(m_month));
3730 
3731     if (m_children & Day)
3732         writer.writeTextElement(QStringLiteral("day"), QString::number(m_day));
3733 
3734     writer.writeEndElement();
3735 }
3736 
setElementYear(int a)3737 void DomDate::setElementYear(int a)
3738 {
3739     m_children |= Year;
3740     m_year = a;
3741 }
3742 
setElementMonth(int a)3743 void DomDate::setElementMonth(int a)
3744 {
3745     m_children |= Month;
3746     m_month = a;
3747 }
3748 
setElementDay(int a)3749 void DomDate::setElementDay(int a)
3750 {
3751     m_children |= Day;
3752     m_day = a;
3753 }
3754 
clearElementYear()3755 void DomDate::clearElementYear()
3756 {
3757     m_children &= ~Year;
3758 }
3759 
clearElementMonth()3760 void DomDate::clearElementMonth()
3761 {
3762     m_children &= ~Month;
3763 }
3764 
clearElementDay()3765 void DomDate::clearElementDay()
3766 {
3767     m_children &= ~Day;
3768 }
3769 
3770 DomTime::~DomTime() = default;
3771 
read(QXmlStreamReader & reader)3772 void DomTime::read(QXmlStreamReader &reader)
3773 {
3774     while (!reader.hasError()) {
3775         switch (reader.readNext()) {
3776         case QXmlStreamReader::StartElement : {
3777             const auto tag = reader.name();
3778             if (!tag.compare(QLatin1String("hour"), Qt::CaseInsensitive)) {
3779                 setElementHour(reader.readElementText().toInt());
3780                 continue;
3781             }
3782             if (!tag.compare(QLatin1String("minute"), Qt::CaseInsensitive)) {
3783                 setElementMinute(reader.readElementText().toInt());
3784                 continue;
3785             }
3786             if (!tag.compare(QLatin1String("second"), Qt::CaseInsensitive)) {
3787                 setElementSecond(reader.readElementText().toInt());
3788                 continue;
3789             }
3790             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3791         }
3792             break;
3793         case QXmlStreamReader::EndElement :
3794             return;
3795         default :
3796             break;
3797         }
3798     }
3799 }
3800 
write(QXmlStreamWriter & writer,const QString & tagName) const3801 void DomTime::write(QXmlStreamWriter &writer, const QString &tagName) const
3802 {
3803     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("time") : tagName.toLower());
3804 
3805     if (m_children & Hour)
3806         writer.writeTextElement(QStringLiteral("hour"), QString::number(m_hour));
3807 
3808     if (m_children & Minute)
3809         writer.writeTextElement(QStringLiteral("minute"), QString::number(m_minute));
3810 
3811     if (m_children & Second)
3812         writer.writeTextElement(QStringLiteral("second"), QString::number(m_second));
3813 
3814     writer.writeEndElement();
3815 }
3816 
setElementHour(int a)3817 void DomTime::setElementHour(int a)
3818 {
3819     m_children |= Hour;
3820     m_hour = a;
3821 }
3822 
setElementMinute(int a)3823 void DomTime::setElementMinute(int a)
3824 {
3825     m_children |= Minute;
3826     m_minute = a;
3827 }
3828 
setElementSecond(int a)3829 void DomTime::setElementSecond(int a)
3830 {
3831     m_children |= Second;
3832     m_second = a;
3833 }
3834 
clearElementHour()3835 void DomTime::clearElementHour()
3836 {
3837     m_children &= ~Hour;
3838 }
3839 
clearElementMinute()3840 void DomTime::clearElementMinute()
3841 {
3842     m_children &= ~Minute;
3843 }
3844 
clearElementSecond()3845 void DomTime::clearElementSecond()
3846 {
3847     m_children &= ~Second;
3848 }
3849 
3850 DomDateTime::~DomDateTime() = default;
3851 
read(QXmlStreamReader & reader)3852 void DomDateTime::read(QXmlStreamReader &reader)
3853 {
3854     while (!reader.hasError()) {
3855         switch (reader.readNext()) {
3856         case QXmlStreamReader::StartElement : {
3857             const auto tag = reader.name();
3858             if (!tag.compare(QLatin1String("hour"), Qt::CaseInsensitive)) {
3859                 setElementHour(reader.readElementText().toInt());
3860                 continue;
3861             }
3862             if (!tag.compare(QLatin1String("minute"), Qt::CaseInsensitive)) {
3863                 setElementMinute(reader.readElementText().toInt());
3864                 continue;
3865             }
3866             if (!tag.compare(QLatin1String("second"), Qt::CaseInsensitive)) {
3867                 setElementSecond(reader.readElementText().toInt());
3868                 continue;
3869             }
3870             if (!tag.compare(QLatin1String("year"), Qt::CaseInsensitive)) {
3871                 setElementYear(reader.readElementText().toInt());
3872                 continue;
3873             }
3874             if (!tag.compare(QLatin1String("month"), Qt::CaseInsensitive)) {
3875                 setElementMonth(reader.readElementText().toInt());
3876                 continue;
3877             }
3878             if (!tag.compare(QLatin1String("day"), Qt::CaseInsensitive)) {
3879                 setElementDay(reader.readElementText().toInt());
3880                 continue;
3881             }
3882             reader.raiseError(QLatin1String("Unexpected element ") + tag);
3883         }
3884             break;
3885         case QXmlStreamReader::EndElement :
3886             return;
3887         default :
3888             break;
3889         }
3890     }
3891 }
3892 
write(QXmlStreamWriter & writer,const QString & tagName) const3893 void DomDateTime::write(QXmlStreamWriter &writer, const QString &tagName) const
3894 {
3895     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("datetime") : tagName.toLower());
3896 
3897     if (m_children & Hour)
3898         writer.writeTextElement(QStringLiteral("hour"), QString::number(m_hour));
3899 
3900     if (m_children & Minute)
3901         writer.writeTextElement(QStringLiteral("minute"), QString::number(m_minute));
3902 
3903     if (m_children & Second)
3904         writer.writeTextElement(QStringLiteral("second"), QString::number(m_second));
3905 
3906     if (m_children & Year)
3907         writer.writeTextElement(QStringLiteral("year"), QString::number(m_year));
3908 
3909     if (m_children & Month)
3910         writer.writeTextElement(QStringLiteral("month"), QString::number(m_month));
3911 
3912     if (m_children & Day)
3913         writer.writeTextElement(QStringLiteral("day"), QString::number(m_day));
3914 
3915     writer.writeEndElement();
3916 }
3917 
setElementHour(int a)3918 void DomDateTime::setElementHour(int a)
3919 {
3920     m_children |= Hour;
3921     m_hour = a;
3922 }
3923 
setElementMinute(int a)3924 void DomDateTime::setElementMinute(int a)
3925 {
3926     m_children |= Minute;
3927     m_minute = a;
3928 }
3929 
setElementSecond(int a)3930 void DomDateTime::setElementSecond(int a)
3931 {
3932     m_children |= Second;
3933     m_second = a;
3934 }
3935 
setElementYear(int a)3936 void DomDateTime::setElementYear(int a)
3937 {
3938     m_children |= Year;
3939     m_year = a;
3940 }
3941 
setElementMonth(int a)3942 void DomDateTime::setElementMonth(int a)
3943 {
3944     m_children |= Month;
3945     m_month = a;
3946 }
3947 
setElementDay(int a)3948 void DomDateTime::setElementDay(int a)
3949 {
3950     m_children |= Day;
3951     m_day = a;
3952 }
3953 
clearElementHour()3954 void DomDateTime::clearElementHour()
3955 {
3956     m_children &= ~Hour;
3957 }
3958 
clearElementMinute()3959 void DomDateTime::clearElementMinute()
3960 {
3961     m_children &= ~Minute;
3962 }
3963 
clearElementSecond()3964 void DomDateTime::clearElementSecond()
3965 {
3966     m_children &= ~Second;
3967 }
3968 
clearElementYear()3969 void DomDateTime::clearElementYear()
3970 {
3971     m_children &= ~Year;
3972 }
3973 
clearElementMonth()3974 void DomDateTime::clearElementMonth()
3975 {
3976     m_children &= ~Month;
3977 }
3978 
clearElementDay()3979 void DomDateTime::clearElementDay()
3980 {
3981     m_children &= ~Day;
3982 }
3983 
~DomStringList()3984 DomStringList::~DomStringList()
3985 {
3986     m_string.clear();
3987 }
3988 
read(QXmlStreamReader & reader)3989 void DomStringList::read(QXmlStreamReader &reader)
3990 {
3991     const QXmlStreamAttributes &attributes = reader.attributes();
3992     for (const QXmlStreamAttribute &attribute : attributes) {
3993         const auto name = attribute.name();
3994         if (name == QLatin1String("notr")) {
3995             setAttributeNotr(attribute.value().toString());
3996             continue;
3997         }
3998         if (name == QLatin1String("comment")) {
3999             setAttributeComment(attribute.value().toString());
4000             continue;
4001         }
4002         if (name == QLatin1String("extracomment")) {
4003             setAttributeExtraComment(attribute.value().toString());
4004             continue;
4005         }
4006         if (name == QLatin1String("id")) {
4007             setAttributeId(attribute.value().toString());
4008             continue;
4009         }
4010         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
4011     }
4012 
4013     while (!reader.hasError()) {
4014         switch (reader.readNext()) {
4015         case QXmlStreamReader::StartElement : {
4016             const auto tag = reader.name();
4017             if (!tag.compare(QLatin1String("string"), Qt::CaseInsensitive)) {
4018                 m_string.append(reader.readElementText());
4019                 continue;
4020             }
4021             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4022         }
4023             break;
4024         case QXmlStreamReader::EndElement :
4025             return;
4026         default :
4027             break;
4028         }
4029     }
4030 }
4031 
write(QXmlStreamWriter & writer,const QString & tagName) const4032 void DomStringList::write(QXmlStreamWriter &writer, const QString &tagName) const
4033 {
4034     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("stringlist") : tagName.toLower());
4035 
4036     if (hasAttributeNotr())
4037         writer.writeAttribute(QStringLiteral("notr"), attributeNotr());
4038 
4039     if (hasAttributeComment())
4040         writer.writeAttribute(QStringLiteral("comment"), attributeComment());
4041 
4042     if (hasAttributeExtraComment())
4043         writer.writeAttribute(QStringLiteral("extracomment"), attributeExtraComment());
4044 
4045     if (hasAttributeId())
4046         writer.writeAttribute(QStringLiteral("id"), attributeId());
4047 
4048     for (const QString &v : m_string)
4049         writer.writeTextElement(QStringLiteral("string"), v);
4050 
4051     writer.writeEndElement();
4052 }
4053 
setElementString(const QStringList & a)4054 void DomStringList::setElementString(const QStringList &a)
4055 {
4056     m_children |= String;
4057     m_string = a;
4058 }
4059 
4060 DomResourcePixmap::~DomResourcePixmap() = default;
4061 
read(QXmlStreamReader & reader)4062 void DomResourcePixmap::read(QXmlStreamReader &reader)
4063 {
4064     const QXmlStreamAttributes &attributes = reader.attributes();
4065     for (const QXmlStreamAttribute &attribute : attributes) {
4066         const auto name = attribute.name();
4067         if (name == QLatin1String("resource")) {
4068             setAttributeResource(attribute.value().toString());
4069             continue;
4070         }
4071         if (name == QLatin1String("alias")) {
4072             setAttributeAlias(attribute.value().toString());
4073             continue;
4074         }
4075         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
4076     }
4077 
4078     while (!reader.hasError()) {
4079         switch (reader.readNext()) {
4080         case QXmlStreamReader::StartElement : {
4081             const auto tag = reader.name();
4082             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4083         }
4084             break;
4085         case QXmlStreamReader::EndElement :
4086             return;
4087         case QXmlStreamReader::Characters :
4088             if (!reader.isWhitespace())
4089                 m_text.append(reader.text().toString());
4090             break;
4091         default :
4092             break;
4093         }
4094     }
4095 }
4096 
write(QXmlStreamWriter & writer,const QString & tagName) const4097 void DomResourcePixmap::write(QXmlStreamWriter &writer, const QString &tagName) const
4098 {
4099     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("resourcepixmap") : tagName.toLower());
4100 
4101     if (hasAttributeResource())
4102         writer.writeAttribute(QStringLiteral("resource"), attributeResource());
4103 
4104     if (hasAttributeAlias())
4105         writer.writeAttribute(QStringLiteral("alias"), attributeAlias());
4106 
4107     if (!m_text.isEmpty())
4108         writer.writeCharacters(m_text);
4109 
4110     writer.writeEndElement();
4111 }
4112 
~DomResourceIcon()4113 DomResourceIcon::~DomResourceIcon()
4114 {
4115     delete m_normalOff;
4116     delete m_normalOn;
4117     delete m_disabledOff;
4118     delete m_disabledOn;
4119     delete m_activeOff;
4120     delete m_activeOn;
4121     delete m_selectedOff;
4122     delete m_selectedOn;
4123 }
4124 
read(QXmlStreamReader & reader)4125 void DomResourceIcon::read(QXmlStreamReader &reader)
4126 {
4127     const QXmlStreamAttributes &attributes = reader.attributes();
4128     for (const QXmlStreamAttribute &attribute : attributes) {
4129         const auto name = attribute.name();
4130         if (name == QLatin1String("theme")) {
4131             setAttributeTheme(attribute.value().toString());
4132             continue;
4133         }
4134         if (name == QLatin1String("resource")) {
4135             setAttributeResource(attribute.value().toString());
4136             continue;
4137         }
4138         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
4139     }
4140 
4141     while (!reader.hasError()) {
4142         switch (reader.readNext()) {
4143         case QXmlStreamReader::StartElement : {
4144             const auto tag = reader.name();
4145             if (!tag.compare(QLatin1String("normaloff"), Qt::CaseInsensitive)) {
4146                 auto *v = new DomResourcePixmap();
4147                 v->read(reader);
4148                 setElementNormalOff(v);
4149                 continue;
4150             }
4151             if (!tag.compare(QLatin1String("normalon"), Qt::CaseInsensitive)) {
4152                 auto *v = new DomResourcePixmap();
4153                 v->read(reader);
4154                 setElementNormalOn(v);
4155                 continue;
4156             }
4157             if (!tag.compare(QLatin1String("disabledoff"), Qt::CaseInsensitive)) {
4158                 auto *v = new DomResourcePixmap();
4159                 v->read(reader);
4160                 setElementDisabledOff(v);
4161                 continue;
4162             }
4163             if (!tag.compare(QLatin1String("disabledon"), Qt::CaseInsensitive)) {
4164                 auto *v = new DomResourcePixmap();
4165                 v->read(reader);
4166                 setElementDisabledOn(v);
4167                 continue;
4168             }
4169             if (!tag.compare(QLatin1String("activeoff"), Qt::CaseInsensitive)) {
4170                 auto *v = new DomResourcePixmap();
4171                 v->read(reader);
4172                 setElementActiveOff(v);
4173                 continue;
4174             }
4175             if (!tag.compare(QLatin1String("activeon"), Qt::CaseInsensitive)) {
4176                 auto *v = new DomResourcePixmap();
4177                 v->read(reader);
4178                 setElementActiveOn(v);
4179                 continue;
4180             }
4181             if (!tag.compare(QLatin1String("selectedoff"), Qt::CaseInsensitive)) {
4182                 auto *v = new DomResourcePixmap();
4183                 v->read(reader);
4184                 setElementSelectedOff(v);
4185                 continue;
4186             }
4187             if (!tag.compare(QLatin1String("selectedon"), Qt::CaseInsensitive)) {
4188                 auto *v = new DomResourcePixmap();
4189                 v->read(reader);
4190                 setElementSelectedOn(v);
4191                 continue;
4192             }
4193             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4194         }
4195             break;
4196         case QXmlStreamReader::EndElement :
4197             return;
4198         case QXmlStreamReader::Characters :
4199             if (!reader.isWhitespace())
4200                 m_text.append(reader.text().toString());
4201             break;
4202         default :
4203             break;
4204         }
4205     }
4206 }
4207 
write(QXmlStreamWriter & writer,const QString & tagName) const4208 void DomResourceIcon::write(QXmlStreamWriter &writer, const QString &tagName) const
4209 {
4210     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("resourceicon") : tagName.toLower());
4211 
4212     if (hasAttributeTheme())
4213         writer.writeAttribute(QStringLiteral("theme"), attributeTheme());
4214 
4215     if (hasAttributeResource())
4216         writer.writeAttribute(QStringLiteral("resource"), attributeResource());
4217 
4218     if (m_children & NormalOff)
4219         m_normalOff->write(writer, QStringLiteral("normaloff"));
4220 
4221     if (m_children & NormalOn)
4222         m_normalOn->write(writer, QStringLiteral("normalon"));
4223 
4224     if (m_children & DisabledOff)
4225         m_disabledOff->write(writer, QStringLiteral("disabledoff"));
4226 
4227     if (m_children & DisabledOn)
4228         m_disabledOn->write(writer, QStringLiteral("disabledon"));
4229 
4230     if (m_children & ActiveOff)
4231         m_activeOff->write(writer, QStringLiteral("activeoff"));
4232 
4233     if (m_children & ActiveOn)
4234         m_activeOn->write(writer, QStringLiteral("activeon"));
4235 
4236     if (m_children & SelectedOff)
4237         m_selectedOff->write(writer, QStringLiteral("selectedoff"));
4238 
4239     if (m_children & SelectedOn)
4240         m_selectedOn->write(writer, QStringLiteral("selectedon"));
4241 
4242     if (!m_text.isEmpty())
4243         writer.writeCharacters(m_text);
4244 
4245     writer.writeEndElement();
4246 }
4247 
takeElementNormalOff()4248 DomResourcePixmap *DomResourceIcon::takeElementNormalOff()
4249 {
4250     DomResourcePixmap *a = m_normalOff;
4251     m_normalOff = nullptr;
4252     m_children ^= NormalOff;
4253     return a;
4254 }
4255 
setElementNormalOff(DomResourcePixmap * a)4256 void DomResourceIcon::setElementNormalOff(DomResourcePixmap *a)
4257 {
4258     delete m_normalOff;
4259     m_children |= NormalOff;
4260     m_normalOff = a;
4261 }
4262 
takeElementNormalOn()4263 DomResourcePixmap *DomResourceIcon::takeElementNormalOn()
4264 {
4265     DomResourcePixmap *a = m_normalOn;
4266     m_normalOn = nullptr;
4267     m_children ^= NormalOn;
4268     return a;
4269 }
4270 
setElementNormalOn(DomResourcePixmap * a)4271 void DomResourceIcon::setElementNormalOn(DomResourcePixmap *a)
4272 {
4273     delete m_normalOn;
4274     m_children |= NormalOn;
4275     m_normalOn = a;
4276 }
4277 
takeElementDisabledOff()4278 DomResourcePixmap *DomResourceIcon::takeElementDisabledOff()
4279 {
4280     DomResourcePixmap *a = m_disabledOff;
4281     m_disabledOff = nullptr;
4282     m_children ^= DisabledOff;
4283     return a;
4284 }
4285 
setElementDisabledOff(DomResourcePixmap * a)4286 void DomResourceIcon::setElementDisabledOff(DomResourcePixmap *a)
4287 {
4288     delete m_disabledOff;
4289     m_children |= DisabledOff;
4290     m_disabledOff = a;
4291 }
4292 
takeElementDisabledOn()4293 DomResourcePixmap *DomResourceIcon::takeElementDisabledOn()
4294 {
4295     DomResourcePixmap *a = m_disabledOn;
4296     m_disabledOn = nullptr;
4297     m_children ^= DisabledOn;
4298     return a;
4299 }
4300 
setElementDisabledOn(DomResourcePixmap * a)4301 void DomResourceIcon::setElementDisabledOn(DomResourcePixmap *a)
4302 {
4303     delete m_disabledOn;
4304     m_children |= DisabledOn;
4305     m_disabledOn = a;
4306 }
4307 
takeElementActiveOff()4308 DomResourcePixmap *DomResourceIcon::takeElementActiveOff()
4309 {
4310     DomResourcePixmap *a = m_activeOff;
4311     m_activeOff = nullptr;
4312     m_children ^= ActiveOff;
4313     return a;
4314 }
4315 
setElementActiveOff(DomResourcePixmap * a)4316 void DomResourceIcon::setElementActiveOff(DomResourcePixmap *a)
4317 {
4318     delete m_activeOff;
4319     m_children |= ActiveOff;
4320     m_activeOff = a;
4321 }
4322 
takeElementActiveOn()4323 DomResourcePixmap *DomResourceIcon::takeElementActiveOn()
4324 {
4325     DomResourcePixmap *a = m_activeOn;
4326     m_activeOn = nullptr;
4327     m_children ^= ActiveOn;
4328     return a;
4329 }
4330 
setElementActiveOn(DomResourcePixmap * a)4331 void DomResourceIcon::setElementActiveOn(DomResourcePixmap *a)
4332 {
4333     delete m_activeOn;
4334     m_children |= ActiveOn;
4335     m_activeOn = a;
4336 }
4337 
takeElementSelectedOff()4338 DomResourcePixmap *DomResourceIcon::takeElementSelectedOff()
4339 {
4340     DomResourcePixmap *a = m_selectedOff;
4341     m_selectedOff = nullptr;
4342     m_children ^= SelectedOff;
4343     return a;
4344 }
4345 
setElementSelectedOff(DomResourcePixmap * a)4346 void DomResourceIcon::setElementSelectedOff(DomResourcePixmap *a)
4347 {
4348     delete m_selectedOff;
4349     m_children |= SelectedOff;
4350     m_selectedOff = a;
4351 }
4352 
takeElementSelectedOn()4353 DomResourcePixmap *DomResourceIcon::takeElementSelectedOn()
4354 {
4355     DomResourcePixmap *a = m_selectedOn;
4356     m_selectedOn = nullptr;
4357     m_children ^= SelectedOn;
4358     return a;
4359 }
4360 
setElementSelectedOn(DomResourcePixmap * a)4361 void DomResourceIcon::setElementSelectedOn(DomResourcePixmap *a)
4362 {
4363     delete m_selectedOn;
4364     m_children |= SelectedOn;
4365     m_selectedOn = a;
4366 }
4367 
clearElementNormalOff()4368 void DomResourceIcon::clearElementNormalOff()
4369 {
4370     delete m_normalOff;
4371     m_normalOff = nullptr;
4372     m_children &= ~NormalOff;
4373 }
4374 
clearElementNormalOn()4375 void DomResourceIcon::clearElementNormalOn()
4376 {
4377     delete m_normalOn;
4378     m_normalOn = nullptr;
4379     m_children &= ~NormalOn;
4380 }
4381 
clearElementDisabledOff()4382 void DomResourceIcon::clearElementDisabledOff()
4383 {
4384     delete m_disabledOff;
4385     m_disabledOff = nullptr;
4386     m_children &= ~DisabledOff;
4387 }
4388 
clearElementDisabledOn()4389 void DomResourceIcon::clearElementDisabledOn()
4390 {
4391     delete m_disabledOn;
4392     m_disabledOn = nullptr;
4393     m_children &= ~DisabledOn;
4394 }
4395 
clearElementActiveOff()4396 void DomResourceIcon::clearElementActiveOff()
4397 {
4398     delete m_activeOff;
4399     m_activeOff = nullptr;
4400     m_children &= ~ActiveOff;
4401 }
4402 
clearElementActiveOn()4403 void DomResourceIcon::clearElementActiveOn()
4404 {
4405     delete m_activeOn;
4406     m_activeOn = nullptr;
4407     m_children &= ~ActiveOn;
4408 }
4409 
clearElementSelectedOff()4410 void DomResourceIcon::clearElementSelectedOff()
4411 {
4412     delete m_selectedOff;
4413     m_selectedOff = nullptr;
4414     m_children &= ~SelectedOff;
4415 }
4416 
clearElementSelectedOn()4417 void DomResourceIcon::clearElementSelectedOn()
4418 {
4419     delete m_selectedOn;
4420     m_selectedOn = nullptr;
4421     m_children &= ~SelectedOn;
4422 }
4423 
4424 DomString::~DomString() = default;
4425 
read(QXmlStreamReader & reader)4426 void DomString::read(QXmlStreamReader &reader)
4427 {
4428     const QXmlStreamAttributes &attributes = reader.attributes();
4429     for (const QXmlStreamAttribute &attribute : attributes) {
4430         const auto name = attribute.name();
4431         if (name == QLatin1String("notr")) {
4432             setAttributeNotr(attribute.value().toString());
4433             continue;
4434         }
4435         if (name == QLatin1String("comment")) {
4436             setAttributeComment(attribute.value().toString());
4437             continue;
4438         }
4439         if (name == QLatin1String("extracomment")) {
4440             setAttributeExtraComment(attribute.value().toString());
4441             continue;
4442         }
4443         if (name == QLatin1String("id")) {
4444             setAttributeId(attribute.value().toString());
4445             continue;
4446         }
4447         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
4448     }
4449 
4450     while (!reader.hasError()) {
4451         switch (reader.readNext()) {
4452         case QXmlStreamReader::StartElement : {
4453             const auto tag = reader.name();
4454             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4455         }
4456             break;
4457         case QXmlStreamReader::EndElement :
4458             return;
4459         case QXmlStreamReader::Characters :
4460             if (!reader.isWhitespace())
4461                 m_text.append(reader.text().toString());
4462             break;
4463         default :
4464             break;
4465         }
4466     }
4467 }
4468 
write(QXmlStreamWriter & writer,const QString & tagName) const4469 void DomString::write(QXmlStreamWriter &writer, const QString &tagName) const
4470 {
4471     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("string") : tagName.toLower());
4472 
4473     if (hasAttributeNotr())
4474         writer.writeAttribute(QStringLiteral("notr"), attributeNotr());
4475 
4476     if (hasAttributeComment())
4477         writer.writeAttribute(QStringLiteral("comment"), attributeComment());
4478 
4479     if (hasAttributeExtraComment())
4480         writer.writeAttribute(QStringLiteral("extracomment"), attributeExtraComment());
4481 
4482     if (hasAttributeId())
4483         writer.writeAttribute(QStringLiteral("id"), attributeId());
4484 
4485     if (!m_text.isEmpty())
4486         writer.writeCharacters(m_text);
4487 
4488     writer.writeEndElement();
4489 }
4490 
4491 DomPointF::~DomPointF() = default;
4492 
read(QXmlStreamReader & reader)4493 void DomPointF::read(QXmlStreamReader &reader)
4494 {
4495     while (!reader.hasError()) {
4496         switch (reader.readNext()) {
4497         case QXmlStreamReader::StartElement : {
4498             const auto tag = reader.name();
4499             if (!tag.compare(QLatin1String("x"), Qt::CaseInsensitive)) {
4500                 setElementX(reader.readElementText().toDouble());
4501                 continue;
4502             }
4503             if (!tag.compare(QLatin1String("y"), Qt::CaseInsensitive)) {
4504                 setElementY(reader.readElementText().toDouble());
4505                 continue;
4506             }
4507             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4508         }
4509             break;
4510         case QXmlStreamReader::EndElement :
4511             return;
4512         default :
4513             break;
4514         }
4515     }
4516 }
4517 
write(QXmlStreamWriter & writer,const QString & tagName) const4518 void DomPointF::write(QXmlStreamWriter &writer, const QString &tagName) const
4519 {
4520     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("pointf") : tagName.toLower());
4521 
4522     if (m_children & X)
4523         writer.writeTextElement(QString(QLatin1Char('x')), QString::number(m_x, 'f', 15));
4524 
4525     if (m_children & Y)
4526         writer.writeTextElement(QString(QLatin1Char('y')), QString::number(m_y, 'f', 15));
4527 
4528     writer.writeEndElement();
4529 }
4530 
setElementX(double a)4531 void DomPointF::setElementX(double a)
4532 {
4533     m_children |= X;
4534     m_x = a;
4535 }
4536 
setElementY(double a)4537 void DomPointF::setElementY(double a)
4538 {
4539     m_children |= Y;
4540     m_y = a;
4541 }
4542 
clearElementX()4543 void DomPointF::clearElementX()
4544 {
4545     m_children &= ~X;
4546 }
4547 
clearElementY()4548 void DomPointF::clearElementY()
4549 {
4550     m_children &= ~Y;
4551 }
4552 
4553 DomRectF::~DomRectF() = default;
4554 
read(QXmlStreamReader & reader)4555 void DomRectF::read(QXmlStreamReader &reader)
4556 {
4557     while (!reader.hasError()) {
4558         switch (reader.readNext()) {
4559         case QXmlStreamReader::StartElement : {
4560             const auto tag = reader.name();
4561             if (!tag.compare(QLatin1String("x"), Qt::CaseInsensitive)) {
4562                 setElementX(reader.readElementText().toDouble());
4563                 continue;
4564             }
4565             if (!tag.compare(QLatin1String("y"), Qt::CaseInsensitive)) {
4566                 setElementY(reader.readElementText().toDouble());
4567                 continue;
4568             }
4569             if (!tag.compare(QLatin1String("width"), Qt::CaseInsensitive)) {
4570                 setElementWidth(reader.readElementText().toDouble());
4571                 continue;
4572             }
4573             if (!tag.compare(QLatin1String("height"), Qt::CaseInsensitive)) {
4574                 setElementHeight(reader.readElementText().toDouble());
4575                 continue;
4576             }
4577             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4578         }
4579             break;
4580         case QXmlStreamReader::EndElement :
4581             return;
4582         default :
4583             break;
4584         }
4585     }
4586 }
4587 
write(QXmlStreamWriter & writer,const QString & tagName) const4588 void DomRectF::write(QXmlStreamWriter &writer, const QString &tagName) const
4589 {
4590     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("rectf") : tagName.toLower());
4591 
4592     if (m_children & X)
4593         writer.writeTextElement(QString(QLatin1Char('x')), QString::number(m_x, 'f', 15));
4594 
4595     if (m_children & Y)
4596         writer.writeTextElement(QString(QLatin1Char('y')), QString::number(m_y, 'f', 15));
4597 
4598     if (m_children & Width)
4599         writer.writeTextElement(QStringLiteral("width"), QString::number(m_width, 'f', 15));
4600 
4601     if (m_children & Height)
4602         writer.writeTextElement(QStringLiteral("height"), QString::number(m_height, 'f', 15));
4603 
4604     writer.writeEndElement();
4605 }
4606 
setElementX(double a)4607 void DomRectF::setElementX(double a)
4608 {
4609     m_children |= X;
4610     m_x = a;
4611 }
4612 
setElementY(double a)4613 void DomRectF::setElementY(double a)
4614 {
4615     m_children |= Y;
4616     m_y = a;
4617 }
4618 
setElementWidth(double a)4619 void DomRectF::setElementWidth(double a)
4620 {
4621     m_children |= Width;
4622     m_width = a;
4623 }
4624 
setElementHeight(double a)4625 void DomRectF::setElementHeight(double a)
4626 {
4627     m_children |= Height;
4628     m_height = a;
4629 }
4630 
clearElementX()4631 void DomRectF::clearElementX()
4632 {
4633     m_children &= ~X;
4634 }
4635 
clearElementY()4636 void DomRectF::clearElementY()
4637 {
4638     m_children &= ~Y;
4639 }
4640 
clearElementWidth()4641 void DomRectF::clearElementWidth()
4642 {
4643     m_children &= ~Width;
4644 }
4645 
clearElementHeight()4646 void DomRectF::clearElementHeight()
4647 {
4648     m_children &= ~Height;
4649 }
4650 
4651 DomSizeF::~DomSizeF() = default;
4652 
read(QXmlStreamReader & reader)4653 void DomSizeF::read(QXmlStreamReader &reader)
4654 {
4655     while (!reader.hasError()) {
4656         switch (reader.readNext()) {
4657         case QXmlStreamReader::StartElement : {
4658             const auto tag = reader.name();
4659             if (!tag.compare(QLatin1String("width"), Qt::CaseInsensitive)) {
4660                 setElementWidth(reader.readElementText().toDouble());
4661                 continue;
4662             }
4663             if (!tag.compare(QLatin1String("height"), Qt::CaseInsensitive)) {
4664                 setElementHeight(reader.readElementText().toDouble());
4665                 continue;
4666             }
4667             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4668         }
4669             break;
4670         case QXmlStreamReader::EndElement :
4671             return;
4672         default :
4673             break;
4674         }
4675     }
4676 }
4677 
write(QXmlStreamWriter & writer,const QString & tagName) const4678 void DomSizeF::write(QXmlStreamWriter &writer, const QString &tagName) const
4679 {
4680     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("sizef") : tagName.toLower());
4681 
4682     if (m_children & Width)
4683         writer.writeTextElement(QStringLiteral("width"), QString::number(m_width, 'f', 15));
4684 
4685     if (m_children & Height)
4686         writer.writeTextElement(QStringLiteral("height"), QString::number(m_height, 'f', 15));
4687 
4688     writer.writeEndElement();
4689 }
4690 
setElementWidth(double a)4691 void DomSizeF::setElementWidth(double a)
4692 {
4693     m_children |= Width;
4694     m_width = a;
4695 }
4696 
setElementHeight(double a)4697 void DomSizeF::setElementHeight(double a)
4698 {
4699     m_children |= Height;
4700     m_height = a;
4701 }
4702 
clearElementWidth()4703 void DomSizeF::clearElementWidth()
4704 {
4705     m_children &= ~Width;
4706 }
4707 
clearElementHeight()4708 void DomSizeF::clearElementHeight()
4709 {
4710     m_children &= ~Height;
4711 }
4712 
4713 DomChar::~DomChar() = default;
4714 
read(QXmlStreamReader & reader)4715 void DomChar::read(QXmlStreamReader &reader)
4716 {
4717     while (!reader.hasError()) {
4718         switch (reader.readNext()) {
4719         case QXmlStreamReader::StartElement : {
4720             const auto tag = reader.name();
4721             if (!tag.compare(QLatin1String("unicode"), Qt::CaseInsensitive)) {
4722                 setElementUnicode(reader.readElementText().toInt());
4723                 continue;
4724             }
4725             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4726         }
4727             break;
4728         case QXmlStreamReader::EndElement :
4729             return;
4730         default :
4731             break;
4732         }
4733     }
4734 }
4735 
write(QXmlStreamWriter & writer,const QString & tagName) const4736 void DomChar::write(QXmlStreamWriter &writer, const QString &tagName) const
4737 {
4738     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("char") : tagName.toLower());
4739 
4740     if (m_children & Unicode)
4741         writer.writeTextElement(QStringLiteral("unicode"), QString::number(m_unicode));
4742 
4743     writer.writeEndElement();
4744 }
4745 
setElementUnicode(int a)4746 void DomChar::setElementUnicode(int a)
4747 {
4748     m_children |= Unicode;
4749     m_unicode = a;
4750 }
4751 
clearElementUnicode()4752 void DomChar::clearElementUnicode()
4753 {
4754     m_children &= ~Unicode;
4755 }
4756 
~DomUrl()4757 DomUrl::~DomUrl()
4758 {
4759     delete m_string;
4760 }
4761 
read(QXmlStreamReader & reader)4762 void DomUrl::read(QXmlStreamReader &reader)
4763 {
4764     while (!reader.hasError()) {
4765         switch (reader.readNext()) {
4766         case QXmlStreamReader::StartElement : {
4767             const auto tag = reader.name();
4768             if (!tag.compare(QLatin1String("string"), Qt::CaseInsensitive)) {
4769                 auto *v = new DomString();
4770                 v->read(reader);
4771                 setElementString(v);
4772                 continue;
4773             }
4774             reader.raiseError(QLatin1String("Unexpected element ") + tag);
4775         }
4776             break;
4777         case QXmlStreamReader::EndElement :
4778             return;
4779         default :
4780             break;
4781         }
4782     }
4783 }
4784 
write(QXmlStreamWriter & writer,const QString & tagName) const4785 void DomUrl::write(QXmlStreamWriter &writer, const QString &tagName) const
4786 {
4787     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("url") : tagName.toLower());
4788 
4789     if (m_children & String)
4790         m_string->write(writer, QStringLiteral("string"));
4791 
4792     writer.writeEndElement();
4793 }
4794 
takeElementString()4795 DomString *DomUrl::takeElementString()
4796 {
4797     DomString *a = m_string;
4798     m_string = nullptr;
4799     m_children ^= String;
4800     return a;
4801 }
4802 
setElementString(DomString * a)4803 void DomUrl::setElementString(DomString *a)
4804 {
4805     delete m_string;
4806     m_children |= String;
4807     m_string = a;
4808 }
4809 
clearElementString()4810 void DomUrl::clearElementString()
4811 {
4812     delete m_string;
4813     m_string = nullptr;
4814     m_children &= ~String;
4815 }
4816 
~DomProperty()4817 DomProperty::~DomProperty()
4818 {
4819     delete m_color;
4820     delete m_font;
4821     delete m_iconSet;
4822     delete m_pixmap;
4823     delete m_palette;
4824     delete m_point;
4825     delete m_rect;
4826     delete m_locale;
4827     delete m_sizePolicy;
4828     delete m_size;
4829     delete m_string;
4830     delete m_stringList;
4831     delete m_date;
4832     delete m_time;
4833     delete m_dateTime;
4834     delete m_pointF;
4835     delete m_rectF;
4836     delete m_sizeF;
4837     delete m_char;
4838     delete m_url;
4839     delete m_brush;
4840 }
4841 
clear()4842 void DomProperty::clear()
4843 {
4844     delete m_color;
4845     delete m_font;
4846     delete m_iconSet;
4847     delete m_pixmap;
4848     delete m_palette;
4849     delete m_point;
4850     delete m_rect;
4851     delete m_locale;
4852     delete m_sizePolicy;
4853     delete m_size;
4854     delete m_string;
4855     delete m_stringList;
4856     delete m_date;
4857     delete m_time;
4858     delete m_dateTime;
4859     delete m_pointF;
4860     delete m_rectF;
4861     delete m_sizeF;
4862     delete m_char;
4863     delete m_url;
4864     delete m_brush;
4865 
4866     m_kind = Unknown;
4867 
4868     m_color = nullptr;
4869     m_cursor = 0;
4870     m_font = nullptr;
4871     m_iconSet = nullptr;
4872     m_pixmap = nullptr;
4873     m_palette = nullptr;
4874     m_point = nullptr;
4875     m_rect = nullptr;
4876     m_locale = nullptr;
4877     m_sizePolicy = nullptr;
4878     m_size = nullptr;
4879     m_string = nullptr;
4880     m_stringList = nullptr;
4881     m_number = 0;
4882     m_float = 0.0;
4883     m_double = 0.0;
4884     m_date = nullptr;
4885     m_time = nullptr;
4886     m_dateTime = nullptr;
4887     m_pointF = nullptr;
4888     m_rectF = nullptr;
4889     m_sizeF = nullptr;
4890     m_longLong = 0;
4891     m_char = nullptr;
4892     m_url = nullptr;
4893     m_UInt = 0;
4894     m_uLongLong = 0;
4895     m_brush = nullptr;
4896 }
4897 
read(QXmlStreamReader & reader)4898 void DomProperty::read(QXmlStreamReader &reader)
4899 {
4900     const QXmlStreamAttributes &attributes = reader.attributes();
4901     for (const QXmlStreamAttribute &attribute : attributes) {
4902         const auto name = attribute.name();
4903         if (name == QLatin1String("name")) {
4904             setAttributeName(attribute.value().toString());
4905             continue;
4906         }
4907         if (name == QLatin1String("stdset")) {
4908             setAttributeStdset(attribute.value().toInt());
4909             continue;
4910         }
4911         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
4912     }
4913 
4914     while (!reader.hasError()) {
4915         switch (reader.readNext()) {
4916         case QXmlStreamReader::StartElement : {
4917             const auto tag = reader.name();
4918             if (!tag.compare(QLatin1String("bool"), Qt::CaseInsensitive)) {
4919                 setElementBool(reader.readElementText());
4920                 continue;
4921             }
4922             if (!tag.compare(QLatin1String("color"), Qt::CaseInsensitive)) {
4923                 auto *v = new DomColor();
4924                 v->read(reader);
4925                 setElementColor(v);
4926                 continue;
4927             }
4928             if (!tag.compare(QLatin1String("cstring"), Qt::CaseInsensitive)) {
4929                 setElementCstring(reader.readElementText());
4930                 continue;
4931             }
4932             if (!tag.compare(QLatin1String("cursor"), Qt::CaseInsensitive)) {
4933                 setElementCursor(reader.readElementText().toInt());
4934                 continue;
4935             }
4936             if (!tag.compare(QLatin1String("cursorshape"), Qt::CaseInsensitive)) {
4937                 setElementCursorShape(reader.readElementText());
4938                 continue;
4939             }
4940             if (!tag.compare(QLatin1String("enum"), Qt::CaseInsensitive)) {
4941                 setElementEnum(reader.readElementText());
4942                 continue;
4943             }
4944             if (!tag.compare(QLatin1String("font"), Qt::CaseInsensitive)) {
4945                 auto *v = new DomFont();
4946                 v->read(reader);
4947                 setElementFont(v);
4948                 continue;
4949             }
4950             if (!tag.compare(QLatin1String("iconset"), Qt::CaseInsensitive)) {
4951                 auto *v = new DomResourceIcon();
4952                 v->read(reader);
4953                 setElementIconSet(v);
4954                 continue;
4955             }
4956             if (!tag.compare(QLatin1String("pixmap"), Qt::CaseInsensitive)) {
4957                 auto *v = new DomResourcePixmap();
4958                 v->read(reader);
4959                 setElementPixmap(v);
4960                 continue;
4961             }
4962             if (!tag.compare(QLatin1String("palette"), Qt::CaseInsensitive)) {
4963                 auto *v = new DomPalette();
4964                 v->read(reader);
4965                 setElementPalette(v);
4966                 continue;
4967             }
4968             if (!tag.compare(QLatin1String("point"), Qt::CaseInsensitive)) {
4969                 auto *v = new DomPoint();
4970                 v->read(reader);
4971                 setElementPoint(v);
4972                 continue;
4973             }
4974             if (!tag.compare(QLatin1String("rect"), Qt::CaseInsensitive)) {
4975                 auto *v = new DomRect();
4976                 v->read(reader);
4977                 setElementRect(v);
4978                 continue;
4979             }
4980             if (!tag.compare(QLatin1String("set"), Qt::CaseInsensitive)) {
4981                 setElementSet(reader.readElementText());
4982                 continue;
4983             }
4984             if (!tag.compare(QLatin1String("locale"), Qt::CaseInsensitive)) {
4985                 auto *v = new DomLocale();
4986                 v->read(reader);
4987                 setElementLocale(v);
4988                 continue;
4989             }
4990             if (!tag.compare(QLatin1String("sizepolicy"), Qt::CaseInsensitive)) {
4991                 auto *v = new DomSizePolicy();
4992                 v->read(reader);
4993                 setElementSizePolicy(v);
4994                 continue;
4995             }
4996             if (!tag.compare(QLatin1String("size"), Qt::CaseInsensitive)) {
4997                 auto *v = new DomSize();
4998                 v->read(reader);
4999                 setElementSize(v);
5000                 continue;
5001             }
5002             if (!tag.compare(QLatin1String("string"), Qt::CaseInsensitive)) {
5003                 auto *v = new DomString();
5004                 v->read(reader);
5005                 setElementString(v);
5006                 continue;
5007             }
5008             if (!tag.compare(QLatin1String("stringlist"), Qt::CaseInsensitive)) {
5009                 auto *v = new DomStringList();
5010                 v->read(reader);
5011                 setElementStringList(v);
5012                 continue;
5013             }
5014             if (!tag.compare(QLatin1String("number"), Qt::CaseInsensitive)) {
5015                 setElementNumber(reader.readElementText().toInt());
5016                 continue;
5017             }
5018             if (!tag.compare(QLatin1String("float"), Qt::CaseInsensitive)) {
5019                 setElementFloat(reader.readElementText().toFloat());
5020                 continue;
5021             }
5022             if (!tag.compare(QLatin1String("double"), Qt::CaseInsensitive)) {
5023                 setElementDouble(reader.readElementText().toDouble());
5024                 continue;
5025             }
5026             if (!tag.compare(QLatin1String("date"), Qt::CaseInsensitive)) {
5027                 auto *v = new DomDate();
5028                 v->read(reader);
5029                 setElementDate(v);
5030                 continue;
5031             }
5032             if (!tag.compare(QLatin1String("time"), Qt::CaseInsensitive)) {
5033                 auto *v = new DomTime();
5034                 v->read(reader);
5035                 setElementTime(v);
5036                 continue;
5037             }
5038             if (!tag.compare(QLatin1String("datetime"), Qt::CaseInsensitive)) {
5039                 auto *v = new DomDateTime();
5040                 v->read(reader);
5041                 setElementDateTime(v);
5042                 continue;
5043             }
5044             if (!tag.compare(QLatin1String("pointf"), Qt::CaseInsensitive)) {
5045                 auto *v = new DomPointF();
5046                 v->read(reader);
5047                 setElementPointF(v);
5048                 continue;
5049             }
5050             if (!tag.compare(QLatin1String("rectf"), Qt::CaseInsensitive)) {
5051                 auto *v = new DomRectF();
5052                 v->read(reader);
5053                 setElementRectF(v);
5054                 continue;
5055             }
5056             if (!tag.compare(QLatin1String("sizef"), Qt::CaseInsensitive)) {
5057                 auto *v = new DomSizeF();
5058                 v->read(reader);
5059                 setElementSizeF(v);
5060                 continue;
5061             }
5062             if (!tag.compare(QLatin1String("longlong"), Qt::CaseInsensitive)) {
5063                 setElementLongLong(reader.readElementText().toLongLong());
5064                 continue;
5065             }
5066             if (!tag.compare(QLatin1String("char"), Qt::CaseInsensitive)) {
5067                 auto *v = new DomChar();
5068                 v->read(reader);
5069                 setElementChar(v);
5070                 continue;
5071             }
5072             if (!tag.compare(QLatin1String("url"), Qt::CaseInsensitive)) {
5073                 auto *v = new DomUrl();
5074                 v->read(reader);
5075                 setElementUrl(v);
5076                 continue;
5077             }
5078             if (!tag.compare(QLatin1String("uint"), Qt::CaseInsensitive)) {
5079                 setElementUInt(reader.readElementText().toUInt());
5080                 continue;
5081             }
5082             if (!tag.compare(QLatin1String("ulonglong"), Qt::CaseInsensitive)) {
5083                 setElementULongLong(reader.readElementText().toULongLong());
5084                 continue;
5085             }
5086             if (!tag.compare(QLatin1String("brush"), Qt::CaseInsensitive)) {
5087                 auto *v = new DomBrush();
5088                 v->read(reader);
5089                 setElementBrush(v);
5090                 continue;
5091             }
5092             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5093         }
5094             break;
5095         case QXmlStreamReader::EndElement :
5096             return;
5097         default :
5098             break;
5099         }
5100     }
5101 }
5102 
write(QXmlStreamWriter & writer,const QString & tagName) const5103 void DomProperty::write(QXmlStreamWriter &writer, const QString &tagName) const
5104 {
5105     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("property") : tagName.toLower());
5106 
5107     if (hasAttributeName())
5108         writer.writeAttribute(QStringLiteral("name"), attributeName());
5109 
5110     if (hasAttributeStdset())
5111         writer.writeAttribute(QStringLiteral("stdset"), QString::number(attributeStdset()));
5112 
5113     switch (kind()) {
5114     case Bool:
5115         writer.writeTextElement(QStringLiteral("bool"), elementBool());
5116         break;
5117 
5118     case Color:
5119         if (m_color != nullptr)
5120             m_color->write(writer, QStringLiteral("color"));
5121         break;
5122 
5123     case Cstring:
5124         writer.writeTextElement(QStringLiteral("cstring"), elementCstring());
5125         break;
5126 
5127     case Cursor:
5128         writer.writeTextElement(QStringLiteral("cursor"), QString::number(elementCursor()));
5129         break;
5130 
5131     case CursorShape:
5132         writer.writeTextElement(QStringLiteral("cursorShape"), elementCursorShape());
5133         break;
5134 
5135     case Enum:
5136         writer.writeTextElement(QStringLiteral("enum"), elementEnum());
5137         break;
5138 
5139     case Font:
5140         if (m_font != nullptr)
5141             m_font->write(writer, QStringLiteral("font"));
5142         break;
5143 
5144     case IconSet:
5145         if (m_iconSet != nullptr)
5146             m_iconSet->write(writer, QStringLiteral("iconset"));
5147         break;
5148 
5149     case Pixmap:
5150         if (m_pixmap != nullptr)
5151             m_pixmap->write(writer, QStringLiteral("pixmap"));
5152         break;
5153 
5154     case Palette:
5155         if (m_palette != nullptr)
5156             m_palette->write(writer, QStringLiteral("palette"));
5157         break;
5158 
5159     case Point:
5160         if (m_point != nullptr)
5161             m_point->write(writer, QStringLiteral("point"));
5162         break;
5163 
5164     case Rect:
5165         if (m_rect != nullptr)
5166             m_rect->write(writer, QStringLiteral("rect"));
5167         break;
5168 
5169     case Set:
5170         writer.writeTextElement(QStringLiteral("set"), elementSet());
5171         break;
5172 
5173     case Locale:
5174         if (m_locale != nullptr)
5175             m_locale->write(writer, QStringLiteral("locale"));
5176         break;
5177 
5178     case SizePolicy:
5179         if (m_sizePolicy != nullptr)
5180             m_sizePolicy->write(writer, QStringLiteral("sizepolicy"));
5181         break;
5182 
5183     case Size:
5184         if (m_size != nullptr)
5185             m_size->write(writer, QStringLiteral("size"));
5186         break;
5187 
5188     case String:
5189         if (m_string != nullptr)
5190             m_string->write(writer, QStringLiteral("string"));
5191         break;
5192 
5193     case StringList:
5194         if (m_stringList != nullptr)
5195             m_stringList->write(writer, QStringLiteral("stringlist"));
5196         break;
5197 
5198     case Number:
5199         writer.writeTextElement(QStringLiteral("number"), QString::number(elementNumber()));
5200         break;
5201 
5202     case Float:
5203         writer.writeTextElement(QStringLiteral("float"), QString::number(elementFloat(), 'f', 8));
5204         break;
5205 
5206     case Double:
5207         writer.writeTextElement(QStringLiteral("double"), QString::number(elementDouble(), 'f', 15));
5208         break;
5209 
5210     case Date:
5211         if (m_date != nullptr)
5212             m_date->write(writer, QStringLiteral("date"));
5213         break;
5214 
5215     case Time:
5216         if (m_time != nullptr)
5217             m_time->write(writer, QStringLiteral("time"));
5218         break;
5219 
5220     case DateTime:
5221         if (m_dateTime != nullptr)
5222             m_dateTime->write(writer, QStringLiteral("datetime"));
5223         break;
5224 
5225     case PointF:
5226         if (m_pointF != nullptr)
5227             m_pointF->write(writer, QStringLiteral("pointf"));
5228         break;
5229 
5230     case RectF:
5231         if (m_rectF != nullptr)
5232             m_rectF->write(writer, QStringLiteral("rectf"));
5233         break;
5234 
5235     case SizeF:
5236         if (m_sizeF != nullptr)
5237             m_sizeF->write(writer, QStringLiteral("sizef"));
5238         break;
5239 
5240     case LongLong:
5241         writer.writeTextElement(QStringLiteral("longLong"), QString::number(elementLongLong()));
5242         break;
5243 
5244     case Char:
5245         if (m_char != nullptr)
5246             m_char->write(writer, QStringLiteral("char"));
5247         break;
5248 
5249     case Url:
5250         if (m_url != nullptr)
5251             m_url->write(writer, QStringLiteral("url"));
5252         break;
5253 
5254     case UInt:
5255         writer.writeTextElement(QStringLiteral("UInt"), QString::number(elementUInt()));
5256         break;
5257 
5258     case ULongLong:
5259         writer.writeTextElement(QStringLiteral("uLongLong"), QString::number(elementULongLong()));
5260         break;
5261 
5262     case Brush:
5263         if (m_brush != nullptr)
5264             m_brush->write(writer, QStringLiteral("brush"));
5265         break;
5266 
5267     default:
5268         break;
5269     }
5270     writer.writeEndElement();
5271 }
5272 
setElementBool(const QString & a)5273 void DomProperty::setElementBool(const QString &a)
5274 {
5275     clear();
5276     m_kind = Bool;
5277     m_bool = a;
5278 }
5279 
takeElementColor()5280 DomColor *DomProperty::takeElementColor()
5281 {
5282     DomColor *a = m_color;
5283     m_color = nullptr;
5284     return a;
5285 }
5286 
setElementColor(DomColor * a)5287 void DomProperty::setElementColor(DomColor *a)
5288 {
5289     clear();
5290     m_kind = Color;
5291     m_color = a;
5292 }
5293 
setElementCstring(const QString & a)5294 void DomProperty::setElementCstring(const QString &a)
5295 {
5296     clear();
5297     m_kind = Cstring;
5298     m_cstring = a;
5299 }
5300 
setElementCursor(int a)5301 void DomProperty::setElementCursor(int a)
5302 {
5303     clear();
5304     m_kind = Cursor;
5305     m_cursor = a;
5306 }
5307 
setElementCursorShape(const QString & a)5308 void DomProperty::setElementCursorShape(const QString &a)
5309 {
5310     clear();
5311     m_kind = CursorShape;
5312     m_cursorShape = a;
5313 }
5314 
setElementEnum(const QString & a)5315 void DomProperty::setElementEnum(const QString &a)
5316 {
5317     clear();
5318     m_kind = Enum;
5319     m_enum = a;
5320 }
5321 
takeElementFont()5322 DomFont *DomProperty::takeElementFont()
5323 {
5324     DomFont *a = m_font;
5325     m_font = nullptr;
5326     return a;
5327 }
5328 
setElementFont(DomFont * a)5329 void DomProperty::setElementFont(DomFont *a)
5330 {
5331     clear();
5332     m_kind = Font;
5333     m_font = a;
5334 }
5335 
takeElementIconSet()5336 DomResourceIcon *DomProperty::takeElementIconSet()
5337 {
5338     DomResourceIcon *a = m_iconSet;
5339     m_iconSet = nullptr;
5340     return a;
5341 }
5342 
setElementIconSet(DomResourceIcon * a)5343 void DomProperty::setElementIconSet(DomResourceIcon *a)
5344 {
5345     clear();
5346     m_kind = IconSet;
5347     m_iconSet = a;
5348 }
5349 
takeElementPixmap()5350 DomResourcePixmap *DomProperty::takeElementPixmap()
5351 {
5352     DomResourcePixmap *a = m_pixmap;
5353     m_pixmap = nullptr;
5354     return a;
5355 }
5356 
setElementPixmap(DomResourcePixmap * a)5357 void DomProperty::setElementPixmap(DomResourcePixmap *a)
5358 {
5359     clear();
5360     m_kind = Pixmap;
5361     m_pixmap = a;
5362 }
5363 
takeElementPalette()5364 DomPalette *DomProperty::takeElementPalette()
5365 {
5366     DomPalette *a = m_palette;
5367     m_palette = nullptr;
5368     return a;
5369 }
5370 
setElementPalette(DomPalette * a)5371 void DomProperty::setElementPalette(DomPalette *a)
5372 {
5373     clear();
5374     m_kind = Palette;
5375     m_palette = a;
5376 }
5377 
takeElementPoint()5378 DomPoint *DomProperty::takeElementPoint()
5379 {
5380     DomPoint *a = m_point;
5381     m_point = nullptr;
5382     return a;
5383 }
5384 
setElementPoint(DomPoint * a)5385 void DomProperty::setElementPoint(DomPoint *a)
5386 {
5387     clear();
5388     m_kind = Point;
5389     m_point = a;
5390 }
5391 
takeElementRect()5392 DomRect *DomProperty::takeElementRect()
5393 {
5394     DomRect *a = m_rect;
5395     m_rect = nullptr;
5396     return a;
5397 }
5398 
setElementRect(DomRect * a)5399 void DomProperty::setElementRect(DomRect *a)
5400 {
5401     clear();
5402     m_kind = Rect;
5403     m_rect = a;
5404 }
5405 
setElementSet(const QString & a)5406 void DomProperty::setElementSet(const QString &a)
5407 {
5408     clear();
5409     m_kind = Set;
5410     m_set = a;
5411 }
5412 
takeElementLocale()5413 DomLocale *DomProperty::takeElementLocale()
5414 {
5415     DomLocale *a = m_locale;
5416     m_locale = nullptr;
5417     return a;
5418 }
5419 
setElementLocale(DomLocale * a)5420 void DomProperty::setElementLocale(DomLocale *a)
5421 {
5422     clear();
5423     m_kind = Locale;
5424     m_locale = a;
5425 }
5426 
takeElementSizePolicy()5427 DomSizePolicy *DomProperty::takeElementSizePolicy()
5428 {
5429     DomSizePolicy *a = m_sizePolicy;
5430     m_sizePolicy = nullptr;
5431     return a;
5432 }
5433 
setElementSizePolicy(DomSizePolicy * a)5434 void DomProperty::setElementSizePolicy(DomSizePolicy *a)
5435 {
5436     clear();
5437     m_kind = SizePolicy;
5438     m_sizePolicy = a;
5439 }
5440 
takeElementSize()5441 DomSize *DomProperty::takeElementSize()
5442 {
5443     DomSize *a = m_size;
5444     m_size = nullptr;
5445     return a;
5446 }
5447 
setElementSize(DomSize * a)5448 void DomProperty::setElementSize(DomSize *a)
5449 {
5450     clear();
5451     m_kind = Size;
5452     m_size = a;
5453 }
5454 
takeElementString()5455 DomString *DomProperty::takeElementString()
5456 {
5457     DomString *a = m_string;
5458     m_string = nullptr;
5459     return a;
5460 }
5461 
setElementString(DomString * a)5462 void DomProperty::setElementString(DomString *a)
5463 {
5464     clear();
5465     m_kind = String;
5466     m_string = a;
5467 }
5468 
takeElementStringList()5469 DomStringList *DomProperty::takeElementStringList()
5470 {
5471     DomStringList *a = m_stringList;
5472     m_stringList = nullptr;
5473     return a;
5474 }
5475 
setElementStringList(DomStringList * a)5476 void DomProperty::setElementStringList(DomStringList *a)
5477 {
5478     clear();
5479     m_kind = StringList;
5480     m_stringList = a;
5481 }
5482 
setElementNumber(int a)5483 void DomProperty::setElementNumber(int a)
5484 {
5485     clear();
5486     m_kind = Number;
5487     m_number = a;
5488 }
5489 
setElementFloat(float a)5490 void DomProperty::setElementFloat(float a)
5491 {
5492     clear();
5493     m_kind = Float;
5494     m_float = a;
5495 }
5496 
setElementDouble(double a)5497 void DomProperty::setElementDouble(double a)
5498 {
5499     clear();
5500     m_kind = Double;
5501     m_double = a;
5502 }
5503 
takeElementDate()5504 DomDate *DomProperty::takeElementDate()
5505 {
5506     DomDate *a = m_date;
5507     m_date = nullptr;
5508     return a;
5509 }
5510 
setElementDate(DomDate * a)5511 void DomProperty::setElementDate(DomDate *a)
5512 {
5513     clear();
5514     m_kind = Date;
5515     m_date = a;
5516 }
5517 
takeElementTime()5518 DomTime *DomProperty::takeElementTime()
5519 {
5520     DomTime *a = m_time;
5521     m_time = nullptr;
5522     return a;
5523 }
5524 
setElementTime(DomTime * a)5525 void DomProperty::setElementTime(DomTime *a)
5526 {
5527     clear();
5528     m_kind = Time;
5529     m_time = a;
5530 }
5531 
takeElementDateTime()5532 DomDateTime *DomProperty::takeElementDateTime()
5533 {
5534     DomDateTime *a = m_dateTime;
5535     m_dateTime = nullptr;
5536     return a;
5537 }
5538 
setElementDateTime(DomDateTime * a)5539 void DomProperty::setElementDateTime(DomDateTime *a)
5540 {
5541     clear();
5542     m_kind = DateTime;
5543     m_dateTime = a;
5544 }
5545 
takeElementPointF()5546 DomPointF *DomProperty::takeElementPointF()
5547 {
5548     DomPointF *a = m_pointF;
5549     m_pointF = nullptr;
5550     return a;
5551 }
5552 
setElementPointF(DomPointF * a)5553 void DomProperty::setElementPointF(DomPointF *a)
5554 {
5555     clear();
5556     m_kind = PointF;
5557     m_pointF = a;
5558 }
5559 
takeElementRectF()5560 DomRectF *DomProperty::takeElementRectF()
5561 {
5562     DomRectF *a = m_rectF;
5563     m_rectF = nullptr;
5564     return a;
5565 }
5566 
setElementRectF(DomRectF * a)5567 void DomProperty::setElementRectF(DomRectF *a)
5568 {
5569     clear();
5570     m_kind = RectF;
5571     m_rectF = a;
5572 }
5573 
takeElementSizeF()5574 DomSizeF *DomProperty::takeElementSizeF()
5575 {
5576     DomSizeF *a = m_sizeF;
5577     m_sizeF = nullptr;
5578     return a;
5579 }
5580 
setElementSizeF(DomSizeF * a)5581 void DomProperty::setElementSizeF(DomSizeF *a)
5582 {
5583     clear();
5584     m_kind = SizeF;
5585     m_sizeF = a;
5586 }
5587 
setElementLongLong(qlonglong a)5588 void DomProperty::setElementLongLong(qlonglong a)
5589 {
5590     clear();
5591     m_kind = LongLong;
5592     m_longLong = a;
5593 }
5594 
takeElementChar()5595 DomChar *DomProperty::takeElementChar()
5596 {
5597     DomChar *a = m_char;
5598     m_char = nullptr;
5599     return a;
5600 }
5601 
setElementChar(DomChar * a)5602 void DomProperty::setElementChar(DomChar *a)
5603 {
5604     clear();
5605     m_kind = Char;
5606     m_char = a;
5607 }
5608 
takeElementUrl()5609 DomUrl *DomProperty::takeElementUrl()
5610 {
5611     DomUrl *a = m_url;
5612     m_url = nullptr;
5613     return a;
5614 }
5615 
setElementUrl(DomUrl * a)5616 void DomProperty::setElementUrl(DomUrl *a)
5617 {
5618     clear();
5619     m_kind = Url;
5620     m_url = a;
5621 }
5622 
setElementUInt(uint a)5623 void DomProperty::setElementUInt(uint a)
5624 {
5625     clear();
5626     m_kind = UInt;
5627     m_UInt = a;
5628 }
5629 
setElementULongLong(qulonglong a)5630 void DomProperty::setElementULongLong(qulonglong a)
5631 {
5632     clear();
5633     m_kind = ULongLong;
5634     m_uLongLong = a;
5635 }
5636 
takeElementBrush()5637 DomBrush *DomProperty::takeElementBrush()
5638 {
5639     DomBrush *a = m_brush;
5640     m_brush = nullptr;
5641     return a;
5642 }
5643 
setElementBrush(DomBrush * a)5644 void DomProperty::setElementBrush(DomBrush *a)
5645 {
5646     clear();
5647     m_kind = Brush;
5648     m_brush = a;
5649 }
5650 
~DomConnections()5651 DomConnections::~DomConnections()
5652 {
5653     qDeleteAll(m_connection);
5654     m_connection.clear();
5655 }
5656 
read(QXmlStreamReader & reader)5657 void DomConnections::read(QXmlStreamReader &reader)
5658 {
5659     while (!reader.hasError()) {
5660         switch (reader.readNext()) {
5661         case QXmlStreamReader::StartElement : {
5662             const auto tag = reader.name();
5663             if (!tag.compare(QLatin1String("connection"), Qt::CaseInsensitive)) {
5664                 auto *v = new DomConnection();
5665                 v->read(reader);
5666                 m_connection.append(v);
5667                 continue;
5668             }
5669             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5670         }
5671             break;
5672         case QXmlStreamReader::EndElement :
5673             return;
5674         default :
5675             break;
5676         }
5677     }
5678 }
5679 
write(QXmlStreamWriter & writer,const QString & tagName) const5680 void DomConnections::write(QXmlStreamWriter &writer, const QString &tagName) const
5681 {
5682     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("connections") : tagName.toLower());
5683 
5684     for (DomConnection *v : m_connection)
5685         v->write(writer, QStringLiteral("connection"));
5686 
5687     writer.writeEndElement();
5688 }
5689 
setElementConnection(const QVector<DomConnection * > & a)5690 void DomConnections::setElementConnection(const QVector<DomConnection *> &a)
5691 {
5692     m_children |= Connection;
5693     m_connection = a;
5694 }
5695 
~DomConnection()5696 DomConnection::~DomConnection()
5697 {
5698     delete m_hints;
5699 }
5700 
read(QXmlStreamReader & reader)5701 void DomConnection::read(QXmlStreamReader &reader)
5702 {
5703     while (!reader.hasError()) {
5704         switch (reader.readNext()) {
5705         case QXmlStreamReader::StartElement : {
5706             const auto tag = reader.name();
5707             if (!tag.compare(QLatin1String("sender"), Qt::CaseInsensitive)) {
5708                 setElementSender(reader.readElementText());
5709                 continue;
5710             }
5711             if (!tag.compare(QLatin1String("signal"), Qt::CaseInsensitive)) {
5712                 setElementSignal(reader.readElementText());
5713                 continue;
5714             }
5715             if (!tag.compare(QLatin1String("receiver"), Qt::CaseInsensitive)) {
5716                 setElementReceiver(reader.readElementText());
5717                 continue;
5718             }
5719             if (!tag.compare(QLatin1String("slot"), Qt::CaseInsensitive)) {
5720                 setElementSlot(reader.readElementText());
5721                 continue;
5722             }
5723             if (!tag.compare(QLatin1String("hints"), Qt::CaseInsensitive)) {
5724                 auto *v = new DomConnectionHints();
5725                 v->read(reader);
5726                 setElementHints(v);
5727                 continue;
5728             }
5729             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5730         }
5731             break;
5732         case QXmlStreamReader::EndElement :
5733             return;
5734         default :
5735             break;
5736         }
5737     }
5738 }
5739 
write(QXmlStreamWriter & writer,const QString & tagName) const5740 void DomConnection::write(QXmlStreamWriter &writer, const QString &tagName) const
5741 {
5742     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("connection") : tagName.toLower());
5743 
5744     if (m_children & Sender)
5745         writer.writeTextElement(QStringLiteral("sender"), m_sender);
5746 
5747     if (m_children & Signal)
5748         writer.writeTextElement(QStringLiteral("signal"), m_signal);
5749 
5750     if (m_children & Receiver)
5751         writer.writeTextElement(QStringLiteral("receiver"), m_receiver);
5752 
5753     if (m_children & Slot)
5754         writer.writeTextElement(QStringLiteral("slot"), m_slot);
5755 
5756     if (m_children & Hints)
5757         m_hints->write(writer, QStringLiteral("hints"));
5758 
5759     writer.writeEndElement();
5760 }
5761 
setElementSender(const QString & a)5762 void DomConnection::setElementSender(const QString &a)
5763 {
5764     m_children |= Sender;
5765     m_sender = a;
5766 }
5767 
setElementSignal(const QString & a)5768 void DomConnection::setElementSignal(const QString &a)
5769 {
5770     m_children |= Signal;
5771     m_signal = a;
5772 }
5773 
setElementReceiver(const QString & a)5774 void DomConnection::setElementReceiver(const QString &a)
5775 {
5776     m_children |= Receiver;
5777     m_receiver = a;
5778 }
5779 
setElementSlot(const QString & a)5780 void DomConnection::setElementSlot(const QString &a)
5781 {
5782     m_children |= Slot;
5783     m_slot = a;
5784 }
5785 
takeElementHints()5786 DomConnectionHints *DomConnection::takeElementHints()
5787 {
5788     DomConnectionHints *a = m_hints;
5789     m_hints = nullptr;
5790     m_children ^= Hints;
5791     return a;
5792 }
5793 
setElementHints(DomConnectionHints * a)5794 void DomConnection::setElementHints(DomConnectionHints *a)
5795 {
5796     delete m_hints;
5797     m_children |= Hints;
5798     m_hints = a;
5799 }
5800 
clearElementSender()5801 void DomConnection::clearElementSender()
5802 {
5803     m_children &= ~Sender;
5804 }
5805 
clearElementSignal()5806 void DomConnection::clearElementSignal()
5807 {
5808     m_children &= ~Signal;
5809 }
5810 
clearElementReceiver()5811 void DomConnection::clearElementReceiver()
5812 {
5813     m_children &= ~Receiver;
5814 }
5815 
clearElementSlot()5816 void DomConnection::clearElementSlot()
5817 {
5818     m_children &= ~Slot;
5819 }
5820 
clearElementHints()5821 void DomConnection::clearElementHints()
5822 {
5823     delete m_hints;
5824     m_hints = nullptr;
5825     m_children &= ~Hints;
5826 }
5827 
~DomConnectionHints()5828 DomConnectionHints::~DomConnectionHints()
5829 {
5830     qDeleteAll(m_hint);
5831     m_hint.clear();
5832 }
5833 
read(QXmlStreamReader & reader)5834 void DomConnectionHints::read(QXmlStreamReader &reader)
5835 {
5836     while (!reader.hasError()) {
5837         switch (reader.readNext()) {
5838         case QXmlStreamReader::StartElement : {
5839             const auto tag = reader.name();
5840             if (!tag.compare(QLatin1String("hint"), Qt::CaseInsensitive)) {
5841                 auto *v = new DomConnectionHint();
5842                 v->read(reader);
5843                 m_hint.append(v);
5844                 continue;
5845             }
5846             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5847         }
5848             break;
5849         case QXmlStreamReader::EndElement :
5850             return;
5851         default :
5852             break;
5853         }
5854     }
5855 }
5856 
write(QXmlStreamWriter & writer,const QString & tagName) const5857 void DomConnectionHints::write(QXmlStreamWriter &writer, const QString &tagName) const
5858 {
5859     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("connectionhints") : tagName.toLower());
5860 
5861     for (DomConnectionHint *v : m_hint)
5862         v->write(writer, QStringLiteral("hint"));
5863 
5864     writer.writeEndElement();
5865 }
5866 
setElementHint(const QVector<DomConnectionHint * > & a)5867 void DomConnectionHints::setElementHint(const QVector<DomConnectionHint *> &a)
5868 {
5869     m_children |= Hint;
5870     m_hint = a;
5871 }
5872 
5873 DomConnectionHint::~DomConnectionHint() = default;
5874 
read(QXmlStreamReader & reader)5875 void DomConnectionHint::read(QXmlStreamReader &reader)
5876 {
5877     const QXmlStreamAttributes &attributes = reader.attributes();
5878     for (const QXmlStreamAttribute &attribute : attributes) {
5879         const auto name = attribute.name();
5880         if (name == QLatin1String("type")) {
5881             setAttributeType(attribute.value().toString());
5882             continue;
5883         }
5884         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
5885     }
5886 
5887     while (!reader.hasError()) {
5888         switch (reader.readNext()) {
5889         case QXmlStreamReader::StartElement : {
5890             const auto tag = reader.name();
5891             if (!tag.compare(QLatin1String("x"), Qt::CaseInsensitive)) {
5892                 setElementX(reader.readElementText().toInt());
5893                 continue;
5894             }
5895             if (!tag.compare(QLatin1String("y"), Qt::CaseInsensitive)) {
5896                 setElementY(reader.readElementText().toInt());
5897                 continue;
5898             }
5899             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5900         }
5901             break;
5902         case QXmlStreamReader::EndElement :
5903             return;
5904         default :
5905             break;
5906         }
5907     }
5908 }
5909 
write(QXmlStreamWriter & writer,const QString & tagName) const5910 void DomConnectionHint::write(QXmlStreamWriter &writer, const QString &tagName) const
5911 {
5912     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("connectionhint") : tagName.toLower());
5913 
5914     if (hasAttributeType())
5915         writer.writeAttribute(QStringLiteral("type"), attributeType());
5916 
5917     if (m_children & X)
5918         writer.writeTextElement(QString(QLatin1Char('x')), QString::number(m_x));
5919 
5920     if (m_children & Y)
5921         writer.writeTextElement(QString(QLatin1Char('y')), QString::number(m_y));
5922 
5923     writer.writeEndElement();
5924 }
5925 
setElementX(int a)5926 void DomConnectionHint::setElementX(int a)
5927 {
5928     m_children |= X;
5929     m_x = a;
5930 }
5931 
setElementY(int a)5932 void DomConnectionHint::setElementY(int a)
5933 {
5934     m_children |= Y;
5935     m_y = a;
5936 }
5937 
clearElementX()5938 void DomConnectionHint::clearElementX()
5939 {
5940     m_children &= ~X;
5941 }
5942 
clearElementY()5943 void DomConnectionHint::clearElementY()
5944 {
5945     m_children &= ~Y;
5946 }
5947 
~DomDesignerData()5948 DomDesignerData::~DomDesignerData()
5949 {
5950     qDeleteAll(m_property);
5951     m_property.clear();
5952 }
5953 
read(QXmlStreamReader & reader)5954 void DomDesignerData::read(QXmlStreamReader &reader)
5955 {
5956     while (!reader.hasError()) {
5957         switch (reader.readNext()) {
5958         case QXmlStreamReader::StartElement : {
5959             const auto tag = reader.name();
5960             if (!tag.compare(QLatin1String("property"), Qt::CaseInsensitive)) {
5961                 auto *v = new DomProperty();
5962                 v->read(reader);
5963                 m_property.append(v);
5964                 continue;
5965             }
5966             reader.raiseError(QLatin1String("Unexpected element ") + tag);
5967         }
5968             break;
5969         case QXmlStreamReader::EndElement :
5970             return;
5971         default :
5972             break;
5973         }
5974     }
5975 }
5976 
write(QXmlStreamWriter & writer,const QString & tagName) const5977 void DomDesignerData::write(QXmlStreamWriter &writer, const QString &tagName) const
5978 {
5979     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("designerdata") : tagName.toLower());
5980 
5981     for (DomProperty *v : m_property)
5982         v->write(writer, QStringLiteral("property"));
5983 
5984     writer.writeEndElement();
5985 }
5986 
setElementProperty(const QList<DomProperty * > & a)5987 void DomDesignerData::setElementProperty(const QList<DomProperty *> &a)
5988 {
5989     m_children |= Property;
5990     m_property = a;
5991 }
5992 
~DomSlots()5993 DomSlots::~DomSlots()
5994 {
5995     m_signal.clear();
5996     m_slot.clear();
5997 }
5998 
read(QXmlStreamReader & reader)5999 void DomSlots::read(QXmlStreamReader &reader)
6000 {
6001     while (!reader.hasError()) {
6002         switch (reader.readNext()) {
6003         case QXmlStreamReader::StartElement : {
6004             const auto tag = reader.name();
6005             if (!tag.compare(QLatin1String("signal"), Qt::CaseInsensitive)) {
6006                 m_signal.append(reader.readElementText());
6007                 continue;
6008             }
6009             if (!tag.compare(QLatin1String("slot"), Qt::CaseInsensitive)) {
6010                 m_slot.append(reader.readElementText());
6011                 continue;
6012             }
6013             reader.raiseError(QLatin1String("Unexpected element ") + tag);
6014         }
6015             break;
6016         case QXmlStreamReader::EndElement :
6017             return;
6018         default :
6019             break;
6020         }
6021     }
6022 }
6023 
write(QXmlStreamWriter & writer,const QString & tagName) const6024 void DomSlots::write(QXmlStreamWriter &writer, const QString &tagName) const
6025 {
6026     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("slots") : tagName.toLower());
6027 
6028     for (const QString &v : m_signal)
6029         writer.writeTextElement(QStringLiteral("signal"), v);
6030 
6031     for (const QString &v : m_slot)
6032         writer.writeTextElement(QStringLiteral("slot"), v);
6033 
6034     writer.writeEndElement();
6035 }
6036 
setElementSignal(const QStringList & a)6037 void DomSlots::setElementSignal(const QStringList &a)
6038 {
6039     m_children |= Signal;
6040     m_signal = a;
6041 }
6042 
setElementSlot(const QStringList & a)6043 void DomSlots::setElementSlot(const QStringList &a)
6044 {
6045     m_children |= Slot;
6046     m_slot = a;
6047 }
6048 
~DomPropertySpecifications()6049 DomPropertySpecifications::~DomPropertySpecifications()
6050 {
6051     qDeleteAll(m_tooltip);
6052     m_tooltip.clear();
6053     qDeleteAll(m_stringpropertyspecification);
6054     m_stringpropertyspecification.clear();
6055 }
6056 
read(QXmlStreamReader & reader)6057 void DomPropertySpecifications::read(QXmlStreamReader &reader)
6058 {
6059     while (!reader.hasError()) {
6060         switch (reader.readNext()) {
6061         case QXmlStreamReader::StartElement : {
6062             const auto tag = reader.name();
6063             if (!tag.compare(QLatin1String("tooltip"), Qt::CaseInsensitive)) {
6064                 auto *v = new DomPropertyToolTip();
6065                 v->read(reader);
6066                 m_tooltip.append(v);
6067                 continue;
6068             }
6069             if (!tag.compare(QLatin1String("stringpropertyspecification"), Qt::CaseInsensitive)) {
6070                 auto *v = new DomStringPropertySpecification();
6071                 v->read(reader);
6072                 m_stringpropertyspecification.append(v);
6073                 continue;
6074             }
6075             reader.raiseError(QLatin1String("Unexpected element ") + tag);
6076         }
6077             break;
6078         case QXmlStreamReader::EndElement :
6079             return;
6080         default :
6081             break;
6082         }
6083     }
6084 }
6085 
write(QXmlStreamWriter & writer,const QString & tagName) const6086 void DomPropertySpecifications::write(QXmlStreamWriter &writer, const QString &tagName) const
6087 {
6088     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("propertyspecifications") : tagName.toLower());
6089 
6090     for (DomPropertyToolTip *v : m_tooltip)
6091         v->write(writer, QStringLiteral("tooltip"));
6092 
6093     for (DomStringPropertySpecification *v : m_stringpropertyspecification)
6094         v->write(writer, QStringLiteral("stringpropertyspecification"));
6095 
6096     writer.writeEndElement();
6097 }
6098 
setElementTooltip(const QVector<DomPropertyToolTip * > & a)6099 void DomPropertySpecifications::setElementTooltip(const QVector<DomPropertyToolTip *> &a)
6100 {
6101     m_children |= Tooltip;
6102     m_tooltip = a;
6103 }
6104 
setElementStringpropertyspecification(const QVector<DomStringPropertySpecification * > & a)6105 void DomPropertySpecifications::setElementStringpropertyspecification(const QVector<DomStringPropertySpecification *> &a)
6106 {
6107     m_children |= Stringpropertyspecification;
6108     m_stringpropertyspecification = a;
6109 }
6110 
6111 DomPropertyToolTip::~DomPropertyToolTip() = default;
6112 
read(QXmlStreamReader & reader)6113 void DomPropertyToolTip::read(QXmlStreamReader &reader)
6114 {
6115     const QXmlStreamAttributes &attributes = reader.attributes();
6116     for (const QXmlStreamAttribute &attribute : attributes) {
6117         const auto name = attribute.name();
6118         if (name == QLatin1String("name")) {
6119             setAttributeName(attribute.value().toString());
6120             continue;
6121         }
6122         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
6123     }
6124 
6125     while (!reader.hasError()) {
6126         switch (reader.readNext()) {
6127         case QXmlStreamReader::StartElement : {
6128             const auto tag = reader.name();
6129             reader.raiseError(QLatin1String("Unexpected element ") + tag);
6130         }
6131             break;
6132         case QXmlStreamReader::EndElement :
6133             return;
6134         default :
6135             break;
6136         }
6137     }
6138 }
6139 
write(QXmlStreamWriter & writer,const QString & tagName) const6140 void DomPropertyToolTip::write(QXmlStreamWriter &writer, const QString &tagName) const
6141 {
6142     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("propertytooltip") : tagName.toLower());
6143 
6144     if (hasAttributeName())
6145         writer.writeAttribute(QStringLiteral("name"), attributeName());
6146 
6147     writer.writeEndElement();
6148 }
6149 
6150 DomStringPropertySpecification::~DomStringPropertySpecification() = default;
6151 
read(QXmlStreamReader & reader)6152 void DomStringPropertySpecification::read(QXmlStreamReader &reader)
6153 {
6154     const QXmlStreamAttributes &attributes = reader.attributes();
6155     for (const QXmlStreamAttribute &attribute : attributes) {
6156         const auto name = attribute.name();
6157         if (name == QLatin1String("name")) {
6158             setAttributeName(attribute.value().toString());
6159             continue;
6160         }
6161         if (name == QLatin1String("type")) {
6162             setAttributeType(attribute.value().toString());
6163             continue;
6164         }
6165         if (name == QLatin1String("notr")) {
6166             setAttributeNotr(attribute.value().toString());
6167             continue;
6168         }
6169         reader.raiseError(QLatin1String("Unexpected attribute ") + name);
6170     }
6171 
6172     while (!reader.hasError()) {
6173         switch (reader.readNext()) {
6174         case QXmlStreamReader::StartElement : {
6175             const auto tag = reader.name();
6176             reader.raiseError(QLatin1String("Unexpected element ") + tag);
6177         }
6178             break;
6179         case QXmlStreamReader::EndElement :
6180             return;
6181         default :
6182             break;
6183         }
6184     }
6185 }
6186 
write(QXmlStreamWriter & writer,const QString & tagName) const6187 void DomStringPropertySpecification::write(QXmlStreamWriter &writer, const QString &tagName) const
6188 {
6189     writer.writeStartElement(tagName.isEmpty() ? QStringLiteral("stringpropertyspecification") : tagName.toLower());
6190 
6191     if (hasAttributeName())
6192         writer.writeAttribute(QStringLiteral("name"), attributeName());
6193 
6194     if (hasAttributeType())
6195         writer.writeAttribute(QStringLiteral("type"), attributeType());
6196 
6197     if (hasAttributeNotr())
6198         writer.writeAttribute(QStringLiteral("notr"), attributeNotr());
6199 
6200     writer.writeEndElement();
6201 }
6202 
6203 QT_END_NAMESPACE
6204 
6205