File indexing completed on 2024-04-28 11:45:10

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"