2 * HTMLWeeklyCalendarElement.cpp - TaskJuggler
4 * Copyright (c) 2002, 2003, 2004 by Chris Schlaeger <cs@kde.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
13 #include "HTMLWeeklyCalendarElement.h"
14 #include "tjlib-internal.h"
16 #include "ExpressionTree.h"
17 #include "Operation.h"
19 #include "TableLineInfo.h"
20 #include "HTMLReport.h"
22 HTMLWeeklyCalendarElement::HTMLWeeklyCalendarElement(Report* r,
25 HTMLReportElement(r, df, dl),
30 uint sc = r->getProject()->getMaxScenarios();
31 columns.append(new TableColumnInfo(sc, "name"));
34 setHideTask(new ExpressionTree(new Operation(0)));
36 setHideResource(new ExpressionTree(new Operation(1)));
38 taskSortCriteria[0] = CoreAttributesList::TreeMode;
39 taskSortCriteria[1] = CoreAttributesList::StartUp;
40 taskSortCriteria[2] = CoreAttributesList::EndUp;
42 resourceSortCriteria[0] = CoreAttributesList::TreeMode;
43 resourceSortCriteria[1] = CoreAttributesList::NameUp;
44 resourceSortCriteria[2] = CoreAttributesList::IdUp;
47 for (unsigned int i = 0; i < 7; ++i)
51 HTMLWeeklyCalendarElement::~HTMLWeeklyCalendarElement()
56 HTMLWeeklyCalendarElement::setDaysToShow(QBitArray& days)
60 for (int i = days.size() - 1; i >= 0; i--)
66 HTMLWeeklyCalendarElement::generateTableHeader(bool weekStartsMonday)
68 s() << " <thead>" << endl
69 << " <tr style=\"background-color:"
70 << colors.getColorName("header")
71 << "; text-align:center\">" << endl;
72 time_t wd = beginOfWeek(start, weekStartsMonday);
74 cellWidth.sprintf("%.1f", 100.0 / numberOfDays);
75 for (int day = 0; day < 7; ++day, wd = sameTimeNextDay(wd))
77 if (!showThisDay(day, weekStartsMonday))
80 s() << " <th width=\"" << cellWidth << "%\" style=\"font-size:110%; ";
82 s() << "background-color:"
83 << colors.getColor("header").dark(130).name();
85 << htmlFilter(dayOfWeekName(wd)) << "</th>" << endl;
87 s() << " </tr>" << endl
88 << " </thead>" << endl;
92 HTMLWeeklyCalendarElement::generateWeekHeader(bool weekStartsMonday,
95 /* Generate table row that contains the day of the month, the month
96 * and the year. The first column of the row also has the number of
99 s() << " <tr style=\"background-color:"
100 << colors.getColorName("header")
101 << "; text-align:center\">" << endl;
104 cellWidth.sprintf("%.1f", 100.0 / numberOfDays);
105 for (int day = 0; day < 7; ++day, wd = sameTimeNextDay(wd))
107 if (!showThisDay(day, weekStartsMonday))
110 s() << " <td width=\"" << cellWidth << "%\"";
111 if (isSameDay(report->getProject()->getNow(), wd))
112 s() << " style=\"background-color:"
113 << colors.getColorName("today") << "\"";
114 else if (isWeekend(wd))
115 s() << " style=\"background-color:"
116 << colors.getColor("header").dark(130).name() << "\"";
118 << " <table width=\"100%\">"
121 << " <td width=\"30%\" rowspan=\"2\" "
122 "style=\"font-size:200%; text-align:center\">"
123 << QString().sprintf("%d", dayOfMonth(wd)) << "</td>" << endl
124 << " <td width=\"70%\" style=\"font-size:60%\">";
126 s() << htmlFilter(i18n("Week")) << " "
127 << QString("%1").arg(weekOfYear(wd, weekStartsMonday));
130 s() << " </td>" << endl
133 QString mAY = monthAndYear(wd);
136 s() << " <td style=\"font-size:90%\">"
137 << htmlFilter(mAY) << "</td>" << endl;
140 s() << " </tr>" << endl;
141 if (report->getProject()->isVacation(wd))
142 s() << " <tr><td colspan=\"2\" style=\"font-size:80%\">"
143 << htmlFilter(report->getProject()->vacationName(wd))
144 << "</td></tr>" << endl;
145 s() << " </table></td>" << endl;
147 s() << " </tr>" << endl;
151 HTMLWeeklyCalendarElement::generateTaksPerDay(
152 time_t& wd, TaskList& filteredTaskList, ResourceList& filteredResourceList,
153 bool weekStartsMonday)
155 // Generate a row with lists the tasks for each day.
156 s() << " <tr style=\"background-color:"
157 << colors.getColorName("default") << "\">" << endl
160 cellWidth.sprintf("%.1f", 100.0 / numberOfDays);
161 for (int day = 0; day < 7; ++day, wd = sameTimeNextDay(wd))
163 if (!showThisDay(day, weekStartsMonday))
166 /* Misuse the class member start and end to limit the scope of
167 * the information listed. */
168 time_t savedStart = start;
169 time_t savedEnd = end;
171 end = sameTimeNextDay(wd);
173 s() << " <td width=\"" << cellWidth
174 << "\" style=\"vertical-align:top\">" << endl;
177 for (TaskListIterator tli(filteredTaskList); *tli != 0;
180 if ((*tli)->getLoad(scenarios[0], Interval(start, end)) == 0.0)
182 if (!(*tli)->isActive(scenarios[0],
183 Interval(wd, sameTimeNextDay(wd))))
188 s() << " <table width=\"100%\">" << endl;
192 tli1.ca1 = tli1.task = *tli;
194 tli1.fontFactor = 40;
195 generateLine(&tli1, 2);
197 if (!filterResourceList(filteredResourceList, *tli,
198 getHideResource(), getRollUpResource()))
200 sortResourceList(filteredResourceList);
202 for (ResourceListIterator rli(filteredResourceList); *rli != 0;
206 tli2.ca1 = tli2.resource = *rli;
207 tli2.ca2 = tli2.task = *tli;
208 for (uint sc = 0; sc < scenarios.count(); ++sc)
211 tli2.sc = scenarios[sc];
213 tli2.fontFactor = 30;
214 generateLine(&tli2, sc == 0 ? 4 : 5);
219 s() << " </table>" << endl;
220 s() << " </td>" << endl;
224 s() << " </tr>" << endl;
230 HTMLWeeklyCalendarElement::generateResourcesPerDay
231 (time_t& wd, ResourceList& filteredResourceList,
232 TaskList& filteredTaskList, bool weekStartsMonday)
234 // Generate a table row which lists the resources for each day.
235 s() << " <tr style=\"background-color:"
236 << colors.getColorName("default") << "\">" << endl
239 cellWidth.sprintf("%.1f", 100.0 / numberOfDays);
240 for (int day = 0; day < 7; ++day, wd = sameTimeNextDay(wd))
242 if (!showThisDay(day, weekStartsMonday))
245 /* Misuse the class member start and end to limit the scope of
246 * the information listed. */
247 time_t savedStart = start;
248 time_t savedEnd = end;
250 end = sameTimeNextDay(wd);
251 s() << " <td width=\"" << cellWidth
252 << "\" style=\"vertical-align:top\">"
256 for (ResourceListIterator rli(filteredResourceList);
257 *rli != 0; ++rli, ++no)
259 if ((*rli)->getEffectiveLoad
260 (scenarios[0], Interval(wd, sameTimeNextDay(wd))) <= 0.0)
265 s() << " <table width=\"100%\">" << endl;
269 tli2.ca1 = tli2.resource = *rli;
271 tli2.fontFactor = 40;
272 generateLine(&tli2, 4);
274 /* We only want to show the nested task list for leaf resources.
275 * Leaf in this case means "task has no visible childs". */
276 bool hasVisibleChilds = false;
277 for (ResourceListIterator cli((*rli)->getSubListIterator());
279 if (filteredResourceList.findRef(*cli) >= 0)
281 hasVisibleChilds = true;
285 if (hasVisibleChilds)
288 if (!filterTaskList(filteredTaskList, *rli, hideTask, rollUpTask))
290 sortTaskList(filteredTaskList);
293 for (TaskListIterator tli(filteredTaskList); *tli != 0; ++tli,
297 tli2.ca1 = tli2.task = *tli;
298 tli2.ca2 = tli2.resource = *rli;
299 for (uint sc = 0; sc < scenarios.count(); ++sc)
302 tli2.sc = scenarios[sc];
304 tli2.fontFactor = 30;
305 generateLine(&tli2, sc == 0 ? 2 : 3);
310 s() << " </table>" << endl;
311 s() << " </td>" << endl;
315 s() << " </tr>" << endl;
322 HTMLWeeklyCalendarElement::generate()
326 TaskList filteredTaskList;
327 if (!filterTaskList(filteredTaskList, 0, hideTask, rollUpTask))
329 sortTaskList(filteredTaskList);
330 maxDepthTaskList = filteredTaskList.maxDepth();
332 ResourceList filteredResourceList;
333 if (!filterResourceList(filteredResourceList, 0, hideResource,
336 sortResourceList(filteredResourceList);
337 maxDepthResourceList = filteredResourceList.maxDepth();
339 bool weekStartsMonday = report->getProject()->getWeekStartsMonday();
340 s() << "<table align=\"center\" cellpadding=\"2\" "
341 << "style=\"background-color:#000000\"";
342 if (static_cast<HTMLReport*>(report)->hasStyleSheet())
343 s() << " class=\"tj_table\"";
346 generateTableHeader(weekStartsMonday);
348 s() << " <tbody>" << endl;
350 for (time_t week = beginOfWeek(start, weekStartsMonday);
351 week <= sameTimeNextWeek(beginOfWeek(end, weekStartsMonday)) - 1; )
353 generateWeekHeader(weekStartsMonday, week);
357 if (!filteredTaskList.isEmpty())
359 if (!generateTaksPerDay(week, filteredTaskList,
360 filteredResourceList,
365 week = sameTimeNextWeek(week);
369 if (!filteredResourceList.isEmpty())
371 if (!generateResourcesPerDay(week, filteredResourceList,
377 week = sameTimeNextWeek(week);
381 s() << " </tbody>" << endl << "</table>" << endl;
389 HTMLWeeklyCalendarElement::showThisDay(int dayIndex, bool weekStartsMonday)
391 /* The dayIndex may start with Sunday or Monday depending of the setting
392 * of weekStartsMonday. daysToShow[0] is always Sunday. */
394 return daysToShow[(dayIndex + (weekStartsMonday ? 1 : 0)) % 7];