kword

KWTableTemplateSelector.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2002 Nash Hoogwater <nrhoogwater@wanadoo.nl>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; using
7 version 2 of the License.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "KWTableTemplateSelector.h"
21#include "KWTableTemplateSelector.moc"
22
23#include "KWTableTemplate.h"
24#include "KWTableFrameSet.h"
25#include "KWDocument.h"
26#include "KWTextDocument.h"
27
28#include <KoRect.h>
29
30#include <tdelocale.h>
31#include <kurl.h>
32#include <tdeio/netaccess.h>
33#include <kstandarddirs.h>
34#include <kdebug.h>
35
36#include <tqlabel.h>
37#include <tqbuttongroup.h>
38#include <tqcheckbox.h>
39#include <tqcombobox.h>
40#include <tqfile.h>
41#include <tqdom.h>
42#include <tqrect.h>
43#include <tqptrlist.h>
44#include <tqlayout.h>
45
46#include <stdlib.h>
47#include <math.h>
48
49/******************************************************************/
50/* Class: KWTableTemplatePreview */
51/******************************************************************/
52
53KWTableTemplatePreview::KWTableTemplatePreview( const TQString& title, KWTableStyle *_emptyStyle, TQWidget* parent, const char* name )
54 : TQGroupBox( title, parent, name )
55{
56 m_emptyStyle = _emptyStyle;
57 m_zoomHandler = new KoTextZoomHandler;
58 m_textdoc = new KWTextDocument( m_zoomHandler );
59 tableTemplate = 0L;
60 origTableTemplate = 0L;
61 m_disableRepaint = false;
62 fillContents();
63}
64
65KWTableTemplatePreview::~KWTableTemplatePreview()
66{
67
68 delete m_textdoc;
69 delete m_zoomHandler;
70
71// if (tableTemplate)
72// delete tableTemplate;
73
74}
75
76int KWTableTemplatePreview::bottomBorder(const int rows, const int cols, const int rowpos, const int colpos)
77{
78 if ( (rowpos<0) || (colpos<0) ) return 0;
79
80 if ( (rowpos==0) && (colpos==0) ) // TOP LEFT CORNER
81 return int( tableTemplate->pTopLeftCorner()->frameStyle()->bottomBorder().width() );
82 else
83 if ( (rowpos==0) && ( colpos==(cols-1) ) ) // TOP RIGHT CORNER
84 return int( tableTemplate->pTopRightCorner()->frameStyle()->bottomBorder().width() );
85 else
86 if ( ( rowpos==(rows-1) ) && (colpos==0) ) // BOTTOM LEFT CORNER
87 return int( tableTemplate->pBottomLeftCorner()->frameStyle()->bottomBorder().width() );
88 else
89 if ( ( rowpos==(rows-1) ) && ( colpos==(cols-1) ) ) // BOTTOM RIGHT CORNER
90 return int( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() );
91 else
92 if ( ( rowpos==0 ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // FIRST ROW
93 return int( tableTemplate->pFirstRow()->frameStyle()->bottomBorder().width() );
94 else
95 if ( ( colpos==0 ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // FIRST COL
96 return int( tableTemplate->pFirstCol()->frameStyle()->bottomBorder().width() );
97 else
98 if ( ( rowpos==(rows-1) ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // LAST ROW
99 return int( tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() );
100 else
101 if ( ( colpos==(cols-1) ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // LAST COL
102 return int( tableTemplate->pLastCol()->frameStyle()->bottomBorder().width() );
103 else
104 if ( (rowpos>0) && (colpos>0) && (rowpos<(rows-1)) && (colpos<(cols-1)) ) // BODY
105 return int( tableTemplate->pBodyCell()->frameStyle()->bottomBorder().width() );
106
107 return 0;
108}
109
110int KWTableTemplatePreview::rightBorder(const int rows, const int cols, const int rowpos, const int colpos)
111{
112 if ( (rowpos<0) || (colpos<0) ) return 0;
113
114 if ( (rowpos==0) && (colpos==0) ) // TOP LEFT CORNER
115 return int( tableTemplate->pTopLeftCorner()->frameStyle()->rightBorder().width() );
116 else
117 if ( (rowpos==0) && ( colpos==(cols-1) ) ) // TOP RIGHT CORNER
118 return int( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() );
119 else
120 if ( ( rowpos==(rows-1) ) && (colpos==0) ) // BOTTOM LEFT CORNER
121 return int( tableTemplate->pBottomLeftCorner()->frameStyle()->rightBorder().width() );
122 else
123 if ( ( rowpos==(rows-1) ) && ( colpos==(cols-1) ) ) // BOTTOM RIGHT CORNER
124 return int( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() );
125 else
126 if ( ( rowpos==0 ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // FIRST ROW
127 return int( tableTemplate->pFirstRow()->frameStyle()->rightBorder().width() );
128 else
129 if ( ( colpos==0 ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // FIRST COL
130 return int( tableTemplate->pFirstCol()->frameStyle()->rightBorder().width() );
131 else
132 if ( ( rowpos==(rows-1) ) && ( colpos>0 ) && ( colpos<(cols-1) ) ) // LAST ROW
133 return int( tableTemplate->pLastRow()->frameStyle()->rightBorder().width() );
134 else
135 if ( ( colpos==(cols-1) ) && ( rowpos>0 ) && ( rowpos<(rows-1) ) ) // LAST COL
136 return int( tableTemplate->pLastCol()->frameStyle()->rightBorder().width() );
137 else
138 if ( (rowpos>0) && (colpos>0) && (rowpos<(rows-1)) && (colpos<(cols-1)) ) // BODY
139 return int( tableTemplate->pBodyCell()->frameStyle()->rightBorder().width() );
140
141 return 0;
142}
143
144void KWTableTemplatePreview::drawCell( TQPainter *p, const KWTableStyle *ts, const TQRect globalRect,
145 const int rows, int cols, int rowpos, int colpos, const TQString & txt)
146{
147 if (!ts) return;
148
149 TQRect insRect;
150
151 p->resetXForm();
152 p->setClipping( false );
153
154 // 1. Calculate insRect
155 int wid = int( globalRect.width()/cols ); // inner width
156 int hei = int( globalRect.height()/rows ); // inner height
157
158 insRect.setX( colpos*wid + globalRect.x() );
159 insRect.setY( rowpos*hei + globalRect.y() );
160 insRect.setWidth( static_cast<int>(wid + ts->frameStyle()->rightBorder().width()) );
161 insRect.setHeight( static_cast<int>(hei + ts->frameStyle()->bottomBorder().width()) );
162
163 // 2. Set background
164 // caching
165 int rb = rightBorder(rows,cols,rowpos,colpos-1);
166 int bb = bottomBorder(rows,cols,rowpos-1,colpos);
167 int hbb = bottomBorder(rows,cols,rowpos,colpos-1);
168 int wrb = rightBorder(rows,cols,rowpos-1,colpos);
169
170 if (rb==0)
171 rb = rightBorder(rows,cols,rowpos-1,colpos-1);
172 if (bb==0)
173 bb = bottomBorder(rows,cols,rowpos-1,colpos-1);
174
175 p->fillRect( TQRect( colpos*wid + globalRect.x() + ( (rb <= ts->frameStyle()->rightBorder().width()) ? int(ts->frameStyle()->rightBorder().width()) : rb ),
176 rowpos*hei + globalRect.y() + ( (bb <= ts->frameStyle()->topBorder().width()) ? int(ts->frameStyle()->topBorder().width()) : bb ),
177 wid + ( ( (wrb > ts->frameStyle()->rightBorder().width()) && ((rb > ts->frameStyle()->rightBorder().width()) || ((rb==0) && (ts->frameStyle()->rightBorder().width()==0) ) ) && ((wrb-rb)>0) ) ? wrb : 0 ),
178 hei + ( ( (hbb > ts->frameStyle()->bottomBorder().width()) && ((bb > ts->frameStyle()->topBorder().width()) || ((bb==0) && (ts->frameStyle()->topBorder().width()==0) ) ) && ((hbb-bb)>0) ) ? hbb : 0 )),
179 ts->frameStyle()->backgroundColor() );
180
181 // 2. set Style
182 KoTextParag * parag = m_textdoc->firstParag();
183
184 parag->remove( 0, parag->string()->length()-1 );
185 parag->insert( 0, txt );
186 parag->applyStyle( ts->paragraphStyle() );
187
188 int widthLU = m_zoomHandler->pixelToLayoutUnitX( wid - 2 ); // keep one pixel border horizontally
189 if ( m_textdoc->width() != widthLU )
190 {
191 // For centering to work, and to even get word wrapping when the thing is too big :)
192 m_textdoc->setWidth( widthLU );
193 parag->invalidate(0);
194 }
195 double x_add = ( (rb < ts->frameStyle()->rightBorder().width()) ?
196 ts->frameStyle()->rightBorder().width() : rb ) +1;
197 double y_add = ( (bb < ts->frameStyle()->topBorder().width()) ?
198 ts->frameStyle()->topBorder().width() : bb ) + 1;
199
200 TQRect textRect = parag->pixelRect( m_zoomHandler );
201 textRect.moveTopLeft( TQPoint( insRect.x() + static_cast<int>(x_add),
202 insRect.y() + static_cast<int>(y_add)) );
203
204
205 textRect.setWidth(wid-2);
206
207 p->setClipRect( textRect.intersect( globalRect ) );
208 p->translate( textRect.x(), textRect.y() );
209
210 TQColorGroup cg = TQApplication::palette().active();
211 cg.setBrush( TQColorGroup::Base, ts->frameStyle()->backgroundColor() );
212
213 m_textdoc->drawWYSIWYG( p, 1, 0, textRect.width() - 1, textRect.height(), cg, m_zoomHandler );
214
215 // 4. Set borders
216 p->resetXForm();
217 p->setClipping( false );
218
219 TQRect cell(globalRect.x(), globalRect.y(),
220 int( globalRect.width() + ts->frameStyle()->rightBorder().width() ),
221 int( globalRect.height() + ts->frameStyle()->bottomBorder().width() ));
222 p->setClipRect( insRect.intersect( cell ) );
223
224 p->translate( insRect.x(), insRect.y() );
225
226 if (ts->frameStyle()->topBorder().width()>0) {
227 p->setPen( KoBorder::borderPen(ts->frameStyle()->topBorder(),
228 int(ts->frameStyle()->topBorder().width()), black) ); // Top border
229
230 p->drawLine( 0, int( floor( ts->frameStyle()->topBorder().width()/2 ) ),
231 int(wid + ts->frameStyle()->rightBorder().width()), int( floor( ts->frameStyle()->topBorder().width()/2 ) ) );
232 }
233 if (ts->frameStyle()->leftBorder().width()>0) {
234 p->setPen( KoBorder::borderPen(ts->frameStyle()->leftBorder(),
235 int(ts->frameStyle()->leftBorder().width()), black) ); // Left border
236
237 p->drawLine( int( floor( ts->frameStyle()->leftBorder().width()/2 ) ), 0,
238 int( floor( ts->frameStyle()->leftBorder().width()/2 ) ), hei + int(ts->frameStyle()->bottomBorder().width()) );
239 }
240 if (ts->frameStyle()->bottomBorder().width()>0) {
241 p->setPen( KoBorder::borderPen(ts->frameStyle()->bottomBorder(),
242 int(ts->frameStyle()->bottomBorder().width()), black) ); // Bottom border
243
244 p->drawLine( 0, hei+int( floor( ts->frameStyle()->bottomBorder().width()/2 ) ),
245 int(wid + ts->frameStyle()->rightBorder().width()), hei + int( floor( ts->frameStyle()->bottomBorder().width()/2 ) ) );
246 }
247 if (ts->frameStyle()->rightBorder().width()>0) {
248 p->setPen( KoBorder::borderPen(ts->frameStyle()->rightBorder(),
249 int(ts->frameStyle()->rightBorder().width()), black) ); // Right border
250
251 p->drawLine( wid + int( floor( ts->frameStyle()->rightBorder().width()/2 ) ), 0,
252 wid + int( floor( ts->frameStyle()->rightBorder().width()/2 ) ), hei + int(ts->frameStyle()->bottomBorder().width()) );
253 }
254}
255
256
257void KWTableTemplatePreview::drawPreviewTable( TQPainter *p, int rows, int cols, TQRect globalRect )
258{
259 KWTableStyle *cell = 0L;
260 TQString txt;
261
262 for ( int i = 0; i < rows; i++ )
263 {
264 for ( int j = 0; j < cols; j++ )
265 {
266 if ( (i==0) && (j==0) ) // TOP LEFT CORNER
267 cell = tableTemplate->pTopLeftCorner();
268 else
269 if ( (i==0) && ( j==(cols-1) ) ) // TOP RIGHT CORNER
270 cell = tableTemplate->pTopRightCorner();
271 else
272 if ( ( i==(rows-1) ) && (j==0) ) // BOTTOM LEFT CORNER
273 cell = tableTemplate->pBottomLeftCorner();
274 else
275 if ( ( i==(rows-1) ) && ( j==(cols-1) ) ) // BOTTOM RIGHT CORNER
276 cell = tableTemplate->pBottomRightCorner();
277 else
278 if ( ( i==0 ) && ( j>0 ) && ( j<(cols-1) ) ) // FIRST ROW
279 cell = tableTemplate->pFirstRow();
280 else
281 if ( ( j==0 ) && ( i>0 ) && ( i<(rows-1) ) ) // FIRST COL
282 cell = tableTemplate->pFirstCol();
283 else
284 if ( ( i==(rows-1) ) && ( j>0 ) && ( j<(cols-1) ) ) // LAST ROW
285 cell = tableTemplate->pLastRow();
286 else
287 if ( ( j==(cols-1) ) && ( i>0 ) && ( i<(rows-1) ) ) // LAST COL
288 cell = tableTemplate->pLastCol();
289 else
290 if ( (i>0) && (j>0) && (i<(rows-1)) && (j<(cols-1)) ) // BODY
291 cell = tableTemplate->pBodyCell();
292
293 if ( (i==0) && (j==0) ) // TOP LEFT CORNER
294 txt = m_contents[0][0];
295 else
296 if ( ( i==0 ) && ( j>0 ) )
297 txt = m_contents[i][j];
298 else
299 if ( ( j==0 ) && ( i>0 ) )
300 txt = m_contents[1][i];
301 else
302 txt = TQString::number(i) + TQString::number(j);
303
304 drawCell( p, cell, globalRect, rows, cols, i, j, txt );
305 }
306 }
307}
308
309void KWTableTemplatePreview::drawContents( TQPainter *p )
310{
311 p->save();
312 TQRect r = contentsRect();
313
314 // 1. Draw fake document white background
315 p->fillRect( TQRect( 10, 20, r.width() - 20, r.height() - 20 ), TQColor("white") );
316
317 // 2. Draw preview table
318 if (tableTemplate) {
319
320 TQRect tableRect;
321 int x,y;
322
323 // x
324 if ( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() >
325 tableTemplate->pLastCol()->frameStyle()->rightBorder().width() )
326 x = int( tableTemplate->pTopRightCorner()->frameStyle()->rightBorder().width() );
327 else
328 x = int( tableTemplate->pLastCol()->frameStyle()->rightBorder().width() );
329 if ( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() > x )
330 x = int( tableTemplate->pBottomRightCorner()->frameStyle()->rightBorder().width() );
331
332 // y
333 if ( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() >
334 tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() )
335 y = int( tableTemplate->pBottomRightCorner()->frameStyle()->bottomBorder().width() );
336 else
337 y = int( tableTemplate->pLastRow()->frameStyle()->bottomBorder().width() );
338 if ( tableTemplate->pBottomLeftCorner()->frameStyle()->bottomBorder().width() > y )
339 y = int( tableTemplate->pBottomLeftCorner()->frameStyle()->leftBorder().width() );
340
341 tableRect.setX( 20 - int(x/2) );
342 tableRect.setY( 30 - int(y/2) );
343 tableRect.setWidth( r.width() - 40 );
344 tableRect.setHeight( r.height() - 40 );
345
346 drawPreviewTable( p, 5, 4, tableRect );
347 }
348
349 p->restore();
350}
351
352void KWTableTemplatePreview::setSpecialCells( KWTableTemplate *_tableTemplate )
353{
354 if (_tableTemplate->pFirstRow()==_tableTemplate->pBodyCell())
355 tableTemplate->setFirstRow( tableTemplate->pBodyCell() );
356 else
357 tableTemplate->setFirstRow( _tableTemplate->pFirstRow() );
358
359 if (_tableTemplate->pFirstCol()==_tableTemplate->pBodyCell())
360 tableTemplate->setFirstCol( tableTemplate->pBodyCell() );
361 else
362 tableTemplate->setFirstCol( _tableTemplate->pFirstCol() );
363
364 if (_tableTemplate->pLastRow()==_tableTemplate->pBodyCell())
365 tableTemplate->setLastRow( tableTemplate->pBodyCell() );
366 else
367 tableTemplate->setLastRow( _tableTemplate->pLastRow() );
368
369 if (_tableTemplate->pLastCol()==_tableTemplate->pBodyCell())
370 tableTemplate->setLastCol( tableTemplate->pBodyCell() );
371 else
372 tableTemplate->setLastCol( _tableTemplate->pLastCol() );
373
374 if (_tableTemplate->pTopLeftCorner()==_tableTemplate->pBodyCell())
375 tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
376 else
377 tableTemplate->setTopLeftCorner( _tableTemplate->pTopLeftCorner() );
378
379 if (_tableTemplate->pTopRightCorner()==_tableTemplate->pBodyCell())
380 tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
381 else
382 tableTemplate->setTopRightCorner( _tableTemplate->pTopRightCorner() );
383
384 if (_tableTemplate->pBottomLeftCorner()==_tableTemplate->pBodyCell())
385 tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
386 else
387 tableTemplate->setBottomLeftCorner( _tableTemplate->pBottomLeftCorner() );
388
389 if (_tableTemplate->pBottomRightCorner()==_tableTemplate->pBodyCell())
390 tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
391 else
392 tableTemplate->setBottomRightCorner( _tableTemplate->pBottomRightCorner() );
393}
394
395void KWTableTemplatePreview::setTableTemplate( KWTableTemplate *_tableTemplate )
396{
397 origTableTemplate = _tableTemplate;
398
399 delete tableTemplate;
400
401 tableTemplate = new KWTableTemplate(_tableTemplate->displayName());
402 tableTemplate->setBodyCell( _tableTemplate->pBodyCell() );
403
404 setSpecialCells(_tableTemplate);
405
406 repaint( true );
407}
408
409void KWTableTemplatePreview::fillContents()
410{
411 // First row
412 m_contents[0][0] = "A";
413 m_contents[0][1] = "B";
414 m_contents[0][2] = "C";
415 m_contents[0][3] = "D";
416 m_contents[0][4] = "E";
417 // First col
418 m_contents[1][0] = ""; // Is overwritten by m_contents[0][0]
419 m_contents[1][1] = "I";
420 m_contents[1][2] = "II";
421 m_contents[1][3] = "III";
422 m_contents[1][4] = "IV";
423
424}
425
426KWTableTemplate* KWTableTemplatePreview::getTableTemplate() const
427{
428 return tableTemplate;
429}
430
431void KWTableTemplatePreview::cbFirstRowChanged( bool enable )
432{
433 if ( enable && (origTableTemplate->pFirstRow()!=origTableTemplate->pBodyCell()) )
434 tableTemplate->setFirstRow( origTableTemplate->pFirstRow() );
435 else
436 tableTemplate->setFirstRow( tableTemplate->pBodyCell() );
437
438 if ( enable && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstRow() ) )
439 tableTemplate->setTopLeftCorner( origTableTemplate->pTopLeftCorner() );
440 else
441 if ( (!enable) && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstRow() ) )
442 tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
443
444 if ( enable && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pFirstRow() ) )
445 tableTemplate->setTopRightCorner( origTableTemplate->pTopRightCorner() );
446 else
447 if ( (!enable) && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pFirstRow() ) )
448 tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
449 if ( !m_disableRepaint )
450 repaint( true );
451}
452
453void KWTableTemplatePreview::cbFirstColChanged( bool enable )
454{
455 if ( enable && (origTableTemplate->pFirstCol()!=origTableTemplate->pBodyCell()) )
456 tableTemplate->setFirstCol( origTableTemplate->pFirstCol() );
457 else
458 tableTemplate->setFirstCol( tableTemplate->pBodyCell() );
459
460 if ( enable && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstCol() ) )
461 tableTemplate->setTopLeftCorner( origTableTemplate->pTopLeftCorner() );
462 else
463 if ( (!enable) && ( origTableTemplate->pTopLeftCorner()==origTableTemplate->pFirstCol() ) )
464 tableTemplate->setTopLeftCorner( tableTemplate->pBodyCell() );
465
466 if ( enable && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pFirstCol() ) )
467 tableTemplate->setBottomLeftCorner( origTableTemplate->pBottomLeftCorner() );
468 else
469 if ( (!enable) && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pFirstCol() ) )
470 tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
471
472 if ( !m_disableRepaint )
473 repaint( true );
474}
475
476void KWTableTemplatePreview::cbLastRowChanged( bool enable )
477{
478 if ( enable && (origTableTemplate->pLastRow()!=origTableTemplate->pBodyCell()) )
479 tableTemplate->setLastRow( origTableTemplate->pLastRow() );
480 else
481 tableTemplate->setLastRow( tableTemplate->pBodyCell() );
482
483 if ( enable && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastRow() ) )
484 tableTemplate->setBottomRightCorner( origTableTemplate->pBottomRightCorner() );
485 else
486 if ( (!enable) && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastRow() ) )
487 tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
488
489 if ( enable && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pLastRow() ) )
490 tableTemplate->setBottomLeftCorner( origTableTemplate->pBottomLeftCorner() );
491 else
492 if ( (!enable) && ( origTableTemplate->pBottomLeftCorner()==origTableTemplate->pLastRow() ) )
493 tableTemplate->setBottomLeftCorner( tableTemplate->pBodyCell() );
494
495 if ( !m_disableRepaint )
496 repaint( true );
497}
498
499void KWTableTemplatePreview::cbLastColChanged( bool enable )
500{
501 if ( enable && (origTableTemplate->pLastCol()!=origTableTemplate->pBodyCell()) )
502 tableTemplate->setLastCol( origTableTemplate->pLastCol() );
503 else
504 tableTemplate->setLastCol( tableTemplate->pBodyCell() );
505
506 if ( enable && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pLastCol() ) )
507 tableTemplate->setTopRightCorner( origTableTemplate->pTopRightCorner() );
508 else
509 if ( (!enable) && ( origTableTemplate->pTopRightCorner()==origTableTemplate->pLastCol() ) )
510 tableTemplate->setTopRightCorner( tableTemplate->pBodyCell() );
511
512 if ( enable && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastCol() ) )
513 tableTemplate->setBottomRightCorner( origTableTemplate->pBottomRightCorner() );
514 else
515 if ( (!enable) && ( origTableTemplate->pBottomRightCorner()==origTableTemplate->pLastCol() ) )
516 tableTemplate->setBottomRightCorner( tableTemplate->pBodyCell() );
517
518 if ( !m_disableRepaint )
519 repaint( true );
520}
521
522void KWTableTemplatePreview::cbBodyChanged( bool enable )
523{
524 KWTableTemplate *oldTemplate = new KWTableTemplate( *tableTemplate );
525
526 if ( enable )
527 tableTemplate->setBodyCell( origTableTemplate->pBodyCell() );
528 else
529 tableTemplate->setBodyCell( m_emptyStyle );
530
531 setSpecialCells(oldTemplate);
532
533 delete oldTemplate;
534
535 if ( !m_disableRepaint )
536 repaint( true );
537
538}
539
540
541/******************************************************************/
542/* Class: KWTableTemplateSelector */
543/******************************************************************/
544
545KWTableTemplateSelector::KWTableTemplateSelector( KWDocument *_doc, TQWidget *_parent, const TQString & _tableTemplate, int _type,const char *_name)
546 : TQWidget( _parent, _name )
547{
548 m_doc = _doc;
549
550 TQGridLayout *grid = new TQGridLayout( this, 3, 2, 0, KDialog::spacingHint() );
551
552 TQWidget *innerHolder = new TQWidget( this );
553 TQGridLayout *innerGrid = new TQGridLayout( innerHolder, 2, 1, 0, KDialog::spacingHint() );
554
555 lbTemplates = new TQListBox( innerHolder );
556
557 TQPtrListIterator<KWTableTemplate> it( m_doc->tableTemplateCollection()->tableTemplateList() );
558 for ( ; it.current() ; ++it )
559 {
560 lbTemplates->insertItem( it.current()->displayName() );
561 }
562
563 innerGrid->addWidget( lbTemplates, 0, 0 );
564
565 pbCustomize = new TQPushButton( i18n( "&Customize" ), innerHolder );
566 pbCustomize->setEnabled(false);
567 pbCustomize->hide();
568 innerGrid->addWidget( pbCustomize, 1, 0 );
569
570 grid->addMultiCellWidget( innerHolder, 0, 2, 0, 0 );
571
572 preview = new KWTableTemplatePreview( i18n( "Preview" ), m_doc->tableStyleCollection()->findStyle("Plain"), this );
573 grid->addWidget( preview, 0, 1 );
574
575 bgCustomize = new TQButtonGroup( 3,TQt::Horizontal, i18n( "Apply To" ), this );
576
577 cbFirstRow = new TQCheckBox( i18n( "First row" ), bgCustomize );
578 cbLastRow = new TQCheckBox( i18n( "Last row" ), bgCustomize );
579 cbBody = new TQCheckBox( i18n( "Body" ), bgCustomize );
580 cbFirstCol = new TQCheckBox( i18n( "First column" ), bgCustomize );
581 cbLastCol = new TQCheckBox( i18n( "Last column" ), bgCustomize );
582
583 grid->addWidget( bgCustomize, 1, 1 );
584
585 grid->setRowStretch( 0, 1 );
586 grid->setRowStretch( 1, 0 );
587 grid->addColSpacing( 0, innerHolder->width() );
588 grid->setColStretch( 0, 0 );
589 grid->setColStretch( 1, 1 );
590 grid->activate();
591
592 connect( cbFirstRow, TQ_SIGNAL( toggled( bool ) ), preview, TQ_SLOT( cbFirstRowChanged( bool ) ) );
593 connect( cbFirstCol, TQ_SIGNAL( toggled( bool ) ), preview, TQ_SLOT( cbFirstColChanged( bool ) ) );
594 connect( cbLastRow, TQ_SIGNAL( toggled( bool ) ), preview, TQ_SLOT( cbLastRowChanged( bool ) ) );
595 connect( cbLastCol, TQ_SIGNAL( toggled( bool ) ), preview, TQ_SLOT( cbLastColChanged( bool ) ) );
596 connect( cbBody, TQ_SIGNAL( toggled( bool ) ), preview, TQ_SLOT( cbBodyChanged( bool ) ) );
597
598 connect( lbTemplates, TQ_SIGNAL( selectionChanged () ), this, TQ_SLOT( changeTableTemplate() ) );
599 TQListBoxItem * item = lbTemplates->findItem( _tableTemplate );
600 int index = 0;
601 if ( item )
602 index = lbTemplates->index ( item );
603 if (m_doc->tableTemplateCollection()->tableTemplateList().count() > 0) {
604 preview->setTableTemplate( m_doc->tableTemplateCollection()->tableTemplateAt(index) );
605 selectedTableTemplate = 0L;
606 lbTemplates->setSelected( index, true );
607 }
608 initFormat( _type );
609}
610
611void KWTableTemplateSelector::changeTableTemplate()
612{
613 preview->setTableTemplate( m_doc->tableTemplateCollection()->tableTemplateAt( lbTemplates->currentItem() ) );
614 selectedTableTemplate = lbTemplates->currentItem();
615 initPreview();
616}
617
618KWTableTemplate* KWTableTemplateSelector::getTableTemplate() const
619{
620 return (selectedTableTemplate) ? preview->getTableTemplate() : 0L;
621}
622
623void KWTableTemplateSelector::initFormat( int format)
624{
625 if ( format & FirstRow)
626 cbFirstRow->setChecked( true );
627
628 if ( format & FirstColumn)
629 cbFirstCol->setChecked( true );
630
631 if ( format & LastRow)
632 cbLastRow->setChecked( true );
633
634 if ( format & LastCol)
635 cbLastCol->setChecked( true );
636
637 if ( format & Body)
638 cbBody->setChecked( true );
639 initPreview();
640}
641
642void KWTableTemplateSelector::initPreview()
643{
644 preview->disableRepaint(true);
645 preview->cbFirstRowChanged( cbFirstRow->isChecked() );
646 preview->cbFirstColChanged( cbFirstCol->isChecked( ) );
647 preview->cbLastRowChanged(cbLastRow->isChecked() );
648 preview->cbLastColChanged( cbLastCol->isChecked() );
649 preview->cbBodyChanged( cbBody->isChecked() );
650 preview->disableRepaint(false);
651 preview->repaint();
652}
653
654int KWTableTemplateSelector::getFormatType() const
655{
656 int type = 0;
657 if ( cbFirstRow->isChecked())
658 {
659 type = type | FirstRow;
660 }
661 if ( cbFirstCol->isChecked())
662 {
663 type = type |FirstColumn;
664
665 }
666 if ( cbLastRow->isChecked())
667 {
668 type = type | LastRow;
669
670 }
671 if ( cbLastCol->isChecked())
672 {
673 type = type | LastCol;
674 }
675 if ( cbBody->isChecked())
676 {
677 type = type | Body;
678 }
679 return type;
680}
Table style (can created/modified/deleted by the user) A table style is simply a paragraph style and ...
This is our KoTextDocument reimplementation, to create KWTextParag instead of KoTextParags,...