1
0
mirror of https://github.com/fwbuilder/fwbuilder synced 2026-03-23 11:47:24 +01:00
fwbuilder/src/gui/FWWindowPrint.cpp
2010-03-03 02:50:00 +00:00

322 lines
9.9 KiB
C++

/*
Firewall Builder
Copyright (C) 2003 NetCitadel, LLC
Author: Vadim Kurland vadim@fwbuilder.org
$Id$
This program is free software which we release under the GNU General Public
License. You may redistribute and/or modify this program under the terms
of that license as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
To get a copy of the GNU General Public License, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../../config.h"
#include "global.h"
#include "utils.h"
#include "platforms.h"
#include <ui_FWBMainWindow_q.h>
#include <ui_pagesetupdialog_q.h>
#include "FWWindow.h"
#include "FWBSettings.h"
#include "PrintingProgressDialog.h"
#include "PrintingController.h"
#include "ProjectPanel.h"
#include "fwbuilder/Firewall.h"
#include "fwbuilder/RuleSet.h"
#include <qglobal.h>
#include <QPrintDialog>
#include <QAbstractPrintDialog>
#include <QMessageBox>
#include <QStatusBar>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QtDebug>
using namespace libfwbuilder;
using namespace std;
void FWWindow::filePrint()
{
if (!activeProject())
{
if (fwbdebug) qDebug() << "There isn't any selected subwindow";
return;
}
int pageWidth = 0;
int pageHeight = 0;
bool fullPage = false;
float margin = 0;
float table_scaling = 1.0;
bool print_header = true;
bool print_legend = true;
bool print_objects = true;
bool newPageForSection = false;
int tableResolution = 100;
FWObject *firewall_to_print = NULL;
FWObject *current_ruleset = activeProject()->getCurrentRuleSet();
if (current_ruleset)
firewall_to_print = current_ruleset->getParent();
else
{
// no ruleset is open in the right panel
firewall_to_print = activeProject()->getSelectedObject();
}
// Need error dialog
if (!Firewall::isA(firewall_to_print)) return;
if (!st->getStr("PrintSetup/newPageForSection").isEmpty())
newPageForSection = st->getBool("PrintSetup/newPageForSection");
if (!st->getStr("PrintSetup/printHeader").isEmpty())
print_header = st->getBool("PrintSetup/printHeader");
if (!st->getStr("PrintSetup/printLegend").isEmpty())
print_legend = st->getBool("PrintSetup/printLegend");
if (!st->getStr("PrintSetup/printObjects").isEmpty())
print_objects = st->getBool("PrintSetup/printObjects");
if (!st->getStr("PrintSetup/tableResolution").isEmpty())
{
tableResolution = st->getInt("PrintSetup/tableResolution");
// for backwards compatibility, convert resolutino from an index
// in a table to float 0..1.0
// Previously values were from the following list:
// 50%, 75%, 100%, 150%, 200%, default 100%
float old_res[] = {50, 75, 100, 150, 200 };
if (tableResolution <= 4 )
tableResolution = old_res[int(tableResolution)];
}
QDialog dlg;
psd = new Ui::pageSetupDialog_q();
psd->setupUi(&dlg);
connect(psd->tableResolution, SIGNAL(valueChanged(int)),
this, SLOT(tableResolutionSettingChanged(int)));
psd->newPageForSection->setChecked(newPageForSection);
psd->printHeader->setChecked(print_header);
psd->printLegend->setChecked(print_legend);
psd->printObjects->setChecked(print_objects);
psd->tableResolution->setValue(tableResolution);
if ( dlg.exec() == QDialog::Accepted )
{
newPageForSection = psd->newPageForSection->isChecked();
print_header = psd->printHeader->isChecked();
print_legend = psd->printLegend->isChecked();
print_objects = psd->printObjects->isChecked();
tableResolution = psd->tableResolution->value();
st->setBool("PrintSetup/newPageForSection", newPageForSection);
st->setBool("PrintSetup/printHeader", print_header);
st->setBool("PrintSetup/printLegend", print_legend);
st->setBool("PrintSetup/printObjects", print_objects);
st->setInt("PrintSetup/tableResolution", tableResolution);
st->getPrinterOptions(printer, pageWidth, pageHeight);
table_scaling = float(tableResolution) / 100;
//printer->setResolution(resolution);
printer->setFullPage(fullPage);
if (fwbdebug) qDebug() << "Running QPrintDialog";
QPrintDialog pdialog(printer, this);
pdialog.setWindowTitle(tr("Print configuration of %1")
.arg(firewall_to_print->getName().c_str()));
pdialog.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
pdialog.setMinMax(1,9999);
pdialog.setPrintRange(QAbstractPrintDialog::AllPages);
if (pdialog.exec() == QDialog::Accepted)
{
if (fwbdebug) qDebug() << "QPrintDialog finished";
int fromPage = printer->fromPage();
int toPage = printer->toPage();
if (fromPage==0) fromPage = 1;
if (toPage==0) toPage = 9999;
showStatusBarMessage(tr("Printing..." ));
PrintingProgressDialog *ppd =
new PrintingProgressDialog(this, printer, 0, false);
QString headerText = mw->printHeader();
#if defined(Q_OS_MACX)
printerStream pr(printer, table_scaling, margin,
print_header, headerText, NULL);
#else
printerStream pr(printer, table_scaling, margin,
print_header, headerText, ppd);
ppd->show();
#endif
pr.setFromTo(fromPage, toPage);
if (fwbdebug)
qDebug() << "Printer resolution (dpi):" << printer->resolution();
if ( !pr.begin())
{
ppd->hide();
delete ppd;
return;
}
PrintingController prcontr(&pr);
prcontr.printFirewall(firewall_to_print, activeProject());
if (print_legend) prcontr.printLegend(newPageForSection);
if (print_objects) prcontr.printObjects(firewall_to_print,
newPageForSection);
ppd->hide();
delete ppd;
pr.end();
if (printer->printerState() == QPrinter::Aborted)
{
showStatusBarMessage(tr("Printing aborted"));
QMessageBox::information(
this,"Firewall Builder",
tr("Printing aborted"),
tr("&Continue"), QString::null,QString::null,
0, 1 );
} else
showStatusBarMessage(tr("Printing completed"));
} else
{
if (fwbdebug) qDebug() << "QPrintDialog cancelled";
showStatusBarMessage(tr("Printing cancelled"));
}
st->setPrinterOptions(printer,pageWidth,pageHeight);
}
delete psd;
psd = NULL;
}
void FWWindow::tableResolutionSettingChanged(int )
{
if (psd)
{
QString res_lbl = QString("%1 %").arg(psd->tableResolution->value());
psd->tableResolutionLabel->setText(res_lbl);
}
}
void FWWindow::printFirewallFromFile(QString fileName,
QString firewallName,
QString outputFileName)
{
if (outputFileName=="")
{
outputFileName = "print.pdf";
}
if (firewallName=="")
{
return ;
}
if (fileName=="")
{
return;
}
FWObjectDatabase * objdb = new FWObjectDatabase();
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
objdb->load(fileName.toLatin1().constData(), NULL,librespath);
FWObject* obj = objdb->findObjectByName(Firewall::TYPENAME,
firewallName.toAscii().data());
if (obj!=NULL)
{
int pageWidth = 0;
int pageHeight = 0;
bool fullPage = false;
float margin = 0;
float table_scaling = 1.0;
bool print_header = true;
bool print_legend = true;
bool print_objects = true;
bool newPageForSection = false;
int tableResolution = 100;
if (!st->getStr("PrintSetup/newPageForSection").isEmpty())
newPageForSection = st->getBool("PrintSetup/newPageForSection");
if (!st->getStr("PrintSetup/printHeader").isEmpty())
print_header = st->getBool("PrintSetup/printHeader");
if (!st->getStr("PrintSetup/printLegend").isEmpty())
print_legend = st->getBool("PrintSetup/printLegend");
if (!st->getStr("PrintSetup/printObjects").isEmpty())
print_objects = st->getBool("PrintSetup/printObjects");
if (!st->getStr("PrintSetup/tableResolution").isEmpty())
tableResolution = st->getInt("PrintSetup/tableResolution");
table_scaling = float(tableResolution) / 100;
st->getPrinterOptions(printer,pageWidth,pageHeight);
//printer->setResolution(resolution);
printer->setFullPage(fullPage);
printer->setOutputFileName (outputFileName);
int fromPage = 1;
int toPage = 9999;
QString headerText = fileName; //mw->printHeader();
printerStream pr(printer, table_scaling,
margin, print_header, headerText, NULL);
pr.setFromTo(fromPage,toPage);
if ( !pr.begin()) return;
PrintingController prcontr(&pr);
prcontr.printFirewall(obj, NULL);
if (print_legend) prcontr.printLegend(newPageForSection);
if (print_objects) prcontr.printObjects(obj, newPageForSection);
}
else
{
qDebug() << "Error: can't find firewall " << firewallName;
}
}