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"