diff options
Diffstat (limited to 'kaddressbook/printing/mikesstyle.cpp')
-rw-r--r-- | kaddressbook/printing/mikesstyle.cpp | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/kaddressbook/printing/mikesstyle.cpp b/kaddressbook/printing/mikesstyle.cpp new file mode 100644 index 000000000..1eae4281c --- /dev/null +++ b/kaddressbook/printing/mikesstyle.cpp @@ -0,0 +1,262 @@ +/* + This file is part of KAddressBook. + Copyright (c) 1996-2002 Mirko Boehm <mirko@kde.org> + 2002 Mike Pilone <mpilone@slac.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qpaintdevicemetrics.h> +#include <qpainter.h> + +#include <kabc/addressee.h> +#include <kapplication.h> +#include <kdebug.h> +#include <kglobal.h> +#include <klocale.h> +#include <kprinter.h> +#include <kprogress.h> + +#include "printingwizard.h" +#include "printprogress.h" +#include "printstyle.h" + +#include "mikesstyle.h" + +using namespace KABPrinting; + +const int mFieldSpacingHint = 2; + +MikesStyle::MikesStyle( PrintingWizard *parent, const char *name ) + : PrintStyle( parent, name ) +{ + setPreview( "mike-style.png" ); +} + +MikesStyle::~MikesStyle() +{ +} + +void MikesStyle::print( const KABC::Addressee::List &contacts, PrintProgress *progress ) +{ + QFont mFont; + QFont mBoldFont; + QPainter p; + + p.begin( wizard()->printer() ); + int yPos = 0, count = 0; + int spacingHint = 10; + + // Now do the actual printing + mFont = p.font(); + mBoldFont = p.font(); + mBoldFont.setBold( true ); + QFontMetrics fm( mFont ); + QPaintDeviceMetrics metrics( p.device() ); + + int height = 0; + KABC::Addressee::List::ConstIterator it; + + progress->addMessage( i18n( "Preparing" ) ); + progress->addMessage( i18n( "Printing" ) ); + + for ( it = contacts.begin(); it != contacts.end(); ++it ) { + progress->setProgress( (count++ * 100) / contacts.count() ); + kapp->processEvents(); + + // Get the total height so we know if it will fit on the current page + height = calcHeight( *it, mFont, mBoldFont ); + if ( (yPos + spacingHint + height) > (metrics.height() - fm.height() - 5) ) { + p.save(); + p.translate( 0, metrics.height() - fm.height() - 5 ); + paintTagLine( p, mFont ); + p.restore(); + + wizard()->printer()->newPage(); + yPos = 0; + } + + // Move the painter to the proper position and then paint the addressee + yPos += spacingHint; + p.save(); + p.translate( 0, yPos ); + doPaint( p, *it, height, mFont, mBoldFont ); + p.restore(); + + yPos += height; + } + + progress->addMessage( i18n( "Done" ) ); + + // print the tag line on the last page + p.save(); + p.translate( 0, metrics.height() - fm.height() - 5 ); + paintTagLine( p, mFont ); + p.restore(); + + // send to the printer + p.end(); +} + +QString MikesStyle::trimString( const QString &text, int width, QFontMetrics &fm ) +{ + if ( fm.width( text ) <= width ) + return text; + + QString dots = "..."; + int dotWidth = fm.width( dots ); + QString trimmed; + int charNum = 0; + + while ( fm.width( trimmed ) + dotWidth < width ) { + trimmed += text[ charNum ]; + charNum++; + } + + // Now trim the last char, since it put the width over the top + trimmed = trimmed.left( trimmed.length() - 1 ); + trimmed += dots; + + return trimmed; +} + +void MikesStyle::doPaint( QPainter &painter, const KABC::Addressee &addr, + int maxHeight, const QFont &font, const QFont &bFont ) +{ + QFontMetrics fm( font ); + QFontMetrics bfm( bFont ); + QPaintDeviceMetrics metrics( painter.device() ); + int margin = 10; + int width = metrics.width() - 10; + int xPos = 5; + int yPos = 0; + QBrush brush( Qt::lightGray ); + + painter.setPen( Qt::black ); + painter.drawRect( xPos, yPos, width, maxHeight ); + + // The header + painter.fillRect( xPos + 1, yPos + 1, width - 2, + bfm.height() + 2 * mFieldSpacingHint - 2, brush ); + painter.setFont( bFont ); + xPos += mFieldSpacingHint; + painter.drawText( xPos, yPos + bfm.height(), addr.formattedName() ); + + yPos += bfm.height() + 2 * mFieldSpacingHint; + xPos = margin; + + // now the fields, in two halves + painter.setFont( font ); + + KABC::Field::List fields = wizard()->addressBook()->fields(); + int numFields = fields.count(); + QString label; + QString value; + + for ( int i = 0; i < numFields / 2; i++ ) { + label = fields[ i ]->label(); + value = trimString( fields[ i ]->value( addr ), (width - 10) / 4, fm ); + + yPos += fm.height(); + painter.drawText( xPos, yPos, label + ":" ); + + xPos += (width - (2 * margin)) / 4; + painter.drawText( xPos, yPos, value ); + + yPos += mFieldSpacingHint; + xPos = margin; + } + + yPos = bfm.height() + 2 * mFieldSpacingHint; + xPos = margin + width / 2; + for ( int i = numFields / 2; i < numFields; i++ ) { + label = fields[ i ]->label(); + value = value = trimString( fields[ i ]->value( addr ), (width - 10) / 4, fm ); + + yPos += fm.height(); + painter.drawText( xPos, yPos, label + ":" ); + + xPos += (width - (2 * margin)) / 4; + painter.drawText( xPos, yPos, value ); + + yPos += mFieldSpacingHint; + xPos = margin + width / 2; + } +} + +void MikesStyle::paintTagLine( QPainter &p, const QFont &font ) +{ + QFontMetrics fm( font ); + + QString text = i18n( "Printed on %1 by KAddressBook (http://www.kde.org)" ) + .arg( KGlobal::locale()->formatDateTime( QDateTime::currentDateTime() ) ); + + p.setPen( Qt::black ); + p.drawText( 0, fm.height(), text ); +} + +int MikesStyle::calcHeight( const KABC::Addressee &addr, + const QFont &font, const QFont &bFont ) +{ + QFontMetrics fm( font ); + QFontMetrics bfm( bFont ); + + int height = 0; + + // get the fields + KABC::Field::List fieldList = wizard()->addressBook()->fields(); + int numFields = fieldList.count(); + int halfHeight = 0; + + // Determine which half of the fields is higher + for ( int i = 0; i < numFields / 2; i++ ) + halfHeight += fm.height() * (fieldList[ i ]->value( addr ).contains( '\n' ) + 1); + + height = halfHeight; + + // now the second half + halfHeight = 0; + for ( int i = numFields / 2; i < numFields; i++ ) + halfHeight += fm.height() * (fieldList[ i ]->value( addr ).contains( '\n' ) + 1); + + height = QMAX( height, halfHeight ); + + // Add the title and the spacing + height += bfm.height() + ((numFields / 2 + 3) * mFieldSpacingHint); + + return height; +} + + +MikesStyleFactory::MikesStyleFactory( PrintingWizard *parent, const char *name ) + : PrintStyleFactory( parent, name ) +{ +} + +PrintStyle *MikesStyleFactory::create() const +{ + return new MikesStyle( mParent, mName ); +} + +QString MikesStyleFactory::description() const +{ + return i18n( "Mike's Printing Style" ); +} + +#include "mikesstyle.moc" |