File indexing completed on 2024-06-02 05:18:58

0001 /*
0002   This file is part of KAddressBook.
0003   SPDX-FileCopyrightText: 1996-2002 Mirko Boehm <mirko@kde.org>
0004   SPDX-FileCopyrightText: Tobias Koenig <tokoe@kde.org>
0005   SPDX-FileCopyrightText: 2009-2024 Laurent Montel <montel@kde.org>
0006 
0007   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0008 */
0009 
0010 #include "printingwizard.h"
0011 #include "settings.h"
0012 
0013 #include "contactsorter.h"
0014 #include "importexport/contactselectionwidget.h"
0015 #include "printprogress.h"
0016 #include "printstyle.h"
0017 #include "stylepage.h"
0018 
0019 // including the styles
0020 #include "compact/compactstyle.h"
0021 #include "detailled/detailledstyle.h"
0022 #include "mike/mikesstyle.h"
0023 #include "printing/grantlee/grantleeprintstyle.h"
0024 #include "ringbinder/ringbinderstyle.h"
0025 
0026 #include "kaddressbook_debug.h"
0027 #include <KLocalizedString>
0028 #include <QApplication>
0029 
0030 #include <KSharedConfig>
0031 #include <KWindowConfig>
0032 #include <QDirIterator>
0033 #include <QPrinter>
0034 #include <QPushButton>
0035 #include <QStandardPaths>
0036 #include <QWindow>
0037 
0038 using namespace KABPrinting;
0039 
0040 PrintingWizard::PrintingWizard(QPrinter *printer, QItemSelectionModel *selectionModel, QWidget *parent)
0041     : KAssistantDialog(parent)
0042     , mPrinter(printer)
0043 {
0044     setWindowTitle(i18nc("@title:window", "Print Contacts"));
0045 
0046     mSelectionPage = new KAddressBookImportExport::ContactSelectionWidget(selectionModel, this);
0047     mSelectionPage->setMessageText(i18n("Which contacts do you want to print?"));
0048 
0049     auto mSelectionPageItem = new KPageWidgetItem(mSelectionPage, i18n("Choose Contacts to Print"));
0050     addPage(mSelectionPageItem);
0051     setAppropriate(mSelectionPageItem, true);
0052 
0053     mStylePage = new StylePage(this);
0054     connect(mStylePage, &StylePage::styleChanged, this, &PrintingWizard::slotStyleSelected);
0055     addPage(mStylePage, i18n("Choose Printing Style"));
0056 
0057     registerStyles();
0058 
0059     if (mPrintStyleDefinition.count() > Settings::self()->printingStyle()) {
0060         mStylePage->setPrintingStyle(Settings::self()->printingStyle()); // should Q_EMIT styleChanged
0061         slotStyleSelected(Settings::self()->printingStyle());
0062     }
0063 
0064     mStylePage->setSortOrder(Settings::self()->sortOrder() == 0 ? Qt::AscendingOrder : Qt::DescendingOrder);
0065     readConfig();
0066 }
0067 
0068 PrintingWizard::~PrintingWizard()
0069 {
0070     writeConfig();
0071 }
0072 
0073 void PrintingWizard::readConfig()
0074 {
0075     create(); // ensure a window is created
0076     windowHandle()->resize(QSize(300, 200));
0077     KConfigGroup group(KSharedConfig::openStateConfig(), QStringLiteral("PrintingWizard"));
0078     KWindowConfig::restoreWindowSize(windowHandle(), group);
0079     resize(windowHandle()->size()); // workaround for QTBUG-40584
0080 }
0081 
0082 void PrintingWizard::writeConfig()
0083 {
0084     KConfigGroup grp(KSharedConfig::openStateConfig(), QStringLiteral("PrintingWizard"));
0085     KWindowConfig::saveWindowSize(windowHandle(), grp);
0086     grp.sync();
0087 }
0088 
0089 void PrintingWizard::setDefaultAddressBook(const Akonadi::Collection &addressBook)
0090 {
0091     mSelectionPage->setDefaultAddressBook(addressBook);
0092 }
0093 
0094 void PrintingWizard::accept()
0095 {
0096     print();
0097     close();
0098     setResult(QDialog::Accepted);
0099 }
0100 
0101 void PrintingWizard::loadGrantleeStyle()
0102 {
0103     const QString relativePath = QStringLiteral("kaddressbook/printing/themes/");
0104     QStringList themesDirectories = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, relativePath, QStandardPaths::LocateDirectory);
0105     if (themesDirectories.count() < 2) {
0106         // Make sure to add local directory
0107         const QString localDirectory = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + relativePath;
0108         if (!themesDirectories.contains(localDirectory)) {
0109             themesDirectories.append(localDirectory);
0110         }
0111     }
0112 
0113     for (const QString &directory : std::as_const(themesDirectories)) {
0114         QDirIterator dirIt(directory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
0115         QStringList alreadyLoadedThemeName;
0116         while (dirIt.hasNext()) {
0117             dirIt.next();
0118             const QString themeInfoFile = dirIt.filePath() + QStringLiteral("/theme.desktop");
0119             KConfig config(themeInfoFile);
0120             KConfigGroup group(&config, QStringLiteral("Desktop Entry"));
0121             QString name = group.readEntry("Name", QString());
0122             if (name.isEmpty()) {
0123                 continue;
0124             }
0125             if (alreadyLoadedThemeName.contains(name)) {
0126                 int i = 2;
0127                 const QString originalName(name);
0128                 while (alreadyLoadedThemeName.contains(name)) {
0129                     name = originalName + QStringLiteral(" (%1)").arg(i);
0130                     ++i;
0131                 }
0132             }
0133             const QString printThemePath(dirIt.filePath() + QLatin1Char('/'));
0134             if (!printThemePath.isEmpty()) {
0135                 alreadyLoadedThemeName << name;
0136                 mPrintStyleDefinition.append(new PrintStyleDefinition(new GrantleeStyleFactory(name, printThemePath, this)));
0137             }
0138         }
0139     }
0140 }
0141 
0142 void PrintingWizard::registerStyles()
0143 {
0144     mPrintStyleDefinition.append(new PrintStyleDefinition(new DetailledPrintStyleFactory(this)));
0145     mPrintStyleDefinition.append(new PrintStyleDefinition(new MikesStyleFactory(this)));
0146     mPrintStyleDefinition.append(new PrintStyleDefinition(new RingBinderPrintStyleFactory(this)));
0147     mPrintStyleDefinition.append(new PrintStyleDefinition(new CompactStyleFactory(this)));
0148 
0149     loadGrantleeStyle();
0150 
0151     mStylePage->clearStyleNames();
0152     for (int i = 0; i < mPrintStyleDefinition.count(); ++i) {
0153         mStylePage->addStyleName(mPrintStyleDefinition.at(i)->printstyleFactory->description());
0154     }
0155 }
0156 
0157 void PrintingWizard::slotStyleSelected(int index)
0158 {
0159     if (index < 0 || index >= mPrintStyleDefinition.count()) {
0160         return;
0161     }
0162     if (mStyle) {
0163         mStyle->hidePages();
0164     }
0165 
0166     mStyle = mPrintStyleDefinition.value(index)->printStyle;
0167     if (!mStyle) {
0168         PrintStyleFactory *factory = mPrintStyleDefinition.at(index)->printstyleFactory;
0169         qCDebug(KADDRESSBOOK_LOG) << "creating print style" << factory->description();
0170 
0171         mStyle = factory->create();
0172         mPrintStyleDefinition.value(index)->printStyle = mStyle;
0173     }
0174 
0175     mStyle->showPages();
0176 
0177     mStylePage->setPreview(mStyle->preview());
0178 
0179     mStylePage->setSortField(mStyle->preferredSortField());
0180     mStylePage->setSortOrder(mStyle->preferredSortOrder());
0181 }
0182 
0183 QPrinter *PrintingWizard::printer() const
0184 {
0185     return mPrinter;
0186 }
0187 
0188 int PrintingWizard::printingStyle() const
0189 {
0190     return mStylePage->printingStyle();
0191 }
0192 
0193 int PrintingWizard::sortOrder() const
0194 {
0195     return mStylePage->sortOrder();
0196 }
0197 
0198 void PrintingWizard::print()
0199 {
0200     // create and show print progress widget:
0201     mProgress = new PrintProgress(this);
0202     auto progressItem = new KPageWidgetItem(mProgress, i18n("Print Progress"));
0203     addPage(progressItem);
0204     setCurrentPage(progressItem);
0205     qApp->processEvents();
0206 
0207     KContacts::Addressee::List contacts = mSelectionPage->selectedContacts().addressList();
0208 
0209     const ContactSorter sorter(mStylePage->sortField(), mStylePage->sortOrder());
0210     sorter.sort(contacts);
0211 
0212     qCDebug(KADDRESSBOOK_LOG) << "printing" << contacts.count() << "contacts.";
0213     // ... print:
0214     backButton()->setEnabled(false);
0215 
0216     button(QDialogButtonBox::Cancel)->setEnabled(false);
0217     mStyle->print(contacts, mProgress);
0218 }
0219 
0220 #include "moc_printingwizard.cpp"