karm Library API Documentation

print.cpp

00001 // #include <iostream>
00002 
00003 #include <qdatetime.h>
00004 #include <qpaintdevicemetrics.h>
00005 #include <qpainter.h>
00006 
00007 #include <kglobal.h>
00008 #include <klocale.h>            // i18n
00009 
00010 #include "karmutility.h"        // formatTime()
00011 #include "print.h"
00012 #include "task.h"
00013 #include "taskview.h"
00014 
00015 const int levelIndent = 10;
00016 
00017 MyPrinter::MyPrinter(const TaskView *taskView)
00018 {
00019   _taskView = taskView;
00020 }
00021 
00022 void MyPrinter::print()
00023 {
00024   // FIXME: make a better caption for the printingdialog
00025   if (setup(0L, i18n("Print Times"))) {
00026     // setup
00027     QPainter painter(this);
00028     QPaintDeviceMetrics deviceMetrics(this);
00029     QFontMetrics metrics = painter.fontMetrics();
00030     pageHeight = deviceMetrics.height();
00031     int pageWidth = deviceMetrics.width();
00032     xMargin = margins().width();
00033     yMargin = margins().height();
00034     yoff = yMargin;
00035     lineHeight = metrics.height();
00036     
00037     // Calculate the totals
00038     // Note the totals are only calculated at the top most levels, as the
00039     // totals are increased together with its children.
00040     int totalTotal = 0;
00041     int sessionTotal = 0;
00042     for (Task* task = _taskView->first_child();
00043                task;
00044                task = static_cast<Task *>(task->nextSibling())) {
00045       totalTotal += task->totalTime();
00046       sessionTotal += task->totalSessionTime();
00047     }
00048 
00049     // Calculate the needed width for each of the fields
00050     timeWidth = QMAX(metrics.width(i18n("Total")),
00051                      metrics.width(formatTime(totalTotal)));
00052     sessionTimeWidth = QMAX(metrics.width(i18n("Session")),
00053                             metrics.width(formatTime(sessionTotal)));
00054 
00055     nameFieldWidth = pageWidth - xMargin - timeWidth - sessionTimeWidth - 2*5;
00056     
00057     int maxReqNameFieldWidth= metrics.width(i18n("Task Name "));
00058     
00059     for ( Task* task = _taskView->first_child();
00060           task;
00061           task = static_cast<Task *>(task->nextSibling()))
00062     {
00063       int width = calculateReqNameWidth(task, metrics, 0);
00064       maxReqNameFieldWidth = QMAX(maxReqNameFieldWidth, width);
00065     }
00066     nameFieldWidth = QMIN(nameFieldWidth, maxReqNameFieldWidth);
00067 
00068     int realPageWidth = nameFieldWidth + timeWidth + sessionTimeWidth + 2*5;
00069 
00070     // Print the header
00071     QFont origFont, newFont;
00072     origFont = painter.font();
00073     newFont = origFont;
00074     newFont.setPixelSize( static_cast<int>(origFont.pixelSize() * 1.5) );
00075     painter.setFont(newFont);
00076     
00077     int height = metrics.height();
00078     QString now = KGlobal::locale()->formatDateTime(QDateTime::currentDateTime());
00079     
00080     painter.drawText(xMargin, yoff, pageWidth*2, height*2,
00081          QPainter::AlignCenter, 
00082          i18n("KArm - %1").arg(now));
00083     
00084     painter.setFont(origFont);
00085     yoff += height + 10;
00086 
00087     // Print the second header.
00088     printLine(i18n("Total"), i18n("Session"), i18n("Task Name"), painter, 0);
00089     
00090     yoff += 4;
00091     painter.drawLine(xMargin, yoff, xMargin + realPageWidth, yoff);
00092     yoff += 2;
00093     
00094     // Now print the actual content
00095     for ( Task* task = _taskView->first_child();
00096                 task;
00097                 task = static_cast<Task *>(task->nextSibling()) )
00098     {
00099       printTask(task, painter, 0);
00100     }
00101 
00102     yoff += 4;
00103     painter.drawLine(xMargin, yoff, xMargin + realPageWidth, yoff);
00104     yoff += 2;
00105     
00106     // Print the Totals
00107     printLine( formatTime( totalTotal ),
00108                formatTime( sessionTotal ),
00109                QString(), painter, 0);
00110   }
00111 }
00112 
00113 int MyPrinter::calculateReqNameWidth( Task* task,
00114                                       QFontMetrics &metrics,
00115                                       int level) 
00116 {
00117   int width = metrics.width(task->name()) + level * levelIndent;
00118 
00119   for ( Task* subTask = task->firstChild();
00120               subTask;
00121               subTask = subTask->nextSibling() ) {
00122     int subTaskWidth = calculateReqNameWidth(subTask, metrics, level+1);
00123     width = QMAX(width, subTaskWidth);
00124   }
00125   return width;
00126 }
00127 
00128 void MyPrinter::printTask(Task *task, QPainter &painter, int level)
00129 {
00130   QString time = formatTime(task->totalTime());
00131   QString sessionTime = formatTime(task->totalSessionTime());
00132   QString name = task->name();
00133   printLine(time, sessionTime, name, painter, level);
00134 
00135   for ( Task* subTask = task->firstChild();
00136               subTask;
00137               subTask = subTask->nextSibling())
00138   {
00139     printTask(subTask, painter, level+1);
00140   }      
00141 }
00142 
00143 void MyPrinter::printLine( QString total, QString session, QString name, 
00144                            QPainter &painter, int level )
00145 {
00146   int xoff = xMargin + 10 * level;
00147   
00148   painter.drawText( xoff, yoff, nameFieldWidth, lineHeight,
00149                     QPainter::AlignLeft, name);
00150   xoff = xMargin + nameFieldWidth;
00151   
00152   painter.drawText( xoff, yoff, sessionTimeWidth, lineHeight,
00153                     QPainter::AlignRight, session);
00154   xoff += sessionTimeWidth+ 5;
00155   
00156   painter.drawText( xoff, yoff, timeWidth, lineHeight,
00157                     QPainter::AlignRight, total);
00158   xoff += timeWidth+5;
00159 
00160   yoff += lineHeight;
00161   
00162   if (yoff + 2* lineHeight > pageHeight) {
00163     newPage();
00164     yoff = yMargin;
00165   }
00166 }
KDE Logo
This file is part of the documentation for karm Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:53 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003