2 * ReportElementBase.cpp - TaskJuggler
4 * Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006
5 * by Chris Schlaeger <cs@kde.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
11 * $Id: ReportElement.h 1335 2006-09-24 13:49:05Z cs $
14 #include "ReportElementBase.h"
15 #include "TableLineInfo.h"
16 #include "tjlib-internal.h"
21 #include "TextAttribute.h"
22 #include "ReferenceAttribute.h"
24 ReportElementBase::ReportElementBase(Report* r, const QString& df, int dl) :
36 ReportElementBase::setLoadUnit(const QString& u)
38 if (u == KW("minutes"))
40 else if (u == KW("hours"))
42 else if (u == KW("days"))
44 else if (u == KW("weeks"))
46 else if (u == KW("months"))
48 else if (u == KW("years"))
50 else if (u == KW("shortauto"))
52 else if (u == KW("longauto"))
61 ReportElementBase::scaledDuration(double t, const RealFormat& realFormat,
62 bool showUnit, bool longUnit) const
64 QValueList<double> factors;
66 factors.append(24 * 60);
69 factors.append(1.0 / 7);
70 factors.append(1.0 / 30.42);
71 factors.append(1.0 / 365);
73 return scaledValue(t, realFormat, showUnit, longUnit, factors);
77 ReportElementBase::scaledLoad(double t, const RealFormat& realFormat,
78 bool showUnit, bool longUnit) const
80 QValueList<double> factors;
82 factors.append(report->getProject()->getDailyWorkingHours() * 60);
83 factors.append(report->getProject()->getDailyWorkingHours());
85 factors.append(1.0 / report->getProject()->getWeeklyWorkingDays());
86 factors.append(1.0 / report->getProject()->getMonthlyWorkingDays());
87 factors.append(1.0 / report->getProject()->getYearlyWorkingDays());
89 return scaledValue(t, realFormat, showUnit, longUnit, factors);
93 ReportElementBase::scaledValue(double t, const RealFormat& realFormat,
94 bool showUnit, bool longUnit,
95 const QValueList<double>& factors) const
97 QStringList variations;
98 const char* shortUnit[] = { "min", "h", "d", "w", "m", "y" };
99 const char* unit[] = { "minute", "hour", "day", "week", "month", "year" };
100 const char* units[] = { "minutes", "hours", "days", "weeks", "months",
102 double max[] = { 60, 48, 0, 8, 24, 0 };
106 if (loadUnit == shortAuto || loadUnit == longAuto)
108 for (QValueList<double>::ConstIterator it = factors.begin();
109 it != factors.end(); ++it)
111 str = realFormat.format(t * *it, false);
112 int idx = factors.findIndex(*it);
113 if ((*it != 1.0 && str == "0") ||
114 (max[idx] != 0 && max[idx] < (t * *it)))
115 variations.append("");
117 variations.append(str);
120 uint shortest = 2; // default to days in case all are the same
121 for (QStringList::Iterator it = variations.begin();
122 it != variations.end();
125 if ((*it).length() > 0 &&
126 (*it).length() < variations[shortest].length())
128 shortest = variations.findIndex(*it);
131 str = variations[shortest];
132 if (loadUnit == longAuto)
134 if (variations[shortest] == "1")
135 str += QString(" ") + unit[shortest];
137 str += QString(" ") + units[shortest];
140 str += shortUnit[shortest];
147 str = realFormat.format(t * factors[0], false);
150 str = realFormat.format(t * factors[1], false);
153 str = realFormat.format(t * factors[2], false);
156 str = realFormat.format(t * factors[3], false);
159 str = realFormat.format(t * factors[4], false);
162 str = realFormat.format(t * factors[5], false);
166 break; // handled above switch statement already
168 // Add unit in case it's forced by caller.
169 if (showUnit && loadUnit <= years)
170 str += longUnit ? QString(" ") + units[loadUnit] :
171 QString(shortUnit[loadUnit]);
177 ReportElementBase::setMacros(TableLineInfo* tli)
181 /* In some cases it might be useful to have not only the ID of the current
182 * property but also the assigned property (e. g. in task reports with
183 * resources, we want the task ID while processing the resource line. */
186 if (tli->task->getAccount()) mt.addMacro(new Macro(KW("accounts"), tli->task->getAccount()->getName(), defFileName, defFileLine));
187 mt.addMacro(new Macro(KW("completed"), tli->task->getComplete(tli->sc), defFileName, defFileLine));
188 mt.addMacro(new Macro(KW("completedeffort"), tli->task->getCompletedLoad(tli->sc), defFileName, defFileLine));
189 mt.addMacro(new Macro(KW("criticalness"), tli->task->getCriticalness(tli->sc), defFileName, defFileLine));
190 mt.addMacro(new Macro(KW("duration"), tli->task->getDuration(tli->sc), defFileName, defFileLine));
191 mt.addMacro(new Macro(KW("effort"), tli->task->getEffort(tli->sc), defFileName, defFileLine));
192 if (tli->task->getEnd(tli->sc))
193 mt.addMacro(new Macro(KW("end"), time2user(tli->task->getEnd(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
194 if (tli->task->getMaxEnd(tli->sc))
195 mt.addMacro(new Macro(KW("maxend"), time2user(tli->task->getMaxEnd(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
196 if (tli->task->getMaxStart(tli->sc))
197 mt.addMacro(new Macro(KW("maxstart"), time2user(tli->task->getMaxStart(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
198 if (tli->task->getMinEnd(tli->sc))
199 mt.addMacro(new Macro(KW("minend"), time2user(tli->task->getMinEnd(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
200 if (tli->task->getMinStart(tli->sc))
201 mt.addMacro(new Macro(KW("minstart"), time2user(tli->task->getMinStart(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
202 mt.addMacro(new Macro(KW("note"), tli->task->getNote(), defFileName, defFileLine));
203 mt.addMacro(new Macro(KW("pathcriticalness"), tli->task->getPathCriticalness(tli->sc), defFileName, defFileLine));
204 mt.addMacro(new Macro(KW("priority"), tli->task->getPriority(), defFileName, defFileLine));
205 mt.addMacro(new Macro(KW("reference"), tli->task->getReference(), defFileName, defFileLine));
206 mt.addMacro(new Macro(KW("remainingeffort"), tli->task->getRemainingLoad(tli->sc), defFileName, defFileLine));
207 if (tli->task->getResponsible())
208 mt.addMacro(new Macro(KW("responsible"), tli->task->getResponsible()->getName(), defFileName, defFileLine));
209 if (tli->task->getStart(tli->sc))
210 mt.addMacro(new Macro(KW("start"), time2user(tli->task->getStart(tli->sc), tli->task->getProject()->getTimeFormat()), defFileName, defFileLine));
211 mt.addMacro(new Macro(KW("status"), tli->task->getStatusText(tli->sc), defFileName, defFileLine));
212 mt.addMacro(new Macro(KW("statusnote"), tli->task->getStatusNote(tli->sc), defFileName, defFileLine));
213 mt.addMacro(new Macro(KW("taskid"), tli->task->getId(), defFileName, defFileLine));
216 for (ResourceListIterator rli
217 (tli->task->getBookedResourcesIterator(tli->sc)); *rli != 0; ++rli)
219 if (!label.isEmpty())
222 label += (*rli)->getName();
224 mt.addMacro(new Macro(KW("resources"), label, defFileName, defFileLine));
228 mt.addMacro(new Macro(KW("efficiency"), tli->resource->getEfficiency(), defFileName, defFileLine));
229 mt.addMacro(new Macro(KW("mineffort"), tli->resource->getMinEffort(), defFileName, defFileLine));
230 mt.addMacro(new Macro(KW("rate"), tli->resource->getRate(), defFileName, defFileLine));
231 mt.addMacro(new Macro(KW("resourceid"), tli->resource->getId(), defFileName, defFileLine));
236 mt.addMacro(new Macro(KW("accountid"), tli->account->getId(), defFileName, defFileLine));
239 // Set macros for built-in attributes.
240 mt.addMacro(new Macro(KW("id"), tli->ca1 ? tli->ca1->getId() :
242 defFileName, defFileLine));
243 mt.addMacro(new Macro(KW("no"), tli->ca1 ?
244 QString("%1").arg(tli->ca1->getSequenceNo()) :
246 defFileName, defFileLine));
247 mt.addMacro(new Macro(KW("index"), tli->ca1 ?
248 QString("%1").arg(tli->ca1->getIndex()) :
250 defFileName, defFileLine));
251 mt.addMacro(new Macro(KW("hierarchno"), tli->ca1 ?
252 tli->ca1->getHierarchNo() : QString::null,
253 defFileName, defFileLine));
254 mt.addMacro(new Macro(KW("hierarchindex"),
255 tli->ca1 ? tli->ca1->getHierarchIndex() :
257 defFileName, defFileLine));
258 mt.addMacro(new Macro(KW("hierarchlevel"),
259 tli->ca1 ? tli->ca1->getHierarchLevel() :
261 defFileName, defFileLine));
262 mt.addMacro(new Macro(KW("name"),
263 tli->ca1 ? tli->ca1->getName() : QString::null,
264 defFileName, defFileLine));
267 setPropertyMacros(tli, report->getProject()->getTaskAttributeDict());
268 setPropertyMacros(tli, report->getProject()->getResourceAttributeDict());
269 setPropertyMacros(tli, report->getProject()->getAccountAttributeDict());
273 ReportElementBase::setPropertyMacros(TableLineInfo* tli,
274 const QDictIterator<CustomAttributeDefinition>& d)
276 QDictIterator<CustomAttributeDefinition> cadi(d);
277 for ( ; cadi.current(); ++cadi)
279 const CustomAttribute* custAttr;
280 QString macroName = cadi.currentKey();
283 (custAttr = tli->ca1->getCustomAttribute(macroName)) != 0)
285 switch (custAttr->getType())
288 macroValue = static_cast<const TextAttribute*>(custAttr)->getText();
291 macroValue = static_cast<const ReferenceAttribute*>(custAttr)->getURL();
297 mt.addMacro(new Macro(macroName, macroValue, defFileName,
303 ReportElementBase::expandReportVariable(const QString& t) const
305 // printf ("ReportElementBase::expandReportVariable <%s>", t.latin1());
307 return mt.expandReportVariable(t, &sl);