File indexing completed on 2024-04-28 15:30:33
0001 /* 0002 SPDX-FileCopyrightText: 2002-2010 Anders Lund <anders@alweb.dk> 0003 0004 Rewritten based on code of: 0005 SPDX-FileCopyrightText: 2002 Michael Goffioul <kdeprint@swing.be> 0006 0007 SPDX-License-Identifier: LGPL-2.0-or-later 0008 */ 0009 0010 #include "kateprinter.h" 0011 0012 #include "kateconfig.h" 0013 #include "katedocument.h" 0014 #include "kateglobal.h" 0015 #include "kateview.h" 0016 0017 #include <KConfigGroup> 0018 #include <KSharedConfig> 0019 0020 #include <QApplication> 0021 #include <QMarginsF> 0022 #include <QPageLayout> 0023 #include <QPrintDialog> 0024 #include <QPrintPreviewDialog> 0025 #include <QPrinter> 0026 0027 #include "printconfigwidgets.h" 0028 #include "printpainter.h" 0029 0030 using namespace KatePrinter; 0031 0032 // BEGIN KatePrinterPrivate 0033 class KatePrinterPrivate : public QObject 0034 { 0035 Q_OBJECT 0036 public: 0037 KatePrinterPrivate(KTextEditor::DocumentPrivate *doc, KTextEditor::ViewPrivate *view = nullptr); 0038 0039 bool print(QPrinter *printer); 0040 void setColorScheme(const QString &scheme); 0041 0042 public Q_SLOTS: 0043 void paint(QPrinter *printer); 0044 0045 private: 0046 KTextEditor::ViewPrivate *m_view; 0047 KTextEditor::DocumentPrivate *m_doc; 0048 PrintPainter m_painter; 0049 static void readSettings(QPrinter *printer); 0050 static void writeSettings(QPrinter *printer); 0051 }; 0052 0053 KatePrinterPrivate::KatePrinterPrivate(KTextEditor::DocumentPrivate *doc, KTextEditor::ViewPrivate *view) 0054 : QObject() 0055 , m_view(view) 0056 , m_doc(doc) 0057 , m_painter(m_doc, m_view) 0058 { 0059 } 0060 0061 bool KatePrinterPrivate::print(QPrinter *printer) 0062 { 0063 // docname is now always there, including the right Untitled name 0064 printer->setDocName(m_doc->documentName()); 0065 0066 KatePrintTextSettings *kpts = new KatePrintTextSettings; 0067 KatePrintHeaderFooter *kphf = new KatePrintHeaderFooter; 0068 KatePrintLayout *kpl = new KatePrintLayout; 0069 0070 QList<QWidget *> tabs; 0071 tabs << kpts; 0072 tabs << kphf; 0073 tabs << kpl; 0074 0075 QWidget *parentWidget = m_doc->widget(); 0076 0077 if (!parentWidget) { 0078 parentWidget = QApplication::activeWindow(); 0079 } 0080 0081 readSettings(printer); 0082 0083 QPointer<QPrintDialog> printDialog(new QPrintDialog(printer, parentWidget)); 0084 printDialog->setOptionTabs(tabs); 0085 0086 if (m_view && m_view->selection()) { 0087 printer->setPrintRange(QPrinter::Selection); 0088 printDialog->setOption(QAbstractPrintDialog::PrintSelection, true); 0089 } 0090 0091 printDialog->setOption(QAbstractPrintDialog::PrintPageRange, true); 0092 0093 const int dlgCode = printDialog->exec(); 0094 if (dlgCode != QDialog::Accepted || !printDialog) { 0095 delete printDialog; 0096 return false; 0097 } 0098 0099 writeSettings(printer); 0100 0101 // configure the painter 0102 m_painter.setPrintGuide(kpts->printGuide()); 0103 m_painter.setPrintLineNumbers(kpts->printLineNumbers()); 0104 m_painter.setDontPrintFoldedCode(kpts->dontPrintFoldedCode()); 0105 0106 m_painter.setColorScheme(kpl->colorScheme()); 0107 m_painter.setTextFont(kpl->textFont()); 0108 m_painter.setUseBackground(kpl->useBackground()); 0109 m_painter.setUseBox(kpl->useBox()); 0110 m_painter.setBoxMargin(kpl->boxMargin()); 0111 m_painter.setBoxWidth(kpl->boxWidth()); 0112 m_painter.setBoxColor(kpl->boxColor()); 0113 0114 m_painter.setHeadersFont(kphf->font()); 0115 0116 m_painter.setUseHeader(kphf->useHeader()); 0117 m_painter.setHeaderBackground(kphf->headerBackground()); 0118 m_painter.setHeaderForeground(kphf->headerForeground()); 0119 m_painter.setUseHeaderBackground(kphf->useHeaderBackground()); 0120 m_painter.setHeaderFormat(kphf->headerFormat()); 0121 0122 m_painter.setUseFooter(kphf->useFooter()); 0123 m_painter.setFooterBackground(kphf->footerBackground()); 0124 m_painter.setFooterForeground(kphf->footerForeground()); 0125 m_painter.setUseFooterBackground(kphf->useFooterBackground()); 0126 m_painter.setFooterFormat(kphf->footerFormat()); 0127 0128 delete printDialog; 0129 m_painter.paint(printer); 0130 0131 return true; 0132 } 0133 0134 void KatePrinterPrivate::paint(QPrinter *printer) 0135 { 0136 m_painter.paint(printer); 0137 } 0138 0139 void KatePrinterPrivate::setColorScheme(const QString &scheme) 0140 { 0141 m_painter.setColorScheme(scheme); 0142 } 0143 0144 void KatePrinterPrivate::writeSettings(QPrinter *printer) 0145 { 0146 KSharedConfigPtr config = KTextEditor::EditorPrivate::config(); 0147 KConfigGroup group(config, QStringLiteral("Kate Print Settings")); 0148 KConfigGroup margins(&group, QStringLiteral("Margins")); 0149 0150 QMarginsF m = printer->pageLayout().margins(QPageLayout::Millimeter); 0151 margins.writeEntry("left", m.left()); 0152 margins.writeEntry("top", m.top()); 0153 margins.writeEntry("right", m.right()); 0154 margins.writeEntry("bottom", m.bottom()); 0155 } 0156 0157 void KatePrinterPrivate::readSettings(QPrinter *printer) 0158 { 0159 KSharedConfigPtr config = KTextEditor::EditorPrivate::config(); 0160 KConfigGroup group(config, QStringLiteral("Kate Print Settings")); 0161 KConfigGroup margins(&group, QStringLiteral("Margins")); 0162 0163 qreal left{}; 0164 qreal right{}; 0165 qreal top{}; 0166 qreal bottom{}; 0167 left = margins.readEntry("left", left); 0168 top = margins.readEntry("top", top); 0169 right = margins.readEntry("right", right); 0170 bottom = margins.readEntry("bottom", bottom); 0171 QMarginsF m = QMarginsF(left, top, right, bottom); 0172 printer->setPageMargins(m, QPageLayout::Millimeter); 0173 } 0174 0175 // END KatePrinterPrivate 0176 0177 // BEGIN KatePrinter 0178 0179 bool KatePrinter::print(KTextEditor::ViewPrivate *view) 0180 { 0181 QPrinter printer; 0182 KatePrinterPrivate p(view->doc(), view); 0183 return p.print(&printer); 0184 } 0185 0186 bool KatePrinter::printPreview(KTextEditor::ViewPrivate *view) 0187 { 0188 QPrinter printer; 0189 KatePrinterPrivate p(view->doc(), view); 0190 p.setColorScheme(QStringLiteral("Printing")); 0191 QPrintPreviewDialog preview(&printer, view); 0192 QObject::connect(&preview, &QPrintPreviewDialog::paintRequested, &p, &KatePrinterPrivate::paint); 0193 return preview.exec(); 0194 } 0195 0196 bool KatePrinter::print(KTextEditor::DocumentPrivate *doc) 0197 { 0198 QPrinter printer; 0199 KatePrinterPrivate p(doc); 0200 return p.print(&printer); 0201 } 0202 0203 bool KatePrinter::printPreview(KTextEditor::DocumentPrivate *doc) 0204 { 0205 QPrinter printer; 0206 KatePrinterPrivate p(doc); 0207 p.setColorScheme(QStringLiteral("Printing")); 0208 QPrintPreviewDialog preview(&printer); 0209 QObject::connect(&preview, &QPrintPreviewDialog::paintRequested, &p, &KatePrinterPrivate::paint); 0210 return preview.exec(); 0211 } 0212 0213 // END KatePrinter 0214 0215 #include "kateprinter.moc"