CalendarSupport

calprinter.cpp
1/*
2 SPDX-FileCopyrightText: 1998 Preston Brown <pbrown@kde.org>
3 SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
4
5 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
6*/
7
8#include "calprinter.h"
9#include "calprintdefaultplugins.h"
10#include "journalprint.h"
11#include "yearprint.h"
12
13#include <KConfigGroup>
14#include <KMessageBox>
15#include <KStandardGuiItem>
16#include <KWindowStateSaver>
17
18#include <QButtonGroup>
19#include <QDialogButtonBox>
20#include <QGridLayout>
21#include <QGroupBox>
22#include <QPrintDialog>
23#include <QPrintPreviewDialog>
24#include <QSplitter>
25#include <QStackedWidget>
26#include <QVBoxLayout>
27
28using namespace CalendarSupport;
29
30CalPrinter::CalPrinter(QWidget *parent, const KCalendarCore::Calendar::Ptr &calendar, bool uniqItem)
31 : QObject(parent)
32 , mParent(parent)
33 , mConfig(new KConfig(QStringLiteral("calendar_printing.rc"), KConfig::SimpleConfig))
34 , mUniqItem(uniqItem)
35{
36 init(calendar);
37}
38
39CalPrinter::~CalPrinter()
40{
41 qDeleteAll(mPrintPlugins);
42 delete mConfig;
43}
44
45void CalPrinter::init(const KCalendarCore::Calendar::Ptr &calendar)
46{
47 mCalendar = calendar;
48
49 qDeleteAll(mPrintPlugins);
50 mPrintPlugins.clear();
51
52 if (!mUniqItem) {
53 mPrintPlugins.prepend(new CalPrintYear());
54 mPrintPlugins.prepend(new CalPrintJournal());
55 mPrintPlugins.prepend(new CalPrintTodos());
56 mPrintPlugins.prepend(new CalPrintMonth());
57 mPrintPlugins.prepend(new CalPrintWeek());
58 mPrintPlugins.prepend(new CalPrintDay());
59 }
60 mPrintPlugins.prepend(new CalPrintIncidence());
61
62 PrintPlugin::List::Iterator it = mPrintPlugins.begin();
63 PrintPlugin::List::Iterator end = mPrintPlugins.end();
64 for (; it != end; ++it) {
65 if (*it) {
66 (*it)->setConfig(mConfig);
67 (*it)->setCalendar(mCalendar);
68 (*it)->doLoadConfig();
69 }
70 }
71}
72
74{
75 for (const auto plugin : std::as_const(mPrintPlugins)) {
76 plugin->setDateRange(fd, td);
77 }
78}
79
80void CalPrinter::print(int type, QDate fd, QDate td, const KCalendarCore::Incidence::List &selectedIncidences, bool preview)
81{
83 const PrintPlugin::List::Iterator end = mPrintPlugins.end();
84 for (it = mPrintPlugins.begin(); it != end; ++it) {
85 (*it)->setSelectedIncidences(selectedIncidences);
86 }
87 QPointer<CalPrintDialog> printDialog = new CalPrintDialog(type, mPrintPlugins, mParent, mUniqItem);
88
89 KConfigGroup grp(mConfig, QStringLiteral("")); // orientation setting isn't in a group
90 printDialog->setOrientation(CalPrinter::ePrintOrientation(grp.readEntry("Orientation", 1)));
91 printDialog->setPreview(preview);
92 setDateRange(fd, td);
93
94 if (printDialog->exec() == QDialog::Accepted) {
95 grp.writeEntry("Orientation", static_cast<int>(printDialog->orientation()));
96
97 // Save all changes in the dialog
98 for (it = mPrintPlugins.begin(); it != mPrintPlugins.end(); ++it) {
99 (*it)->doSaveConfig();
100 }
101 doPrint(printDialog->selectedPlugin(), printDialog->orientation(), preview);
102 }
103 delete printDialog;
104
105 for (it = mPrintPlugins.begin(); it != mPrintPlugins.end(); ++it) {
106 (*it)->setSelectedIncidences(KCalendarCore::Incidence::List());
107 }
108}
109
110void CalPrinter::doPrint(PrintPlugin *selectedStyle, CalPrinter::ePrintOrientation dlgorientation, bool preview)
111{
112 if (!selectedStyle) {
113 KMessageBox::error(mParent, i18nc("@info", "Unable to print, an invalid print style was specified."), i18nc("@title:window", "Printing error"));
114 return;
115 }
116
117 QPrinter printer;
118 switch (dlgorientation) {
119 case eOrientPlugin:
120 printer.setPageOrientation(selectedStyle->defaultOrientation());
121 break;
122 case eOrientPortrait:
124 break;
125 case eOrientLandscape:
127 break;
128 case eOrientPrinter:
129 break;
130 }
131
132 if (preview) {
134 new KWindowStateSaver(printPreview.data(), QLatin1StringView("CalendarPrintPreviewDialog"));
136 selectedStyle->doPrint(&printer);
137 });
138 printPreview->exec();
139 delete printPreview;
140 } else {
141 QPointer<QPrintDialog> printDialog = new QPrintDialog(&printer, mParent);
142 if (printDialog->exec() == QDialog::Accepted) {
143 selectedStyle->doPrint(&printer);
144 }
145 delete printDialog;
146 }
147}
148
149void CalPrinter::updateConfig()
150{
151}
152
153CalPrintDialog::CalPrintDialog(int initialPrintType, const PrintPlugin::List &plugins, QWidget *parent, bool uniqItem)
154 : QDialog(parent)
155{
156 setWindowTitle(i18nc("@title:window", "Print"));
158 auto mainLayout = new QVBoxLayout(this);
159 mOkButton = buttonBox->button(QDialogButtonBox::Ok);
160 mOkButton->setDefault(true);
161 mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
162 connect(buttonBox, &QDialogButtonBox::accepted, this, &CalPrintDialog::slotOk);
164 setModal(true);
165 auto page = new QWidget(this);
166 auto pageVBoxLayout = new QVBoxLayout(page);
167 pageVBoxLayout->setContentsMargins(0, 0, 0, 0);
168 mainLayout->addWidget(page);
169 mainLayout->addWidget(buttonBox);
170
171 auto splitter = new QSplitter(page);
172 pageVBoxLayout->addWidget(splitter);
173 splitter->setOrientation(Qt::Horizontal);
174 splitter->setChildrenCollapsible(false);
175 auto typeBox = new QGroupBox(i18nc("@title:group", "Print Style"), splitter);
177 mTypeGroup = new QButtonGroup(typeBox);
178
179 auto splitterRight = new QWidget(splitter);
181 splitterRightLayout->setContentsMargins(0, 0, 0, 0);
182 // splitterRightLayout->setMargin( marginHint() );
183 // splitterRightLayout->setSpacing( spacingHint() );
184
185 mConfigArea = new QStackedWidget(splitterRight);
186 splitterRightLayout->addWidget(mConfigArea, 0, 0, 1, 2);
187 auto orientationLabel = new QLabel(i18nc("@label", "Page &orientation:"), splitterRight);
188 orientationLabel->setAlignment(Qt::AlignRight);
189 splitterRightLayout->addWidget(orientationLabel, 1, 0);
190
191 mOrientationSelection = new QComboBox(splitterRight);
192 mOrientationSelection->setToolTip(i18nc("@info:tooltip", "Set the print orientation"));
193 mOrientationSelection->setWhatsThis(i18nc("@info:whatsthis",
194 "Choose if you want your output to be printed in \"portrait\" or "
195 "\"landscape\". You can also default to the orientation best suited to "
196 "the selected style or to your printer's default setting."));
197 mOrientationSelection->addItem(i18nc("@item:inlistbox", "Use Default Orientation of Selected Style"));
198 mOrientationSelection->addItem(i18nc("@item:inlistbox", "Use Printer Default"));
199 mOrientationSelection->addItem(i18nc("@item:inlistbox", "Portrait"));
200 mOrientationSelection->addItem(i18nc("@item:inlistbox", "Landscape"));
201 splitterRightLayout->addWidget(mOrientationSelection, 1, 1);
202
203 // signals and slots connections
204 connect(mTypeGroup, &QButtonGroup::buttonClicked, this, &CalPrintDialog::setPrintType);
205 orientationLabel->setBuddy(mOrientationSelection);
206
207 // First insert the config widgets into the widget stack. This possibly assigns
208 // proper ids (when two plugins have the same sortID), so store them in a map
209 // and use these new IDs to later sort the plugins for the type selection.
210 for (PrintPlugin::List::ConstIterator it = plugins.constBegin(), total = plugins.constEnd(); it != total; ++it) {
211 int newid = mConfigArea->insertWidget((*it)->sortID(), (*it)->configWidget(mConfigArea));
212 mPluginIDs[newid] = (*it);
213 }
214 // Insert all plugins in sorted order; plugins with clashing IDs will be first
216 bool firstButton = true;
217 int id = 0;
218 for (mapit = mPluginIDs.constBegin(); mapit != mPluginIDs.constEnd(); ++mapit) {
219 PrintPlugin *p = mapit.value();
220 auto radioButton = new QRadioButton(p->description());
221 radioButton->setEnabled(p->enabled());
222 radioButton->setToolTip(i18nc("@info:tooltip", "Select the type of print"));
223 radioButton->setWhatsThis(i18nc("@info:whatsthis",
224 "Select one of the following types of prints you want to make. "
225 "You may want to print an individual item, or all the items for a "
226 "specific time range (like a day, week or month), or you may want "
227 "to print your to-do list."));
228 // Check the first available button (to ensure one is selected initially) and then
229 // the button matching the desired print type -- if such is available!
230 if ((firstButton || p->sortID() == initialPrintType) && p->enabled()) {
231 firstButton = false;
232 radioButton->setChecked(true);
233 changePrintType(id);
234 }
235 mTypeGroup->addButton(radioButton, mapit.key());
236 typeLayout->addWidget(radioButton);
237 id++;
238 }
239 if (uniqItem) {
240 typeBox->hide();
241 }
242 typeLayout->insertStretch(-1, 100);
243 setMinimumSize(minimumSizeHint());
244 resize(minimumSizeHint());
245}
246
247CalPrintDialog::~CalPrintDialog() = default;
248
249void CalPrintDialog::setPreview(bool preview)
250{
251 if (preview) {
252 mOkButton->setText(i18nc("@action:button", "&Preview"));
253 } else {
254 mOkButton->setText(KStandardGuiItem::print().text());
255 }
256}
257
258void CalPrintDialog::changePrintType(int i)
259{
260 mConfigArea->setCurrentIndex(i);
261 mConfigArea->currentWidget()->raise();
262 QAbstractButton *btn = mTypeGroup->button(i);
263 if (btn) {
264 btn->setChecked(true);
265 }
266}
267
268void CalPrintDialog::setPrintType(QAbstractButton *button)
269{
270 if (button) {
271 const int i = mTypeGroup->id(button);
272 mConfigArea->setCurrentIndex(i);
273 mConfigArea->currentWidget()->raise();
274 button->setChecked(true);
275 }
276}
277
278void CalPrintDialog::setOrientation(CalPrinter::ePrintOrientation orientation)
279{
280 mOrientation = orientation;
281 mOrientationSelection->setCurrentIndex(mOrientation);
282}
283
284CalPrinter::ePrintOrientation CalPrintDialog::orientation() const
285{
286 return mOrientation;
287}
288
289PrintPlugin *CalPrintDialog::selectedPlugin()
290{
291 int id = mConfigArea->currentIndex();
292 if (mPluginIDs.contains(id)) {
293 return mPluginIDs[id];
294 } else {
295 return nullptr;
296 }
297}
298
299void CalPrintDialog::slotOk()
300{
301 mOrientation = static_cast<CalPrinter::ePrintOrientation>(mOrientationSelection->currentIndex());
302
303 QMap<int, PrintPlugin *>::ConstIterator it = mPluginIDs.constBegin();
304 for (; it != mPluginIDs.constEnd(); ++it) {
305 if (it.value()) {
306 it.value()->readSettingsWidget();
307 }
308 }
309 accept();
310}
311
312#include "moc_calprinter.cpp"
void setDateRange(QDate start, QDate end)
Set date range to be printed.
CalPrinter(QWidget *par, const KCalendarCore::Calendar::Ptr &calendar, bool uniqItem=false)
Base class for Calendar printing classes.
Definition printplugin.h:33
virtual bool enabled() const
Returns true if the plugin should be enabled; false otherwise.
Definition printplugin.h:93
virtual QString description() const =0
Returns short description of print format.
virtual int sortID() const
Returns the sort ID of the plugin.
Definition printplugin.h:85
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
QAction * printPreview(const QObject *recvr, const char *slot, QObject *parent)
KGuiItem print()
const QList< QKeySequence > & end()
void setChecked(bool)
void setText(const QString &text)
QVariant data() const const
QAbstractButton * button(int id) const const
void buttonClicked(QAbstractButton *button)
int id(QAbstractButton *button) const const
void setCurrentIndex(int index)
virtual void accept()
virtual void reject()
iterator begin()
void clear()
const_iterator constBegin() const const
const_iterator constEnd() const const
iterator end()
void prepend(parameter_type value)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
virtual bool setPageOrientation(QPageLayout::Orientation orientation)
void paintRequested(QPrinter *printer)
void setCurrentIndex(int index)
QWidget * currentWidget() const const
AlignRight
Key_Return
Horizontal
void raise()
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:16:32 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.