kptextpage.cpp
00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License version 2 as published by the Free Software Foundation. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Library General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Library General Public License 00015 * along with this library; see the file COPYING.LIB. If not, write to 00016 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 * Boston, MA 02110-1301, USA. 00018 **/ 00019 00020 #include "kptextpage.h" 00021 #include "marginwidget.h" 00022 #include "driver.h" 00023 #include "kprinter.h" 00024 00025 #include <qbuttongroup.h> 00026 #include <qgroupbox.h> 00027 #include <qlayout.h> 00028 #include <qlabel.h> 00029 #include <qradiobutton.h> 00030 #include <qwhatsthis.h> 00031 #include <knuminput.h> 00032 #include <klocale.h> 00033 #include <kiconloader.h> 00034 #include <kseparator.h> 00035 #include <kdebug.h> 00036 00037 KPTextPage::KPTextPage(DrMain *driver, QWidget *parent, const char *name) 00038 : KPrintDialogPage(0, driver, parent, name) 00039 { 00040 //WhatsThis strings.... (added by pfeifle@kde.org) 00041 QString whatsThisCPITextPage = i18n( " <qt> " 00042 " <p><b>Characters Per Inch</b></p> " 00043 " <p>This setting controls the horizontal size of characters when printing a text file. </p>" 00044 " <p>The default value is 10, meaning that the font is scaled in a way that 10 characters " 00045 " per inch will be printed. </p> " 00046 " <hr> " 00047 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00048 " with the CUPS commandline job option parameter:</em> " 00049 " <pre>" 00050 " -o cpi=... # example: \"8\" or \"12\" " 00051 " </pre>" 00052 " </p> " 00053 " </qt>" ); 00054 00055 QString whatsThisLPITextPage = i18n( " <qt> " 00056 " <p><b>Lines Per Inch</b></p> " 00057 " <p>This setting controls the vertical size of characters when printing a text file. </p>" 00058 " <p>The default value is 6, meaning that the font is scaled in a way that 6 lines " 00059 " per inch will be printed. </p> " 00060 " <hr> " 00061 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00062 " with the CUPS commandline job option parameter:</em> " 00063 " <pre>" 00064 " -o lpi=... # example \"5\" or \"7\" " 00065 " </pre>" 00066 " </p> " 00067 " </qt>" ); 00068 00069 QString whatsThisColumnsTextPage = i18n( " <qt> " 00070 " <p><b>Columns</b></p> " 00071 " <p>This setting controls how many columns of text will be printed on each page when." 00072 " printing text files. </p> " 00073 " <p>The default value is 1, meaning that only one column of text per page " 00074 " will be printed. </p> " 00075 " <hr> " 00076 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00077 " with the CUPS commandline job option parameter:</em> " 00078 " <pre>" 00079 " -o columns=... # example: \"2\" or \"4\" " 00080 " </pre>" 00081 " </p> " 00082 " </qt>" ); 00083 00084 QString whatsThisPrettyprintPreviewIconTextPage = i18n( " <qt> " 00085 " Preview icon changes when you turn on or off prettyprint. " 00086 " </qt>" ); 00087 QString whatsThisFormatTextPage = i18n( " <qt> " 00088 " <p><b>Text Formats</b></p> " 00089 " <p>These settings control the appearance of text on printouts. They are only valid for " 00090 " printing text files or input directly through kprinter. </p> " 00091 " <p><b>Note:</b> These settings have no effect whatsoever for other input formats than " 00092 " text, or for printing from applications such as the KDE Advanced Text Editor. (Applications " 00093 " in general send PostScript to the print system, and 'kate' in particular has its own " 00094 " knobs to control the print output. </p>." 00095 " <hr> " 00096 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00097 " with the CUPS commandline job option parameter:</em> " 00098 " <pre>" 00099 " -o cpi=... # example: \"8\" or \"12\" " 00100 " <br> " 00101 " -o lpi=... # example: \"5\" or \"7\" " 00102 " <br> " 00103 " -o columns=... # example: \"2\" or \"4\" " 00104 " </pre>" 00105 " </p> " 00106 " </qt>" ); 00107 00108 QString whatsThisMarginsTextPage = i18n( " <qt> " 00109 " <p><b>Margins</b></p> " 00110 " <p>These settings control the margins of printouts on the paper. They are not valid for " 00111 " jobs originating from applications which define their own page layout internally and " 00112 " send PostScript to KDEPrint (such as KOffice or OpenOffice.org). </p> " 00113 " <p>When printing from KDE applications, such as KMail and Konqueror, or printing an ASCII text " 00114 " file through kprinter, you can choose your preferred margin settings here. </p> " 00115 " <p>Margins may be set individually for each edge of the paper. The combo box at the bottom lets you change " 00116 " the units of measurement between Pixels, Millimeters, Centimeters, and Inches. </p> " 00117 " <p>You can even use the mouse to grab one margin and drag it to the intended position (see the " 00118 " preview picture on the right side). </p> " 00119 " <hr> " 00120 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00121 " with the CUPS commandline job option parameter:</em> " 00122 " <pre>" 00123 " -o page-top=... # example: \"72\" " 00124 " <br> " 00125 " -o page-bottom=... # example: \"24\" " 00126 " <br> " 00127 " -o page-left=... # example: \"36\" " 00128 " <br> " 00129 " -o page-right=... # example: \"12\" " 00130 " </pre>" 00131 " </p> " 00132 " </qt>" ); 00133 00134 QString whatsThisPrettyprintButtonOnTextPage = i18n( " <qt> " 00135 " <p><b>Turn Text Printing with Syntax Highlighting (Prettyprint) On!</b></p> " 00136 " <p>ASCII text file printouts can be 'prettyfied' by enabling this option. If you do so, " 00137 " a header is printed at the top of each page. The header contains " 00138 " the page number, job title (usually the filename), and the date. In addition, C and " 00139 " C++ keywords are highlighted, and comment lines are italicized.</p>" 00140 " <p>This prettyprint option is handled by CUPS.</p> " 00141 " <p>If you prefer another 'plaintext-to-prettyprint' converter, look for the <em>enscript</em> " 00142 " pre-filter on the <em>Filters</em> tab. </p>" 00143 " <br> " 00144 " <hr> " 00145 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00146 " with the CUPS commandline job option parameter:</em> " 00147 " <pre>" 00148 " -o prettyprint=true. " 00149 " </pre>" 00150 " </p> " 00151 " </qt>" ); 00152 00153 QString whatsThisPrettyprintButtonOffTextPage = i18n( " <qt> " 00154 " <p><b>Turn Text Printing with Syntax Highlighting (Prettyprint) Off! </b></p> " 00155 " <p>ASCII text file printing with this option turned off are appearing without a page " 00156 " header and without syntax highlighting. (You can still set the page margins, though.) </p> " 00157 " <br> " 00158 " <hr> " 00159 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00160 " with the CUPS commandline job option parameter:</em> " 00161 " <pre>" 00162 " -o prettyprint=false " 00163 " </pre>" 00164 " </p> " 00165 " </qt>" ); 00166 00167 QString whatsThisPrettyprintFrameTextPage = i18n( " <qt> " 00168 " <p><b>Print Text with Syntax Highlighting (Prettyprint)</b></p> " 00169 " <p>ASCII file printouts can be 'prettyfied' by enabling this option. If you do so, " 00170 " a header is printed at the top of each page. The header contains " 00171 " the page number, job title (usually the filename), and the date. In addition, C and " 00172 " C++ keywords are highlighted, and comment lines are italicized.</p>" 00173 " <p>This prettyprint option is handled by CUPS.</p> " 00174 " <p>If you prefer another 'plaintext-to-prettyprint' converter, look for the <em>enscript</em> " 00175 " pre-filter on the <em>Filters</em> tab. </p> " 00176 " <br> " 00177 " <hr> " 00178 " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches " 00179 " with the CUPS commandline job option parameter:</em> " 00180 " <pre>" 00181 " -o prettyprint=true. " 00182 " <br> " 00183 " -o prettyprint=false " 00184 " </pre>" 00185 " </p> " 00186 " </qt>" ); 00187 00188 setTitle(i18n("Text")); 00189 m_block = false; 00190 00191 QGroupBox *formatbox = new QGroupBox(0, Qt::Vertical, i18n("Text Format"), this); 00192 QWhatsThis::add(formatbox, whatsThisFormatTextPage); 00193 QGroupBox *prettybox = new QGroupBox(0, Qt::Vertical, i18n("Syntax Highlighting"), this); 00194 QWhatsThis::add(prettybox, whatsThisPrettyprintFrameTextPage); 00195 QGroupBox *marginbox = new QGroupBox(0, Qt::Vertical, i18n("Margins"), this); 00196 QWhatsThis::add(marginbox, whatsThisMarginsTextPage); 00197 00198 m_cpi = new KIntNumInput(10, formatbox); 00199 QWhatsThis::add(m_cpi, whatsThisCPITextPage); 00200 m_cpi->setLabel(i18n("&Chars per inch:"), Qt::AlignLeft|Qt::AlignVCenter); 00201 m_cpi->setRange(1, 999, 1, false); 00202 m_lpi = new KIntNumInput(m_cpi, 6, formatbox); 00203 QWhatsThis::add(m_lpi, whatsThisLPITextPage); 00204 m_lpi->setLabel(i18n("&Lines per inch:"), Qt::AlignLeft|Qt::AlignVCenter); 00205 m_lpi->setRange(1, 999, 1, false); 00206 m_columns = new KIntNumInput(m_lpi, 1, formatbox); 00207 QWhatsThis::add(m_columns, whatsThisColumnsTextPage); 00208 m_columns->setLabel(i18n("C&olumns:"), Qt::AlignLeft|Qt::AlignVCenter); 00209 m_columns->setRange(1, 10, 1, false); 00210 KSeparator *sep = new KSeparator(Qt::Horizontal, formatbox); 00211 connect(m_columns, SIGNAL(valueChanged(int)), SLOT(slotColumnsChanged(int))); 00212 00213 m_prettypix = new QLabel(prettybox); 00214 QWhatsThis::add(m_prettypix, whatsThisPrettyprintPreviewIconTextPage); 00215 m_prettypix->setAlignment(Qt::AlignCenter); 00216 QRadioButton *off = new QRadioButton(i18n("&Disabled"), prettybox); 00217 QWhatsThis::add(off, whatsThisPrettyprintButtonOffTextPage); 00218 QRadioButton *on = new QRadioButton(i18n("&Enabled"), prettybox); 00219 QWhatsThis::add(on, whatsThisPrettyprintButtonOnTextPage); 00220 m_prettyprint = new QButtonGroup(prettybox); 00221 m_prettyprint->hide(); 00222 m_prettyprint->insert(off, 0); 00223 m_prettyprint->insert(on, 1); 00224 m_prettyprint->setButton(0); 00225 connect(m_prettyprint, SIGNAL(clicked(int)), SLOT(slotPrettyChanged(int))); 00226 slotPrettyChanged(0); 00227 00228 m_margin = new MarginWidget(marginbox); 00229 QWhatsThis::add(m_margin, whatsThisMarginsTextPage); 00230 m_margin->setPageSize(595, 842); 00231 00232 QGridLayout *l0 = new QGridLayout(this, 2, 2, 0, 10); 00233 l0->addWidget(formatbox, 0, 0); 00234 l0->addWidget(prettybox, 0, 1); 00235 l0->addMultiCellWidget(marginbox, 1, 1, 0, 1); 00236 QVBoxLayout *l1 = new QVBoxLayout(formatbox->layout(), 5); 00237 l1->addWidget(m_cpi); 00238 l1->addWidget(m_lpi); 00239 l1->addWidget(sep); 00240 l1->addWidget(m_columns); 00241 QGridLayout *l2 = new QGridLayout(prettybox->layout(), 2, 2, 10); 00242 l2->addWidget(off, 0, 0); 00243 l2->addWidget(on, 1, 0); 00244 l2->addMultiCellWidget(m_prettypix, 0, 1, 1, 1); 00245 QVBoxLayout *l3 = new QVBoxLayout(marginbox->layout(), 10); 00246 l3->addWidget(m_margin); 00247 } 00248 00249 KPTextPage::~KPTextPage() 00250 { 00251 } 00252 00253 void KPTextPage::setOptions(const QMap<QString,QString>& opts) 00254 { 00255 QString value; 00256 00257 if (!(value=opts["cpi"]).isEmpty()) 00258 m_cpi->setValue(value.toInt()); 00259 if (!(value=opts["lpi"]).isEmpty()) 00260 m_lpi->setValue(value.toInt()); 00261 if (!(value=opts["columns"]).isEmpty()) 00262 m_columns->setValue(value.toInt()); 00263 int ID(0); 00264 if (opts.contains("prettyprint") && (opts["prettyprint"].isEmpty() || opts["prettyprint"] == "true")) 00265 ID = 1; 00266 m_prettyprint->setButton(ID); 00267 slotPrettyChanged(ID); 00268 00269 // get default margins 00270 m_currentps = opts["PageSize"]; 00271 QString orient = opts["orientation-requested"]; 00272 bool landscape = (orient == "4" || orient == "5"); 00273 initPageSize(landscape); 00274 00275 bool marginset(false); 00276 if (!(value=opts["page-top"]).isEmpty() && value.toFloat() != m_margin->top()) 00277 { 00278 marginset = true; 00279 m_margin->setTop(value.toFloat()); 00280 } 00281 if (!(value=opts["page-bottom"]).isEmpty() && value.toFloat() != m_margin->bottom()) 00282 { 00283 marginset = true; 00284 m_margin->setBottom(value.toFloat()); 00285 } 00286 if (!(value=opts["page-left"]).isEmpty() && value.toFloat() != m_margin->left()) 00287 { 00288 marginset = true; 00289 m_margin->setLeft(value.toFloat()); 00290 } 00291 if (!(value=opts["page-right"]).isEmpty() && value.toFloat() != m_margin->right()) 00292 { 00293 marginset = true; 00294 m_margin->setRight(value.toFloat()); 00295 } 00296 m_margin->setCustomEnabled(marginset); 00297 } 00298 00299 void KPTextPage::getOptions(QMap<QString,QString>& opts, bool incldef) 00300 { 00301 if (incldef || m_cpi->value() != 10) 00302 opts["cpi"] = QString::number(m_cpi->value()); 00303 if (incldef || m_lpi->value() != 6) 00304 opts["lpi"] = QString::number(m_lpi->value()); 00305 if (incldef || m_columns->value() != 1) 00306 opts["columns"] = QString::number(m_columns->value()); 00307 00308 //if (m_margin->isCustomEnabled() || incldef) 00309 if (m_margin->isCustomEnabled()) 00310 { 00311 opts["page-top"] = QString::number(( int )( m_margin->top()+0.5 )); 00312 opts["page-bottom"] = QString::number(( int )( m_margin->bottom()+0.5 )); 00313 opts["page-left"] = QString::number(( int )( m_margin->left()+0.5 )); 00314 opts["page-right"] = QString::number(( int )( m_margin->right()+0.5 )); 00315 } 00316 else 00317 { 00318 opts.remove("page-top"); 00319 opts.remove("page-bottom"); 00320 opts.remove("page-left"); 00321 opts.remove("page-right"); 00322 } 00323 00324 if (m_prettyprint->id(m_prettyprint->selected()) == 1) 00325 opts["prettyprint"] = "true"; 00326 else if (incldef) 00327 opts["prettyprint"] = "false"; 00328 else 00329 opts.remove("prettyprint"); 00330 } 00331 00332 void KPTextPage::slotPrettyChanged(int ID) 00333 { 00334 QString iconstr = (ID == 0 ? "kdeprint_nup1" : "kdeprint_prettyprint"); 00335 m_prettypix->setPixmap(UserIcon(iconstr)); 00336 } 00337 00338 void KPTextPage::slotColumnsChanged(int) 00339 { 00340 // TO BE IMPLEMENTED 00341 } 00342 00343 void KPTextPage::initPageSize(bool landscape) 00344 { 00345 float w( -1 ), h( -1 ); 00346 float mt( 36 ), mb( mt ), ml( 18 ), mr( ml ); 00347 if (driver()) 00348 { 00349 if (m_currentps.isEmpty()) 00350 { 00351 DrListOption *o = (DrListOption*)driver()->findOption("PageSize"); 00352 if (o) 00353 m_currentps = o->get("default"); 00354 } 00355 if (!m_currentps.isEmpty()) 00356 { 00357 DrPageSize *ps = driver()->findPageSize(m_currentps); 00358 if (ps) 00359 { 00360 w = ps->pageWidth(); 00361 h = ps->pageHeight(); 00362 mt = ps->topMargin(); 00363 ml = ps->leftMargin(); 00364 mr = ps->rightMargin(); 00365 mb = ps->bottomMargin(); 00366 } 00367 } 00368 } 00369 m_margin->setPageSize(w, h); 00370 m_margin->setOrientation(landscape ? KPrinter::Landscape : KPrinter::Portrait); 00371 m_margin->setDefaultMargins( mt, mb, ml, mr ); 00372 m_margin->setCustomEnabled(false); 00373 } 00374 00375 #include "kptextpage.moc"