KReport

KReportSectionData.cpp
1 /* This file is part of the KDE project
2  * Copyright (C) 2001-2007 by OpenMFG, LLC ([email protected])
3  * Copyright (C) 2007-2008 by Adam Pigg ([email protected])
4  * Copyright (C) 2010-2018 JarosÅ‚aw Staniek <[email protected]>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "KReportSectionData.h"
21 #include "KReportDesigner.h"
22 #include "KReportDocument.h"
23 #include "KReportItemLine.h"
24 #include "KReportPluginInterface.h"
25 #include "KReportPluginManager.h"
26 #include "KReportItemLine.h"
27 #include "KReportDesigner.h"
28 #include "KReportUtils.h"
29 #include "KReportUtils_p.h"
30 #include "kreport_debug.h"
31 
32 #include <KPropertySet>
33 
34 #include <QDomElement>
35 
36 class Q_DECL_HIDDEN KReportSectionData::Private
37 {
38 public:
39  explicit Private(KReportSectionData *data, const QDomElement &elemSource) : q(data)
40  {
41  if (!elemSource.isNull()) {
42  q->setObjectName(elemSource.tagName());
43  type = sectionTypeFromString(KReportUtils::readSectionTypeNameAttribute(elemSource));
44  }
45  createProperties(elemSource);
46  if (!elemSource.isNull()) {
47  loadXml(elemSource);
48  }
49  set.clearModifiedFlags();
50  }
51 
52  ~Private()
53  {
54  qDeleteAll(objects);
55  }
56 
57  void setHeight(qreal ptHeight, KProperty::ValueOptions options);
58 
59  static bool zLessThan(KReportItemBase* s1, KReportItemBase* s2);
60  static bool xLessThan(KReportItemBase* s1, KReportItemBase* s2);
61 
62  KReportSectionData * const q;
63  KPropertySet set;
64  KProperty *backgroundColor;
65  KProperty *height;
67  KReportUnit unit = KReportUnit(DEFAULT_UNIT_TYPE);
68  Type type = Type::None;
69  bool valid = true;
70 
71 private:
72  void createProperties(const QDomElement &elemSource);
73  void loadXml(const QDomElement &elemSource);
74 };
75 
76 KReportSectionData::KReportSectionData(QObject *parent)
77  : KReportSectionData(QDomElement(), parent)
78 {
79 }
80 
81 KReportSectionData::KReportSectionData(const QDomElement & elemSource, QObject *parent)
82  : QObject(parent), d(new Private(this, elemSource))
83 {
84 }
85 
86 void KReportSectionData::Private::loadXml(const QDomElement &elemSource)
87 {
88  if (q->objectName() != QLatin1String("report:section") || type == KReportSectionData::Type::None) {
89  valid = false;
90  return;
91  }
92 
93  KReportPluginManager* manager = KReportPluginManager::self();
94 
95  QDomNodeList section = elemSource.childNodes();
96  for (int nodeCounter = 0; nodeCounter < section.count(); nodeCounter++) {
97  QDomElement elemThis = section.item(nodeCounter).toElement();
98  QString n = elemThis.tagName();
99  if (n.startsWith(QLatin1String("report:"))) {
100  KReportItemBase *krobj = nullptr;
101  QString reportItemName = n.mid(qstrlen("report:"));
102  if (reportItemName == QLatin1String("line")) {
103  KReportItemLine * line = new KReportItemLine(elemThis);
104  krobj = line;
105  } else {
106  KReportPluginInterface *plugin = manager->plugin(reportItemName);
107  if (plugin) {
108  QObject *obj = plugin->createRendererInstance(elemThis);
109  if (obj) {
110  krobj = dynamic_cast<KReportItemBase*>(obj);
111  }
112  }
113  }
114  if (krobj) {
115  krobj->propertySet()->clearModifiedFlags();
116  objects.append(krobj);
117  } else {
118  kreportWarning() << "Could not create element of type" << reportItemName;
119  }
120  } else {
121  kreportWarning() << "While parsing section encountered an unknown element:" << n;
122  }
123  }
124  qSort(objects.begin(), objects.end(), zLessThan);
125  valid = true;
126 }
127 
128 KReportSectionData::~KReportSectionData()
129 {
130  delete d;
131 }
132 
133 KReportUnit KReportSectionData::unit() const
134 {
135  return d->unit;
136 }
137 
138 void KReportSectionData::setUnit(const KReportUnit &u)
139 {
140  if (d->unit == u) {
141  return;
142  }
143  // convert values
144  KReportUnit oldunit = d->unit;
145  d->unit = u;
146 
147  d->height->setValue(KReportUnit::convertFromUnitToUnit(d->height->value().toReal(), oldunit, u),
149  d->height->setOption("suffix", u.symbol());
150 }
151 
152 bool KReportSectionData::Private::zLessThan(KReportItemBase* s1, KReportItemBase* s2)
153 {
154  return s1->z() < s2->z();
155 }
156 
157 bool KReportSectionData::Private::xLessThan(KReportItemBase* s1, KReportItemBase* s2)
158 {
159  return s1->position().toPoint().x() < s2->position().toPoint().x();
160 }
161 
162 void KReportSectionData::Private::createProperties(const QDomElement & elemSource)
163 {
164  KReportDesigner::addMetaProperties(&set, KReportSectionData::tr("Section", "Report section"),
165  QLatin1String("kreport-section-element"));
166  height = new KProperty("height", 0.0, tr("Height"));
167  backgroundColor = new KProperty(
168  "background-color",
169  KReportUtils::attr(elemSource, QLatin1String("fo:background-color"), QColor(Qt::white)),
170  tr("Background Color"));
171  height->setOption("unit", QLatin1String("cm"));
172  if (!elemSource.isNull()) {
173  height->setValue(unit.convertFromPoint(
174  KReportUtils::readSizeAttributes(
175  elemSource, QSizeF(DEFAULT_SECTION_SIZE_PT, DEFAULT_SECTION_SIZE_PT))
176  .height()));
177  }
178 
179  set.addProperty(height);
180  set.addProperty(backgroundColor);
181  set.clearModifiedFlags();
182 }
183 
184 QString KReportSectionData::name() const
185 {
186  return (objectName() + QLatin1Char('-') + sectionTypeString(d->type));
187 }
188 
189 QString KReportSectionData::sectionTypeString(KReportSectionData::Type type)
190 {
191 //! @todo use QMap
192  QString sectiontype;
193  switch (type) {
194  case KReportSectionData::Type::PageHeaderAny:
195  sectiontype = QLatin1String("header-page-any");
196  break;
197  case KReportSectionData::Type::PageHeaderEven:
198  sectiontype = QLatin1String("header-page-even");
199  break;
200  case KReportSectionData::Type::PageHeaderOdd:
201  sectiontype = QLatin1String("header-page-odd");
202  break;
203  case KReportSectionData::Type::PageHeaderFirst:
204  sectiontype = QLatin1String("header-page-first");
205  break;
206  case KReportSectionData::Type::PageHeaderLast:
207  sectiontype = QLatin1String("header-page-last");
208  break;
209  case KReportSectionData::Type::PageFooterAny:
210  sectiontype = QLatin1String("footer-page-any");
211  break;
212  case KReportSectionData::Type::PageFooterEven:
213  sectiontype = QLatin1String("footer-page-even");
214  break;
215  case KReportSectionData::Type::PageFooterOdd:
216  sectiontype = QLatin1String("footer-page-odd");
217  break;
218  case KReportSectionData::Type::PageFooterFirst:
219  sectiontype = QLatin1String("footer-page-first");
220  break;
221  case KReportSectionData::Type::PageFooterLast:
222  sectiontype = QLatin1String("footer-page-last");
223  break;
224  case KReportSectionData::Type::ReportHeader:
225  sectiontype = QLatin1String("header-report");
226  break;
227  case KReportSectionData::Type::ReportFooter:
228  sectiontype = QLatin1String("footer-report");
229  break;
230  case KReportSectionData::Type::GroupHeader:
231  sectiontype = QLatin1String("group-header");
232  break;
233  case KReportSectionData::Type::GroupFooter:
234  sectiontype = QLatin1String("group-footer");
235  break;
236  case KReportSectionData::Type::Detail:
237  sectiontype = QLatin1String("detail");
238  break;
239  default:
240  break;
241  }
242 
243  return sectiontype;
244 }
245 
246 KReportSectionData::Type KReportSectionData::sectionTypeFromString(const QString& s)
247 {
248 //! @todo use QMap
249  KReportSectionData::Type type;
250  //kreportDebug() << "Determining section type for " << s;
251  if (s == QLatin1String("header-page-any"))
252  type = KReportSectionData::Type::PageHeaderAny;
253  else if (s == QLatin1String("header-page-even"))
254  type = KReportSectionData::Type::PageHeaderEven;
255  else if (s == QLatin1String("header-page-odd"))
256  type = KReportSectionData::Type::PageHeaderOdd;
257  else if (s == QLatin1String("header-page-first"))
258  type = KReportSectionData::Type::PageHeaderFirst;
259  else if (s == QLatin1String("header-page-last"))
260  type = KReportSectionData::Type::PageHeaderLast;
261  else if (s == QLatin1String("header-report"))
262  type = KReportSectionData::Type::ReportHeader;
263  else if (s == QLatin1String("footer-page-any"))
264  type = KReportSectionData::Type::PageFooterAny;
265  else if (s == QLatin1String("footer-page-even"))
266  type = KReportSectionData::Type::PageFooterEven;
267  else if (s == QLatin1String("footer-page-odd"))
268  type = KReportSectionData::Type::PageFooterOdd;
269  else if (s == QLatin1String("footer-page-first"))
270  type = KReportSectionData::Type::PageFooterFirst;
271  else if (s == QLatin1String("footer-page-last"))
272  type = KReportSectionData::Type::PageFooterLast;
273  else if (s == QLatin1String("footer-report"))
274  type = KReportSectionData::Type::ReportFooter;
275  else if (s == QLatin1String("group-header"))
276  type = KReportSectionData::Type::GroupHeader;
277  else if (s == QLatin1String("group-footer"))
278  type = KReportSectionData::Type::GroupFooter;
279  else if (s == QLatin1String("detail"))
280  type = KReportSectionData::Type::Detail;
281  else
282  type = KReportSectionData::Type::None;
283 
284  return type;
285 }
286 
287 qreal KReportSectionData::height() const
288 {
289  return d->unit.convertToPoint(d->height->value().toReal());
290 }
291 
292 void KReportSectionData::setHeight(qreal ptHeight, KProperty::ValueOptions options)
293 {
294  d->height->setValue(d->unit.convertFromPoint(ptHeight), options);
295 }
296 
297 void KReportSectionData::setHeight(qreal ptHeight)
298 {
299  setHeight(ptHeight, KProperty::ValueOptions());
300 }
301 
303 {
304  return &d->set;
305 }
306 
308 {
309  return &d->set;
310 }
311 
312 bool KReportSectionData::isValid() const
313 {
314  return d->valid;
315 }
316 
317 QList<KReportItemBase*> KReportSectionData::objects() const
318 {
319  return d->objects;
320 }
321 
322 QColor KReportSectionData::backgroundColor() const
323 {
324  return d->backgroundColor->value().value<QColor>();
325 }
326 
327 void KReportSectionData::setBackgroundColor(const QColor &color)
328 {
329  d->backgroundColor->setValue(color);
330 }
331 
332 KReportSectionData::Type KReportSectionData::type() const
333 {
334  return d->type;
335 }
336 
337 KReportItemBase* KReportSectionData::object(int index)
338 {
339  return d->objects.value(index);
340 }
Base class for items that are drawn syncronously.
int count() const const
static KReportSectionData::Type sectionTypeFromString(const QString &s)
Converts between different units.
Definition: KReportUnit.h:70
QDomElement toElement() const const
QString tagName() const const
Type type(const QSqlDatabase &db)
bool isNull() const const
static QString sectionTypeString(KReportSectionData::Type type)
static void addMetaProperties(KPropertySet *set, const QString &classString, const QString &iconName)
Adds meta-properties to the property set set for consumption by property editor.
int x() const const
KReportSectionData is used to store the information about a specific report section.
Manager class for finding and loading available plugins.
QDomNode item(int index) const const
QPointF position() const
Return the position in points.
QDomNodeList childNodes() const const
KPropertySet * propertySet()
Returns property set for this section.
qreal z() const
Return the z-value in points.
static QString symbol(KReportUnit::Type type)
Returns the symbol string of given unit type Symbol for Invalid type is empty string.
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
QPoint toPoint() const const
virtual QObject * createRendererInstance(const QDomNode &element)=0
static qreal convertFromUnitToUnit(qreal value, const KReportUnit &fromUnit, const KReportUnit &toUnit, qreal factor=1.0)
convert the given value directly from one unit to another with high accuracy
void clearModifiedFlags()
QString mid(int position, int n) const const
QString tr(const char *sourceText, const char *disambiguation, int n)
An interface for plugins delivering KReport elements.
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Tue Aug 9 2022 04:09:34 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.