00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kpgeneralpage.h"
00021 #include "driver.h"
00022 #include "kmprinter.h"
00023 #include "kprinter.h"
00024
00025 #include <qcombobox.h>
00026 #include <qlabel.h>
00027 #include <qbuttongroup.h>
00028 #include <qlayout.h>
00029 #include <qradiobutton.h>
00030
00031 #include <kcursor.h>
00032 #include <klocale.h>
00033 #include <kiconloader.h>
00034 #include <kdialog.h>
00035
00036
00037 #define ORIENT_PORTRAIT_ID 0
00038 #define ORIENT_LANDSCAPE_ID 1
00039 #define ORIENT_REVLANDSCAPE_ID 2
00040 #define ORIENT_REVPORTRAIT_ID 3
00041
00042 #define DUPLEX_NONE_ID 0
00043 #define DUPLEX_LONG_ID 1
00044 #define DUPLEX_SHORT_ID 2
00045
00046 #define NUP_1_ID 0
00047 #define NUP_2_ID 1
00048 #define NUP_4_ID 2
00049
00050 static void initCombo(QComboBox *cb, DrListOption *opt)
00051 {
00052 cb->clear();
00053 QPtrListIterator<DrBase> it(*(opt->choices()));
00054 for (;it.current();++it)
00055 {
00056 cb->insertItem(it.current()->get("text"));
00057 if (it.current() == opt->currentChoice())
00058 cb->setCurrentItem(cb->count()-1);
00059 }
00060 }
00061
00062 static void setComboItem(QComboBox *cb, const QString& txt)
00063 {
00064 for (int i=0;i<cb->count();i++)
00065 if (cb->text(i) == txt)
00066 {
00067 cb->setCurrentItem(i);
00068 return;
00069 }
00070 }
00071
00072 static int findOption(const char *strs[], int n, const QString& txt)
00073 {
00074 for (int i=0;i<n;i+=2)
00075 if (txt == strs[i]) return (i/2);
00076 return (-1);
00077 }
00078
00079
00080
00081
00082 static const char* default_size[] = {
00083 "A4", I18N_NOOP("ISO A4"),
00084 "Letter", I18N_NOOP("US Letter"),
00085 "Legal", I18N_NOOP("US Legal"),
00086 "Ledger", I18N_NOOP("Ledger"),
00087 "Folio", I18N_NOOP("Folio"),
00088 "Comm10", I18N_NOOP("US #10 Envelope"),
00089 "DL", I18N_NOOP("ISO DL Envelope"),
00090 "Tabloid", I18N_NOOP("Tabloid"),
00091 "A3", I18N_NOOP( "ISO A3" ),
00092 "A2", I18N_NOOP( "ISO A2" ),
00093 "A1", I18N_NOOP( "ISO A1" ),
00094 "A0", I18N_NOOP( "ISO A0" )
00095 };
00096 #define SMALLSIZE_BEGIN 0
00097 #define MEDIUMSIZE_BEGIN 14
00098 #define HIGHSIZE_BEGIN 20
00099 #define DEFAULT_SIZE 24
00100
00101 #define DEFAULT_SOURCE 8
00102 static const char* default_source[] = {
00103 "Upper", I18N_NOOP("Upper Tray"),
00104 "Lower", I18N_NOOP("Lower Tray"),
00105 "MultiPurpose", I18N_NOOP("Multi-Purpose Tray"),
00106 "LargeCapacity", I18N_NOOP("Large Capacity Tray")
00107 };
00108 #define DEFAULT_TYPE 4
00109 static const char* default_type[] = {
00110 "Normal", I18N_NOOP("Normal"),
00111 "Transparency", I18N_NOOP("Transparency")
00112 };
00113
00114
00115
00116 KPGeneralPage::KPGeneralPage(KMPrinter *pr, DrMain *dr, QWidget *parent, const char *name)
00117 : KPrintDialogPage(pr,dr,parent,name)
00118 {
00119 setTitle(i18n("General"));
00120
00121
00122 QLabel *m_pagesizelabel = new QLabel(i18n("Page s&ize:"), this);
00123 m_pagesizelabel->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
00124 QLabel *m_papertypelabel = new QLabel(i18n("Paper t&ype:"), this);
00125 m_papertypelabel->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
00126 QLabel *m_inputslotlabel = new QLabel(i18n("Paper so&urce:"), this);
00127 m_inputslotlabel->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
00128 m_pagesize = new QComboBox(this);
00129 m_papertype = new QComboBox(this);
00130 m_inputslot = new QComboBox(this);
00131 m_pagesizelabel->setBuddy(m_pagesize);
00132 m_papertypelabel->setBuddy(m_papertype);
00133 m_inputslotlabel->setBuddy(m_inputslot);
00134 m_orientbox = new QButtonGroup(0, Qt::Vertical, i18n("Orientation"), this);
00135 m_duplexbox = new QButtonGroup(0, Qt::Vertical, i18n("Duplex Printing"), this);
00136 m_nupbox = new QButtonGroup(0, Qt::Vertical, i18n("Pages per Sheet"), this);
00137 m_bannerbox = new QGroupBox(0, Qt::Vertical, i18n("Banners"), this);
00138 QRadioButton *m_portrait = new QRadioButton(i18n("&Portrait"), m_orientbox);
00139 QRadioButton *m_landscape = new QRadioButton(i18n("&Landscape"), m_orientbox);
00140 QRadioButton *m_revland = new QRadioButton(i18n("&Reverse landscape"), m_orientbox);
00141 QRadioButton *m_revport = new QRadioButton(i18n("R&everse portrait"), m_orientbox);
00142 m_portrait->setChecked(true);
00143 m_orientpix = new QLabel(m_orientbox);
00144 m_orientpix->setAlignment(Qt::AlignCenter);
00145 QRadioButton *m_dupnone = new QRadioButton(i18n("duplex orientation", "&None"), m_duplexbox);
00146 QRadioButton *m_duplong = new QRadioButton(i18n("duplex orientation", "Lon&g side"), m_duplexbox);
00147 QRadioButton *m_dupshort = new QRadioButton(i18n("duplex orientation", "S&hort side"), m_duplexbox);
00148 m_dupnone->setChecked(true);
00149 m_duplexpix = new QLabel(m_duplexbox);
00150 m_duplexpix->setAlignment(Qt::AlignCenter);
00151 QRadioButton *m_nup1 = new QRadioButton("&1", m_nupbox);
00152 QRadioButton *m_nup2 = new QRadioButton("&2", m_nupbox);
00153 QRadioButton *m_nup4 = new QRadioButton("&4", m_nupbox);
00154 m_nup1->setChecked(true);
00155 m_nuppix = new QLabel(m_nupbox);
00156 m_nuppix->setAlignment(Qt::AlignCenter);
00157 m_startbanner = new QComboBox(m_bannerbox);
00158 m_endbanner = new QComboBox(m_bannerbox);
00159 QLabel *m_startbannerlabel = new QLabel(i18n("S&tart:"), m_bannerbox);
00160 QLabel *m_endbannerlabel = new QLabel(i18n("En&d:"), m_bannerbox);
00161 m_startbannerlabel->setBuddy(m_startbanner);
00162 m_endbannerlabel->setBuddy(m_endbanner);
00163
00164
00165 QVBoxLayout *lay0 = new QVBoxLayout(this, 0, KDialog::spacingHint());
00166 QGridLayout *lay1 = new QGridLayout(0, 3, 2, 0, KDialog::spacingHint());
00167 QGridLayout *lay2 = new QGridLayout(0, 2, 2, 0, KDialog::spacingHint());
00168 lay0->addStretch(1);
00169 lay0->addLayout(lay1);
00170 lay0->addStretch(1);
00171 lay0->addLayout(lay2);
00172 lay0->addStretch(2);
00173 lay1->addWidget(m_pagesizelabel, 0, 0);
00174 lay1->addWidget(m_papertypelabel, 1, 0);
00175 lay1->addWidget(m_inputslotlabel, 2, 0);
00176 lay1->addWidget(m_pagesize, 0, 1);
00177 lay1->addWidget(m_papertype, 1, 1);
00178 lay1->addWidget(m_inputslot, 2, 1);
00179 lay2->addWidget(m_orientbox, 0, 0);
00180 lay2->addWidget(m_bannerbox, 1, 0);
00181 lay2->addWidget(m_duplexbox, 0, 1);
00182 lay2->addWidget(m_nupbox, 1, 1);
00183 lay2->setColStretch(0, 1);
00184 lay2->setColStretch(1, 1);
00185 QGridLayout *lay3 = new QGridLayout(m_orientbox->layout(), 4, 2,
00186 KDialog::spacingHint());
00187 lay3->addWidget(m_portrait, 0, 0);
00188 lay3->addWidget(m_landscape, 1, 0);
00189 lay3->addWidget(m_revland, 2, 0);
00190 lay3->addWidget(m_revport, 3, 0);
00191 lay3->addMultiCellWidget(m_orientpix, 0, 3, 1, 1);
00192 QGridLayout *lay4 = new QGridLayout(m_duplexbox->layout(), 3, 2,
00193 KDialog::spacingHint());
00194 lay4->addWidget(m_dupnone, 0, 0);
00195 lay4->addWidget(m_duplong, 1, 0);
00196 lay4->addWidget(m_dupshort, 2, 0);
00197 lay4->addMultiCellWidget(m_duplexpix, 0, 2, 1, 1);
00198 lay4->setRowStretch( 0, 1 );
00199 QGridLayout *lay5 = new QGridLayout(m_nupbox->layout(), 3, 2,
00200 KDialog::spacingHint());
00201 lay5->addWidget(m_nup1, 0, 0);
00202 lay5->addWidget(m_nup2, 1, 0);
00203 lay5->addWidget(m_nup4, 2, 0);
00204 lay5->addMultiCellWidget(m_nuppix, 0, 2, 1, 1);
00205 QGridLayout *lay6 = new QGridLayout(m_bannerbox->layout(), 2, 2,
00206 KDialog::spacingHint());
00207 lay6->addWidget(m_startbannerlabel, 0, 0);
00208 lay6->addWidget(m_endbannerlabel, 1, 0);
00209 lay6->addWidget(m_startbanner, 0, 1);
00210 lay6->addWidget(m_endbanner, 1, 1);
00211 lay6->setColStretch(1, 1);
00212
00213
00214 connect(m_orientbox,SIGNAL(clicked(int)),SLOT(slotOrientationChanged(int)));
00215 connect(m_nupbox,SIGNAL(clicked(int)),SLOT(slotNupChanged(int)));
00216 connect(m_duplexbox,SIGNAL(clicked(int)),SLOT(slotDuplexChanged(int)));
00217
00218
00219 initialize();
00220 }
00221
00222 KPGeneralPage::~KPGeneralPage()
00223 {
00224 }
00225
00226 void KPGeneralPage::initialize()
00227 {
00228 if (driver())
00229 {
00230
00231 DrListOption *opt = (DrListOption*)driver()->findOption("PageSize");
00232 if (opt) initCombo(m_pagesize,opt);
00233 else m_pagesize->setEnabled(false);
00234 opt = (DrListOption*)driver()->findOption("MediaType");
00235 if (opt) initCombo(m_papertype,opt);
00236 else m_papertype->setEnabled(false);
00237 opt = (DrListOption*)driver()->findOption("InputSlot");
00238 if (opt) initCombo(m_inputslot,opt);
00239 else m_inputslot->setEnabled(false);
00240
00241 opt = (DrListOption*)driver()->findOption("Duplex");
00242 if (opt)
00243 {
00244 if ( opt->choices()->count() == 2 )
00245 {
00246
00247 QButton *btn = m_duplexbox->find( DUPLEX_SHORT_ID );
00248 m_duplexbox->remove( btn );
00249 btn->hide();
00250
00251 m_duplexbox->find( DUPLEX_NONE_ID )->setText( i18n( "Disabled" ) );
00252 m_duplexbox->find( DUPLEX_LONG_ID )->setText( i18n( "Enabled" ) );
00253 m_duplexpix->hide();
00254 }
00255 if (opt->currentChoice())
00256 {
00257 int ID(DUPLEX_NONE_ID);
00258 if (opt->currentChoice()->name() == "DuplexNoTumble" || opt->currentChoice()->name() == "On") ID = DUPLEX_LONG_ID;
00259 else if (opt->currentChoice()->name() == "DuplexTumble") ID = DUPLEX_SHORT_ID;
00260 m_duplexbox->setButton(ID);
00261 slotDuplexChanged(ID);
00262 }
00263 }
00264 else m_duplexbox->setEnabled(false);
00265 }
00266 else
00267 {
00268
00269 for (int i=SMALLSIZE_BEGIN+1;i<MEDIUMSIZE_BEGIN;i+=2)
00270 m_pagesize->insertItem(i18n(default_size[i]));
00271 if ( printer()->printerCap() & KMPrinter::CapMedium )
00272 for ( int i=MEDIUMSIZE_BEGIN+1; i<HIGHSIZE_BEGIN; i+=2 )
00273 m_pagesize->insertItem(i18n(default_size[i]));
00274 if ( printer()->printerCap() & KMPrinter::CapLarge )
00275 for ( int i=HIGHSIZE_BEGIN+1; i<DEFAULT_SIZE; i+=2 )
00276 m_pagesize->insertItem(i18n(default_size[i]));
00277
00278 QString psname = pageSizeToPageName((KPrinter::PageSize)(KGlobal::locale()->pageSize()));
00279 int index = findOption(default_size, DEFAULT_SIZE, psname);
00280 if (index >= 0)
00281 m_pagesize->setCurrentItem(index);
00282
00283 for (int i=1;i<DEFAULT_TYPE;i+=2)
00284 m_papertype->insertItem(i18n(default_type[i]));
00285
00286 for (int i=1;i<DEFAULT_SOURCE;i+=2)
00287 m_inputslot->insertItem(i18n(default_source[i]));
00288
00289
00290 m_duplexbox->setEnabled( printer()->printerCap() & KMPrinter::CapDuplex );
00291 }
00292
00293
00294 QStringList values = QStringList::split(',',printer()->option("kde-banners-supported"),false);
00295 if (values.count() > 0)
00296 {
00297 for (QStringList::ConstIterator it = values.begin(); it != values.end(); ++it)
00298 {
00299 m_startbanner->insertItem(*it);
00300 m_endbanner->insertItem(*it);
00301 }
00302 values = QStringList::split(',',printer()->option("kde-banners"),false);
00303 while (values.count() < 2) values.append("none");
00304 setComboItem(m_startbanner, values[0]);
00305 setComboItem(m_endbanner, values[1]);
00306 }
00307 else
00308 m_bannerbox->setEnabled(false);
00309
00310 slotOrientationChanged(ORIENT_PORTRAIT_ID);
00311 slotNupChanged(NUP_1_ID);
00312 }
00313
00314 void KPGeneralPage::setOptions(const QMap<QString,QString>& opts)
00315 {
00316 QString value;
00317
00318 if (driver())
00319 {
00320 value = opts["PageSize"];
00321 if (m_pagesize->isEnabled() && !value.isEmpty())
00322 {
00323 DrBase *ch = ((DrListOption*)driver()->findOption("PageSize"))->findChoice(value);
00324 if (ch) setComboItem(m_pagesize, ch->get("text"));
00325 }
00326 value = opts["MediaType"];
00327 if (m_papertype->isEnabled() && !value.isEmpty())
00328 {
00329 DrBase *ch = ((DrListOption*)driver()->findOption("MediaType"))->findChoice(value);
00330 if (ch) setComboItem(m_papertype, ch->get("text"));
00331 }
00332 value = opts["InputSlot"];
00333 if (m_inputslot->isEnabled() && !value.isEmpty())
00334 {
00335 DrBase *ch = ((DrListOption*)driver()->findOption("InputSlot"))->findChoice(value);
00336 if (ch) setComboItem(m_inputslot, ch->get("text"));
00337 }
00338
00339 value = opts["Duplex"];
00340 if (m_duplexbox->isEnabled() && !value.isEmpty())
00341 {
00342 int ID(0);
00343 if (value == "DuplexNoTumble" || value == "On") ID = 1;
00344 else if (value == "DuplexTumble") ID = 2;
00345 m_duplexbox->setButton(ID);
00346 slotDuplexChanged(ID);
00347 }
00348 }
00349 else
00350 {
00351
00352 value = opts["media"];
00353 if (!value.isEmpty())
00354 {
00355 int index(-1);
00356 QStringList l = QStringList::split(',',value,false);
00357 if (l.count() > 0 && (index=findOption(default_size,DEFAULT_SIZE,l[0])) >= 0)
00358 m_pagesize->setCurrentItem(index);
00359 if (l.count() > 1 && (index=findOption(default_type,DEFAULT_TYPE,l[1])) >= 0)
00360 m_papertype->setCurrentItem(index);
00361 if (l.count() > 2 && (index=findOption(default_source,DEFAULT_SOURCE,l[2])) >= 0)
00362 m_inputslot->setCurrentItem(index);
00363 }
00364
00365
00366 value = opts["sides"];
00367 int ID(0);
00368 if (value == "two-sided-long-edge") ID = 1;
00369 else if (value == "two-sided-short-edge") ID = 2;
00370 m_duplexbox->setButton(ID);
00371 slotDuplexChanged(ID);
00372 }
00373
00374
00375 value = opts["job-sheets"];
00376 if (!value.isEmpty())
00377 {
00378 QStringList l = QStringList::split(',',value,false);
00379 if (l.count() > 0) setComboItem(m_startbanner,l[0]);
00380 if (l.count() > 1) setComboItem(m_endbanner,l[1]);
00381 }
00382
00383
00384 value = opts["orientation-requested"];
00385 if (!value.isEmpty())
00386 {
00387 bool ok;
00388 int ID = value.toInt(&ok)-3;
00389 if (ok)
00390 {
00391 m_orientbox->setButton(ID);
00392 slotOrientationChanged(ID);
00393 }
00394 }
00395
00396
00397 value = opts["number-up"];
00398 if (!value.isEmpty())
00399 {
00400 bool ok;
00401 int ID = QMIN(value.toInt(&ok)-1,2);
00402 if (ok)
00403 {
00404 m_nupbox->setButton(ID);
00405 slotNupChanged(ID);
00406 }
00407 }
00408
00409 if ( m_orientbox->isEnabled() )
00410 m_orientbox->setDisabled( opts[ "kde-orientation-fixed" ] == "1" );
00411 if ( m_pagesize->isEnabled() )
00412 m_pagesize->setDisabled( opts[ "kde-pagesize-fixed" ] == "1" );
00413 }
00414
00415 void KPGeneralPage::getOptions(QMap<QString,QString>& opts, bool incldef)
00416 {
00417 QString value;
00418
00419 if (driver())
00420 {
00421 DrListOption *opt;
00422 if ((opt=(DrListOption*)driver()->findOption("PageSize")) != NULL)
00423 {
00424 DrBase *ch = opt->choices()->at(m_pagesize->currentItem());
00425 if (incldef || ch->name() != opt->get("default")) opts["PageSize"] = ch->name();
00426 }
00427 if ((opt=(DrListOption*)driver()->findOption("MediaType")) != NULL)
00428 {
00429 DrBase *ch = opt->choices()->at(m_papertype->currentItem());
00430 if (incldef || ch->name() != opt->get("default")) opts["MediaType"] = ch->name();
00431 }
00432 if ((opt=(DrListOption*)driver()->findOption("InputSlot")) != NULL)
00433 {
00434 DrBase *ch = opt->choices()->at(m_inputslot->currentItem());
00435 if (incldef || ch->name() != opt->get("default")) opts["InputSlot"] = ch->name();
00436 }
00437
00438 if (m_duplexbox->isEnabled() && (opt=(DrListOption*)driver()->findOption("Duplex")) != NULL)
00439 {
00440 bool twoChoices = ( m_duplexbox->count() == 2 );
00441 switch (m_duplexbox->id(m_duplexbox->selected()))
00442 {
00443 case DUPLEX_NONE_ID: value = ( twoChoices ? "Off" : "None" ); break;
00444 case DUPLEX_LONG_ID: value = ( twoChoices ? "On" : "DuplexNoTumble" ); break;
00445 case DUPLEX_SHORT_ID: value = "DuplexTumble"; break;
00446 }
00447 if (incldef || value != opt->get("default")) opts["Duplex"] = value;
00448 }
00449 }
00450 else
00451 {
00452 value = QString("%1,%2,%3").arg(default_size[m_pagesize->currentItem()*2]).arg(default_type[m_papertype->currentItem()*2]).arg(default_source[m_inputslot->currentItem()*2]);
00453 opts["media"] = value;
00454
00455 if (m_duplexbox->isEnabled())
00456 {
00457 switch (m_duplexbox->id(m_duplexbox->selected()))
00458 {
00459 case 0: value = "one-sided"; break;
00460 case 1: value = "two-sided-long-edge"; break;
00461 case 2: value = "two-sided-short-edge"; break;
00462 }
00463 opts["sides"] = value;
00464 }
00465 }
00466
00467 value = QString::number(m_orientbox->id(m_orientbox->selected())+3);
00468 if (value != "3" || incldef) opts["orientation-requested"] = value;
00469
00470 if (m_nupbox->isEnabled())
00471 {
00472 switch (m_nupbox->id(m_nupbox->selected()))
00473 {
00474 case 0: value = "1"; break;
00475 case 1: value = "2"; break;
00476 case 2: value = "4"; break;
00477 }
00478 if (value != "1" || incldef) opts["number-up"] = value;
00479 }
00480
00481 if (m_bannerbox->isEnabled())
00482 {
00483 QStringList l = QStringList::split(',',printer()->option("kde-banners"),false);
00484 if (incldef || (l.count() == 2 && (l[0] != m_startbanner->currentText() || l[1] != m_endbanner->currentText()))
00485 || (l.count() == 0 && (m_startbanner->currentText() != "none" || m_endbanner->currentText() != "none")))
00486 {
00487 value = QString("%1,%2").arg(m_startbanner->currentText()).arg(m_endbanner->currentText());
00488 opts["job-sheets"] = value;
00489 }
00490 }
00491 }
00492
00493 void KPGeneralPage::slotOrientationChanged(int ID)
00494 {
00495 QString iconstr;
00496 switch (ID)
00497 {
00498 case ORIENT_PORTRAIT_ID: iconstr = "kdeprint_portrait"; break;
00499 case ORIENT_LANDSCAPE_ID: iconstr = "kdeprint_landscape"; break;
00500 case ORIENT_REVPORTRAIT_ID: iconstr = "kdeprint_revportrait"; break;
00501 case ORIENT_REVLANDSCAPE_ID: iconstr = "kdeprint_revlandscape"; break;
00502 default: iconstr = "kdeprint_portrait"; break;
00503 }
00504 m_orientpix->setPixmap(UserIcon(iconstr));
00505 }
00506
00507 void KPGeneralPage::slotNupChanged(int ID)
00508 {
00509 QString iconstr;
00510 switch (ID)
00511 {
00512 case NUP_1_ID: iconstr = "kdeprint_nup1"; break;
00513 case NUP_2_ID: iconstr = "kdeprint_nup2"; break;
00514 case NUP_4_ID: iconstr = "kdeprint_nup4"; break;
00515 default: iconstr = "kdeprint_nup1"; break;
00516 }
00517 m_nuppix->setPixmap(UserIcon(iconstr));
00518 }
00519
00520 void KPGeneralPage::slotDuplexChanged(int ID)
00521 {
00522 if (m_duplexbox->isEnabled())
00523 {
00524 QString iconstr;
00525 switch (ID)
00526 {
00527 case DUPLEX_NONE_ID: iconstr = "kdeprint_duplex_none"; break;
00528 case DUPLEX_LONG_ID: iconstr = "kdeprint_duplex_long"; break;
00529 case DUPLEX_SHORT_ID: iconstr = "kdeprint_duplex_short"; break;
00530 default: iconstr = "kdeprint_duplex_none"; break;
00531 }
00532 m_duplexpix->setPixmap(UserIcon(iconstr));
00533 }
00534 }
00535 #include "kpgeneralpage.moc"