0
+ − 1
/****************************************************************************
+ − 2
**
+ − 3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ − 4
** All rights reserved.
+ − 5
** Contact: Nokia Corporation (qt-info@nokia.com)
+ − 6
**
+ − 7
** This file is part of the QtGui module of the Qt Toolkit.
+ − 8
**
+ − 9
** $QT_BEGIN_LICENSE:LGPL$
+ − 10
** No Commercial Usage
+ − 11
** This file contains pre-release code and may not be distributed.
+ − 12
** You may use this file in accordance with the terms and conditions
+ − 13
** contained in the Technology Preview License Agreement accompanying
+ − 14
** this package.
+ − 15
**
+ − 16
** GNU Lesser General Public License Usage
+ − 17
** Alternatively, this file may be used under the terms of the GNU Lesser
+ − 18
** General Public License version 2.1 as published by the Free Software
+ − 19
** Foundation and appearing in the file LICENSE.LGPL included in the
+ − 20
** packaging of this file. Please review the following information to
+ − 21
** ensure the GNU Lesser General Public License version 2.1 requirements
+ − 22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ − 23
**
+ − 24
** In addition, as a special exception, Nokia gives you certain additional
+ − 25
** rights. These rights are described in the Nokia Qt LGPL Exception
+ − 26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+ − 27
**
+ − 28
** If you have questions regarding the use of this file, please contact
+ − 29
** Nokia at qt-info@nokia.com.
+ − 30
**
+ − 31
**
+ − 32
**
+ − 33
**
+ − 34
**
+ − 35
**
+ − 36
**
+ − 37
**
+ − 38
** $QT_END_LICENSE$
+ − 39
**
+ − 40
****************************************************************************/
+ − 41
+ − 42
#include "qpagesetupdialog.h"
+ − 43
+ − 44
#ifndef QT_NO_PRINTDIALOG
+ − 45
#include "qpagesetupdialog_unix_p.h"
+ − 46
+ − 47
#include "qpainter.h"
+ − 48
#include "qprintdialog.h"
+ − 49
#include "qdialogbuttonbox.h"
+ − 50
#include <ui_qpagesetupwidget.h>
+ − 51
+ − 52
#include <QtGui/qprinter.h>
+ − 53
#include <private/qabstractpagesetupdialog_p.h>
+ − 54
#include <private/qprinter_p.h>
+ − 55
+ − 56
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 57
# include <private/qcups_p.h>
+ − 58
# include <cups/cups.h>
+ − 59
# include <private/qpdf_p.h>
+ − 60
#endif
+ − 61
+ − 62
+ − 63
QT_BEGIN_NAMESPACE
+ − 64
+ − 65
QSizeF qt_printerPaperSize(QPrinter::Orientation, QPrinter::PaperSize, QPrinter::Unit, int);
+ − 66
+ − 67
// Disabled until we have support for papersources on unix
+ − 68
// #define PSD_ENABLE_PAPERSOURCE
+ − 69
+ − 70
static void populatePaperSizes(QComboBox* cb)
+ − 71
{
+ − 72
cb->addItem(QPrintDialog::tr("A0"), QPrinter::A0);
+ − 73
cb->addItem(QPrintDialog::tr("A1"), QPrinter::A1);
+ − 74
cb->addItem(QPrintDialog::tr("A2"), QPrinter::A2);
+ − 75
cb->addItem(QPrintDialog::tr("A3"), QPrinter::A3);
+ − 76
cb->addItem(QPrintDialog::tr("A4"), QPrinter::A4);
+ − 77
cb->addItem(QPrintDialog::tr("A5"), QPrinter::A5);
+ − 78
cb->addItem(QPrintDialog::tr("A6"), QPrinter::A6);
+ − 79
cb->addItem(QPrintDialog::tr("A7"), QPrinter::A7);
+ − 80
cb->addItem(QPrintDialog::tr("A8"), QPrinter::A8);
+ − 81
cb->addItem(QPrintDialog::tr("A9"), QPrinter::A9);
+ − 82
cb->addItem(QPrintDialog::tr("B0"), QPrinter::B0);
+ − 83
cb->addItem(QPrintDialog::tr("B1"), QPrinter::B1);
+ − 84
cb->addItem(QPrintDialog::tr("B2"), QPrinter::B2);
+ − 85
cb->addItem(QPrintDialog::tr("B3"), QPrinter::B3);
+ − 86
cb->addItem(QPrintDialog::tr("B4"), QPrinter::B4);
+ − 87
cb->addItem(QPrintDialog::tr("B5"), QPrinter::B5);
+ − 88
cb->addItem(QPrintDialog::tr("B6"), QPrinter::B6);
+ − 89
cb->addItem(QPrintDialog::tr("B7"), QPrinter::B7);
+ − 90
cb->addItem(QPrintDialog::tr("B8"), QPrinter::B8);
+ − 91
cb->addItem(QPrintDialog::tr("B9"), QPrinter::B9);
+ − 92
cb->addItem(QPrintDialog::tr("B10"), QPrinter::B10);
+ − 93
cb->addItem(QPrintDialog::tr("C5E"), QPrinter::C5E);
+ − 94
cb->addItem(QPrintDialog::tr("DLE"), QPrinter::DLE);
+ − 95
cb->addItem(QPrintDialog::tr("Executive"), QPrinter::Executive);
+ − 96
cb->addItem(QPrintDialog::tr("Folio"), QPrinter::Folio);
+ − 97
cb->addItem(QPrintDialog::tr("Ledger"), QPrinter::Ledger);
+ − 98
cb->addItem(QPrintDialog::tr("Legal"), QPrinter::Legal);
+ − 99
cb->addItem(QPrintDialog::tr("Letter"), QPrinter::Letter);
+ − 100
cb->addItem(QPrintDialog::tr("Tabloid"), QPrinter::Tabloid);
+ − 101
cb->addItem(QPrintDialog::tr("US Common #10 Envelope"), QPrinter::Comm10E);
+ − 102
cb->addItem(QPrintDialog::tr("Custom"), QPrinter::Custom);
+ − 103
}
+ − 104
+ − 105
+ − 106
static QSizeF sizeForOrientation(QPrinter::Orientation orientation, const QSizeF &size)
+ − 107
{
+ − 108
return (orientation == QPrinter::Portrait) ? size : QSizeF(size.height(), size.width());
+ − 109
}
+ − 110
+ − 111
#ifdef PSD_ENABLE_PAPERSOURCE
+ − 112
static const char *paperSourceNames[] = {
+ − 113
"Only One",
+ − 114
"Lower",
+ − 115
"Middle",
+ − 116
"Manual",
+ − 117
"Envelope",
+ − 118
"Envelope manual",
+ − 119
"Auto",
+ − 120
"Tractor",
+ − 121
"Small format",
+ − 122
"Large format",
+ − 123
"Large capacity",
+ − 124
"Cassette",
+ − 125
"Form source",
+ − 126
0
+ − 127
};
+ − 128
+ − 129
struct PaperSourceNames
+ − 130
{
+ − 131
PaperSourceNames(const char *nam, QPrinter::PaperSource ps)
+ − 132
: paperSource(ps), name(nam) {}
+ − 133
QPrinter::PaperSource paperSource;
+ − 134
const char *name;
+ − 135
};
+ − 136
#endif
+ − 137
+ − 138
+ − 139
class QPagePreview : public QWidget
+ − 140
{
+ − 141
public:
+ − 142
QPagePreview(QWidget *parent) : QWidget(parent)
+ − 143
{
+ − 144
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ − 145
setMinimumSize(50, 50);
+ − 146
}
+ − 147
+ − 148
void setPaperSize(const QSizeF& size)
+ − 149
{
+ − 150
m_size = size;
+ − 151
update();
+ − 152
}
+ − 153
+ − 154
void setMargins(qreal left, qreal top, qreal right, qreal bottom)
+ − 155
{
+ − 156
m_left = left;
+ − 157
m_top = top;
+ − 158
m_right = right;
+ − 159
m_bottom = bottom;
+ − 160
update();
+ − 161
}
+ − 162
+ − 163
protected:
+ − 164
void paintEvent(QPaintEvent *)
+ − 165
{
+ − 166
QRect pageRect;
+ − 167
QSizeF adjustedSize(m_size);
+ − 168
adjustedSize.scale(width()-10, height()-10, Qt::KeepAspectRatio);
+ − 169
pageRect = QRect(QPoint(0,0), adjustedSize.toSize());
+ − 170
pageRect.moveCenter(rect().center());
+ − 171
+ − 172
qreal width_factor = pageRect.width() / m_size.width();
+ − 173
qreal height_factor = pageRect.height() / m_size.height();
+ − 174
int leftSize = qRound(m_left*width_factor);
+ − 175
int topSize = qRound(m_top*height_factor);
+ − 176
int rightSize = qRound(m_right*width_factor);
+ − 177
int bottomSize = qRound(m_bottom * height_factor);
+ − 178
QRect marginRect(pageRect.x()+leftSize,
+ − 179
pageRect.y()+topSize,
+ − 180
pageRect.width() - (leftSize+rightSize+1),
+ − 181
pageRect.height() - (topSize+bottomSize+1));
+ − 182
+ − 183
QPainter p(this);
+ − 184
QColor shadow(palette().mid().color());
+ − 185
for (int i=1; i<6; ++i) {
+ − 186
shadow.setAlpha(180-i*30);
+ − 187
QRect offset(pageRect.adjusted(i, i, i, i));
+ − 188
p.setPen(shadow);
+ − 189
p.drawLine(offset.left(), offset.bottom(), offset.right(), offset.bottom());
+ − 190
p.drawLine(offset.right(), offset.top(), offset.right(), offset.bottom()-1);
+ − 191
}
+ − 192
p.fillRect(pageRect, palette().light());
+ − 193
+ − 194
if (marginRect.isValid()) {
+ − 195
p.setPen(QPen(palette().color(QPalette::Dark), 0, Qt::DotLine));
+ − 196
p.drawRect(marginRect);
+ − 197
+ − 198
marginRect.adjust(2, 2, -1, -1);
+ − 199
p.setClipRect(marginRect);
+ − 200
QFont font;
+ − 201
font.setPointSizeF(font.pointSizeF()*0.25);
+ − 202
p.setFont(font);
+ − 203
p.setPen(palette().color(QPalette::Dark));
+ − 204
QString text(QLatin1String("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi."));
+ − 205
for (int i=0; i<3; ++i)
+ − 206
text += text;
+ − 207
p.drawText(marginRect, Qt::TextWordWrap|Qt::AlignVCenter, text);
+ − 208
}
+ − 209
}
+ − 210
+ − 211
private:
+ − 212
// all these are in points
+ − 213
qreal m_left, m_top, m_right, m_bottom;
+ − 214
QSizeF m_size;
+ − 215
};
+ − 216
+ − 217
+ − 218
class QPageSetupDialogPrivate : public QAbstractPageSetupDialogPrivate
+ − 219
{
+ − 220
Q_DECLARE_PUBLIC(QPageSetupDialog)
+ − 221
+ − 222
public:
+ − 223
~QPageSetupDialogPrivate();
+ − 224
void init();
+ − 225
+ − 226
QPageSetupWidget *widget;
+ − 227
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 228
QCUPSSupport *cups;
+ − 229
#endif
+ − 230
};
+ − 231
+ − 232
QPageSetupDialogPrivate::~QPageSetupDialogPrivate()
+ − 233
{
+ − 234
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 235
delete cups;
+ − 236
#endif
+ − 237
}
+ − 238
+ − 239
void QPageSetupDialogPrivate::init()
+ − 240
{
+ − 241
Q_Q(QPageSetupDialog);
+ − 242
+ − 243
widget = new QPageSetupWidget(q);
+ − 244
widget->setPrinter(printer);
+ − 245
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 246
if (printer->outputFormat() == QPrinter::NativeFormat && QCUPSSupport::isAvailable()) {
+ − 247
cups = new QCUPSSupport;
+ − 248
widget->selectPrinter(cups);
+ − 249
} else {
+ − 250
cups = 0;
+ − 251
}
+ − 252
#endif
+ − 253
+ − 254
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok
+ − 255
| QDialogButtonBox::Cancel,
+ − 256
Qt::Horizontal, q);
+ − 257
QObject::connect(buttons, SIGNAL(accepted()), q, SLOT(accept()));
+ − 258
QObject::connect(buttons, SIGNAL(rejected()), q, SLOT(reject()));
+ − 259
+ − 260
QVBoxLayout *lay = new QVBoxLayout(q);
+ − 261
lay->addWidget(widget);
+ − 262
lay->addWidget(buttons);
+ − 263
}
+ − 264
+ − 265
QPageSetupWidget::QPageSetupWidget(QWidget *parent)
+ − 266
: QWidget(parent),
+ − 267
m_printer(0),
+ − 268
m_blockSignals(false),
+ − 269
m_cups(0)
+ − 270
{
+ − 271
widget.setupUi(this);
+ − 272
+ − 273
QString suffix = (QLocale::system().measurementSystem() == QLocale::ImperialSystem)
+ − 274
? QString::fromLatin1(" in")
+ − 275
: QString::fromLatin1(" mm");
+ − 276
widget.topMargin->setSuffix(suffix);
+ − 277
widget.bottomMargin->setSuffix(suffix);
+ − 278
widget.leftMargin->setSuffix(suffix);
+ − 279
widget.rightMargin->setSuffix(suffix);
+ − 280
widget.paperWidth->setSuffix(suffix);
+ − 281
widget.paperHeight->setSuffix(suffix);
+ − 282
+ − 283
QVBoxLayout *lay = new QVBoxLayout(widget.preview);
+ − 284
widget.preview->setLayout(lay);
+ − 285
m_pagePreview = new QPagePreview(widget.preview);
+ − 286
lay->addWidget(m_pagePreview);
+ − 287
+ − 288
setAttribute(Qt::WA_WState_Polished, false);
+ − 289
+ − 290
#ifdef PSD_ENABLE_PAPERSOURCE
+ − 291
for (int i=0; paperSourceNames[i]; ++i)
+ − 292
widget.paperSource->insertItem(paperSourceNames[i]);
+ − 293
#else
+ − 294
widget.paperSourceLabel->setVisible(false);
+ − 295
widget.paperSource->setVisible(false);
+ − 296
#endif
+ − 297
+ − 298
widget.reverseLandscape->setVisible(false);
+ − 299
widget.reversePortrait->setVisible(false);
+ − 300
+ − 301
populatePaperSizes(widget.paperSize);
+ − 302
+ − 303
QStringList units;
+ − 304
units << tr("Centimeters (cm)") << tr("Millimeters (mm)") << tr("Inches (in)") << tr("Points (pt)");
+ − 305
widget.unit->addItems(units);
+ − 306
connect(widget.unit, SIGNAL(activated(int)), this, SLOT(unitChanged(int)));
+ − 307
widget.unit->setCurrentIndex((QLocale::system().measurementSystem() == QLocale::ImperialSystem) ? 2 : 1);
+ − 308
+ − 309
connect(widget.paperSize, SIGNAL(currentIndexChanged(int)), this, SLOT(_q_paperSizeChanged()));
+ − 310
connect(widget.paperWidth, SIGNAL(valueChanged(double)), this, SLOT(_q_paperSizeChanged()));
+ − 311
connect(widget.paperHeight, SIGNAL(valueChanged(double)), this, SLOT(_q_paperSizeChanged()));
+ − 312
+ − 313
connect(widget.leftMargin, SIGNAL(valueChanged(double)), this, SLOT(setLeftMargin(double)));
+ − 314
connect(widget.topMargin, SIGNAL(valueChanged(double)), this, SLOT(setTopMargin(double)));
+ − 315
connect(widget.rightMargin, SIGNAL(valueChanged(double)), this, SLOT(setRightMargin(double)));
+ − 316
connect(widget.bottomMargin, SIGNAL(valueChanged(double)), this, SLOT(setBottomMargin(double)));
+ − 317
+ − 318
connect(widget.portrait, SIGNAL(clicked()), this, SLOT(_q_pageOrientationChanged()));
+ − 319
connect(widget.landscape, SIGNAL(clicked()), this, SLOT(_q_pageOrientationChanged()));
+ − 320
}
+ − 321
+ − 322
void QPageSetupWidget::setPrinter(QPrinter *printer)
+ − 323
{
+ − 324
m_printer = printer;
+ − 325
m_blockSignals = true;
+ − 326
selectPdfPsPrinter(printer);
+ − 327
printer->getPageMargins(&m_leftMargin, &m_topMargin, &m_rightMargin, &m_bottomMargin, QPrinter::Point);
+ − 328
unitChanged(widget.unit->currentIndex());
+ − 329
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 330
m_paperSize = printer->paperSize(QPrinter::Point);
+ − 331
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
+ − 332
widget.paperHeight->setValue(m_paperSize.height() / m_currentMultiplier);
+ − 333
+ − 334
widget.landscape->setChecked(printer->orientation() == QPrinter::Landscape);
+ − 335
+ − 336
#ifdef PSD_ENABLE_PAPERSOURCE
+ − 337
widget.paperSource->setCurrentItem(printer->paperSource());
+ − 338
#endif
+ − 339
Q_ASSERT(m_blockSignals);
+ − 340
m_blockSignals = false;
+ − 341
_q_paperSizeChanged();
+ − 342
}
+ − 343
+ − 344
// set gui data on printer
+ − 345
void QPageSetupWidget::setupPrinter() const
+ − 346
{
+ − 347
QPrinter::Orientation orientation = widget.portrait->isChecked()
+ − 348
? QPrinter::Portrait
+ − 349
: QPrinter::Landscape;
+ − 350
m_printer->setOrientation(orientation);
+ − 351
// paper format
+ − 352
QVariant val = widget.paperSize->itemData(widget.paperSize->currentIndex());
+ − 353
int ps = m_printer->pageSize();
+ − 354
if (val.type() == QVariant::Int) {
+ − 355
ps = val.toInt();
+ − 356
}
+ − 357
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 358
else if (m_cups && QCUPSSupport::isAvailable() && m_cups->currentPPD()) {
+ − 359
QByteArray cupsPageSize = val.toByteArray();
+ − 360
QPrintEngine *engine = m_printer->printEngine();
+ − 361
engine->setProperty(PPK_CupsStringPageSize, QString::fromLatin1(cupsPageSize));
+ − 362
engine->setProperty(PPK_CupsOptions, m_cups->options());
+ − 363
+ − 364
QRect pageRect = m_cups->pageRect(cupsPageSize);
+ − 365
engine->setProperty(PPK_CupsPageRect, pageRect);
+ − 366
+ − 367
QRect paperRect = m_cups->paperRect(cupsPageSize);
+ − 368
engine->setProperty(PPK_CupsPaperRect, paperRect);
+ − 369
+ − 370
for(ps = 0; ps < QPrinter::NPaperSize; ++ps) {
+ − 371
QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps));
+ − 372
if (size.width == paperRect.width() && size.height == paperRect.height())
+ − 373
break;
+ − 374
}
+ − 375
}
+ − 376
#endif
+ − 377
if (ps == QPrinter::Custom)
+ − 378
m_printer->setPaperSize(sizeForOrientation(orientation, m_paperSize), QPrinter::Point);
+ − 379
else
+ − 380
m_printer->setPaperSize(static_cast<QPrinter::PaperSize>(ps));
+ − 381
+ − 382
#ifdef PSD_ENABLE_PAPERSOURCE
+ − 383
m_printer->setPaperSource((QPrinter::PaperSource)widget.paperSource->currentIndex());
+ − 384
#endif
+ − 385
m_printer->setPageMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin, QPrinter::Point);
+ − 386
+ − 387
}
+ − 388
+ − 389
void QPageSetupWidget::selectPrinter(QCUPSSupport *cups)
+ − 390
{
+ − 391
m_cups = cups;
+ − 392
widget.paperSize->clear();
+ − 393
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 394
if (m_cups && QCUPSSupport::isAvailable()) {
+ − 395
const ppd_option_t* pageSizes = m_cups->pageSizes();
+ − 396
const int numChoices = pageSizes ? pageSizes->num_choices : 0;
+ − 397
+ − 398
int cupsDefaultSize = 0;
+ − 399
QSize qtPreferredSize = m_printer->paperSize(QPrinter::Point).toSize();
+ − 400
bool preferredSizeMatched = false;
+ − 401
for (int i = 0; i < numChoices; ++i) {
+ − 402
widget.paperSize->addItem(QString::fromLocal8Bit(pageSizes->choices[i].text), QByteArray(pageSizes->choices[i].choice));
+ − 403
if (static_cast<int>(pageSizes->choices[i].marked) == 1)
+ − 404
cupsDefaultSize = i;
+ − 405
if (m_printer->d_func()->hasUserSetPageSize) {
+ − 406
QRect cupsPaperSize = m_cups->paperRect(pageSizes->choices[i].choice);
+ − 407
QSize diff = cupsPaperSize.size() - qtPreferredSize;
+ − 408
if (qAbs(diff.width()) < 5 && qAbs(diff.height()) < 5) {
+ − 409
widget.paperSize->setCurrentIndex(i);
+ − 410
preferredSizeMatched = true;
+ − 411
}
+ − 412
}
+ − 413
}
+ − 414
if (!preferredSizeMatched)
+ − 415
widget.paperSize->setCurrentIndex(cupsDefaultSize);
+ − 416
if (m_printer->d_func()->hasCustomPageMargins) {
+ − 417
m_printer->getPageMargins(&m_leftMargin, &m_topMargin, &m_rightMargin, &m_bottomMargin, QPrinter::Point);
+ − 418
} else {
+ − 419
QByteArray cupsPaperSizeChoice = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray();
+ − 420
QRect paper = m_cups->paperRect(cupsPaperSizeChoice);
+ − 421
QRect content = m_cups->pageRect(cupsPaperSizeChoice);
+ − 422
+ − 423
m_leftMargin = content.x() - paper.x();
+ − 424
m_topMargin = content.y() - paper.y();
+ − 425
m_rightMargin = paper.right() - content.right();
+ − 426
m_bottomMargin = paper.bottom() - content.bottom();
+ − 427
}
+ − 428
}
+ − 429
#endif
+ − 430
if (widget.paperSize->count() == 0) {
+ − 431
populatePaperSizes(widget.paperSize);
+ − 432
widget.paperSize->setCurrentIndex(widget.paperSize->findData(
+ − 433
QLocale::system().measurementSystem() == QLocale::ImperialSystem ? QPrinter::Letter : QPrinter::A4));
+ − 434
}
+ − 435
+ − 436
unitChanged(widget.unit->currentIndex());
+ − 437
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 438
}
+ − 439
+ − 440
void QPageSetupWidget::selectPdfPsPrinter(const QPrinter *p)
+ − 441
{
+ − 442
m_cups = 0;
+ − 443
widget.paperSize->clear();
+ − 444
populatePaperSizes(widget.paperSize);
+ − 445
widget.paperSize->setCurrentIndex(widget.paperSize->findData(p->paperSize()));
+ − 446
+ − 447
m_leftMargin = 90;
+ − 448
m_topMargin = 72;
+ − 449
m_bottomMargin = 72;
+ − 450
m_rightMargin = 90;
+ − 451
unitChanged(widget.unit->currentIndex());
+ − 452
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 453
}
+ − 454
+ − 455
// Updates size/preview after the combobox has been changed.
+ − 456
void QPageSetupWidget::_q_paperSizeChanged()
+ − 457
{
+ − 458
QVariant val = widget.paperSize->itemData(widget.paperSize->currentIndex());
+ − 459
int index = m_printer->pageSize();
+ − 460
if (val.type() == QVariant::Int) {
+ − 461
index = val.toInt();
+ − 462
}
+ − 463
+ − 464
if (m_blockSignals) return;
+ − 465
m_blockSignals = true;
+ − 466
+ − 467
QPrinter::PaperSize size = QPrinter::PaperSize(index);
+ − 468
QPrinter::Orientation orientation = widget.portrait->isChecked()
+ − 469
? QPrinter::Portrait
+ − 470
: QPrinter::Landscape;
+ − 471
+ − 472
bool custom = size == QPrinter::Custom;
+ − 473
+ − 474
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 475
custom = custom ? !m_cups : custom;
+ − 476
#endif
+ − 477
+ − 478
widget.paperWidth->setEnabled(custom);
+ − 479
widget.paperHeight->setEnabled(custom);
+ − 480
widget.widthLabel->setEnabled(custom);
+ − 481
widget.heightLabel->setEnabled(custom);
+ − 482
if (custom) {
+ − 483
m_paperSize.setWidth( widget.paperWidth->value() * m_currentMultiplier);
+ − 484
m_paperSize.setHeight( widget.paperHeight->value() * m_currentMultiplier);
+ − 485
m_pagePreview->setPaperSize(m_paperSize);
+ − 486
} else {
+ − 487
Q_ASSERT(m_printer);
+ − 488
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
+ − 489
if (m_cups) { // combobox is filled with cups based data
+ − 490
QByteArray cupsPageSize = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray();
+ − 491
m_paperSize = m_cups->paperRect(cupsPageSize).size();
+ − 492
if (orientation == QPrinter::Landscape)
+ − 493
m_paperSize = QSizeF(m_paperSize.height(), m_paperSize.width()); // swap
+ − 494
}
+ − 495
else
+ − 496
#endif
+ − 497
m_paperSize = qt_printerPaperSize(orientation, size, QPrinter::Point, 1);
+ − 498
+ − 499
m_pagePreview->setPaperSize(m_paperSize);
+ − 500
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
+ − 501
widget.paperHeight->setValue(m_paperSize.height() / m_currentMultiplier);
+ − 502
}
+ − 503
m_blockSignals = false;
+ − 504
}
+ − 505
+ − 506
void QPageSetupWidget::_q_pageOrientationChanged()
+ − 507
{
+ − 508
if (QPrinter::PaperSize(widget.paperSize->currentIndex()) == QPrinter::Custom) {
+ − 509
double tmp = widget.paperWidth->value();
+ − 510
widget.paperWidth->setValue(widget.paperHeight->value());
+ − 511
widget.paperHeight->setValue(tmp);
+ − 512
}
+ − 513
_q_paperSizeChanged();
+ − 514
}
+ − 515
+ − 516
extern double qt_multiplierForUnit(QPrinter::Unit unit, int resolution);
+ − 517
+ − 518
void QPageSetupWidget::unitChanged(int item)
+ − 519
{
+ − 520
QString suffix;
+ − 521
switch(item) {
+ − 522
case 0:
+ − 523
m_currentMultiplier = 10 * qt_multiplierForUnit(QPrinter::Millimeter, 1);
+ − 524
suffix = QString::fromLatin1(" cm");
+ − 525
break;
+ − 526
case 2:
+ − 527
m_currentMultiplier = qt_multiplierForUnit(QPrinter::Inch, 1);
+ − 528
suffix = QString::fromLatin1(" in");
+ − 529
break;
+ − 530
case 3:
+ − 531
m_currentMultiplier = qt_multiplierForUnit(QPrinter::Point, 1);
+ − 532
suffix = QString::fromLatin1(" pt");
+ − 533
break;
+ − 534
case 1:
+ − 535
default:
+ − 536
m_currentMultiplier = qt_multiplierForUnit(QPrinter::Millimeter, 1);
+ − 537
suffix = QString::fromLatin1(" mm");
+ − 538
break;
+ − 539
}
+ − 540
const bool old = m_blockSignals;
+ − 541
m_blockSignals = true;
+ − 542
widget.topMargin->setSuffix(suffix);
+ − 543
widget.leftMargin->setSuffix(suffix);
+ − 544
widget.rightMargin->setSuffix(suffix);
+ − 545
widget.bottomMargin->setSuffix(suffix);
+ − 546
widget.paperWidth->setSuffix(suffix);
+ − 547
widget.paperHeight->setSuffix(suffix);
+ − 548
widget.topMargin->setValue(m_topMargin / m_currentMultiplier);
+ − 549
widget.leftMargin->setValue(m_leftMargin / m_currentMultiplier);
+ − 550
widget.rightMargin->setValue(m_rightMargin / m_currentMultiplier);
+ − 551
widget.bottomMargin->setValue(m_bottomMargin / m_currentMultiplier);
+ − 552
widget.paperWidth->setValue(m_paperSize.width() / m_currentMultiplier);
+ − 553
widget.paperHeight->setValue(m_paperSize.height() / m_currentMultiplier);
+ − 554
m_blockSignals = old;
+ − 555
}
+ − 556
+ − 557
void QPageSetupWidget::setTopMargin(double newValue)
+ − 558
{
+ − 559
if (m_blockSignals) return;
+ − 560
m_topMargin = newValue * m_currentMultiplier;
+ − 561
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 562
}
+ − 563
+ − 564
void QPageSetupWidget::setBottomMargin(double newValue)
+ − 565
{
+ − 566
if (m_blockSignals) return;
+ − 567
m_bottomMargin = newValue * m_currentMultiplier;
+ − 568
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 569
}
+ − 570
+ − 571
void QPageSetupWidget::setLeftMargin(double newValue)
+ − 572
{
+ − 573
if (m_blockSignals) return;
+ − 574
m_leftMargin = newValue * m_currentMultiplier;
+ − 575
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 576
}
+ − 577
+ − 578
void QPageSetupWidget::setRightMargin(double newValue)
+ − 579
{
+ − 580
if (m_blockSignals) return;
+ − 581
m_rightMargin = newValue * m_currentMultiplier;
+ − 582
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
+ − 583
}
+ − 584
+ − 585
+ − 586
+ − 587
QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
+ − 588
: QAbstractPageSetupDialog(*(new QPageSetupDialogPrivate), printer, parent)
+ − 589
{
+ − 590
Q_D(QPageSetupDialog);
+ − 591
d->init();
+ − 592
}
+ − 593
+ − 594
+ − 595
QPageSetupDialog::QPageSetupDialog(QWidget *parent)
+ − 596
: QAbstractPageSetupDialog(*(new QPageSetupDialogPrivate), 0, parent)
+ − 597
{
+ − 598
Q_D(QPageSetupDialog);
+ − 599
d->init();
+ − 600
}
+ − 601
+ − 602
/*!
+ − 603
\internal
+ − 604
*/
+ − 605
int QPageSetupDialog::exec()
+ − 606
{
+ − 607
Q_D(QPageSetupDialog);
+ − 608
+ − 609
int ret = QDialog::exec();
+ − 610
if (ret == Accepted)
+ − 611
d->widget->setupPrinter();
+ − 612
return ret;
+ − 613
}
+ − 614
+ − 615
+ − 616
QT_END_NAMESPACE
+ − 617
+ − 618
#include "moc_qpagesetupdialog.cpp"
+ − 619
+ − 620
#endif // QT_NO_PRINTDIALOG