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