00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <qpainter.h>
00026 #include <qpaintdevicemetrics.h>
00027
00028 #include <kapplication.h>
00029 #include <kprinter.h>
00030 #include <klocale.h>
00031 #include <kglobal.h>
00032 #include <kdebug.h>
00033 #include <kprogress.h>
00034 #include <kabc/addressee.h>
00035
00036 #include "printingwizard.h"
00037 #include "printstyle.h"
00038 #include "printprogress.h"
00039 #include "mikesstyle.h"
00040
00041 namespace KABPrinting
00042 {
00043
00044 const int mFieldSpacingHint=2;
00045
00046 MikesStyle::MikesStyle(PrintingWizard* parent, const char* name)
00047 : PrintStyle(parent, name)
00048 {
00049 setPreview("mike-style.png");
00050 }
00051
00052 MikesStyle::~MikesStyle()
00053 {
00054 }
00055
00056 void MikesStyle::print( KABC::Addressee::List &contacts, PrintProgress *progress)
00057 {
00058 QFont mFont;
00059 QFont mBoldFont;
00060 QPainter p;
00061 p.begin(wizard()->printer());
00062 int yPos = 0, count=0;
00063 int spacingHint = 10;
00064
00065 mFont = p.font();
00066 mBoldFont = p.font();
00067 mBoldFont.setBold(true);
00068 QFontMetrics fm(mFont);
00069 QPaintDeviceMetrics metrics(p.device());
00070
00071 int height = 0;
00072 KABC::Addressee::List::Iterator it;
00073
00074 progress->addMessage(i18n("Preparing"));
00075 progress->addMessage(i18n("Printing"));
00076
00077 for ( it = contacts.begin(); it != contacts.end(); ++it )
00078 {
00079 progress->setProgress((count++*100)/contacts.count());
00080 kapp->processEvents();
00081
00082
00083
00084 height = calcHeight((*it), mFont, mBoldFont);
00085 if ((yPos + spacingHint + height)
00086 > (metrics.height()-fm.height()-5))
00087 {
00088 p.save();
00089 p.translate(0, metrics.height()-fm.height()-5);
00090 paintTagLine(p, mFont);
00091 p.restore();
00092
00093 wizard()->printer()->newPage();
00094 yPos = 0;
00095 }
00096
00097
00098
00099 yPos += spacingHint;
00100 p.save();
00101 p.translate(0, yPos);
00102 doPaint(p, (*it), height, mFont, mBoldFont);
00103 p.restore();
00104 yPos += height;
00105
00106
00107 }
00108 progress->addMessage(i18n("Done"));
00109
00110 p.save();
00111 p.translate(0, metrics.height()-fm.height()-5);
00112 paintTagLine(p, mFont);
00113 p.restore();
00114
00115
00116 p.end();
00117 }
00118
00119 QString MikesStyle::trimString(const QString &text, int width,
00120 QFontMetrics &fm)
00121 {
00122 if (fm.width(text) <= width)
00123 return text;
00124
00125 QString dots = "...";
00126 int dotWidth = fm.width(dots);
00127 QString trimmed;
00128 int charNum = 0;
00129
00130 while (fm.width(trimmed) + dotWidth < width)
00131 {
00132 trimmed += text[charNum];
00133 charNum++;
00134 }
00135
00136
00137 trimmed = trimmed.left(trimmed.length()-1);
00138 trimmed += dots;
00139
00140 return trimmed;
00141 }
00142
00143 void MikesStyle::doPaint(QPainter &painter, const KABC::Addressee &a,
00144 int maxHeight,
00145 const QFont& font, const QFont& bFont)
00146 {
00147 QFontMetrics fm(font);
00148 QFontMetrics bfm(bFont);
00149 QPaintDeviceMetrics metrics(painter.device());
00150 int margin = 10;
00151 int width = metrics.width() - 10;
00152 int xPos = 5;
00153 int yPos = 0;
00154 QBrush brush(Qt::lightGray);
00155
00156 painter.setPen(Qt::black);
00157 painter.drawRect(xPos, yPos, width, maxHeight);
00158
00159
00160 painter.fillRect(xPos+1, yPos+1, width-2,
00161 bfm.height() + 2*mFieldSpacingHint - 2, brush);
00162 painter.setFont(bFont);
00163 xPos += mFieldSpacingHint;
00164 painter.drawText(xPos, yPos+bfm.height(),
00165 a.formattedName());
00166
00167 yPos += bfm.height() + 2*mFieldSpacingHint;
00168 xPos = margin;
00169
00170
00171 painter.setFont(font);
00172
00173 KABC::Field::List fields = wizard()->addressBook()->fields();
00174 int numFields = fields.count();
00175 QString label;
00176 QString value;
00177
00178 for (int i = 0; i < numFields/2; i++)
00179 {
00180 label = fields[i]->label();
00181 value = trimString(fields[i]->value(a), (width-10)/4, fm);
00182
00183 yPos += fm.height();
00184 painter.drawText(xPos, yPos, label + ":");
00185
00186 xPos += (width - (2 * margin))/4;
00187 painter.drawText(xPos, yPos, value);
00188
00189 yPos += mFieldSpacingHint;
00190 xPos = margin;
00191 }
00192
00193 yPos = bfm.height() + 2*mFieldSpacingHint;
00194 xPos = margin + width/2;
00195 for (int i = numFields/2; i < numFields; i++)
00196 {
00197 label = fields[i]->label();
00198 value = value = trimString(fields[i]->value(a), (width-10)/4, fm);
00199
00200 yPos += fm.height();
00201 painter.drawText(xPos, yPos, label + ":");
00202
00203 xPos += (width - (2 * margin))/4;
00204 painter.drawText(xPos, yPos, value);
00205
00206 yPos += mFieldSpacingHint;
00207 xPos = margin + width/2;
00208 }
00209
00210 }
00211
00212 void MikesStyle::paintTagLine(QPainter &p, const QFont& font)
00213 {
00214 QFontMetrics fm(font);
00215
00216 QString text =
00217 i18n("Printed on %1 by KAddressBook (http://www.kde.org)")
00218 .arg(KGlobal::locale()->formatDateTime(QDateTime::currentDateTime()));
00219
00220 p.setPen(Qt::black);
00221 p.drawText(0, fm.height(), text);
00222
00223 }
00224
00225 int MikesStyle::calcHeight(const KABC::Addressee &a,
00226 const QFont& font, const QFont& bFont)
00227 {
00228
00229 QFontMetrics fm(font);
00230 QFontMetrics bfm(bFont);
00231
00232 int height = 0;
00233
00234
00235 KABC::Field::List fieldList = wizard()->addressBook()->fields();
00236 int numFields = fieldList.count();
00237 int halfHeight = 0;
00238
00239
00240 for (int i = 0; i < numFields/2; i++)
00241 {
00242 halfHeight +=
00243 fm.height() * (fieldList[i]->value(a).contains('\n') + 1);
00244 }
00245 height = halfHeight;
00246
00247
00248 halfHeight = 0;
00249 for (int i = numFields/2; i < numFields; i++)
00250 {
00251 halfHeight +=
00252 fm.height() * (fieldList[i]->value(a).contains('\n') + 1);
00253 }
00254
00255 height = QMAX(height, halfHeight);
00256
00257
00258 height += bfm.height() + ((numFields/2 + 3)*mFieldSpacingHint);
00259
00260 return height;
00261
00262 }
00263
00264
00265
00266 MikesStyleFactory::MikesStyleFactory(PrintingWizard* parent,
00267 const char* name)
00268 : PrintStyleFactory(parent, name)
00269 {
00270 }
00271
00272 PrintStyle *MikesStyleFactory::create()
00273 {
00274 return new MikesStyle( mParent, mName );
00275 }
00276
00277 QString MikesStyleFactory::description()
00278 {
00279 return i18n("Mike's Printing Style");
00280 }
00281
00282 }
00283
00284 #include "mikesstyle.moc"
00285