diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /kaddressbook/printing/detailledstyle.cpp | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kaddressbook/printing/detailledstyle.cpp')
-rw-r--r-- | kaddressbook/printing/detailledstyle.cpp | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/kaddressbook/printing/detailledstyle.cpp b/kaddressbook/printing/detailledstyle.cpp new file mode 100644 index 000000000..78283a080 --- /dev/null +++ b/kaddressbook/printing/detailledstyle.cpp @@ -0,0 +1,291 @@ +/* + This file is part of KAddressBook. + Copyright (c) 1996-2002 Mirko Boehm <mirko@kde.org> + + 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 <kapplication.h> +#include <qcheckbox.h> +#include <kcolorbutton.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kdialog.h> +#include <kfontcombo.h> +#include <kglobalsettings.h> +#include <qlayout.h> +#include <klocale.h> +#include <knuminput.h> +#include <qpaintdevicemetrics.h> +#include <qpainter.h> +#include <kprinter.h> +#include <kstandarddirs.h> + +#include "ds_appearance.h" +#include "printingwizard.h" +#include "printprogress.h" +#include "printstyle.h" + +#include "detailledstyle.h" + +using namespace KABPrinting; + +const char *ConfigSectionName = "DetailedPrintStyle"; +const char *UseKDEFonts = "UseKDEFonts"; +const char *HeaderFont = "HeaderFont"; +const char *HeaderFontSize = "HeaderFontSize"; +const char *HeadlinesFont = "HeadlineFont"; +const char *HeadlinesFontSize = "HeadlineFontSize"; +const char *BodyFont = "BodyFont"; +const char *BodyFontSize = "BodyFontSize"; +const char *DetailsFont = "DetailsFont"; +const char *DetailsFontSize = "DetailsFontSize"; +const char *FixedFont = "FixedFont"; +const char *FixedFontSize = "FixedFontSize"; +const char *ColoredContactHeaders = "UseColoredContactHeaders"; +const char *ContactHeaderForeColor = "ContactHeaderForeColor"; +const char *ContactHeaderBGColor = "ContactHeaderBGColor"; + + +DetailledPrintStyle::DetailledPrintStyle( PrintingWizard *parent, const char *name ) + : PrintStyle( parent, name ), + mPageAppearance( new AppearancePage( parent, "AppearancePage" ) ), + mPainter( 0 ), + mPrintProgress( 0 ) +{ + KConfig *config; + QFont font; + bool kdeFonts; + QFont standard = KGlobalSettings::generalFont(); + QFont fixed = KGlobalSettings::fixedFont(); + + setPreview( "detailed-style.png" ); + + addPage( mPageAppearance, i18n( "Detailed Print Style - Appearance" ) ); + + config = kapp->config(); + config->setGroup( ConfigSectionName ); + + kdeFonts = config->readBoolEntry( UseKDEFonts, true ); + mPageAppearance->cbStandardFonts->setChecked( kdeFonts ); + + font = config->readFontEntry( HeaderFont, &standard ); + mPageAppearance->kfcHeaderFont->setCurrentFont( font.family() ); + mPageAppearance->kisbHeaderFontSize->setValue( font.pointSize() ); + + font = config->readFontEntry( HeadlinesFont, &standard ); + mPageAppearance->kfcHeadlineFont->setCurrentFont( font.family() ); + mPageAppearance->kisbHeadlineFontSize->setValue( font.pointSize() ); + + font = config->readFontEntry( BodyFont, &standard ); + mPageAppearance->kfcBodyFont->setCurrentFont( font.family() ); + mPageAppearance->kisbBodyFontSize->setValue( font.pointSize() ); + + font = config->readFontEntry( DetailsFont, &standard ); + mPageAppearance->kfcDetailsFont->setCurrentFont( font.family() ); + mPageAppearance->kisbDetailsFontSize->setValue( font.pointSize() ); + + font = config->readFontEntry( FixedFont, &fixed ); + mPageAppearance->kfcFixedFont->setCurrentFont( font.family() ); + mPageAppearance->kisbFixedFontSize->setValue( font.pointSize() ); + + mPageAppearance->cbBackgroundColor->setChecked( + config->readBoolEntry( ColoredContactHeaders, true ) ); + mPageAppearance->kcbHeaderBGColor->setColor( + config->readColorEntry( ContactHeaderBGColor, &Qt::black ) ); + mPageAppearance->kcbHeaderTextColor->setColor( + config->readColorEntry( ContactHeaderForeColor, &Qt::white ) ); + + mPageAppearance->layout()->setMargin( KDialog::marginHint() ); + mPageAppearance->layout()->setSpacing( KDialog::spacingHint() ); +} + +DetailledPrintStyle::~DetailledPrintStyle() +{ + delete mPainter; + mPainter = 0; +} + +void DetailledPrintStyle::print( const KABC::Addressee::List &contacts, PrintProgress *progress ) +{ + mPrintProgress = progress; + + progress->addMessage( i18n( "Setting up fonts and colors" ) ); + progress->setProgress( 0 ); + + bool useKDEFonts; + QFont font; + QColor foreColor = Qt::black; + QColor headerColor = Qt::white; + bool useHeaderColor = true; + QColor backColor = Qt::black; + bool useBGColor; + + // save, always available defaults: + QFont header = QFont("Helvetica", 12, QFont::Normal); + QFont headlines = QFont("Helvetica", 12, QFont::Normal, true); + QFont body = QFont("Helvetica", 12, QFont::Normal); + QFont fixed = QFont("Courier", 12, QFont::Normal); + QFont comment = QFont("Helvetica", 10, QFont::Normal); + + // store the configuration settings: + KConfig *config = kapp->config(); + config->setGroup( ConfigSectionName ); + useKDEFonts = mPageAppearance->cbStandardFonts->isChecked(); + config->writeEntry( UseKDEFonts, useKDEFonts ); + + // read the font and color selections from the wizard pages: + useBGColor=mPageAppearance->cbBackgroundColor->isChecked(); + config->writeEntry( ColoredContactHeaders, useBGColor ); + + // use colored contact headers, otherwise use plain black and white): + if ( useBGColor ) { + headerColor = mPageAppearance->kcbHeaderTextColor->color(); + backColor = mPageAppearance->kcbHeaderBGColor->color(); + config->writeEntry( ContactHeaderForeColor, headerColor ); + config->writeEntry( ContactHeaderBGColor, backColor ); + } + + if ( mPageAppearance->cbStandardFonts->isChecked() ) { + QFont standard = KGlobalSettings::generalFont(); + header = standard; + headlines = standard; + body = standard; + fixed = KGlobalSettings::fixedFont(); + comment = standard; + } else { + header.setFamily( mPageAppearance->kfcHeaderFont->currentText() ); + header.setPointSize( mPageAppearance->kisbHeaderFontSize->value() ); + config->writeEntry( HeaderFont, header ); + + // headlines: + headlines.setFamily( mPageAppearance->kfcHeadlineFont->currentText() ); + headlines.setPointSize( mPageAppearance->kisbHeadlineFontSize->value() ); + config->writeEntry( HeadlinesFont, headlines ); + + // body: + body.setFamily( mPageAppearance->kfcBodyFont->currentText() ); + body.setPointSize( mPageAppearance->kisbBodyFontSize->value() ); + config->writeEntry( BodyFont, body ); + + // details: + comment.setFamily( mPageAppearance->kfcDetailsFont->currentText() ); + comment.setPointSize( mPageAppearance->kisbDetailsFontSize->value() ); + config->writeEntry( DetailsFont, comment ); + + // fixed: + fixed.setFamily( mPageAppearance->kfcFixedFont->currentText() ); + fixed.setPointSize( mPageAppearance->kisbFixedFontSize->value() ); + config->writeEntry( FixedFont, fixed ); + } + + mPainter = new KABEntryPainter; + mPainter->setForegroundColor( foreColor ); + mPainter->setHeaderColor( headerColor ); + mPainter->setBackgroundColor( backColor ); + mPainter->setUseHeaderColor( useHeaderColor ); + mPainter->setHeaderFont( header ); + mPainter->setHeadLineFont( headlines ); + mPainter->setBodyFont( body ); + mPainter->setFixedFont( fixed ); + mPainter->setCommentFont( comment ); + + KPrinter *printer = wizard()->printer(); + + QPainter painter; + progress->addMessage( i18n( "Setting up margins and spacing" ) ); + int marginTop = 0, + marginLeft = 64, // to allow stapling, need refinement with two-side prints + marginRight = 0, + marginBottom = 0; + + register int left, top, width, height; + + painter.begin( printer ); + printer->setFullPage( true ); // use whole page + + QPaintDeviceMetrics metrics( printer ); + + left = QMAX( printer->margins().width(), marginLeft ); + top = QMAX( printer->margins().height(), marginTop ); + width = metrics.width() - left - QMAX( printer->margins().width(), marginRight ); + height = metrics.height() - top - QMAX( printer->margins().height(), marginBottom ); + + painter.setViewport( left, top, width, height ); + progress->addMessage( i18n( "Printing" ) ); + + printEntries( contacts, printer, &painter, + QRect( 0, 0, metrics.width(), metrics.height() ) ); + + progress->addMessage( i18n( "Done" ) ); + painter.end(); + + config->sync(); +} + +bool DetailledPrintStyle::printEntries( const KABC::Addressee::List &contacts, + KPrinter *printer, + QPainter *painter, + const QRect &window) +{ + QRect brect; + int ypos = 0, count = 0; + + KABC::Addressee::List::ConstIterator it; + for ( it = contacts.begin(); it != contacts.end(); ++it ) { + if ( !(*it).isEmpty() ) { + // do a faked print to get the bounding rect: + if ( !mPainter->printAddressee( *it, window, painter, ypos, true, &brect) ) { + // it does not fit on the page beginning at ypos: + printer->newPage(); + + // WORK_TO_DO: this assumes the entry fits on the whole page + // (dunno how to fix this without being illogical) + ypos = 0; + } + + mPainter->printAddressee( *it, window, painter, ypos, false, &brect ); + ypos += brect.height(); + } + + mPrintProgress->setProgress( (count++ * 100) / contacts.count() ); + } + + mPrintProgress->setProgress( 100 ); + + return true; +} + +DetailledPrintStyleFactory::DetailledPrintStyleFactory( PrintingWizard *parent, + const char *name ) + : PrintStyleFactory( parent, name ) +{ +} + +PrintStyle *DetailledPrintStyleFactory::create() const +{ + return new DetailledPrintStyle( mParent, mName ); +} + +QString DetailledPrintStyleFactory::description() const +{ + return i18n( "Detailed Style" ); +} + +#include "detailledstyle.moc" |