kword

KWTableTemplateSelector.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2002 Nash Hoogwater <nrhoogwater@wanadoo.nl>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; using
00007    version 2 of the License.
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 "KWTableTemplateSelector.h"
00021 #include "KWTableTemplateSelector.moc"
00022 
00023 #include "KWTableTemplate.h"
00024 #include "KWTableFrameSet.h"
00025 #include "KWDocument.h"
00026 #include "KWTextDocument.h"
00027 
00028 #include <KoRect.h>
00029 
00030 #include <klocale.h>
00031 #include <kurl.h>
00032 #include <kio/netaccess.h>
00033 #include <kstandarddirs.h>
00034 #include <kdebug.h>
00035 
00036 #include <qlabel.h>
00037 #include <qbuttongroup.h>
00038 #include <qcheckbox.h>
00039 #include <qcombobox.h>
00040 #include <qfile.h>
00041 #include <qdom.h>
00042 #include <qrect.h>
00043 #include <qptrlist.h>
00044 #include <qlayout.h>
00045 
00046 #include <stdlib.h>
00047 #include <math.h>
00048 
00049 /******************************************************************/
00050 /* Class: KWTableTemplatePreview                                  */
00051 /******************************************************************/
00052 
00053 KWTableTemplatePreview::KWTableTemplatePreview( const QString& title, KWTableStyle *_emptyStyle, QWidget* parent, const char* name )
00054     : QGroupBox( title, parent, name )
00055 {
00056     m_emptyStyle = _emptyStyle;
00057     m_zoomHandler = new KoTextZoomHandler;
00058     m_textdoc = new KWTextDocument( m_zoomHandler );
00059     tableTemplate = 0L;
00060     origTableTemplate = 0L;
00061     m_disableRepaint = false;
00062     fillContents();
00063 }
00064 
00065 KWTableTemplatePreview::~KWTableTemplatePreview()
00066 {
00067 
00068     delete m_textdoc;
00069     delete m_zoomHandler;
00070 
00071 //    if (tableTemplate)
00072 //        delete tableTemplate;
00073 
00074 }
00075 
00076 int KWTableTemplatePreview::bottomBorder(const int rows, const int cols, const int rowpos, const int colpos)
00077 {
00078     if ( (rowpos<0) || (colpos<0) ) return 0;
00079 
00080     if ( (rowpos==0) && (colpos==0) ) // TOP LEFT CORNER
00081         return int( tableTemplate->pTopLeftCorner()->frameStyle()->bottomBorder().width() );
00082     else
00083     if ( (rowpos==0) && ( colpos==(cols-1) ) ) // TOP RIGHT CORNER
00084         return int( tableTemplate->pTopRightCorner()->frameStyle()->bottomBorder().width() );
00085     else
00086     if ( ( rowpos==(rows-1) ) && (colpos==0) ) // BOTTOM LEFT CORNER
00087         return int( tableTemplate->pBottomLeftCorner()->frameStyle()->bottomBorder().width() );
00088     else
00089     if ( ( rowpos==(rows-1) ) && ( colpos==(cols-1) ) ) // BOTTOM RIGHT CORNER
00090         return int( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() );
00091     else
00092     if ( ( rowpos==0 ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // FIRST ROW
00093         return int( tableTemplate->pFirstRow()->frameStyle()->bottomBorder().width() );
00094     else
00095     if ( ( colpos==0 ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // FIRST COL
00096         return int( tableTemplate->pFirstCol()->frameStyle()->bottomBorder().width() );
00097     else
00098     if ( ( rowpos==(rows-1) ) && ( colpos>0 ) && ( colpos<(cols-1) ) )  // LAST ROW
00099         return int( tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() );
00100     else
00101     if ( ( colpos==(cols-1) ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // LAST COL
00102         return int( tableTemplate->pLastCol()->frameStyle()->bottomBorder().width() );
00103     else
00104     if ( (rowpos>0) && (colpos>0) && (rowpos<(rows-1)) && (colpos<(cols-1)) ) // BODY
00105         return int( tableTemplate->pBodyCell()->frameStyle()->bottomBorder().width() );
00106 
00107     return 0;
00108 }
00109 
00110 int KWTableTemplatePreview::rightBorder(const int rows, const int cols, const int rowpos, const int colpos)
00111 {
00112     if ( (rowpos<0) || (colpos<0) ) return 0;
00113 
00114     if ( (rowpos==0) && (colpos==0) ) // TOP LEFT CORNER
00115         return int( tableTemplate->pTopLeftCorner()->frameStyle()->rightBorder().width() );
00116     else
00117     if ( (rowpos==0) && ( colpos==(cols-1) ) ) // TOP RIGHT CORNER
00118         return int( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() );
00119     else
00120     if ( ( rowpos==(rows-1) ) && (colpos==0) ) // BOTTOM LEFT CORNER
00121         return int( tableTemplate->pBottomLeftCorner()->frameStyle()->rightBorder().width() );
00122     else
00123     if ( ( rowpos==(rows-1) ) && ( colpos==(cols-1) ) ) // BOTTOM RIGHT CORNER
00124         return int( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() );
00125     else
00126     if ( ( rowpos==0 ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // FIRST ROW
00127         return int( tableTemplate->pFirstRow()->frameStyle()->rightBorder().width() );
00128     else
00129     if ( ( colpos==0 ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // FIRST COL
00130         return int( tableTemplate->pFirstCol()->frameStyle()->rightBorder().width() );
00131     else
00132     if ( ( rowpos==(rows-1) ) && ( colpos>0 ) && ( colpos<(cols-1) ) )  // LAST ROW
00133         return int( tableTemplate->pLastRow()->frameStyle()->rightBorder().width() );
00134     else
00135     if ( ( colpos==(cols-1) ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // LAST COL
00136         return int( tableTemplate->pLastCol()->frameStyle()->rightBorder().width() );
00137     else
00138     if ( (rowpos>0) && (colpos>0) && (rowpos<(rows-1)) && (colpos<(cols-1)) ) // BODY
00139         return int( tableTemplate->pBodyCell()->frameStyle()->rightBorder().width() );
00140 
00141     return 0;
00142 }
00143 
00144 void KWTableTemplatePreview::drawCell( QPainter *p, const KWTableStyle *ts, const QRect globalRect,
00145                                        const int rows, int cols, int rowpos, int colpos, const QString & txt)
00146 {
00147     if (!ts) return;
00148 
00149     QRect insRect;
00150 
00151     p->resetXForm();
00152     p->setClipping( false );
00153 
00154     // 1. Calculate insRect
00155     int wid = int( globalRect.width()/cols ); // inner width
00156     int hei = int( globalRect.height()/rows ); // inner height
00157 
00158     insRect.setX( colpos*wid + globalRect.x() );
00159     insRect.setY( rowpos*hei + globalRect.y() );
00160     insRect.setWidth( static_cast<int>(wid + ts->frameStyle()->rightBorder().width()) );
00161     insRect.setHeight( static_cast<int>(hei + ts->frameStyle()->bottomBorder().width()) );
00162 
00163     // 2. Set background
00164     // caching
00165     int rb = rightBorder(rows,cols,rowpos,colpos-1);
00166     int bb = bottomBorder(rows,cols,rowpos-1,colpos);
00167     int hbb = bottomBorder(rows,cols,rowpos,colpos-1);
00168     int wrb = rightBorder(rows,cols,rowpos-1,colpos);
00169 
00170     if (rb==0)
00171         rb = rightBorder(rows,cols,rowpos-1,colpos-1);
00172     if (bb==0)
00173         bb = bottomBorder(rows,cols,rowpos-1,colpos-1);
00174 
00175     p->fillRect( QRect( colpos*wid + globalRect.x() + ( (rb <= ts->frameStyle()->rightBorder().width()) ? int(ts->frameStyle()->rightBorder().width()) : rb ),
00176                         rowpos*hei + globalRect.y() + ( (bb <= ts->frameStyle()->topBorder().width()) ? int(ts->frameStyle()->topBorder().width()) : bb ),
00177                         wid + ( ( (wrb > ts->frameStyle()->rightBorder().width()) && ((rb > ts->frameStyle()->rightBorder().width()) || ((rb==0) && (ts->frameStyle()->rightBorder().width()==0) ) ) && ((wrb-rb)>0) )  ? wrb : 0 ),
00178                         hei + ( ( (hbb > ts->frameStyle()->bottomBorder().width()) && ((bb > ts->frameStyle()->topBorder().width()) || ((bb==0) && (ts->frameStyle()->topBorder().width()==0) ) ) && ((hbb-bb)>0) ) ? hbb : 0 )),
00179                         ts->frameStyle()->backgroundColor() );
00180 
00181     // 2. set Style
00182     KoTextParag * parag = m_textdoc->firstParag();
00183 
00184     parag->remove( 0, parag->string()->length()-1 );
00185     parag->insert( 0, txt );
00186     parag->applyStyle( ts->paragraphStyle() );
00187 
00188     int widthLU = m_zoomHandler->pixelToLayoutUnitX( wid - 2 ); // keep one pixel border horizontally
00189     if ( m_textdoc->width() != widthLU )
00190     {
00191         // For centering to work, and to even get word wrapping when the thing is too big :)
00192         m_textdoc->setWidth( widthLU );
00193         parag->invalidate(0);
00194     }
00195     double x_add = ( (rb < ts->frameStyle()->rightBorder().width()) ?
00196         ts->frameStyle()->rightBorder().width() : rb ) +1;
00197     double y_add = ( (bb < ts->frameStyle()->topBorder().width()) ?
00198         ts->frameStyle()->topBorder().width() : bb ) + 1;
00199 
00200     QRect textRect = parag->pixelRect( m_zoomHandler );
00201     textRect.moveTopLeft( QPoint( insRect.x() + static_cast<int>(x_add),
00202                                   insRect.y() + static_cast<int>(y_add)) );
00203 
00204 
00205     textRect.setWidth(wid-2);
00206 
00207     p->setClipRect( textRect.intersect( globalRect ) );
00208     p->translate( textRect.x(), textRect.y() );
00209 
00210     QColorGroup cg = QApplication::palette().active();
00211     cg.setBrush( QColorGroup::Base, ts->frameStyle()->backgroundColor() );
00212 
00213     m_textdoc->drawWYSIWYG( p, 1, 0, textRect.width() - 1, textRect.height(), cg, m_zoomHandler );
00214 
00215     // 4. Set borders
00216     p->resetXForm();
00217     p->setClipping( false );
00218 
00219     QRect cell(globalRect.x(), globalRect.y(),
00220         int( globalRect.width() + ts->frameStyle()->rightBorder().width() ),
00221         int( globalRect.height() + ts->frameStyle()->bottomBorder().width() ));
00222     p->setClipRect( insRect.intersect( cell ) );
00223 
00224     p->translate( insRect.x(), insRect.y() );
00225 
00226     if (ts->frameStyle()->topBorder().width()>0) {
00227         p->setPen( KoBorder::borderPen(ts->frameStyle()->topBorder(),
00228             int(ts->frameStyle()->topBorder().width()), black) ); // Top border
00229 
00230         p->drawLine( 0, int( floor( ts->frameStyle()->topBorder().width()/2 ) ),
00231             int(wid + ts->frameStyle()->rightBorder().width()), int( floor( ts->frameStyle()->topBorder().width()/2 ) ) );
00232     }
00233     if (ts->frameStyle()->leftBorder().width()>0) {
00234         p->setPen( KoBorder::borderPen(ts->frameStyle()->leftBorder(),
00235             int(ts->frameStyle()->leftBorder().width()), black) ); // Left border
00236 
00237         p->drawLine( int( floor( ts->frameStyle()->leftBorder().width()/2 ) ), 0,
00238             int( floor( ts->frameStyle()->leftBorder().width()/2 ) ), hei + int(ts->frameStyle()->bottomBorder().width()) );
00239     }
00240     if (ts->frameStyle()->bottomBorder().width()>0) {
00241         p->setPen( KoBorder::borderPen(ts->frameStyle()->bottomBorder(),
00242             int(ts->frameStyle()->bottomBorder().width()), black) ); // Bottom border
00243 
00244         p->drawLine( 0, hei+int( floor( ts->frameStyle()->bottomBorder().width()/2 ) ),
00245             int(wid + ts->frameStyle()->rightBorder().width()), hei + int( floor( ts->frameStyle()->bottomBorder().width()/2 ) ) );
00246     }
00247     if (ts->frameStyle()->rightBorder().width()>0) {
00248         p->setPen( KoBorder::borderPen(ts->frameStyle()->rightBorder(),
00249             int(ts->frameStyle()->rightBorder().width()), black) ); // Right border
00250 
00251         p->drawLine( wid + int( floor( ts->frameStyle()->rightBorder().width()/2 ) ), 0,
00252             wid + int( floor( ts->frameStyle()->rightBorder().width()/2 ) ), hei + int(ts->frameStyle()->bottomBorder().width()) );
00253     }
00254 }
00255 
00256 
00257 void KWTableTemplatePreview::drawPreviewTable( QPainter *p, int rows, int cols, QRect globalRect )
00258 {
00259     KWTableStyle *cell = 0L;
00260     QString txt;
00261 
00262     for ( int i = 0; i < rows; i++ )
00263     {
00264         for ( int j = 0; j < cols; j++ )
00265         {
00266             if ( (i==0) && (j==0) ) // TOP LEFT CORNER
00267                 cell = tableTemplate->pTopLeftCorner();
00268             else
00269             if ( (i==0) && ( j==(cols-1) ) ) // TOP RIGHT CORNER
00270                 cell = tableTemplate->pTopRightCorner();
00271             else
00272             if ( ( i==(rows-1) ) && (j==0) ) // BOTTOM LEFT CORNER
00273                 cell = tableTemplate->pBottomLeftCorner();
00274             else
00275             if ( ( i==(rows-1) ) && ( j==(cols-1) ) ) // BOTTOM RIGHT CORNER
00276                 cell = tableTemplate->pBottomRightCorner();
00277             else
00278             if ( ( i==0 ) && ( j>0 ) && ( j<(cols-1) ) ) // FIRST ROW
00279                 cell = tableTemplate->pFirstRow();
00280             else
00281             if ( ( j==0 ) && ( i>0 ) && ( i<(rows-1) ) ) // FIRST COL
00282                 cell = tableTemplate->pFirstCol();
00283             else
00284             if ( ( i==(rows-1) ) && ( j>0 ) && ( j<(cols-1) ) )  // LAST ROW
00285                 cell = tableTemplate->pLastRow();
00286             else
00287             if ( ( j==(cols-1) ) && ( i>0 ) && ( i<(rows-1) ) ) // LAST COL
00288                 cell = tableTemplate->pLastCol();
00289             else
00290             if ( (i>0) && (j>0) && (i<(rows-1)) && (j<(cols-1)) ) // BODY
00291                 cell = tableTemplate->pBodyCell();
00292 
00293             if ( (i==0) && (j==0) ) // TOP LEFT CORNER
00294                 txt = m_contents[0][0];
00295             else
00296             if ( ( i==0 ) && ( j>0 ) )
00297                 txt = m_contents[i][j];
00298             else
00299             if ( ( j==0 ) && ( i>0 ) )
00300                 txt = m_contents[1][i];
00301             else
00302                 txt = QString::number(i) + QString::number(j);
00303 
00304             drawCell( p, cell, globalRect, rows, cols, i, j, txt );
00305         }
00306     }
00307 }
00308 
00309 void KWTableTemplatePreview::drawContents( QPainter *p )
00310 {
00311     p->save();
00312     QRect r = contentsRect();
00313 
00314     // 1. Draw fake document white background
00315     p->fillRect( QRect( 10, 20, r.width() - 20, r.height() - 20 ), QColor("white") );
00316 
00317     // 2. Draw preview table
00318     if (tableTemplate) {
00319 
00320         QRect tableRect;
00321         int x,y;
00322 
00323         // x
00324         if ( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() >
00325              tableTemplate->pLastCol()->frameStyle()->rightBorder().width() )
00326              x = int( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() );
00327         else
00328              x = int( tableTemplate->pLastCol()->frameStyle()->rightBorder().width() );
00329         if ( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() > x )
00330              x = int( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() );
00331 
00332         // y
00333         if ( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() >
00334              tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() )
00335              y = int( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() );
00336         else
00337              y = int( tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() );
00338         if ( tableTemplate->pBottomLeftCorner()->frameStyle()->bottomBorder().width() > y )
00339              y = int( tableTemplate->pBottomLeftCorner()->frameStyle()->leftBorder().width() );
00340 
00341         tableRect.setX( 20 - int(x/2) );
00342         tableRect.setY( 30 - int(y/2) );
00343         tableRect.setWidth( r.width() - 40 );
00344         tableRect.setHeight( r.height() - 40 );
00345 
00346         drawPreviewTable( p, 5, 4, tableRect );
00347     }
00348 
00349     p->restore();
00350 }
00351 
00352 void KWTableTemplatePreview::setSpecialCells( KWTableTemplate *_tableTemplate )
00353 {
00354     if (_tableTemplate->pFirstRow()==_tableTemplate->pBodyCell())
00355         tableTemplate->setFirstRow( tableTemplate->pBodyCell() );
00356     else
00357         tableTemplate->setFirstRow( _tableTemplate->pFirstRow() );
00358 
00359     if (_tableTemplate->pFirstCol()==_tableTemplate->pBodyCell())
00360         tableTemplate->setFirstCol( tableTemplate->pBodyCell() );
00361     else
00362         tableTemplate->setFirstCol( _tableTemplate->pFirstCol() );
00363 
00364     if (_tableTemplate->pLastRow()==_tableTemplate->pBodyCell())
00365         tableTemplate->setLastRow( tableTemplate->pBodyCell() );
00366     else
00367         tableTemplate->setLastRow( _tableTemplate->pLastRow() );
00368 
00369     if (_tableTemplate->pLastCol()==_tableTemplate->pBodyCell())
00370         tableTemplate->setLastCol( tableTemplate->pBodyCell() );
00371     else
00372         tableTemplate->setLastCol( _tableTemplate->pLastCol() );
00373 
00374     if (_tableTemplate->pTopLeftCorner()==_tableTemplate->pBodyCell())
00375         tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
00376     else
00377         tableTemplate->setTopLeftCorner( _tableTemplate->pTopLeftCorner() );
00378 
00379     if (_tableTemplate->pTopRightCorner()==_tableTemplate->pBodyCell())
00380         tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
00381     else
00382         tableTemplate->setTopRightCorner( _tableTemplate->pTopRightCorner() );
00383 
00384     if (_tableTemplate->pBottomLeftCorner()==_tableTemplate->pBodyCell())
00385         tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
00386     else
00387         tableTemplate->setBottomLeftCorner( _tableTemplate->pBottomLeftCorner() );
00388 
00389     if (_tableTemplate->pBottomRightCorner()==_tableTemplate->pBodyCell())
00390         tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
00391     else
00392         tableTemplate->setBottomRightCorner( _tableTemplate->pBottomRightCorner() );
00393 }
00394 
00395 void KWTableTemplatePreview::setTableTemplate( KWTableTemplate *_tableTemplate )
00396 {
00397     origTableTemplate = _tableTemplate;
00398 
00399     delete tableTemplate;
00400 
00401     tableTemplate = new KWTableTemplate(_tableTemplate->displayName());
00402     tableTemplate->setBodyCell( _tableTemplate->pBodyCell() );
00403 
00404     setSpecialCells(_tableTemplate);
00405 
00406     repaint( true );
00407 }
00408 
00409 void KWTableTemplatePreview::fillContents()
00410 {
00411     // First row
00412     m_contents[0][0] = "A";
00413     m_contents[0][1] = "B";
00414     m_contents[0][2] = "C";
00415     m_contents[0][3] = "D";
00416     m_contents[0][4] = "E";
00417     // First col
00418     m_contents[1][0] = ""; // Is overwritten by m_contents[0][0]
00419     m_contents[1][1] = "I";
00420     m_contents[1][2] = "II";
00421     m_contents[1][3] = "III";
00422     m_contents[1][4] = "IV";
00423 
00424 }
00425 
00426 KWTableTemplate* KWTableTemplatePreview::getTableTemplate() const
00427 {
00428       return tableTemplate;
00429 }
00430 
00431 void KWTableTemplatePreview::cbFirstRowChanged( bool enable )
00432 {
00433     if ( enable && (origTableTemplate->pFirstRow()!=origTableTemplate->pBodyCell()) )
00434         tableTemplate->setFirstRow( origTableTemplate->pFirstRow() );
00435     else
00436         tableTemplate->setFirstRow( tableTemplate->pBodyCell() );
00437 
00438     if ( enable && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstRow() ) )
00439         tableTemplate->setTopLeftCorner( origTableTemplate->pTopLeftCorner() );
00440     else
00441     if ( (!enable) && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstRow() ) )
00442         tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
00443 
00444     if ( enable && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pFirstRow() ) )
00445         tableTemplate->setTopRightCorner( origTableTemplate->pTopRightCorner() );
00446     else
00447     if ( (!enable) && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pFirstRow() ) )
00448         tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
00449     if ( !m_disableRepaint )
00450         repaint( true );
00451 }
00452 
00453 void KWTableTemplatePreview::cbFirstColChanged( bool enable )
00454 {
00455     if ( enable && (origTableTemplate->pFirstCol()!=origTableTemplate->pBodyCell()) )
00456         tableTemplate->setFirstCol( origTableTemplate->pFirstCol() );
00457     else
00458         tableTemplate->setFirstCol( tableTemplate->pBodyCell() );
00459 
00460     if ( enable && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstCol() ) )
00461         tableTemplate->setTopLeftCorner( origTableTemplate->pTopLeftCorner() );
00462     else
00463     if ( (!enable) && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstCol() ) )
00464         tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
00465 
00466     if ( enable && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pFirstCol() ) )
00467         tableTemplate->setBottomLeftCorner( origTableTemplate->pBottomLeftCorner() );
00468     else
00469     if ( (!enable) && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pFirstCol() ) )
00470         tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
00471 
00472     if ( !m_disableRepaint )
00473         repaint( true );
00474 }
00475 
00476 void KWTableTemplatePreview::cbLastRowChanged( bool enable )
00477 {
00478     if ( enable && (origTableTemplate->pLastRow()!=origTableTemplate->pBodyCell()) )
00479         tableTemplate->setLastRow( origTableTemplate->pLastRow() );
00480     else
00481         tableTemplate->setLastRow( tableTemplate->pBodyCell() );
00482 
00483     if ( enable && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastRow() ) )
00484         tableTemplate->setBottomRightCorner( origTableTemplate->pBottomRightCorner() );
00485     else
00486     if ( (!enable) && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastRow() ) )
00487         tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
00488 
00489     if ( enable && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pLastRow() ) )
00490         tableTemplate->setBottomLeftCorner( origTableTemplate->pBottomLeftCorner() );
00491     else
00492     if ( (!enable) && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pLastRow() ) )
00493         tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
00494 
00495     if ( !m_disableRepaint )
00496         repaint( true );
00497 }
00498 
00499 void KWTableTemplatePreview::cbLastColChanged( bool enable )
00500 {
00501     if ( enable && (origTableTemplate->pLastCol()!=origTableTemplate->pBodyCell()) )
00502         tableTemplate->setLastCol( origTableTemplate->pLastCol() );
00503     else
00504         tableTemplate->setLastCol( tableTemplate->pBodyCell() );
00505 
00506     if ( enable && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pLastCol() ) )
00507         tableTemplate->setTopRightCorner( origTableTemplate->pTopRightCorner() );
00508     else
00509     if ( (!enable) && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pLastCol() ) )
00510         tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
00511 
00512     if ( enable && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastCol() ) )
00513         tableTemplate->setBottomRightCorner( origTableTemplate->pBottomRightCorner() );
00514     else
00515     if ( (!enable) && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastCol() ) )
00516         tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
00517 
00518     if ( !m_disableRepaint )
00519         repaint( true );
00520 }
00521 
00522 void KWTableTemplatePreview::cbBodyChanged( bool enable )
00523 {
00524     KWTableTemplate *oldTemplate = new KWTableTemplate( *tableTemplate );
00525 
00526     if ( enable )
00527         tableTemplate->setBodyCell( origTableTemplate->pBodyCell() );
00528     else
00529         tableTemplate->setBodyCell( m_emptyStyle );
00530 
00531     setSpecialCells(oldTemplate);
00532 
00533     delete oldTemplate;
00534 
00535     if ( !m_disableRepaint )
00536         repaint( true );
00537 
00538 }
00539 
00540 
00541 /******************************************************************/
00542 /* Class: KWTableTemplateSelector                                    */
00543 /******************************************************************/
00544 
00545 KWTableTemplateSelector::KWTableTemplateSelector( KWDocument *_doc, QWidget *_parent, const QString & _tableTemplate, int _type,const char *_name)
00546     : QWidget( _parent, _name )
00547 {
00548     m_doc = _doc;
00549 
00550     QGridLayout *grid = new QGridLayout( this, 3, 2, 0, KDialog::spacingHint() );
00551 
00552     QWidget *innerHolder = new QWidget( this );
00553     QGridLayout *innerGrid = new QGridLayout( innerHolder, 2, 1, 0, KDialog::spacingHint() );
00554 
00555     lbTemplates = new QListBox( innerHolder );
00556 
00557     QPtrListIterator<KWTableTemplate> it( m_doc->tableTemplateCollection()->tableTemplateList() );
00558     for ( ; it.current() ; ++it )
00559     {
00560         lbTemplates->insertItem( it.current()->displayName() );
00561     }
00562 
00563     innerGrid->addWidget( lbTemplates, 0, 0 );
00564 
00565     pbCustomize = new QPushButton( i18n( "&Customize" ), innerHolder );
00566     pbCustomize->setEnabled(false);
00567     pbCustomize->hide();
00568     innerGrid->addWidget( pbCustomize, 1, 0 );
00569 
00570     grid->addMultiCellWidget( innerHolder, 0, 2, 0, 0 );
00571 
00572     preview = new KWTableTemplatePreview( i18n( "Preview" ), m_doc->tableStyleCollection()->findStyle("Plain"), this );
00573     grid->addWidget( preview, 0, 1 );
00574 
00575     bgCustomize = new QButtonGroup( 3, Horizontal, i18n( "Apply To" ), this );
00576 
00577     cbFirstRow = new QCheckBox( i18n( "First row" ), bgCustomize );
00578     cbLastRow = new QCheckBox( i18n( "Last row" ), bgCustomize );
00579     cbBody = new QCheckBox( i18n( "Body" ), bgCustomize );
00580     cbFirstCol = new QCheckBox( i18n( "First column" ), bgCustomize );
00581     cbLastCol = new QCheckBox( i18n( "Last column" ), bgCustomize );
00582 
00583     grid->addWidget( bgCustomize, 1, 1 );
00584 
00585     grid->setRowStretch( 0, 1 );
00586     grid->setRowStretch( 1, 0 );
00587     grid->addColSpacing( 0, innerHolder->width() );
00588     grid->setColStretch( 0, 0 );
00589     grid->setColStretch( 1, 1 );
00590     grid->activate();
00591 
00592     connect( cbFirstRow, SIGNAL( toggled( bool ) ), preview, SLOT( cbFirstRowChanged( bool ) ) );
00593     connect( cbFirstCol, SIGNAL( toggled( bool ) ), preview, SLOT( cbFirstColChanged( bool ) ) );
00594     connect( cbLastRow, SIGNAL( toggled( bool ) ), preview, SLOT( cbLastRowChanged( bool ) ) );
00595     connect( cbLastCol,  SIGNAL( toggled( bool ) ), preview, SLOT( cbLastColChanged( bool ) ) );
00596     connect( cbBody,  SIGNAL( toggled( bool ) ), preview, SLOT( cbBodyChanged( bool ) ) );
00597 
00598     connect( lbTemplates, SIGNAL(  selectionChanged () ), this, SLOT( changeTableTemplate() ) );
00599     QListBoxItem * item = lbTemplates->findItem( _tableTemplate );
00600     int index = 0;
00601     if ( item  )
00602         index = lbTemplates->index ( item );
00603     if (m_doc->tableTemplateCollection()->tableTemplateList().count() > 0) {
00604       preview->setTableTemplate( m_doc->tableTemplateCollection()->tableTemplateAt(index) );
00605       selectedTableTemplate = 0L;
00606       lbTemplates->setSelected( index, true );
00607     }
00608     initFormat( _type );
00609 }
00610 
00611 void KWTableTemplateSelector::changeTableTemplate()
00612 {
00613     preview->setTableTemplate( m_doc->tableTemplateCollection()->tableTemplateAt( lbTemplates->currentItem() ) );
00614     selectedTableTemplate = lbTemplates->currentItem();
00615     initPreview();
00616 }
00617 
00618 KWTableTemplate* KWTableTemplateSelector::getTableTemplate() const
00619 {
00620   return (selectedTableTemplate) ? preview->getTableTemplate() : 0L;
00621 }
00622 
00623 void KWTableTemplateSelector::initFormat( int format)
00624 {
00625     if ( format & FirstRow)
00626         cbFirstRow->setChecked( true );
00627 
00628     if ( format & FirstColumn)
00629         cbFirstCol->setChecked( true );
00630 
00631     if ( format & LastRow)
00632         cbLastRow->setChecked( true );
00633 
00634     if ( format & LastCol)
00635         cbLastCol->setChecked( true );
00636 
00637     if ( format & Body)
00638         cbBody->setChecked( true );
00639     initPreview();
00640 }
00641 
00642 void KWTableTemplateSelector::initPreview()
00643 {
00644     preview->disableRepaint(true);
00645     preview->cbFirstRowChanged( cbFirstRow->isChecked() );
00646     preview->cbFirstColChanged( cbFirstCol->isChecked(  ) );
00647     preview->cbLastRowChanged(cbLastRow->isChecked() );
00648     preview->cbLastColChanged( cbLastCol->isChecked() );
00649     preview->cbBodyChanged( cbBody->isChecked() );
00650     preview->disableRepaint(false);
00651     preview->repaint();
00652 }
00653 
00654 int KWTableTemplateSelector::getFormatType() const
00655 {
00656     int type = 0;
00657     if ( cbFirstRow->isChecked())
00658     {
00659         type = type | FirstRow;
00660     }
00661     if ( cbFirstCol->isChecked())
00662     {
00663         type = type |FirstColumn;
00664 
00665     }
00666     if ( cbLastRow->isChecked())
00667     {
00668         type = type | LastRow;
00669 
00670     }
00671     if ( cbLastCol->isChecked())
00672     {
00673         type = type | LastCol;
00674     }
00675     if ( cbBody->isChecked())
00676     {
00677         type = type | Body;
00678     }
00679     return type;
00680 }
KDE Home | KDE Accessibility Home | Description of Access Keys