File indexing completed on 2024-05-19 15:27:53

0001 /* This file is part of KGraphViewer.
0002    Copyright (C) 2005-2007 Gael de Chalendar <kleag@free.fr>
0003 
0004    KGraphViewer is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU General Public
0006    License as published by the Free Software Foundation, version 2.
0007 
0008    This program is distributed in the hope that it will be useful,
0009    but WITHOUT ANY WARRANTY; without even the implied warranty of
0010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0011    General Public License for more details.
0012 
0013    You should have received a copy of the GNU General Public License
0014    along with this program; if not, write to the Free Software
0015    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
0016    02110-1301, USA
0017 */
0018 
0019 /* This file was part of the KDE project
0020    Copyright (C) 2005 Jarosław Staniek <staniek@kde.org>
0021 
0022    This program is free software; you can redistribute it and/or
0023    modify it under the terms of the GNU Library General Public
0024    License as published by the Free Software Foundation; either
0025    version 2 of the License, or (at your option) any later version.
0026  */
0027 
0028 #include "simpleprintingpagesetup.h"
0029 #include "dotgraphview.h"
0030 #include "kgraphviewerlib_debug.h"
0031 #include "simpleprintingcommand.h"
0032 #include "simpleprintingsettings.h"
0033 #include "simpleprintpreviewwindow.h"
0034 #include "ui_simpleprintingpagesetupbase.h"
0035 
0036 #include <QApplication>
0037 #include <QDebug>
0038 #include <QFontDialog>
0039 #include <QIcon>
0040 #include <QLabel>
0041 #include <QLineEdit>
0042 #include <QMessageBox>
0043 #include <QPushButton>
0044 #include <QSpinBox>
0045 #include <QStandardPaths>
0046 #include <QUrl>
0047 
0048 #include <QRadioButton>
0049 #include <qcheckbox.h>
0050 #include <qlabel.h>
0051 #include <qlayout.h>
0052 #include <qpainter.h>
0053 #include <qslider.h>
0054 #include <qtimer.h>
0055 #include <qtooltip.h>
0056 // Added by qt3to4:
0057 #include <QPixmap>
0058 #include <QVBoxLayout>
0059 #include <iostream>
0060 #include <klocalizedstring.h>
0061 
0062 namespace KGraphViewer
0063 {
0064 KGVSimplePrintingPageSetup::KGVSimplePrintingPageSetup(KGVSimplePrintingCommand *command, DotGraphView *mainWin, QWidget *parent, QMap<QString, QString> *args)
0065     : QWidget(parent)
0066     , m_settings(command->engine()->settings())
0067     , m_command(command)
0068 {
0069     setObjectName("KGVSimplePrintingPageSetup");
0070     // object to print
0071     bool ok = args;
0072     m_graphView = mainWin;
0073     ok = m_graphView;
0074 
0075     bool printPreview = false;
0076     bool print = false;
0077     bool pageSetup = false;
0078     if (ok) {
0079         printPreview = (*args)["action"] == "printPreview";
0080         print = (*args)["action"] == "print";
0081         pageSetup = (*args)["action"] == "pageSetup";
0082         ok = printPreview || print || pageSetup;
0083     }
0084 
0085     // settings
0086     //! @todo default?
0087     m_unit = QLocale().measurementSystem() == QLocale::MetricSystem ? KgvUnit::U_CM : KgvUnit::U_INCH;
0088 
0089     // GUI
0090     m_contents = new Ui::KGVSimplePrintingPageSetupBase();
0091     m_contents->setupUi(this);
0092     layout()->setMargin(0);
0093 
0094     setFocusPolicy(Qt::WheelFocus);
0095     //  m_contents->setFocusProxy(m_contents->headerTitleLineEdit);
0096 
0097     m_contents->printButton->setIcon(QIcon::fromTheme("printer"));
0098     connect(m_contents->printButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotPrint);
0099 
0100     m_contents->printPreviewButton->setIcon(QIcon::fromTheme("document-print-preview"));
0101     m_contents->printPreviewButton->setText(i18n("Print Preview..."));
0102     connect(m_contents->printPreviewButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotPrintPreview);
0103 
0104     m_contents->headerTitleFontButton->setText(i18n("Font..."));
0105     m_contents->headerTitleFontButton->setWhatsThis(i18n("Changes font for title text."));
0106     connect(m_contents->headerTitleFontButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotChangeTitleFont);
0107 
0108     if (m_graphView) {
0109         m_contents->headerTitleLineEdit->setText((*args)["title"]);
0110         QString origCaptionLabelText = m_contents->captionLabel->text();
0111         m_contents->captionLabel->setText(i18n("<qt><h2>Page Setup for Printing Graph \"%1\"</h2></qt>", QUrl::fromLocalFile(m_graphView->dotFileName()).fileName()));
0112     }
0113     connect(m_contents->headerTitleLineEdit, &QLineEdit::textChanged, this, &KGVSimplePrintingPageSetup::slotTitleTextChanged);
0114     m_contents->headerTitleLineEdit->setFont(m_settings->pageTitleFont);
0115 
0116     m_contents->saveSetupLink->setWhatsThis(i18n("Saves settings for this setup as default."));
0117     connect(m_contents->saveSetupLink, static_cast<void (KUrlLabel::*)()>(&KUrlLabel::leftClickedUrl), this, &KGVSimplePrintingPageSetup::slotSaveSetup);
0118 
0119     m_contents->addDateTimeCheckbox->setWhatsThis(i18n("Adds date and time to the header."));
0120     m_contents->addPageNumbersCheckbox->setWhatsThis(i18n("Adds page numbers to the footer."));
0121     m_contents->addTableBordersCheckbox->setWhatsThis(i18n("Adds table borders."));
0122 
0123 #ifdef KGV_NO_UNFINISHED
0124     m_contents->addDateTimeCheckbox->hide();
0125     m_contents->addPageNumbersCheckbox->hide();
0126 #endif
0127 
0128     updatePageLayoutAndUnitInfo();
0129     m_contents->changePageSizeAndMarginsButton->setText(i18n("Change Page Size and Margins..."));
0130     m_contents->changePageSizeAndMarginsButton->setWhatsThis(i18n("Changes page size and margins."));
0131     connect(m_contents->changePageSizeAndMarginsButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotChangePageSizeAndMargins);
0132 
0133     connect(m_contents->addPageNumbersCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddPageNumbersCheckboxToggled);
0134     connect(m_contents->addDateTimeCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddDateTimeCheckboxToggled);
0135     connect(m_contents->addTableBordersCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddTableBordersCheckboxToggled);
0136 
0137     //
0138     m_contents->addPageNumbersCheckbox->setChecked(m_settings->addPageNumbers);
0139     m_contents->addDateTimeCheckbox->setChecked(m_settings->addDateAndTime);
0140     m_contents->addTableBordersCheckbox->setChecked(m_settings->addTableBorders);
0141     setDirty(false);
0142 
0143     //  clear it back to false after widgets initialization
0144     m_printPreviewNeedsReloading = false;
0145 
0146     if (printPreview)
0147         QTimer::singleShot(50, this, SLOT(printPreview()));
0148     else if (print)
0149         QTimer::singleShot(50, this, SLOT(print()));
0150     connect(this, static_cast<void (KGVSimplePrintingPageSetup::*)()>(&KGVSimplePrintingPageSetup::print), m_graphView, &DotGraphView::print);
0151     connect(this, static_cast<void (KGVSimplePrintingPageSetup::*)()>(&KGVSimplePrintingPageSetup::printPreview), m_graphView, &DotGraphView::printPreview);
0152 
0153     connect(m_contents->buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotClose);
0154 
0155     m_contents->horizFitNumInput->setRange(1, m_command->engine()->maxHorizFit());
0156     m_contents->vertFitNumInput->setRange(1, m_command->engine()->maxVertFit());
0157     m_settings->horizFitting = m_command->engine()->maxHorizFit();
0158     m_settings->vertFitting = m_command->engine()->maxVertFit();
0159     m_contents->horizFitNumInput->setValue(m_settings->horizFitting);
0160     m_contents->vertFitNumInput->setValue(m_settings->vertFitting);
0161     connect(m_contents->maintainAspectButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotMaintainAspectButtonToggled);
0162     connect(m_contents->horizFitNumInput, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &KGVSimplePrintingPageSetup::slotHorizFitChanged);
0163     connect(m_contents->vertFitNumInput, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &KGVSimplePrintingPageSetup::slotVertFitChanged);
0164 
0165     m_fittingModeButtons.addButton(m_contents->naturalSizeRadioButton, NaturalSize);
0166     m_fittingModeButtons.addButton(m_contents->fitToOnePageRadioButton, FitToOnePage);
0167     m_fittingModeButtons.addButton(m_contents->fitToSeveralPagesRadioButton, FitToSeveralPages);
0168     connect(&m_fittingModeButtons, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), this, &KGVSimplePrintingPageSetup::slotFittingButtonClicked);
0169 
0170     m_fittingModeButtons.button(m_settings->fittingMode)->setChecked(true);
0171     if (m_settings->fittingMode != FitToSeveralPages) {
0172         m_contents->horizFitNumInput->setEnabled(false);
0173         m_contents->vertFitNumInput->setEnabled(false);
0174         m_contents->maintainAspectButton->setEnabled(false);
0175     }
0176 
0177     QString chainStatePixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain.png");
0178     if (!m_settings->chainedFittings) {
0179         chainStatePixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain-broken.png");
0180     }
0181     if (chainStatePixString.isNull()) {
0182         std::cerr << "chain state pixmap not found !" << std::endl;
0183     }
0184     m_contents->maintainAspectButton->setIcon(QPixmap(chainStatePixString));
0185 
0186     // hides currently unused title label
0187     m_contents->headerTitleLineEdit->setText(i18n("Chosen font looks like this"));
0188     m_contents->headerTitleLineEdit->setReadOnly(true);
0189 }
0190 
0191 KGVSimplePrintingPageSetup::~KGVSimplePrintingPageSetup()
0192 {
0193     delete m_contents;
0194 }
0195 
0196 void KGVSimplePrintingPageSetup::updatePageLayoutAndUnitInfo()
0197 {
0198     QString s;
0199     if (m_settings->pageLayout.format == PG_CUSTOM) {
0200         s += QString(" (%1 %2 x %3 %4)").arg(m_settings->pageLayout.ptWidth).arg(KgvUnit::unitName(m_unit)).arg(m_settings->pageLayout.ptHeight).arg(KgvUnit::unitName(m_unit));
0201     } else
0202         s += KgvPageFormat::name(m_settings->pageLayout.format);
0203     s += QString(", ") + (m_settings->pageLayout.orientation == PG_PORTRAIT ? i18n("Portrait") : i18n("Landscape")) + ", " + i18n("margins:") + ' ' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptLeft, m_unit) + '/' +
0204         KgvUnit::toUserStringValue(m_settings->pageLayout.ptRight, m_unit) + '/' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptTop, m_unit) + '/' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptBottom, m_unit) + ' ' +
0205         KgvUnit::unitName(m_unit);
0206     m_contents->pageSizeAndMarginsLabel->setText(s);
0207     m_contents->horizFitNumInput->setRange(1, m_command->engine()->maxHorizFit());
0208     m_contents->vertFitNumInput->setRange(1, m_command->engine()->maxVertFit());
0209 }
0210 
0211 void KGVSimplePrintingPageSetup::setDirty(bool set)
0212 {
0213     m_contents->saveSetupLink->setEnabled(set);
0214     if (set) {
0215         m_printPreviewNeedsReloading = true;
0216         m_command->engine()->clear();
0217         emit needsRedraw();
0218     }
0219 }
0220 
0221 void KGVSimplePrintingPageSetup::slotSaveSetup()
0222 {
0223     m_settings->save();
0224     setDirty(false);
0225 }
0226 
0227 void KGVSimplePrintingPageSetup::slotPrint()
0228 {
0229     emit print();
0230 }
0231 
0232 void KGVSimplePrintingPageSetup::slotPrintPreview()
0233 {
0234     emit printPreview();
0235     m_printPreviewNeedsReloading = false;
0236 }
0237 
0238 void KGVSimplePrintingPageSetup::slotTitleTextChanged(const QString &)
0239 {
0240     if (m_contents->headerTitleLineEdit->isModified()) {
0241         m_printPreviewNeedsReloading = true;
0242     }
0243 
0244     m_contents->headerTitleLineEdit->setModified(false);
0245     setDirty(true);
0246 }
0247 
0248 void KGVSimplePrintingPageSetup::slotChangeTitleFont()
0249 {
0250     bool ok;
0251     QFont font = QFontDialog::getFont(&ok, m_settings->pageTitleFont, this);
0252     if (!ok)
0253         return;
0254     m_settings->pageTitleFont = font;
0255     m_contents->headerTitleLineEdit->setFont(m_settings->pageTitleFont);
0256     setDirty(true);
0257 }
0258 
0259 void KGVSimplePrintingPageSetup::slotChangePageSizeAndMargins()
0260 {
0261     KgvHeadFoot headfoot; // dummy
0262     //   std::cerr << "PageLayout before: " << m_settings->pageLayout.orientation << std::endl;
0263     if (int(QDialog::Accepted) != KgvPageLayoutDia::pageLayout(m_settings->pageLayout, headfoot, FORMAT_AND_BORDERS | DISABLE_UNIT, m_unit, this))
0264         return;
0265 
0266     //   std::cerr << "PageLayout after: " << m_settings->pageLayout.orientation << std::endl;
0267     // update
0268     updatePageLayoutAndUnitInfo();
0269     setDirty(true);
0270 }
0271 
0272 void KGVSimplePrintingPageSetup::slotAddPageNumbersCheckboxToggled(bool set)
0273 {
0274     m_settings->addPageNumbers = set;
0275     setDirty(true);
0276 }
0277 
0278 void KGVSimplePrintingPageSetup::slotAddDateTimeCheckboxToggled(bool set)
0279 {
0280     m_settings->addDateAndTime = set;
0281     setDirty(true);
0282 }
0283 
0284 void KGVSimplePrintingPageSetup::slotAddTableBordersCheckboxToggled(bool set)
0285 {
0286     m_settings->addTableBorders = set;
0287     setDirty(true);
0288 }
0289 
0290 void KGVSimplePrintingPageSetup::slotFittingButtonClicked(int id)
0291 {
0292     qCDebug(KGRAPHVIEWERLIB_LOG) << "KGVSimplePrintingPageSetup::slotFittingButtonClicked " << id;
0293     if (id == NaturalSize) {
0294         m_settings->fitToOnePage = false;
0295         m_contents->horizFitNumInput->setEnabled(false);
0296         m_contents->vertFitNumInput->setEnabled(false);
0297         m_contents->maintainAspectButton->setEnabled(false);
0298     } else if (id == FitToOnePage) {
0299         m_settings->fitToOnePage = true;
0300         m_contents->horizFitNumInput->setEnabled(false);
0301         m_contents->vertFitNumInput->setEnabled(false);
0302         m_contents->maintainAspectButton->setEnabled(false);
0303     } else if (id == FitToSeveralPages) {
0304         m_settings->fitToOnePage = false;
0305         m_contents->horizFitNumInput->setEnabled(true);
0306         m_contents->vertFitNumInput->setEnabled(true);
0307         m_contents->maintainAspectButton->setEnabled(true);
0308     }
0309     setDirty(true);
0310 }
0311 
0312 void KGVSimplePrintingPageSetup::slotMaintainAspectButtonToggled()
0313 {
0314     if (m_settings->chainedFittings) {
0315         QString chainBreakPixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain-broken.png");
0316         if (chainBreakPixString.isNull()) {
0317             std::cerr << "chain break pixmap not found !" << std::endl;
0318         }
0319         m_contents->maintainAspectButton->setIcon(QPixmap(chainBreakPixString));
0320         m_settings->chainedFittings = false;
0321     } else {
0322         QString chainPixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain.png");
0323         if (chainPixString.isNull()) {
0324             std::cerr << "chain pixmap not found !" << std::endl;
0325         }
0326         m_contents->maintainAspectButton->setIcon(QPixmap(chainPixString));
0327         m_settings->chainedFittings = true;
0328     }
0329     emit needsRedraw();
0330 }
0331 
0332 void KGVSimplePrintingPageSetup::slotClose()
0333 {
0334     parentWidget()->hide();
0335 }
0336 
0337 void KGVSimplePrintingPageSetup::slotHorizFitChanged(int newValue)
0338 {
0339     m_settings->horizFitting = newValue;
0340     m_printPreviewNeedsReloading = true;
0341     emit needsRedraw();
0342 }
0343 
0344 void KGVSimplePrintingPageSetup::slotVertFitChanged(int newValue)
0345 {
0346     m_settings->vertFitting = newValue;
0347     m_printPreviewNeedsReloading = true;
0348     emit needsRedraw();
0349 }
0350 
0351 }
0352 
0353 #include "moc_simpleprintingpagesetup.cpp"