# kdeprint Library API Documentation

Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# 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., 59 Temple Place - Suite 330,
    00017  *  Boston, MA 02111-1307, 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"

This file is part of the documentation for kdeprint Library Version 3.4.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 11 20:31:05 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003