marginwidget.cpp

00001 /*
00002  *  This file is part of the KDE libraries
00003  *  Copyright (c) 2001-2002 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 "marginwidget.h"
00021 #include "marginpreview.h"
00022 #include "marginvaluewidget.h"
00023 #include "kprinter.h"
00024 
00025 #include <qcombobox.h>
00026 #include <qcheckbox.h>
00027 #include <qlayout.h>
00028 #include <qlabel.h>
00029 #include <qwhatsthis.h>
00030 #include <klocale.h>
00031 #include <kglobal.h>
00032 
00033 MarginWidget::MarginWidget(QWidget *parent, const char* name, bool allowMetricUnit)
00034 : QWidget(parent, name), m_default(4, 0), m_pagesize( 2 )
00035 {
00036     //WhatsThis strings.... (added by pfeifle@kde.org)
00037     QString whatsThisTopMarginWidget = i18n( " <qt> "
00038             " <p><b>Top Margin</b></p>. "
00039             " <p>This spinbox/text edit field lets you control the top margin of your printout if the printing "
00040             " application does not define its margins internally. </p> "
00041             " <p>The setting works for instance for ASCII text file printing, or for printing from KMail and "
00042             " and Konqueror.. </p>"
00043             " <p><b>Note:</b></p>This margin setting is not intended for KOffice or OpenOffice.org printing, "
00044             " because these applications (or rather their users) are expected to do it by themselves. "
00045             " It also does not work for PostScript or PDF file, which in most cases have their margins hardcoded "
00046             " internally.</p> " 
00047             " <br> "
00048             " <hr> "
00049             " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches "
00050             " with the CUPS commandline job option parameter:</em> "
00051             " <pre>"
00052             "    -o page-top=...      # use values from \"0\" or higher. \"72\" is equal to 1 inch. "
00053             " </pre>"
00054             " </p> "
00055             " </qt>" );
00056 
00057     QString whatsThisBottomMarginWidget = i18n( " <qt> "
00058             " <p><b>Bottom Margin</b></p>. "
00059             " <p>This spinbox/text edit field lets you control the bottom margin of your printout if the printing "
00060             " application does not define its margins internally. </p> "
00061             " <p>The setting works for instance for ASCII text file printing, or for printing from KMail and "
00062             " and Konqueror. </p>"
00063             " <p><b>Note:</b></p>This margin setting is not intended for KOffice or OpenOffice.org printing, "
00064             " because these applications (or rather their users) are expected to do it by themselves. "
00065             " It also does not work for PostScript or PDF file, which in most cases have their margins hardcoded "
00066             " internally.</p> "
00067             " <br> "
00068             " <hr> "
00069             " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches "
00070             " with the CUPS commandline job option parameter:</em> "
00071             " <pre>"
00072             "    -o page-bottom=...      # use values from \"0\" or higher. \"72\" is equal to 1 inch. "
00073             " </pre>"
00074             " </qt>" );
00075 
00076     QString whatsThisLeftMarginWidget = i18n( " <qt> "
00077             " <p><b>Left Margin</b></p>. "
00078             " <p>This spinbox/text edit field lets you control the left margin of your printout if the printing "
00079             " application does not define its margins internally. </p> "
00080             " <p>The setting works for instance for ASCII text file printing, or for printing from KMail and "
00081             " and Konqueror. </p>"
00082             " <p><b>Note:</b></p>This margin setting is not intended for KOffice or OpenOffice.org printing, "
00083             " because these applications (or rather their users) are expected to do it by themselves. "
00084             " It also does not work for PostScript or PDF file, which in most cases have their margins hardcoded "
00085             " internally.</p> "
00086             " <br> "
00087             " <hr> "
00088             " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches "
00089             " with the CUPS commandline job option parameter:</em> "
00090             " <pre>"
00091             "    -o page-left=...      # use values from \"0\" or higher. \"72\" is equal to 1 inch. "
00092             " </pre>"
00093             " </qt>" );
00094 
00095     QString whatsThisRightMarginWidget = i18n( " <qt> "
00096             " <p><b>Right Margin</b></p>. "
00097             " <p>This spinbox/text edit field lets you control the right margin of your printout if the printing "
00098             " application does not define its margins internally. </p> "
00099             " <p>The setting works for instance for ASCII text file printing, or for printing from KMail and "
00100             " and Konqueror. </p>"
00101             " <p><b>Note:</b></p>This margin setting is not intended for KOffice or OpenOffice.org printing, "
00102             " because these applications (or rather their users) are expected to do it by themselves. "
00103             " It also does not work for PostScript or PDF file, which in most cases have their margins hardcoded "
00104             " internally.</p> "
00105             " <br> "
00106             " <hr> "
00107             " <p><em><b>Additional hint for power users:</b> This KDEPrint GUI element matches "
00108             " with the CUPS commandline job option parameter:</em> "
00109             " <pre>"
00110             "    -o page-right=...      # use values from \"0\" or higher. \"72\" is equal to 1 inch. "
00111             " </pre>"
00112             " </qt>" );
00113 
00114     QString whatsThisMeasurementUnitMarginWidget = i18n( " <qt> "
00115             " <p><b>Change Measurement Unit<b></p>. "
00116             " <p>You can change the units of measurement for the page"
00117             " margins here. Select from Millimeter, Centimeter, Inch or Pixels (1 pixel == 1/72 inch). "
00118             " </p> "
00119             " </qt>" );
00120 
00121     QString whatsThisCheckboxMarginWidget = i18n( " <qt> "
00122             " <p><b>Custom Margins Checkbox</b></p>. "
00123             " <p>Enable this checkbox if you want to modify the margins of your printouts "
00124             " <p>You can change margin settings in 4 ways: "
00125             " <ul> "
00126             " <li>Edit the text fields. </li> "
00127             " <li>Click spinbox arrows. </li> "
00128             " <li>Scroll wheel of wheelmouses. </li> "
00129             " <li>Drag margins in preview frame with mouse. </li> "
00130             " </ul> "
00131             " <b>Note:</b> The margin setting does not work if you load such files directly into "
00132             " kprinter, which have their print margins hardcoded internally, like as most "
00133             " PDF or PostScript files. It works for all ASCII text files however. It also may not "
00134             " work with non-KDE applications which fail to "
00135             " fully utilize the KDEPrint framework, such as OpenOffice.org. </p> "
00136             " </qt>" );
00137 
00138     QString whatsThisDragAndPreviewMarginWidget = i18n( " <qt> "
00139             " <p><b>\"Drag-your-Margins\" </p>. "
00140             " <p>Use your mouse to drag and set each margin on this little preview window. </p> "
00141             " </qt>" );
00142 
00143     m_symetric = m_block = false;
00144     m_pagesize[ 0 ] = 595;
00145     m_pagesize[ 1 ] = 842;
00146     m_landscape = false;
00147 
00148     m_custom = new QCheckBox(i18n("&Use custom margins"), this);
00149       QWhatsThis::add(m_custom, whatsThisCheckboxMarginWidget);
00150     m_top = new MarginValueWidget(0, 0.0, this);
00151       QWhatsThis::add(m_top, whatsThisTopMarginWidget);
00152     m_bottom = new MarginValueWidget(m_top, 0.0, this);
00153       QWhatsThis::add(m_bottom, whatsThisBottomMarginWidget);
00154     m_left = new MarginValueWidget(m_bottom, 0.0, this);
00155       QWhatsThis::add(m_left, whatsThisLeftMarginWidget);
00156     m_right = new MarginValueWidget(m_left, 0.0, this);
00157       QWhatsThis::add(m_right, whatsThisRightMarginWidget);
00158     m_top->setLabel(i18n("&Top:"), Qt::AlignLeft|Qt::AlignVCenter);
00159     m_bottom->setLabel(i18n("&Bottom:"), Qt::AlignLeft|Qt::AlignVCenter);
00160     m_left->setLabel(i18n("Le&ft:"), Qt::AlignLeft|Qt::AlignVCenter);
00161     m_right->setLabel(i18n("&Right:"), Qt::AlignLeft|Qt::AlignVCenter);
00162     m_units = new QComboBox(this);
00163       QWhatsThis::add(m_units, whatsThisMeasurementUnitMarginWidget);
00164     m_units->insertItem(i18n("Pixels (1/72nd in)"));
00165     if ( allowMetricUnit )
00166     {
00167         m_units->insertItem(i18n("Inches (in)"));
00168         m_units->insertItem(i18n("Centimeters (cm)"));
00169         m_units->insertItem( i18n( "Millimeters (mm)" ) );
00170     }
00171     m_units->setCurrentItem(0);
00172     connect(m_units, SIGNAL(activated(int)), m_top, SLOT(setMode(int)));
00173     connect(m_units, SIGNAL(activated(int)), m_bottom, SLOT(setMode(int)));
00174     connect(m_units, SIGNAL(activated(int)), m_left, SLOT(setMode(int)));
00175     connect(m_units, SIGNAL(activated(int)), m_right, SLOT(setMode(int)));
00176     m_preview = new MarginPreview(this);
00177       QWhatsThis::add(m_preview, whatsThisDragAndPreviewMarginWidget);
00178     m_preview->setMinimumSize(60, 80);
00179     m_preview->setPageSize(m_pagesize[ 0 ], m_pagesize[ 1 ]);
00180     connect(m_preview, SIGNAL(marginChanged(int,float)), SLOT(slotMarginPreviewChanged(int,float)));
00181     connect(m_top, SIGNAL(marginChanged(float)), SLOT(slotMarginValueChanged()));
00182     connect(m_bottom, SIGNAL(marginChanged(float)), SLOT(slotMarginValueChanged()));
00183     connect(m_left, SIGNAL(marginChanged(float)), SLOT(slotMarginValueChanged()));
00184     connect(m_right, SIGNAL(marginChanged(float)), SLOT(slotMarginValueChanged()));
00185     slotMarginValueChanged();
00186     connect(m_custom, SIGNAL(toggled(bool)), m_top, SLOT(setEnabled(bool)));
00187     connect(m_custom, SIGNAL(toggled(bool)), m_left, SLOT(setEnabled(bool)));
00188     //connect(m_custom, SIGNAL(toggled(bool)), m_units, SLOT(setEnabled(bool)));
00189     connect(m_custom, SIGNAL(toggled(bool)), SLOT(slotCustomMarginsToggled(bool)));
00190     connect(m_custom, SIGNAL(toggled(bool)), m_preview, SLOT(enableRubberBand(bool)));
00191     m_top->setEnabled(false);
00192     m_bottom->setEnabled(false);
00193     m_left->setEnabled(false);
00194     m_right->setEnabled(false);
00195     //m_units->setEnabled(false);
00196 
00197     QGridLayout *l3 = new QGridLayout(this, 7, 2, 0, 10);
00198     l3->addWidget(m_custom, 0, 0);
00199     l3->addWidget(m_top, 1, 0);
00200     l3->addWidget(m_bottom, 2, 0);
00201     l3->addWidget(m_left, 3, 0);
00202     l3->addWidget(m_right, 4, 0);
00203     l3->addRowSpacing(5, 10);
00204     l3->addWidget(m_units, 6, 0);
00205     l3->addMultiCellWidget(m_preview, 0, 6, 1, 1);
00206 
00207     if ( allowMetricUnit )
00208     {
00209         int mode = (KGlobal::locale()->measureSystem() == KLocale::Metric ? 2 : 1);
00210         m_top->setMode(mode);
00211         m_bottom->setMode(mode);
00212         m_left->setMode(mode);
00213         m_right->setMode(mode);
00214         m_units->setCurrentItem(mode);
00215     }
00216 }
00217 
00218 MarginWidget::~MarginWidget()
00219 {
00220 }
00221 
00222 void MarginWidget::slotCustomMarginsToggled(bool b)
00223 {
00224     m_bottom->setEnabled(b && !m_symetric);
00225     m_right->setEnabled(b && !m_symetric);
00226     if (!b)
00227         resetDefault();
00228 }
00229 
00230 void MarginWidget::setSymetricMargins(bool on)
00231 {
00232     if (on == m_symetric)
00233         return;
00234 
00235     m_symetric = on;
00236     m_bottom->setEnabled(on && m_custom->isChecked());
00237     m_right->setEnabled(on && m_custom->isChecked());
00238     if (on)
00239     {
00240         connect(m_top, SIGNAL(marginChanged(float)), m_bottom, SLOT(setMargin(float)));
00241         connect(m_left, SIGNAL(marginChanged(float)), m_right, SLOT(setMargin(float)));
00242         m_bottom->setMargin(m_top->margin());
00243         m_right->setMargin(m_left->margin());
00244     }
00245     else
00246     {
00247         disconnect(m_top, 0, m_bottom, 0);
00248         disconnect(m_left, 0, m_right, 0);
00249     }
00250     m_preview->setSymetric(on);
00251 }
00252 
00253 void MarginWidget::slotMarginValueChanged()
00254 {
00255     if (m_block)
00256         return;
00257     m_preview->setMargins(m_top->margin(), m_bottom->margin(), m_left->margin(), m_right->margin());
00258 }
00259 
00260 void MarginWidget::slotMarginPreviewChanged(int type, float value)
00261 {
00262     m_block = true;
00263     switch (type)
00264     {
00265         case MarginPreview::TMoving:
00266             m_top->setMargin(value);
00267             break;
00268         case MarginPreview::BMoving:
00269             m_bottom->setMargin(value);
00270             break;
00271         case MarginPreview::LMoving:
00272             m_left->setMargin(value);
00273             break;
00274         case MarginPreview::RMoving:
00275             m_right->setMargin(value);
00276             break;
00277     }
00278     m_block = false;
00279 }
00280 
00281 void MarginWidget::setPageSize(float w, float h)
00282 {
00283     // takes care of the orientation and the resolution
00284     int dpi = m_top->resolution();
00285     m_pagesize[ 0 ] = w;
00286     m_pagesize[ 1 ] = h;
00287     if (m_landscape)
00288         m_preview->setPageSize((m_pagesize[ 1 ]*dpi)/72, (m_pagesize[ 0 ]*dpi)/72);
00289     else
00290         m_preview->setPageSize((m_pagesize[ 0 ]*dpi)/72, (m_pagesize[ 1 ]*dpi)/72);
00291 }
00292 
00293 float MarginWidget::top() const
00294 {
00295     return m_top->margin();
00296 }
00297 
00298 float MarginWidget::bottom() const
00299 {
00300     return m_bottom->margin();
00301 }
00302 
00303 float MarginWidget::left() const
00304 {
00305     return m_left->margin();
00306 }
00307 
00308 float MarginWidget::right() const
00309 {
00310     return m_right->margin();
00311 }
00312 
00313 void MarginWidget::setTop(float value)
00314 {
00315     m_top->setMargin(value);
00316 }
00317 
00318 void MarginWidget::setBottom(float value)
00319 {
00320     m_bottom->setMargin(value);
00321 }
00322 
00323 void MarginWidget::setLeft(float value)
00324 {
00325     m_left->setMargin(value);
00326 }
00327 
00328 void MarginWidget::setRight(float value)
00329 {
00330     m_right->setMargin(value);
00331 }
00332 
00333 void MarginWidget::setResolution(int dpi)
00334 {
00335     m_top->setResolution(dpi);
00336     m_bottom->setResolution(dpi);
00337     m_left->setResolution(dpi);
00338     m_right->setResolution(dpi);
00339 }
00340 
00341 void MarginWidget::setDefaultMargins(float t, float b, float l, float r)
00342 {
00343     int dpi = m_top->resolution();
00344     m_default[0] = (t*dpi)/72;
00345     m_default[1] = (b*dpi)/72;
00346     m_default[2] = (l*dpi)/72;
00347     m_default[3] = (r*dpi)/72;
00348     if (!m_custom->isChecked())
00349         resetDefault();
00350 }
00351 
00352 void MarginWidget::resetDefault()
00353 {
00354     m_top->setMargin(m_landscape ? m_default[2] : m_default[0]);
00355     m_bottom->setMargin(m_landscape ? m_default[3] : m_default[1]);
00356     m_left->setMargin(m_landscape ? m_default[1] : m_default[2]);
00357     m_right->setMargin(m_landscape ? m_default[0] : m_default[3]);
00358 }
00359 
00360 void MarginWidget::setCustomEnabled(bool on)
00361 {
00362     m_custom->setChecked(on);
00363 }
00364 
00365 bool MarginWidget::isCustomEnabled() const
00366 {
00367     return m_custom->isChecked();
00368 }
00369 
00370 void MarginWidget::setOrientation(int orient)
00371 {
00372     m_landscape = (orient == KPrinter::Landscape);
00373     setPageSize(m_pagesize[ 0 ], m_pagesize[ 1 ]);
00374 }
00375 
00376 #include "marginwidget.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys