File indexing completed on 2024-04-28 07:46:26
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 public: 0036 KatePrinterPrivate(KTextEditor::DocumentPrivate *doc, KTextEditor::ViewPrivate *view = nullptr); 0037 0038 bool print(QPrinter *printer); 0039 void setColorScheme(const QString &scheme); 0040 0041 public: 0042 void paint(QPrinter *printer); 0043 0044 private: 0045 KTextEditor::ViewPrivate *m_view; 0046 KTextEditor::DocumentPrivate *m_doc; 0047 PrintPainter m_painter; 0048 static void readSettings(QPrinter *printer); 0049 static void writeSettings(QPrinter *printer); 0050 }; 0051 0052 KatePrinterPrivate::KatePrinterPrivate(KTextEditor::DocumentPrivate *doc, KTextEditor::ViewPrivate *view) 0053 : QObject() 0054 , m_view(view) 0055 , m_doc(doc) 0056 , m_painter(m_doc, m_view) 0057 { 0058 } 0059 0060 bool KatePrinterPrivate::print(QPrinter *printer) 0061 { 0062 // docname is now always there, including the right Untitled name 0063 printer->setDocName(m_doc->documentName()); 0064 0065 KatePrintTextSettings *kpts = new KatePrintTextSettings; 0066 KatePrintHeaderFooter *kphf = new KatePrintHeaderFooter; 0067 KatePrintLayout *kpl = new KatePrintLayout; 0068 0069 QList<QWidget *> tabs; 0070 tabs << kpts; 0071 tabs << kphf; 0072 tabs << kpl; 0073 0074 QWidget *parentWidget = m_doc->widget(); 0075 0076 if (!parentWidget) { 0077 parentWidget = QApplication::activeWindow(); 0078 } 0079 0080 readSettings(printer); 0081 0082 QPointer<QPrintDialog> printDialog(new QPrintDialog(printer, parentWidget)); 0083 printDialog->setOptionTabs(tabs); 0084 0085 if (m_view && m_view->selection()) { 0086 printer->setPrintRange(QPrinter::Selection); 0087 printDialog->setOption(QAbstractPrintDialog::PrintSelection, true); 0088 } 0089 0090 printDialog->setOption(QAbstractPrintDialog::PrintPageRange, true); 0091 0092 const int dlgCode = printDialog->exec(); 0093 if (dlgCode != QDialog::Accepted || !printDialog) { 0094 delete printDialog; 0095 return false; 0096 } 0097 0098 writeSettings(printer); 0099 0100 // configure the painter 0101 m_painter.setPrintGuide(kpts->printGuide()); 0102 m_painter.setPrintLineNumbers(kpts->printLineNumbers()); 0103 m_painter.setDontPrintFoldedCode(kpts->dontPrintFoldedCode()); 0104 0105 m_painter.setColorScheme(kpl->colorScheme()); 0106 m_painter.setTextFont(kpl->textFont()); 0107 m_painter.setUseBackground(kpl->useBackground()); 0108 m_painter.setUseBox(kpl->useBox()); 0109 m_painter.setBoxMargin(kpl->boxMargin()); 0110 m_painter.setBoxWidth(kpl->boxWidth()); 0111 m_painter.setBoxColor(kpl->boxColor()); 0112 0113 m_painter.setHeadersFont(kphf->font()); 0114 0115 m_painter.setUseHeader(kphf->useHeader()); 0116 m_painter.setHeaderBackground(kphf->headerBackground()); 0117 m_painter.setHeaderForeground(kphf->headerForeground()); 0118 m_painter.setUseHeaderBackground(kphf->useHeaderBackground()); 0119 m_painter.setHeaderFormat(kphf->headerFormat()); 0120 0121 m_painter.setUseFooter(kphf->useFooter()); 0122 m_painter.setFooterBackground(kphf->footerBackground()); 0123 m_painter.setFooterForeground(kphf->footerForeground()); 0124 m_painter.setUseFooterBackground(kphf->useFooterBackground()); 0125 m_painter.setFooterFormat(kphf->footerFormat()); 0126 0127 delete printDialog; 0128 m_painter.paint(printer); 0129 0130 return true; 0131 } 0132 0133 void KatePrinterPrivate::paint(QPrinter *printer) 0134 { 0135 m_painter.paint(printer); 0136 } 0137 0138 void KatePrinterPrivate::setColorScheme(const QString &scheme) 0139 { 0140 m_painter.setColorScheme(scheme); 0141 } 0142 0143 void KatePrinterPrivate::writeSettings(QPrinter *printer) 0144 { 0145 KSharedConfigPtr config = KTextEditor::EditorPrivate::config(); 0146 KConfigGroup group(config, QStringLiteral("Kate Print Settings")); 0147 KConfigGroup margins(&group, QStringLiteral("Margins")); 0148 0149 QMarginsF m = printer->pageLayout().margins(QPageLayout::Millimeter); 0150 margins.writeEntry("left", m.left()); 0151 margins.writeEntry("top", m.top()); 0152 margins.writeEntry("right", m.right()); 0153 margins.writeEntry("bottom", m.bottom()); 0154 } 0155 0156 void KatePrinterPrivate::readSettings(QPrinter *printer) 0157 { 0158 KSharedConfigPtr config = KTextEditor::EditorPrivate::config(); 0159 KConfigGroup group(config, QStringLiteral("Kate Print Settings")); 0160 KConfigGroup margins(&group, QStringLiteral("Margins")); 0161 0162 qreal left{}; 0163 qreal right{}; 0164 qreal top{}; 0165 qreal bottom{}; 0166 left = margins.readEntry("left", left); 0167 top = margins.readEntry("top", top); 0168 right = margins.readEntry("right", right); 0169 bottom = margins.readEntry("bottom", bottom); 0170 QMarginsF m = QMarginsF(left, top, right, bottom); 0171 printer->setPageMargins(m, QPageLayout::Millimeter); 0172 } 0173 0174 // END KatePrinterPrivate 0175 0176 // BEGIN KatePrinter 0177 0178 bool KatePrinter::print(KTextEditor::ViewPrivate *view) 0179 { 0180 QPrinter printer; 0181 KatePrinterPrivate p(view->doc(), view); 0182 return p.print(&printer); 0183 } 0184 0185 bool KatePrinter::printPreview(KTextEditor::ViewPrivate *view) 0186 { 0187 QPrinter printer; 0188 KatePrinterPrivate p(view->doc(), view); 0189 p.setColorScheme(QStringLiteral("Printing")); 0190 QPrintPreviewDialog preview(&printer, view); 0191 QObject::connect(&preview, &QPrintPreviewDialog::paintRequested, &p, &KatePrinterPrivate::paint); 0192 return preview.exec(); 0193 } 0194 0195 bool KatePrinter::print(KTextEditor::DocumentPrivate *doc) 0196 { 0197 QPrinter printer; 0198 KatePrinterPrivate p(doc); 0199 return p.print(&printer); 0200 } 0201 0202 bool KatePrinter::printPreview(KTextEditor::DocumentPrivate *doc) 0203 { 0204 QPrinter printer; 0205 KatePrinterPrivate p(doc); 0206 p.setColorScheme(QStringLiteral("Printing")); 0207 QPrintPreviewDialog preview(&printer); 0208 QObject::connect(&preview, &QPrintPreviewDialog::paintRequested, &p, &KatePrinterPrivate::paint); 0209 return preview.exec(); 0210 } 0211 0212 // END KatePrinter