kdeprint Library API Documentation

posterpreview.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 "posterpreview.h" 00021 00022 #include <kprocess.h> 00023 #include <qpainter.h> 00024 #include <qsimplerichtext.h> 00025 #include <qtimer.h> 00026 #include <qpixmap.h> 00027 #include <kprinter.h> 00028 #include <klocale.h> 00029 #include <kcursor.h> 00030 #include <kglobalsettings.h> 00031 00032 PosterPreview::PosterPreview( QWidget *parent, const char *name ) 00033 : QFrame( parent, name ) 00034 { 00035 m_postersize = m_mediasize = "A4"; 00036 m_cutmargin = 5; 00037 init(); 00038 } 00039 00040 PosterPreview::PosterPreview( const QString& postersize, const QString& mediasize, QWidget *parent, const char *name ) 00041 : QFrame( parent, name ) 00042 { 00043 m_postersize = postersize; 00044 m_mediasize = mediasize; 00045 m_cutmargin = 5; 00046 init(); 00047 } 00048 00049 PosterPreview::~PosterPreview() 00050 { 00051 delete m_process; 00052 } 00053 00054 void PosterPreview::init() 00055 { 00056 m_process = new KProcess; 00057 connect( m_process, SIGNAL( receivedStderr( KProcess*, char*, int ) ), SLOT( slotProcessStderr( KProcess*, char*, int ) ) ); 00058 connect( m_process, SIGNAL( processExited( KProcess* ) ), SLOT( slotProcessExited( KProcess* ) ) ); 00059 00060 m_cols = m_rows = m_pw = m_ph = m_mw = m_mh = 0; 00061 m_dirty = false; 00062 setDirty(); 00063 setMouseTracking( true ); 00064 setBackgroundMode( Qt::NoBackground ); 00065 } 00066 00067 void PosterPreview::parseBuffer() 00068 { 00069 int rotate; 00070 float pw, ph, mw, mh; 00071 float x1, x2, y1, y2; 00072 sscanf( m_buffer.ascii(), "%d %d %d %g %g %g %g %g %g %g %g", &m_rows, &m_cols, &rotate, 00073 &pw, &ph, &mw, &mh, &x1, &y1, &x2, &y2 ); 00074 m_pw = ( int )( rotate ? ph : pw ); 00075 m_ph = ( int )( rotate ? pw : ph ); 00076 m_mw = ( int )( rotate ? mh : mw ); 00077 m_mh = ( int )( rotate ? mw : mh ); 00078 m_posterbb.setCoords( ( int )x1, ( int )y1, ( int )x2, ( int )y2 ); 00079 } 00080 00081 void PosterPreview::setDirty() 00082 { 00083 if ( !m_dirty ) 00084 { 00085 m_dirty = true; 00086 QTimer::singleShot( 1, this, SLOT( updatePoster() ) ); 00087 } 00088 } 00089 00090 void PosterPreview::updatePoster() 00091 { 00092 m_buffer = ""; 00093 m_process->clearArguments(); 00094 *m_process << "poster" << "-F" << "-m" + m_mediasize << "-p" + m_postersize 00095 << "-c" + QString::number( m_cutmargin ) + "%"; 00096 if ( !m_process->start( KProcess::NotifyOnExit, KProcess::Stderr ) ) 00097 { 00098 m_rows = m_cols = 0; 00099 m_dirty = false; 00100 update(); 00101 } 00102 } 00103 00104 void PosterPreview::drawContents( QPainter *painter ) 00105 { 00106 QPixmap pix( width(), height() ); 00107 QPainter *p = new QPainter( &pix ); 00108 00109 p->fillRect( 0, 0, width(), height(), colorGroup().background() ); 00110 00111 if ( isEnabled() ) 00112 { 00113 if ( m_rows <= 0 || m_cols <= 0 || m_pw <= 0 || m_ph <= 0 ) 00114 { 00115 QString txt = i18n( "Poster preview not available. Either the <b>poster</b> " 00116 "executable is not properly installed, or you don't have " 00117 "the required version; available at http://printing.kde.org/downloads/." ); 00118 QSimpleRichText richtext( ( m_buffer.isEmpty() ? txt : m_buffer.prepend( "<pre>" ).append( "</pre>" ) ), p->font() ); 00119 richtext.adjustSize(); 00120 int x = ( width()-richtext.widthUsed() )/2, y = ( height()-richtext.height() )/2; 00121 x = QMAX( x, 0 ); 00122 y = QMAX( y, 0 ); 00123 richtext.draw( p, x, y, QRect( x, y, richtext.widthUsed(), richtext.height() ), colorGroup() ); 00124 m_boundingrect = QRect(); 00125 } 00126 else 00127 { 00128 int totalx = m_cols*m_pw, totaly = m_rows*m_ph; 00129 float scale = QMIN( float( width()-1 )/totalx, float( height()-1 )/totaly ); 00130 p->translate( 0, height()-1 ); 00131 p->scale( scale, -scale ); 00132 int x = ( int )( width()/scale-totalx )/2, y = ( int )( height()/scale-totaly )/2; 00133 p->translate( x, y ); 00134 m_boundingrect = p->xForm( QRect( 0, 0, totalx, totaly ) ); 00135 00136 x = y = 0; 00137 int px = m_posterbb.x(), py = m_posterbb.y(), pw = m_posterbb.width(), ph = m_posterbb.height(); 00138 for ( int i=0; i<m_rows; i++, y+=m_ph, x=0 ) 00139 { 00140 for ( int j=0; j<m_cols; j++, x+=m_pw ) 00141 { 00142 bool selected = ( m_selectedpages.find( i*m_cols+j+1 ) != m_selectedpages.end() ); 00143 p->fillRect( x+1, y+1, m_pw-2, m_ph-2, ( selected ? KGlobalSettings::highlightColor() : white ) ); 00144 p->drawRect( x, y, m_pw, m_ph ); 00145 if ( pw > 0 && ph > 0 ) 00146 p->fillRect( x+m_mw+px, y+m_mh+py, QMIN( pw, m_pw-2*m_mw-px ), QMIN( ph, m_ph-2*m_mh-py ), 00147 ( selected ? KGlobalSettings::highlightColor().dark( 160 ) : lightGray ) ); 00148 p->setPen( Qt::DotLine ); 00149 p->drawRect( x+m_mw, y+m_mh, m_pw-2*m_mw, m_ph-2*m_mh ); 00150 p->setPen( Qt::SolidLine ); 00151 00152 pw -= m_pw-2*m_mw-px; 00153 px = 0; 00154 } 00155 00156 px = m_posterbb.x(); 00157 ph -= m_ph-2*m_mh-py; 00158 py = 0; 00159 pw = m_posterbb.width(); 00160 } 00161 } 00162 } 00163 00164 delete p; 00165 painter->drawPixmap( 0, 0, pix ); 00166 } 00167 00168 void PosterPreview::mouseMoveEvent( QMouseEvent *e ) 00169 { 00170 if ( m_boundingrect.isValid() ) 00171 { 00172 if ( m_boundingrect.contains( e->pos() ) ) 00173 setCursor( KCursor::handCursor() ); 00174 else 00175 setCursor( KCursor::arrowCursor() ); 00176 } 00177 } 00178 00179 void PosterPreview::mousePressEvent( QMouseEvent *e ) 00180 { 00181 if ( e->button() == Qt::LeftButton && m_boundingrect.isValid() ) 00182 { 00183 if ( m_boundingrect.contains( e->pos() ) ) 00184 { 00185 int c, r; 00186 c = ( e->pos().x()-m_boundingrect.x() )/( m_boundingrect.width()/m_cols ) + 1; 00187 r = m_rows - ( e->pos().y()-m_boundingrect.y() )/( m_boundingrect.height()/m_rows ); 00188 int pagenum = ( r-1 )*m_cols+c; 00189 00190 if ( m_selectedpages.find( pagenum ) == m_selectedpages.end() || 00191 !( e->state() & Qt::ShiftButton ) ) 00192 { 00193 if ( !( e->state() & Qt::ShiftButton ) ) 00194 m_selectedpages.clear(); 00195 m_selectedpages.append( pagenum ); 00196 update(); 00197 emitSelectedPages(); 00198 } 00199 } 00200 else if ( m_selectedpages.count() > 0 ) 00201 { 00202 m_selectedpages.clear(); 00203 update(); 00204 emitSelectedPages(); 00205 } 00206 } 00207 } 00208 00209 void PosterPreview::slotProcessStderr( KProcess*, char *buf, int len ) 00210 { 00211 m_buffer.append( QCString( buf, len ) ); 00212 } 00213 00214 void PosterPreview::slotProcessExited( KProcess* ) 00215 { 00216 if ( m_process->normalExit() && m_process->exitStatus() == 0 ) 00217 parseBuffer(); 00218 else 00219 m_rows = m_cols = 0; 00220 00221 m_dirty = false; 00222 update(); 00223 } 00224 00225 void PosterPreview::setPosterSize( int s ) 00226 { 00227 setPosterSize( pageSizeToPageName( KPrinter::PageSize( s ) ) ); 00228 } 00229 00230 void PosterPreview::setPosterSize( const QString& s ) 00231 { 00232 if ( m_postersize != s ) 00233 { 00234 m_selectedpages.clear(); 00235 m_postersize = s; 00236 setDirty(); 00237 emitSelectedPages(); 00238 } 00239 } 00240 00241 void PosterPreview::setMediaSize( int s ) 00242 { 00243 setMediaSize( pageSizeToPageName( ( KPrinter::PageSize )s ) ); 00244 } 00245 00246 void PosterPreview::setMediaSize( const QString& s ) 00247 { 00248 if ( m_mediasize != s ) 00249 { 00250 m_selectedpages.clear(); 00251 m_mediasize = s; 00252 setDirty(); 00253 emitSelectedPages(); 00254 } 00255 } 00256 00257 void PosterPreview::setCutMargin( int value ) 00258 { 00259 m_cutmargin = value; 00260 setDirty(); 00261 } 00262 00263 void PosterPreview::setSelectedPages( const QString& s ) 00264 { 00265 QStringList l = QStringList::split( ",", s, false ); 00266 m_selectedpages.clear(); 00267 for ( QStringList::ConstIterator it=l.begin(); it!=l.end(); ++it ) 00268 { 00269 int p; 00270 if ( ( p = ( *it ).find( '-' ) ) == -1 ) 00271 m_selectedpages.append( ( *it ).toInt() ); 00272 else 00273 { 00274 int p1 = ( *it ).left( p ).toInt(), p2 = ( *it ).mid( p+1 ).toInt(); 00275 for ( int i=p1; i<=p2; i++ ) 00276 m_selectedpages.append( i ); 00277 } 00278 } 00279 update(); 00280 } 00281 00282 void PosterPreview::emitSelectedPages() 00283 { 00284 QString s; 00285 if ( m_selectedpages.count() > 0 ) 00286 { 00287 for ( QValueList<int>::ConstIterator it=m_selectedpages.begin(); it!=m_selectedpages.end(); ++it ) 00288 s.append( QString::number( *it ) + "," ); 00289 s.truncate( s.length()-1 ); 00290 } 00291 emit selectionChanged( s ); 00292 } 00293 00294 #include "posterpreview.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Sep 29 09:44:31 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003