kword

KWFrameDia.cpp
1/* This file is part of the KDE project
2 Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
3 Copyright (C) 2005 Thomas Zander <zander@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19*/
20
21#include "KWFrameDia.h"
22#include "KWTextFrameSet.h"
23#include "KWDocument.h"
24#include "KWFrameDia.moc"
25#include "KWCommand.h"
26#include "KWTableFrameSet.h"
27#include "KWPageManager.h"
28#include "KWPage.h"
29#include "KWPictureFrameSet.h"
30
31#include <KoSetPropCommand.h>
32#include <KoParagDia_p.h> // for KoBorderPreview
33
34#include <knuminput.h>
35#include <tdelocale.h>
36#include <kiconloader.h>
37#include <tdemessagebox.h>
38#include <knumvalidator.h>
39#include <kcolorbutton.h>
40#include <kdebug.h>
41
42#include <tqwhatsthis.h>
43#include <tqlineedit.h>
44#include <tqcheckbox.h>
45#include <tqcombobox.h>
46#include <tqhbuttongroup.h>
47#include <tqlabel.h>
48#include <tqradiobutton.h>
49#include <tqlistview.h>
50#include <tqbuttongroup.h>
51#include <tqhbox.h>
52#include <tqheader.h>
53#include <tqlayout.h>
54
55#include <stdlib.h>
56#include <limits.h>
57
58/******************************************************************/
59/* Class KWBrushStylePreview - only used by kwframestylemanager */
60/******************************************************************/
61KWBrushStylePreview::KWBrushStylePreview( TQWidget* parent )
62 : TQFrame(parent)
63{
64}
65
66void KWBrushStylePreview::drawContents( TQPainter* painter )
67{
68 painter->save();
69 painter->translate( contentsRect().x(), contentsRect().y() );
70 painter->fillRect( contentsRect(), colorGroup().base() ); // in case of a transparent brush
71 painter->fillRect( contentsRect(), brush );
72 painter->restore();
73}
74
75
76/******************************************************************/
77/* Class: KWFrameDia *
78 *
79 * TAB Frame Options
80 * Set options dependent of frametype
81 * TAB Text Runaround
82 * Set the text behaviour of this frame
83 * TAB Frameset
84 * here the user can select from the current TEXT framesets, a new one is
85 * included in the list.
86 * Afterwards (on ok) the frame should be checked if it is already owned by a
87 * frameset, if so that connection must be disconnected (if different) and
88 * framebehaviour will be copied from the frameset
89 * then the new connection should be made.
90 *
91 * TAB Geometry
92 * position/size
93 ******************************************************************/
94
95KWFrameDia::KWFrameDia( TQWidget* parent, KWFrame *frame)
96 : KDialogBase( Tabbed, TQString(), Ok | Apply| Cancel, Ok, parent, "framedialog", true)
97{
98 m_noSignal=false;
99 m_frame = frame;
100 m_mainFrame = 0;
101 if(m_frame==0) {
102 kdDebug() << "ERROR: KWFrameDia::constructor no frame.."<<endl;
103 return;
104 }
105 setCaption( i18n( "Frame Properties for %1" ).arg( m_frame->frameSet()->name() ) );
106 KWFrameSet *fs = m_frame->frameSet()->groupmanager();
107 if(fs==0L) fs=m_frame->frameSet();
108 m_frameType = fs->type();
109 m_frameSetFloating = fs->isFloating();
110 m_frameSetProtectedSize = fs->isProtectSize();
111 m_mainFrameSetIncluded = fs->isMainFrameset();
112 m_defaultFrameSetIncluded = fs->isMainFrameset() || fs->isHeaderOrFooter() || fs->isFootEndNote();
113 if ( m_mainFrameSetIncluded )
114 m_mainFrame = m_frame;
115
116 m_doc = 0;
117 init();
118}
119
120/* Contructor when the dialog is used on creation of frame */
121KWFrameDia::KWFrameDia( TQWidget* parent, KWFrame *frame, KWDocument *doc, FrameSetType ft )
122 : KDialogBase( Tabbed, i18n("Frame Properties for New Frame"), Ok | Cancel, Ok, parent, "framedialog", true)
123{
124 m_noSignal=false;
125 m_frameType=ft;
126 m_doc = doc;
127 m_frame= frame;
128 m_frameSetFloating = false;
129 m_frameSetProtectedSize = false;
130 m_mainFrameSetIncluded = false;
131 m_defaultFrameSetIncluded = false;
132 if(m_frame==0) {
133 kdDebug() << "ERROR: KWFrameDia::constructor no m_frame.."<<endl;
134 return;
135 }
136 m_mainFrame = 0;
137 init();
138}
139
140KWFrameDia::KWFrameDia( TQWidget *parent, TQPtrList<KWFrame> listOfFrames) : KDialogBase( Tabbed, i18n("Frames Properties"), Ok | Apply | Cancel, Ok, parent, "framedialog", true) , m_allFrames() {
141 m_noSignal=false;
142
143 m_mainFrame = m_frame = 0L;
144 m_tab1 = m_tab2 = m_tab3 = m_tab4 = m_tab5 = m_tab6 = 0;
145
146 KWFrame *f=listOfFrames.first();
147 if(f==0) {
148 kdDebug() << "ERROR: KWFrameDia::constructor no frames.."<<endl;
149 return;
150 }
151 if ( listOfFrames.count() == 1 )
152 setCaption( i18n( "Frame Settings for %1" ).arg( f->frameSet()->name() ) );
153
154 KWFrameSet *fs = f->frameSet()->groupmanager();
155 if(fs==0L) fs=f->frameSet();
156 m_frameType = fs->type();
157 bool frameTypeUnset=true;
158 m_doc = fs->kWordDocument();
159
160 if( !fs->isMainFrameset() ) { // don't include the main fs.
161 m_allFrames.append(f);
162 frameTypeUnset=false;
163 }
164 else
165 m_mainFrame = f;
166
167 f=listOfFrames.next();
168 while(f) {
169 fs = f->frameSet()->groupmanager();
170 if(fs==0L) fs=f->frameSet();
171 if(m_doc->processingType() != KWDocument::WP || m_doc->frameSet(0) != fs) { // don't include the main fs.
172 if(!frameTypeUnset && m_frameType != fs->type()) m_frameType= FT_TEXT;
173 if(frameTypeUnset) {
174 m_frameType = fs->type();
175 frameTypeUnset = false;
176 } else if(m_frameType != fs->type()) m_frameType= FT_TEXT;
177 m_allFrames.append(f);
178 }
179 f=listOfFrames.next();
180 }
181 if(m_allFrames.count()==0)
182 m_allFrames.append(listOfFrames.first());
183
184 // Now that m_allFrames is set, calculate m_mainFrameSetIncluded and m_defaultFrameSetIncluded
185 m_mainFrameSetIncluded = false;
186 m_defaultFrameSetIncluded = false;
187 for ( f = m_allFrames.first(); f; f = m_allFrames.next() ) {
188 fs = f->frameSet();
189 if ( !m_mainFrameSetIncluded )
190 {
191 m_mainFrameSetIncluded = fs->isMainFrameset();
192 if ( m_mainFrameSetIncluded )
193 m_mainFrame = f;
194 }
195 if ( !m_defaultFrameSetIncluded )
196 m_defaultFrameSetIncluded = fs->isMainFrameset() || fs->isHeaderOrFooter() || fs->isFootEndNote();
197 }
198
199
200 init();
201}
202
203void KWFrameDia::init() {
204
205 m_tab1 = m_tab2 = m_tab3 = m_tab4 = m_tab5 = m_tab6 = 0;
206 m_sw = m_sh = 0L;
207 m_cbAspectRatio=0L;
208 KWFrameSet *fs=0;
209 if(m_frame) {
210 fs = m_frame->frameSet(); // 0 when creating a frame
211 KoRect r = m_frame->normalize();
212 m_frame->setRect( r.x(), r.y(), r.width(), r.height() );
213 }
214 if(!m_doc && fs)
215 {
216 m_doc = fs->kWordDocument();
217 }
218 if(!m_doc)
219 {
220 kdDebug() << "ERROR: KWFrameDia::init frame has no reference to m_doc.."<<endl;
221 return;
222 }
223 if( fs && fs->isMainFrameset() )
224 {
225 setupTab6();
226 setupTab5();
227 setupTab4();
228 }
229 else if ( fs && (fs->isHeaderOrFooter() || fs->isFootEndNote()) )
230 {
231 setupTab1();
232 if ( !fs->isMainFrameset() && !fs->isHeaderOrFooter() && !fs->isFootEndNote())
233 setupTab2();
234 setupTab4();
235 setupTab5();
236 setupTab6();
237 }
238 else if(m_frameType == FT_TEXT)
239 {
240 setupTab1();
241 if ( fs && !fs->isMainFrameset() && !fs->isHeaderOrFooter() && !fs->isFootEndNote())
242 setupTab2();
243 else if ( !fs )
244 setupTab2();
245 setupTab3();
246 setupTab4();
247 setupTab5();
248 setupTab6();
249 if(! fs) // first creation
250 showPage(2);
251 }
252 else if(m_frameType == FT_PICTURE)
253 {
254 setupTab1();
255 if ( m_frameType == FT_PICTURE )
256 setupTab2();
257 if(m_frame) // not for multiframe dia
258 setupTab4();
259 setupTab6();
260 showPage(1); // while options are not implemented..
261 }
262 else if(m_frameType == FT_PART)
263 {
264 setupTab2();
265 if(m_frame) // not for multiframe dia
266 setupTab4();
267 setupTab6();
268 }
269 else if(m_frameType == FT_FORMULA)
270 {
271 setupTab1();
272 setupTab2();
273 if(m_frame) // not for multiframe dia
274 setupTab4();
275 setupTab6();
276 showPage(1); // while options are not implemented..
277 }
278 else if(m_frameType == FT_TABLE)
279 {
280 setupTab4();
281 setupTab5();
282 setupTab6();
283 }
284 setInitialSize( TQSize(550, 400) );
285}
286
287void KWFrameDia::setupTab1(){ // TAB Frame Options
288 //kdDebug() << "setup tab 1 Frame options"<<endl;
289 m_tab1 = addPage( i18n("Options") );
290 int columns = 0;
291 if(m_frameType == FT_FORMULA || m_frameType == FT_PICTURE)
292 columns = 1;
293 else if(m_frameType == FT_TEXT)
294 columns = 2;
295
296 m_grid1 = new TQGridLayout( m_tab1, 0 /*auto create*/, columns, 0, KDialog::spacingHint() );
297
298 // Options for all types of frames
299 m_cbCopy = new TQCheckBox( i18n("Frame is a copy of the previous frame"),m_tab1 );
300 m_grid1->addWidget(m_cbCopy,1,0);
301
302 if(m_frame) {
303 m_cbCopy->setChecked( m_frame->isCopy() );
304 m_cbCopy->setEnabled( m_frame->frameSet() && m_frame->frameSet()->frame( 0 ) != m_frame ); // First one can't be a copy
305 } else { // list of frames as input.
306 KWFrame *f=m_allFrames.first();
307 bool show=true;
308 bool enabled=f->frameSet() && f->frameSet()->frame( 0 ) != f; // First one can't be a copy
309 bool checked=f->isCopy();
310 f=m_allFrames.next();
311 while(f) {
312 enabled=enabled || (f->frameSet() && f->frameSet()->frame( 0 ) != f);
313 if(checked != f->isCopy()) show=false;
314 f=m_allFrames.next();
315 }
316 if(! show) {
317 m_cbCopy->setTristate();
318 m_cbCopy->setNoChange();
319 }
320 else m_cbCopy->setChecked(checked);
321 m_cbCopy->setEnabled( enabled );
322 }
323
324 // Well, for images, formulas etc. it doesn't make sense to activate 'is copy'. What else would it show ?
325 if(m_frameType!=FT_TEXT)
326 m_cbCopy->setEnabled( false );
327
328 int row = 2;
329 int column = 0;
330
331 // Picture m_frame
332 if(m_frameType==FT_PICTURE)
333 {
334 m_cbAspectRatio = new TQCheckBox (i18n("Retain original aspect ratio"),m_tab1);
335 connect( m_cbAspectRatio, TQ_SIGNAL(toggled(bool)),
336 this, TQ_SLOT(slotKeepRatioToggled(bool)));
337 bool show=true;
338 bool on=true;
339 if(m_frame) {
340 if ( m_frame->frameSet() )
341 on= static_cast<KWPictureFrameSet *>( m_frame->frameSet() )->keepAspectRatio();
342 } else {
343 KWFrame *f=m_allFrames.first();
344 KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
345 if(fs)
346 on=fs->keepAspectRatio();
347 f=m_allFrames.next();
348 while(f) {
349 KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
350 if(fs)
351 if(on != fs->keepAspectRatio()) {
352 show=false;
353 break;
354 }
355 f=m_allFrames.next();
356 }
357 }
358 m_cbAspectRatio->setChecked( on );
359 if(! show) {
360 m_cbAspectRatio->setTristate();
361 m_cbAspectRatio->setNoChange();
362 }
363 m_grid1->addWidget(m_cbAspectRatio, row, 0);
364 ++row;
365 }
366 else
367 m_cbAspectRatio = 0L;
368
369 // Text m_frame
370 if(m_frameType==FT_TEXT)
371 {
372 // AutoCreateNewFrame policy.
373 m_endOfFrame = new TQGroupBox(i18n("If Text is Too Long for Frame"), m_tab1 );
374 m_grid1->addWidget( m_endOfFrame, row, 0 );
375
376 m_eofGrid= new TQGridLayout (m_endOfFrame, 4, 1, KDialog::marginHint(), KDialog::spacingHint());
377 m_rAppendFrame = new TQRadioButton( i18n( "Create a new page" ), m_endOfFrame );
378 TQWhatsThis::add( m_rAppendFrame, "<b>Create a new page:</b><br/> if there is too "
379 "much text for this text frame, a new page will be created and, "
380 "since \"Reconnect frame to current flow\" is the only possible "
381 "option together with this one, "
382 "the new page will have a frame for showing the additional text." );
383 m_eofGrid->addWidget( m_rAppendFrame, 1, 0 );
384
385 m_rResizeFrame = new TQRadioButton( i18n( "Resize last frame" ), m_endOfFrame );
386 TQWhatsThis::add( m_rResizeFrame, "<b>Resize last frame:</b><br/> "
387 "if there is too much text for this text frame, "
388 "the frame will resize itself (increasing its height) as much as it needs, "
389 "to be able to contain all the text. More precisely, when the frameset has "
390 "multiple chained frames, it's always the last one which will be resized." );
391 m_eofGrid->addWidget( m_rResizeFrame, 2, 0 );
392
393 m_rNoShow = new TQRadioButton( i18n( "Don't show the extra text" ), m_endOfFrame );
394 TQWhatsThis::add( m_rNoShow, "<b>Don't show the extra text:</b><br/> "
395 "if there is too much text for this text frame, nothing happens "
396 "automatically. Initially the extra text won't appear. One possibility "
397 "then is to resize the frame manually. The other possibility is, with the option "
398 "\"Reconnect frame to current flow\" selected, to create a new page "
399 "which will then have a followup frame with the extra text." );
400 m_eofGrid->addWidget( m_rNoShow, 3, 0 );
401 TQButtonGroup *grp = new TQButtonGroup( m_endOfFrame );
402 grp->hide();
403 grp->setExclusive( true );
404 grp->insert( m_rAppendFrame );
405 grp->insert( m_rResizeFrame );
406 grp->insert( m_rNoShow );
407
408 m_eofGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
410 bool show=true;
411 if(m_frame) {
412 fb = m_frame->frameBehavior();
413 } else {
414 KWFrame *f=m_allFrames.first();
415 fb = f->frameBehavior();
416 f=m_allFrames.next();
417 while(f) {
418 if(fb != f->frameBehavior()) {
419 show=false;
420 break;
421 }
422 f=m_allFrames.next();
423 }
424 }
425 if(show) {
426 if(fb == KWFrame::AutoExtendFrame) {
427 m_rResizeFrame->setChecked(true);
428 } else if (fb == KWFrame::AutoCreateNewFrame) {
429 m_rAppendFrame->setChecked(true);
430 } else {
431 m_rNoShow->setChecked(true);
432 }
433 }
434 column++;
435 } else {
436 m_rResizeFrame = 0L;
437 m_rAppendFrame = 0L;
438 m_rNoShow = 0L;
439 }
440
441 // NewFrameBehavior - now for all type of frames
442 m_onNewPage = new TQGroupBox(i18n("On New Page Creation"),m_tab1);
443 m_grid1->addWidget( m_onNewPage, row, column );
444
445 m_onpGrid = new TQGridLayout( m_onNewPage, 4, 1, KDialog::marginHint(), KDialog::spacingHint() );
446 m_reconnect = new TQRadioButton (i18n ("Reconnect frame to current flow"), m_onNewPage);
447 TQWhatsThis::add(m_reconnect, i18n("<b>Reconnect frame to current flow:</b><br/>"
448 "When a new page is created, a new frame will be created for this "
449 "frameset, so that the text can flow from one page to the next if necessary. "
450 "This is what happens for the \"main text frameset\", but this option makes it possible "
451 "to choose the same behavior for other framesets, for instance in magazine layouts."));
452 if ( m_rResizeFrame )
453 connect( m_reconnect, TQ_SIGNAL( clicked() ), this, TQ_SLOT( setFrameBehaviorInputOn() ) );
454 m_onpGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
455 m_onpGrid->addWidget( m_reconnect, 1, 0 );
456
457 m_noFollowup = new TQRadioButton (i18n ("Do not create a followup frame"), m_onNewPage);
458 TQWhatsThis::add(m_noFollowup, i18n("<b>Do not create a followup frame:</b><br/>"
459 "When a new page is created, no frame will be created for this frameset."));
460 if ( m_rResizeFrame )
461 connect( m_noFollowup, TQ_SIGNAL( clicked() ), this, TQ_SLOT( setFrameBehaviorInputOn() ) );
462 m_onpGrid->addWidget( m_noFollowup, 2, 0 );
463
464 m_copyRadio= new TQRadioButton (i18n ("Place a copy of this frame"), m_onNewPage);
465 TQWhatsThis::add(m_copyRadio, i18n("<b>Place a copy of this frame:</b><br/>"
466 "When a new page is created, a frame will be created for this frameset, "
467 "which will always show the exact same thing as the frame on the previous "
468 "page. This is what happens for headers and footers, but this option "
469 "makes it possible to choose the same behavior for other framesets, for "
470 "instance a company logo and/or title that should appear exactly the same on every page."));
471 if ( m_rResizeFrame )
472 connect( m_copyRadio, TQ_SIGNAL( clicked() ), this, TQ_SLOT( setFrameBehaviorInputOff() ) );
473 m_onpGrid->addWidget( m_copyRadio, 3, 0);
474
475 enableOnNewPageOptions();
476
477 TQButtonGroup *grp2 = new TQButtonGroup( m_onNewPage );
478 grp2->hide();
479 grp2->setExclusive( true );
480 grp2->insert( m_reconnect );
481 grp2->insert( m_noFollowup );
482 grp2->insert( m_copyRadio );
483 m_grid1->addRowSpacing( row, m_onNewPage->height());
485 bool show=true;
486 if(m_frame) {
487 nfb = m_frame->newFrameBehavior();
488 } else {
489 KWFrame *f=m_allFrames.first();
490 nfb = f->newFrameBehavior();
491 f=m_allFrames.next();
492 while(f) {
493 if(nfb != f->newFrameBehavior()) {
494 show=false;
495 break;
496 }
497 f=m_allFrames.next();
498 }
499 }
500 if(show) {
501 if(nfb == KWFrame::Reconnect) {
502 m_reconnect->setChecked(true);
503 } else if(nfb == KWFrame::NoFollowup) {
504 m_noFollowup->setChecked(true);
505 } else {
506 m_copyRadio->setChecked(true);
507 setFrameBehaviorInputOff();
508 }
509 }
510
511
512 // SideHeads definition - for text frames only
513 if( false && m_frameType == FT_TEXT ) // disabled in the GUI for now! (TZ June 2002)
514 {
515 row++;
516 m_sideHeads = new TQGroupBox(i18n("SideHead Definition"),m_tab1);
517 m_sideHeads->setEnabled(false); //###
518 m_grid1->addWidget(m_sideHeads, row, 0);
519
520 m_sideGrid = new TQGridLayout( m_sideHeads, 4, 2, KDialog::marginHint(), KDialog::spacingHint() );
521 sideTitle1 = new TQLabel ( i18n("Size (%1):").arg(m_doc->unitName()),m_sideHeads);
522 sideTitle1->resize(sideTitle1->sizeHint());
523 m_sideGrid->addWidget(sideTitle1,1,0);
524 m_sideWidth= new TQLineEdit(m_sideHeads,"");
525 m_sideWidth->setMaxLength(6);
526 m_sideGrid->addWidget(m_sideWidth,1,1);
527 sideTitle2 = new TQLabel( i18n("Gap size (%1):").arg(m_doc->unitName()),m_sideHeads);
528 sideTitle2->resize(sideTitle2->sizeHint());
529 m_sideGrid->addWidget(sideTitle2,2,0);
530 m_sideGap = new TQLineEdit(m_sideHeads,"");
531 m_sideGap->setMaxLength(6);
532 m_sideGrid->addWidget(m_sideGap,2,1);
533 m_sideAlign = new TQComboBox (false,m_sideHeads);
534 m_sideAlign->setAutoResize(false);
535 m_sideAlign->insertItem ( i18n("Left"));
536 m_sideAlign->insertItem ( i18n("Right"));
537 m_sideAlign->insertItem ( i18n("Closest to Binding"));
538 m_sideAlign->insertItem ( i18n("Closest to Page Edge"));
539 m_sideAlign->resize(m_sideAlign->sizeHint());
540 m_sideGrid->addMultiCellWidget(m_sideAlign,3,3,0,1);
541 m_sideGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
542
543 // init for sideheads.
544 m_sideWidth->setText("0");
545 m_sideWidth->setValidator( new KFloatValidator(0,9999,true, m_sideWidth) );
546
547 m_sideGap->setText("0");
548 m_sideGap->setValidator( new KFloatValidator(0,9999,true, m_sideGap) );
549 // add rest of sidehead init..
550 }
551
552 m_cbAllFrames = new TQCheckBox (i18n("Changes will be applied to all frames in frameset"),m_tab1);
553 m_cbAllFrames->setChecked(m_frame!=0L);
554 row++;
555 m_grid1->addMultiCellWidget(m_cbAllFrames,row,row, 0, 1);
556 m_cbProtectContent = new TQCheckBox( i18n("Protect content"), m_tab1);
557 TQWhatsThis::add(m_cbProtectContent, i18n("<b>Protect content:</b><br/>"
558 "Disallow changes to be made to the contents of the frame(s)."));
559 connect( m_cbProtectContent, TQ_SIGNAL(toggled ( bool ) ), this, TQ_SLOT(slotProtectContentChanged( bool )));
560 row++;
561 m_grid1->addMultiCellWidget(m_cbProtectContent,row,row, 0, 1);
562 if( m_frameType != FT_TEXT || m_frame!=0 && m_frame->frameSet()==0) {
563 m_cbAllFrames->setChecked(false);
564 m_cbAllFrames->hide();
565 m_cbProtectContent->setChecked( false );
566 m_cbProtectContent->hide();
567 }
568 else if ( m_frameType == FT_TEXT /*&& m_frame!=0 && m_frame->frameSet()*/ )
569 {
570 bool show=true;
571 bool on=true;
572 if(m_frame)
573 {
574 if ( m_frame->frameSet() )
575 on= static_cast<KWTextFrameSet *>(m_frame->frameSet() )->textObject()->protectContent();
576 }
577 else
578 {
579 KWFrame *f=m_allFrames.first();
580 KWTextFrameSet *fs = dynamic_cast<KWTextFrameSet *> (f->frameSet());
581 if(fs)
582 on=fs->textObject()->protectContent();
583 f=m_allFrames.next();
584 while(f) {
585 KWTextFrameSet *fs = dynamic_cast<KWTextFrameSet *> (f->frameSet());
586 if(fs)
587 {
588 if(on != fs->textObject()->protectContent())
589 {
590 show=false;
591 break;
592 }
593 }
594 f=m_allFrames.next();
595 }
596 }
597 m_cbProtectContent->setChecked( on );
598 if(! show) {
599 m_cbProtectContent->setTristate();
600 m_cbProtectContent->setNoChange();
601 }
602 }
603
604 for(int i=0;i < row;i++)
605 m_grid1->setRowStretch( i, 0 );
606 m_grid1->setRowStretch( row + 1, 1 );
607}
608
609void KWFrameDia::setupTab2() { // TAB Text Runaround
610 m_tab2 = addPage( i18n( "Text Run Around" ) );
611
612 TQVBoxLayout *tabLayout = new TQVBoxLayout( m_tab2, 0, KDialog::spacingHint(), "tabLayout");
613
614 // First groupbox
615 m_runGroup = new TQButtonGroup( i18n( "Layout of Text in Other Frames" ), m_tab2);
616 m_runGroup->setColumnLayout( 0, TQt::Vertical );
617 m_runGroup->layout()->setSpacing( KDialog::spacingHint() );
618 TQGridLayout *groupBox1Layout = new TQGridLayout( m_runGroup->layout() );
619 groupBox1Layout->setAlignment( TQt::AlignTop );
620
621 m_rRunNo = new TQRadioButton( i18n( "Text will run &through this frame" ), m_runGroup );
622 groupBox1Layout->addWidget( m_rRunNo, 0, 1 );
623
624 m_rRunBounding = new TQRadioButton( i18n( "Text will run &around the frame" ), m_runGroup );
625 groupBox1Layout->addWidget( m_rRunBounding, 1, 1 );
626
627 m_rRunSkip = new TQRadioButton( i18n( "Text will &not run around this frame" ), m_runGroup );
628 groupBox1Layout->addWidget( m_rRunSkip, 2, 1 );
629
630 TQPixmap pixmap = KWBarIcon( "run_not" );
631 TQLabel *lRunNo = new TQLabel( m_runGroup );
632 lRunNo->setBackgroundPixmap( pixmap );
633 lRunNo->setFixedSize( pixmap.size() );
634 groupBox1Layout->addWidget( lRunNo, 0, 0 );
635
636 pixmap = KWBarIcon( "run_bounding" );
637 TQLabel *lRunBounding = new TQLabel( m_runGroup );
638 lRunBounding->setBackgroundPixmap( pixmap );
639 lRunBounding->setFixedSize( pixmap.size() );
640 groupBox1Layout->addWidget( lRunBounding, 1, 0 );
641
642 pixmap = KWBarIcon( "run_skip" );
643 TQLabel *lRunSkip = new TQLabel( m_runGroup );
644 lRunSkip->setBackgroundPixmap( pixmap );
645 lRunSkip->setFixedSize( pixmap.size() );
646 groupBox1Layout->addWidget( lRunSkip, 2, 0 );
647
648 tabLayout->addWidget( m_runGroup );
649
650 // Second groupbox
651 m_runSideGroup = new TQButtonGroup( i18n( "Run Around Side" ), m_tab2);
652 m_runSideGroup->setColumnLayout( 0, TQt::Vertical );
653 m_runSideGroup->layout()->setSpacing( KDialog::spacingHint() );
654 m_runSideGroup->layout()->setMargin( KDialog::marginHint() );
655 TQGridLayout *runSideLayout = new TQGridLayout( m_runSideGroup->layout() );
656 runSideLayout->setAlignment( TQt::AlignTop );
657
658 m_rRunLeft = new TQRadioButton( i18n( "Run Around", "&Left" ), m_runSideGroup );
659 runSideLayout->addWidget( m_rRunLeft, 0, 0 /*1*/ );
660
661 m_rRunRight = new TQRadioButton( i18n( "Run Around", "&Right" ), m_runSideGroup );
662 runSideLayout->addWidget( m_rRunRight, 1, 0 /*1*/ );
663
664 m_rRunBiggest = new TQRadioButton( i18n( "Run Around", "Lon&gest side" ), m_runSideGroup );
665 runSideLayout->addWidget( m_rRunBiggest, 2, 0 /*1*/ );
666
667#if 0 // TODO icons!
668 TQPixmap pixmap = KWBarIcon( "run_left" );
669 TQLabel *label = new TQLabel( m_runSideGroup );
670 label->setBackgroundPixmap( pixmap );
671 label->setFixedSize( pixmap.size() );
672 runSideLayout->addWidget( label, 0, 0 );
673
674 pixmap = KWBarIcon( "run_right" );
675 label = new TQLabel( m_runSideGroup );
676 label->setBackgroundPixmap( pixmap );
677 label->setFixedSize( pixmap.size() );
678 runSideLayout->addWidget( label, 1, 0 );
679
680 pixmap = KWBarIcon( "run_biggest" );
681 label = new TQLabel( m_runSideGroup );
682 label->setBackgroundPixmap( pixmap );
683 label->setFixedSize( pixmap.size() );
684 runSideLayout->addWidget( label, 2, 0 );
685#endif
686
687 tabLayout->addWidget( m_runSideGroup );
688
689 m_raDistConfigWidget = new KWFourSideConfigWidget( m_doc, i18n("Distance Between Frame && Text"), m_tab2 );
690 if ( m_frame )
691 m_raDistConfigWidget->setValues( TQMAX(0.00, m_frame->runAroundLeft()),
692 TQMAX(0.00, m_frame->runAroundRight()),
693 TQMAX(0.00, m_frame->runAroundTop()),
694 TQMAX(0.00, m_frame->runAroundBottom()) );
695 tabLayout->addWidget( m_raDistConfigWidget );
696
697
698
699 // Show current settings
700
701 // Runaround
702 bool show=true;
703 KWFrame::RunAround ra = KWFrame::RA_NO;
704 if ( m_frame )
705 ra = m_frame->runAround();
706 else {
707 KWFrame *f=m_allFrames.first();
708 ra = f->runAround();
709 f=m_allFrames.next();
710 while(f) {
711 if(ra != f->runAround()) show=false;
712 f=m_allFrames.next();
713 }
714 }
715
716 if(show) {
717 switch ( ra ) {
718 case KWFrame::RA_NO: m_rRunNo->setChecked( true ); break;
719 case KWFrame::RA_BOUNDINGRECT: m_rRunBounding->setChecked( true ); break;
720 case KWFrame::RA_SKIP: m_rRunSkip->setChecked( true ); break;
721 }
722 }
723
724 // Runaround side
725 show = true;
726 KWFrame::RunAroundSide rs = KWFrame::RA_BIGGEST;
727 if ( m_frame )
728 rs = m_frame->runAroundSide();
729 else {
730 KWFrame *f=m_allFrames.first();
731 rs = f->runAroundSide();
732 f = m_allFrames.next();
733 while(f) {
734 if(rs != f->runAroundSide()) show=false;
735 f=m_allFrames.next();
736 }
737 }
738
739 if(show) {
740 switch ( rs ) {
741 case KWFrame::RA_LEFT: m_rRunLeft->setChecked( true ); break;
742 case KWFrame::RA_RIGHT: m_rRunRight->setChecked( true ); break;
743 case KWFrame::RA_BIGGEST: m_rRunBiggest->setChecked( true ); break;
744 }
745 }
746
747 // Runaround gap
748 show=true;
749 double ragapLeft = 0;
750 double ragapRight = 0;
751 double ragapTop = 0;
752 double ragapBottom = 0;
753 if ( m_frame ) {
754 ragapLeft = m_frame->runAroundLeft();
755 ragapRight = m_frame->runAroundRight();
756 ragapTop = m_frame->runAroundTop();
757 ragapBottom = m_frame->runAroundBottom();
758 }
759 else {
760 KWFrame *f = m_allFrames.first();
761 ragapLeft = f->runAroundLeft();
762 ragapRight = f->runAroundRight();
763 ragapTop = f->runAroundTop();
764 ragapBottom = f->runAroundBottom();
765 for( f = m_allFrames.next() ; f ; f = m_allFrames.next() ) {
766 if( ragapLeft != f->runAroundLeft() ||
767 ragapRight != f->runAroundRight() ||
768 ragapTop != f->runAroundTop() ||
769 ragapBottom != f->runAroundBottom() )
770 show = false; // TODO special value in the spinbox
771 f = m_allFrames.next();
772 }
773 }
774
775 if(show)
776 m_raDistConfigWidget->setValues( ragapLeft, ragapRight, ragapTop, ragapBottom );
777
778 enableRunAround();
779
780 // Changing the type of runaround needs to enable/disable the runaround-side options
781 connect( m_runGroup, TQ_SIGNAL( clicked(int) ), this, TQ_SLOT( enableRunAround() ) );
782}
783
784void KWFrameDia::setupTab3(){ // TAB Frameset
785 /*
786 * here the user can select from the current TEXT framesets
787 * Afterwards (on ok) the frame should be checked if it is already owned by a
788 * frameset, if so that connection must be disconnected (if different) and
789 * framebehaviour will be copied from the frameset
790 * then the new connection should be made.
791 */
792 //kdDebug() << "setup tab 3 frameSet"<<endl;
793 m_tab3 = addPage( i18n( "Connect Text Frames" ) );
794
795 TQVBoxLayout *tabLayout = new TQVBoxLayout( m_tab3, 0, KDialog::spacingHint());
796
797 TQButtonGroup *myGroup = new TQButtonGroup(this);
798 myGroup->hide();
799
800 m_rExistingFrameset = new TQRadioButton( m_tab3, "m_rExistingFrameset" );
801 m_rExistingFrameset->setText( i18n("Select existing frameset to connect frame to:") );
802 tabLayout->addWidget( m_rExistingFrameset );
803 myGroup->insert(m_rExistingFrameset,1);
804 connect (m_rExistingFrameset, TQ_SIGNAL( toggled(bool)), this, TQ_SLOT(ensureValidFramesetSelected()));
805
806 TQHBoxLayout *layout2 = new TQHBoxLayout( 0, 0, 6);
807 TQSpacerItem* spacer = new TQSpacerItem( 20, 20, TQSizePolicy::Minimum, TQSizePolicy::Expanding );
808 layout2->addItem( spacer );
809
810 m_lFrameSList = new TQListView( m_tab3, "m_lFrameSList" );
811 m_lFrameSList->addColumn( i18n("No.") );
812 m_lFrameSList->addColumn( i18n("Frameset Name") );
813 m_lFrameSList->setAllColumnsShowFocus( true );
814 m_lFrameSList->header()->setMovingEnabled( false );
815 connect( m_lFrameSList, TQ_SIGNAL(selectionChanged ()),this,TQ_SLOT(selectExistingFrameset ()) );
816 connect (m_lFrameSList, TQ_SIGNAL( selectionChanged()), this, TQ_SLOT(ensureValidFramesetSelected()));
817
818 layout2->addWidget( m_lFrameSList );
819 tabLayout->addLayout( layout2 );
820
821 m_rNewFrameset = new TQRadioButton( m_tab3);
822 m_rNewFrameset->setText( i18n( "Create a new frameset" ) );
823 tabLayout->addWidget( m_rNewFrameset );
824 myGroup->insert(m_rNewFrameset,2);
825
826 TQFrame *line1 = new TQFrame( m_tab3 );
827 line1->setProperty( "frameShape", (int)TQFrame::HLine );
828 line1->setFrameShadow( TQFrame::Plain );
829 line1->setFrameShape( TQFrame::HLine );
830 tabLayout->addWidget( line1 );
831
832 TQHBoxLayout *layout1 = new TQHBoxLayout( 0, 0, 6 );
833 TQLabel *textLabel1 = new TQLabel( m_tab3 );
834 textLabel1->setText( i18n( "Name of frameset:" ) );
835 layout1->addWidget( textLabel1 );
836
837 m_eFrameSetName = new TQLineEdit( m_tab3 );
838 layout1->addWidget( m_eFrameSetName );
839 tabLayout->addLayout( layout1 );
840
841 int amount=0;
842 // now fill the gui.
843 for ( unsigned int i = 0; i < m_doc->frameSetCount(); i++ ) {
844 KWFrameSet * fs = m_doc->frameSet( i );
845 if ( i == 0 && m_doc->processingType() == KWDocument::WP )
846 continue;
847 if ( fs->type() != FT_TEXT || fs->isHeaderOrFooter() )
848 continue;
849 if ( fs->frameSetInfo() == KWFrameSet::FI_FOOTNOTE )
850 continue;
851 if ( fs->groupmanager() )
852 continue;
853 if ( fs->isDeleted() )
854 continue;
855 TQListViewItem *item = new TQListViewItem( m_lFrameSList );
856 item->setText( 0, TQString( "%1" ).arg( i + 1 ) );
857 item->setText( 1, fs->name() );
858 amount++;
859 if( m_frame && m_frame->frameSet() == fs ) {
860 m_lFrameSList->setSelected(item, true );
861 m_oldFrameSetName = fs->name();
862 m_rExistingFrameset->setChecked(true);
863 }
864 }
865 if(amount==0) {
866 m_rNewFrameset->setChecked(/*true*/false);
867 m_rNewFrameset->setEnabled(false);
868 m_rExistingFrameset->setEnabled(false);
869 m_lFrameSList->setEnabled(false);
870 }
871 //we can't create a new frame when we select
872 //multi frame!!!!
873 if ( m_allFrames.count() > 1 ) {
874 m_rNewFrameset->setChecked(false);
875 m_rNewFrameset->setEnabled(false);
876 myGroup->setRadioButtonExclusive( false );
877 }
878 if(m_frame && m_frame->frameSet() == 0) {
879 m_oldFrameSetName = m_doc->generateFramesetName( i18n( "Text Frameset %1" ) );
880 m_rNewFrameset->setChecked(true);
881 }
882 m_eFrameSetName->setText( m_oldFrameSetName );
883
884 connect( m_lFrameSList, TQ_SIGNAL( currentChanged( TQListViewItem * ) ),
885 this, TQ_SLOT( connectListSelected( TQListViewItem * ) ) );
886 connect(m_eFrameSetName, TQ_SIGNAL(textChanged ( const TQString & ) ),
887 this,TQ_SLOT(textNameFrameChanged ( const TQString & ) ) );
888 connect(m_eFrameSetName, TQ_SIGNAL(textChanged ( const TQString & )),
889 this,TQ_SLOT(textNameFrameChanged ( const TQString & ) ));
890 connect( m_rNewFrameset, TQ_SIGNAL(toggled (bool)),
891 this,TQ_SLOT(selectNewFrameset (bool)) );
892}
893
894void KWFrameDia::selectExistingFrameset() {
895 m_rExistingFrameset->setChecked(true);
896}
897
898void KWFrameDia::selectNewFrameset(bool on) {
899 if(!on) return;
900
901 TQListViewItem *frameSetItem = m_lFrameSList->selectedItem();
902 if ( !frameSetItem)
903 return;
904 TQString str = frameSetItem->text( 0 );
905 KWFrameSet *fs = m_doc->frameSet(str.toInt() - 1);
906
907 frameSetItem->setText(1, fs->name() );
908}
909
910void KWFrameDia::textNameFrameChanged ( const TQString &text )
911{
912 if(m_rExistingFrameset->isChecked()) {
913 TQListViewItem *item = m_lFrameSList->selectedItem();
914 if ( !item )
915 return;
916 item->setText(1, text );
917 }
918 if(m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked()) //when one of both is clicked.
919 enableButtonOK( !text.isEmpty() );
920 else
921 enableButtonOK( true );
922}
923
924void KWFrameDia::setupTab4() { // TAB Geometry
925 m_noSignal = true;
926
927 m_tab4 = addPage( i18n( "Geometry" ) );
928 TQGridLayout* grid4 = new TQGridLayout( m_tab4, 5, 1, 0, KDialog::spacingHint() );
929
930 m_floating = new TQCheckBox( i18n("Frame is inline"), m_tab4 );
931
932 connect( m_floating, TQ_SIGNAL( toggled(bool) ), this, TQ_SLOT( slotFloatingToggled(bool) ) );
933 int row = 0;
934 grid4->addMultiCellWidget( m_floating, row, row, 0, 1 );
935
936 row++;
937 m_protectSize = new TQCheckBox( i18n("Protect size and position"), m_tab4);
938 grid4->addMultiCellWidget( m_protectSize, row, row, 0, 1 );
939 connect( m_protectSize, TQ_SIGNAL( toggled(bool) ), this, TQ_SLOT( slotProtectSizeToggled(bool) ) );
940
941 /* ideally the following properties could be given to any floating frame:
942 Position: (y)
943 Top of frame
944 Top of paragraph
945 Above current line
946 At insertion point
947 Below current line
948 Bottom of paragraph
949 Bottom of frame
950 Absolute
951 Alignment: (x)
952 Left
953 Right
954 Center
955 Closest to binding
956 Further from binding
957 Absolute
958 */
959
960 m_grp1 = new TQGroupBox( i18n("Position"), m_tab4 );
961 TQGridLayout* pGrid = new TQGridLayout( m_grp1, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
962
963 m_lx = new TQLabel( i18n( "Left:" ), m_grp1 );
964 m_lx->resize( m_lx->sizeHint() );
965 pGrid->addWidget( m_lx, 1, 0 );
966
967 m_sx = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
968
969 m_sx->resize( m_sx->sizeHint() );
970 pGrid->addWidget( m_sx, 1, 1 );
971
972 m_ly = new TQLabel( i18n( "Top:" ), m_grp1 );
973 m_ly->resize( m_ly->sizeHint() );
974 pGrid->addWidget( m_ly, 1, 2 );
975
976 m_sy = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
977 m_sy->resize( m_sy->sizeHint() );
978 pGrid->addWidget( m_sy, 1, 3 );
979
980 m_lw = new TQLabel( i18n( "Width:" ), m_grp1 );
981 m_lw->resize( m_lw->sizeHint() );
982 pGrid->addWidget( m_lw, 2, 0 );
983
984 m_sw = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
985
986 m_sw->resize( m_sw->sizeHint() );
987 connect( m_sw, TQ_SIGNAL(valueChanged(double)),
988 this, TQ_SLOT(slotUpdateHeightForWidth(double)) );
989
990 pGrid->addWidget( m_sw, 2, 1 );
991
992 m_lh = new TQLabel( i18n( "Height:" ), m_grp1 );
993 m_lh->resize( m_lh->sizeHint() );
994 pGrid->addWidget( m_lh, 2, 2 );
995
996 m_sh = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
997 connect( m_sh, TQ_SIGNAL(valueChanged(double)),
998 this, TQ_SLOT(slotUpdateWidthForHeight(double)) );
999
1000 m_sh->resize( m_sh->sizeHint() );
1001
1002 pGrid->addWidget( m_sh, 2, 3 );
1003
1004 pGrid->setRowSpacing( 0, KDialog::spacingHint() + 5 );
1005
1006 row++;
1007 grid4->addMultiCellWidget( m_grp1, row, row, 0,1 );
1008
1009 if(m_frame) {
1010 m_paddingConfigWidget = new KWFourSideConfigWidget( m_doc, i18n("Margins"), m_tab4 );
1011 m_paddingConfigWidget->setValues( TQMAX(0.00, m_frame->paddingLeft()),
1012 TQMAX(0.00, m_frame->paddingRight()),
1013 TQMAX(0.00, m_frame->paddingTop()),
1014 TQMAX(0.00, m_frame->paddingBottom()) );
1015 row++;
1016 grid4->addMultiCellWidget( m_paddingConfigWidget, row, row, 0, 1 );
1017
1018 if ( m_tab1 && m_cbProtectContent )
1019 {
1020 m_paddingConfigWidget->setEnabled( !m_cbProtectContent->isChecked() );
1021 }
1022 }
1023 else
1024 {
1025 m_paddingConfigWidget = 0;
1026 }
1027
1028 initGeometrySettings();
1029
1030 if ( !m_frame || m_defaultFrameSetIncluded ) {
1031 // is multi frame, positions don't work for that..
1032 // also not for default frames.
1033 m_sx->setEnabled( false );
1034 m_sy->setEnabled( false );
1035 m_lx->setEnabled( false );
1036 m_ly->setEnabled( false );
1037 m_lw->setEnabled( false );
1038 m_lh->setEnabled( false );
1039 m_floating->setEnabled( false );
1040 }
1041
1042 if ( m_defaultFrameSetIncluded || m_mainFrameSetIncluded)
1043 {
1044 m_sw->setEnabled( false );
1045 m_sh->setEnabled( false );
1046 m_grp1->setEnabled( false );
1047 }
1048
1049 if ( m_mainFrameSetIncluded )
1050 {
1051 m_grp1->hide();
1052 m_floating->hide( );
1053 m_protectSize->hide();
1054 }
1055 m_noSignal=false;
1056
1057 ++row;
1058 grid4->setRowStretch( row, 1 );
1059}
1060
1061void KWFrameDia::initGeometrySettings()
1062{
1063 if ( m_frame ) {
1064 // is single frame dia. Fill position strings and checkboxes now.
1065
1066 // Can't use frame->pageNum() here since frameset might be 0
1067 int pageNum = m_doc->pageManager()->pageNumber(m_frame);
1068
1069 m_sx->setValue( KoUnit::toUserValue( m_frame->x(), m_doc->unit() ) );
1070 m_sy->setValue( KoUnit::toUserValue( m_frame->y() - m_doc->pageManager()->topOfPage(pageNum), m_doc->unit() ) );
1071 m_sw->setValue( KoUnit::toUserValue( m_frame->width(), m_doc->unit() ) );
1072 m_sh->setValue( KoUnit::toUserValue( m_frame->height(), m_doc->unit() ) );
1073
1074 calcRatio();
1075
1076 // userValue leads to some rounding -> store old values from the ones
1077 // displayed, so that the "change detection" in apply() works.
1078 m_oldX = m_sx->value();
1079 m_oldY = m_sy->value();
1080 m_oldW = m_sw->value();
1081 m_oldH = m_sh->value();
1082
1083#ifdef ALLOW_NON_INLINE_TABLES
1084 KWFrameSet * fs = m_frame->frameSet();
1085 if ( fs && fs->groupmanager() )
1086 m_floating->setText( i18n( "Table is inline" ) );
1087#else
1088 m_floating->hide();
1089#endif
1090
1091 m_floating->setChecked( m_frameSetFloating );
1092 m_protectSize->setChecked( m_frameSetProtectedSize);
1093 } else {
1094 // multi frame. Fill inline and protect checkbox, leave away the position strings.
1095 KWFrame *f=m_allFrames.first();
1096 KWFrameSet *fs=f->frameSet();
1097 bool ps=fs->isProtectSize();
1098 m_protectSize->setChecked( ps );
1099
1100 bool table=fs->groupmanager();
1101 if(table)
1102 fs=fs->groupmanager();
1103 bool inlineframe =fs->isFloating();
1104 m_floating->setChecked( inlineframe );
1105
1106 double commonWidth = f->width();
1107 double commonHeight = f->height();
1108 m_sw->setEnabled( true );
1109 m_sh->setEnabled( true );
1110
1111 f=m_allFrames.next();
1112 while(f) {
1113 KWFrameSet *fs=f->frameSet();
1114 if(ps != fs->isProtectSize()) {
1115 m_protectSize->setTristate();
1116 m_protectSize->setNoChange();
1117 }
1118 if(fs->groupmanager()) //table
1119 fs=fs->groupmanager();
1120 else
1121 table=false;
1122
1123 if(inlineframe != fs->isFloating()) {
1124 m_floating->setTristate();
1125 m_floating->setNoChange();
1126 }
1127
1128 if ( kAbs( f->width() - commonWidth ) > 1E-6 ) {
1129 kdDebug() << k_funcinfo << "width differs:" << f->width() << " " << commonWidth << endl;
1130 m_sw->setEnabled( false );
1131 }
1132 if ( kAbs( f->height() - commonHeight ) > 1E-6 ) {
1133 kdDebug() << k_funcinfo << "height differs:" << f->height() << " " << commonHeight << endl;
1134 m_sh->setEnabled( false );
1135 }
1136
1137 f=m_allFrames.next();
1138 }
1139 // TODO show a special value when frames have a different width/height
1140 if ( m_sw->isEnabled() )
1141 m_sw->setValue( KoUnit::toUserValue( commonWidth, m_doc->unit() ) );
1142 if ( m_sh->isEnabled() )
1143 m_sh->setValue( KoUnit::toUserValue( commonHeight, m_doc->unit() ) );
1144 if(table)
1145 {
1146#ifdef ALLOW_NON_INLINE_TABLES
1147 m_floating->setText( i18n( "Table is inline" ) );
1148#else
1149 m_floating->hide();
1150#endif
1151 }
1152 }
1153}
1154
1155void KWFrameDia::setupTab5() { // Tab Background fill/color
1156 m_tab5 = addPage( i18n("Background") );
1157 TQGridLayout* grid5 = new TQGridLayout( m_tab5, 0 /*auto*/, 2, 0, KDialog::spacingHint() );
1158
1159 int row = 0;
1160 if (!m_frame ) {
1161 m_overwriteColor = new TQCheckBox (i18n("Set new color on all selected frames"), m_tab5);
1162 grid5->addMultiCellWidget(m_overwriteColor,row,row,0,1);
1163 row++;
1164 }
1165 //brushPreview=new KWBrushStylePreview(m_tab5);
1166 //grid5->addMultiCellWidget(brushPreview,row,5,1,1);
1167
1168 m_transparentCB = new TQCheckBox( i18n( "Transparent background" ), m_tab5 );
1169 grid5->addWidget(m_transparentCB,row++,0);
1170 m_transparentCB->setEnabled( !m_mainFrameSetIncluded );
1171
1172 TQLabel *labelBgColor = new TQLabel( i18n( "Background color:" ), m_tab5 );
1173
1174 grid5->addWidget(labelBgColor,row++,0);
1175
1176 m_brushColor = new KColorButton( TQt::white, KWDocument::defaultBgColor(0), m_tab5 );
1177 grid5->addWidget(m_brushColor,row++,0);
1178
1179// connect( m_brushColor, TQ_SIGNAL( changed( const TQColor & ) ),
1180// this, TQ_SLOT( updateBrushPreview() ) );
1181
1182
1183 // ###########################
1184 // Fill styles are ugly and not WYSIWYG (due to being pixel-based)
1185 // Feature not in OOo either (they have a configurable level of transparency instead, much nicer)
1186#if 0
1187 l = new TQLabel( i18n( "Background style:" ), m_tab5 );
1188 grid5->addWidget(l,row++,0);
1189
1190 brushStyle = new TQComboBox( false,m_tab5, "BStyle" );
1191 grid5->addWidget(brushStyle,row++,0);
1192
1193 brushStyle->insertItem( i18n( "No Background Fill" ) );
1194 // xgettext:no-c-format
1195 brushStyle->insertItem( i18n( "100% Fill Pattern" ) );
1196 // xgettext:no-c-format
1197 brushStyle->insertItem( i18n( "94% Fill Pattern" ) );
1198 // xgettext:no-c-format
1199 brushStyle->insertItem( i18n( "88% Fill Pattern" ) );
1200 // xgettext:no-c-format
1201 brushStyle->insertItem( i18n( "63% Fill Pattern" ) );
1202 // xgettext:no-c-format
1203 brushStyle->insertItem( i18n( "50% Fill Pattern" ) );
1204 // xgettext:no-c-format
1205 brushStyle->insertItem( i18n( "37% Fill Pattern" ) );
1206 // xgettext:no-c-format
1207 brushStyle->insertItem( i18n( "12% Fill Pattern" ) );
1208 // xgettext:no-c-format
1209 brushStyle->insertItem( i18n( "6% Fill Pattern" ) );
1210 brushStyle->insertItem( i18n( "Horizontal Lines" ) );
1211 brushStyle->insertItem( i18n( "Vertical Lines" ) );
1212 brushStyle->insertItem( i18n( "Crossing Lines" ) );
1213 brushStyle->insertItem( i18n( "Diagonal Lines ( / )" ) );
1214 brushStyle->insertItem( i18n( "Diagonal Lines ( \\ )" ) );
1215 brushStyle->insertItem( i18n( "Diagonal Crossing Lines" ) );
1216 connect( brushStyle, TQ_SIGNAL( activated( int ) ),
1217 this, TQ_SLOT( updateBrushPreview() ) );
1218
1219 updateBrushPreview();
1220#endif
1221
1222 connect( m_transparentCB, TQ_SIGNAL( toggled( bool ) ), labelBgColor, TQ_SLOT( setDisabled( bool ) ) );
1223 connect( m_transparentCB, TQ_SIGNAL( toggled( bool ) ), m_brushColor, TQ_SLOT( setDisabled( bool ) ) );
1224 initBrush();
1225
1226 TQSpacerItem* spacer = new TQSpacerItem( 10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding);
1227 grid5->addItem( spacer,row,0 );
1228}
1229
1230void KWFrameDia::setupTab6() // Border style
1231{
1232 m_tab6 = addPage( i18n("&Borders") );
1233
1234 TQGridLayout *grid = new TQGridLayout( m_tab6, 8, 2, 0, KDialog::spacingHint() );
1235
1236 TQLabel * lStyle = new TQLabel( i18n( "St&yle:" ), m_tab6 );
1237 grid->addWidget( lStyle, 0, 0 );
1238
1239 m_cStyle = new TQComboBox( false, m_tab6 );
1240 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::SOLID ) );
1241 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH ) );
1242 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DOT ) );
1243 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH_DOT ) );
1244 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH_DOT_DOT ) );
1245 m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DOUBLE_LINE ) );
1246 lStyle->setBuddy( m_cStyle );
1247 grid->addWidget( m_cStyle, 1, 0 );
1248
1249 TQLabel * lWidth = new TQLabel( i18n( "&Width:" ), m_tab6 );
1250 grid->addWidget( lWidth, 2, 0 );
1251
1252 m_cWidth = new TQComboBox( false, m_tab6 );
1253 for( unsigned int i = 1; i <= 10; i++ )
1254 m_cWidth->insertItem(TQString::number(i));
1255 lWidth->setBuddy( m_cWidth );
1256 grid->addWidget( m_cWidth, 3, 0 );
1257
1258 TQLabel * lColor = new TQLabel( i18n( "Co&lor:" ), m_tab6 );
1259 grid->addWidget( lColor, 4, 0 );
1260
1261 m_bColor = new KColorButton( black,
1262 black,
1263 m_tab6 );
1264
1265 lColor->setBuddy( m_bColor );
1266 grid->addWidget( m_bColor, 5, 0 );
1267
1268 TQButtonGroup * bb = new TQHButtonGroup( m_tab6 );
1269 bb->setFrameStyle(TQFrame::NoFrame);
1270 m_bLeft = new TQPushButton(bb);
1271 m_bLeft->setPixmap( BarIcon( "borderleft" ) );
1272 m_bLeft->setToggleButton( true );
1273 m_bRight = new TQPushButton(bb);
1274 m_bRight->setPixmap( BarIcon( "borderright" ) );
1275 m_bRight->setToggleButton( true );
1276 m_bTop = new TQPushButton(bb);
1277 m_bTop->setPixmap( BarIcon( "bordertop" ) );
1278 m_bTop->setToggleButton( true );
1279 m_bBottom = new TQPushButton(bb);
1280 m_bBottom->setPixmap( BarIcon( "borderbottom" ) );
1281 m_bBottom->setToggleButton( true );
1282 grid->addWidget( bb, 6, 0 );
1283
1284 connect( m_bLeft, TQ_SIGNAL( toggled( bool ) ), this, TQ_SLOT( brdLeftToggled( bool ) ) );
1285 connect( m_bRight, TQ_SIGNAL( toggled( bool ) ), this, TQ_SLOT( brdRightToggled( bool ) ) );
1286 connect( m_bTop, TQ_SIGNAL( toggled( bool ) ), this, TQ_SLOT( brdTopToggled( bool ) ) );
1287 connect( m_bBottom, TQ_SIGNAL( toggled( bool ) ), this, TQ_SLOT( brdBottomToggled( bool ) ) );
1288
1289 initBorderSettings();
1290
1291 TQGroupBox *grp=new TQGroupBox( 0, TQt::Vertical, i18n( "Preview" ), m_tab6, "previewgrp" );
1292 grid->addMultiCellWidget( grp , 0, 7, 1, 1 );
1293 grp->layout()->setSpacing(KDialog::spacingHint());
1294 grp->layout()->setMargin(KDialog::marginHint());
1295 m_prev3 = new KoBorderPreview( grp );
1296 TQVBoxLayout *lay1 = new TQVBoxLayout( grp->layout() );
1297 lay1->addWidget(m_prev3);
1298
1299 connect( m_prev3, TQ_SIGNAL( choosearea(TQMouseEvent * ) ),
1300 this, TQ_SLOT( slotPressEvent(TQMouseEvent *) ) );
1301
1302 // update the bordet preview widget
1303 m_prev3->setLeftBorder( m_leftBorder );
1304 m_prev3->setRightBorder( m_rightBorder );
1305 m_prev3->setTopBorder( m_topBorder );
1306 m_prev3->setBottomBorder( m_bottomBorder );
1307
1308 grid->setRowStretch( 7, 1 );
1309 grid->setColStretch( 1, 1 );
1310}
1311
1312void KWFrameDia::initBorderSettings()
1313{
1314 KWFrame *f = m_mainFrame ? m_mainFrame : ( m_frame ? m_frame : m_allFrames.first() );
1315 m_leftBorder = f->leftBorder();
1316 m_rightBorder = f->rightBorder();
1317 m_topBorder = f->topBorder();
1318 m_bottomBorder = f->bottomBorder();
1319}
1320
1321#define OFFSETX 15
1322#define OFFSETY 7
1323#define Ko_SPACE 30
1324void KWFrameDia::slotPressEvent(TQMouseEvent *ev)
1325{
1326 TQRect r = m_prev3->contentsRect();
1327 TQRect rect(r.x()+OFFSETX,r.y()+OFFSETY,r.width()-OFFSETX,r.y()+OFFSETY+Ko_SPACE);
1328 if(rect.contains(TQPoint(ev->x(),ev->y())))
1329 {
1330 if( ( ((int)m_topBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_topBorder.color != m_bColor->color() )
1331 ||(m_topBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bTop->isOn() )
1332 {
1333 m_topBorder.setPenWidth( m_cWidth->currentText().toInt() );
1334 m_topBorder.color = TQColor( m_bColor->color() );
1335 m_topBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
1336 m_prev3->setTopBorder( m_topBorder );
1337 }
1338 else
1339 m_bTop->setOn(!m_bTop->isOn());
1340 }
1341 rect.setCoords(r.x()+OFFSETX,r.height()-OFFSETY-Ko_SPACE,r.width()-OFFSETX,r.height()-OFFSETY);
1342 if(rect.contains(TQPoint(ev->x(),ev->y())))
1343 {
1344 if( ( ((int)m_bottomBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_bottomBorder.color != m_bColor->color() )
1345 ||(m_bottomBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bBottom->isOn() )
1346 {
1347 m_bottomBorder.setPenWidth(m_cWidth->currentText().toInt());
1348 m_bottomBorder.color = TQColor( m_bColor->color() );
1349 m_bottomBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
1350 m_prev3->setBottomBorder( m_bottomBorder );
1351 }
1352 else
1353 m_bBottom->setOn(!m_bBottom->isOn());
1354 }
1355
1356 rect.setCoords(r.x()+OFFSETX,r.y()+OFFSETY,r.x()+Ko_SPACE+OFFSETX,r.height()-OFFSETY);
1357 if(rect.contains(TQPoint(ev->x(),ev->y())))
1358 {
1359
1360 if( ( ((int)m_leftBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_leftBorder.color != m_bColor->color() )
1361 ||(m_leftBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bLeft->isOn() )
1362 {
1363 m_leftBorder.setPenWidth( m_cWidth->currentText().toInt());
1364 m_leftBorder.color = TQColor( m_bColor->color() );
1365 m_leftBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
1366 m_prev3->setLeftBorder( m_leftBorder );
1367 }
1368 else
1369 m_bLeft->setOn(!m_bLeft->isOn());
1370 }
1371 rect.setCoords(r.width()-OFFSETX-Ko_SPACE,r.y()+OFFSETY,r.width()-OFFSETX,r.height()-OFFSETY);
1372 if(rect.contains(TQPoint(ev->x(),ev->y())))
1373 {
1374
1375 if( ( ((int)m_rightBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_rightBorder.color != m_bColor->color() )
1376 ||(m_rightBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bRight->isOn() )
1377 {
1378 m_rightBorder.setPenWidth( m_cWidth->currentText().toInt());
1379 m_rightBorder.color = m_bColor->color();
1380 m_rightBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
1381 m_prev3->setRightBorder( m_rightBorder );
1382 }
1383 else
1384 m_bRight->setOn(!m_bRight->isOn());
1385 }
1386}
1387#undef OFFSETX
1388#undef OFFSETY
1389#undef Ko_SPACE
1390
1391
1392void KWFrameDia::brdLeftToggled( bool on )
1393{
1394 if ( !on )
1395 m_leftBorder.setPenWidth(0);
1396 else {
1397 m_leftBorder.setPenWidth(m_cWidth->currentText().toInt());
1398 m_leftBorder.color = m_bColor->color();
1399 m_leftBorder.setStyle(KoBorder::getStyle( m_cStyle->currentText() ));
1400 }
1401 m_prev3->setLeftBorder( m_leftBorder );
1402}
1403
1404void KWFrameDia::brdRightToggled( bool on )
1405{
1406 if ( !on )
1407 m_rightBorder.setPenWidth(0);
1408 else {
1409 m_rightBorder.setPenWidth(m_cWidth->currentText().toInt());
1410 m_rightBorder.color = m_bColor->color();
1411 m_rightBorder.setStyle( KoBorder::getStyle( m_cStyle->currentText() ));
1412 }
1413 m_prev3->setRightBorder( m_rightBorder );
1414}
1415
1416void KWFrameDia::brdTopToggled( bool on )
1417{
1418 if ( !on )
1419 m_topBorder.setPenWidth(0);
1420 else {
1421 m_topBorder.setPenWidth(m_cWidth->currentText().toInt());
1422 m_topBorder.color = m_bColor->color();
1423 m_topBorder.setStyle(KoBorder::getStyle( m_cStyle->currentText() ));
1424 }
1425 m_prev3->setTopBorder( m_topBorder );
1426}
1427
1428void KWFrameDia::brdBottomToggled( bool on )
1429{
1430 if ( !on )
1431 m_bottomBorder.setPenWidth ( 0 );
1432 else {
1433 m_bottomBorder.setPenWidth( m_cWidth->currentText().toInt());
1434 m_bottomBorder.color = m_bColor->color();
1435 m_bottomBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
1436 }
1437 m_prev3->setBottomBorder( m_bottomBorder );
1438}
1439
1440void KWFrameDia::slotProtectContentChanged( bool b )
1441{
1442 if (m_tab4 && !m_noSignal && m_paddingConfigWidget) {
1443 m_paddingConfigWidget->setEnabled( !b );
1444 }
1445}
1446
1447void KWFrameDia::slotUpdateWidthForHeight(double height)
1448{
1449 if ( !m_cbAspectRatio || m_cbAspectRatio->state() != TQButton::NoChange)
1450 return;
1451 if ( m_heightByWidthRatio == 0 )
1452 return; // avoid DBZ
1453 m_sw->setValue( height / m_heightByWidthRatio );
1454
1455}
1456
1457void KWFrameDia::slotUpdateHeightForWidth( double width )
1458{
1459 if ( !m_cbAspectRatio || m_cbAspectRatio->state() != TQButton::NoChange)
1460 return;
1461 m_sh->setValue( width * m_heightByWidthRatio );
1462}
1463
1464void KWFrameDia::slotKeepRatioToggled(bool on)
1465{
1466 if ( !on || !m_sw || !m_sh) return;
1467 calcRatio();
1468}
1469void KWFrameDia::ensureValidFramesetSelected()
1470{
1471 enableButtonOK( m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked() && m_lFrameSList->selectedItem() != NULL);
1472}
1473
1474void KWFrameDia::calcRatio()
1475{
1476 if ( m_sw->value() == 0 )
1477 m_heightByWidthRatio = 1.0; // arbitrary
1478 else
1479 m_heightByWidthRatio = m_sh->value() / m_sw->value();
1480}
1481
1482void KWFrameDia::initBrush()
1483{
1484 bool allFramesSame=true;
1485 if ( m_frame )
1486 m_newBrushStyle = m_frame->backgroundColor();
1487 else {
1488 KWFrame *f=m_allFrames.first();
1489 m_newBrushStyle = f->backgroundColor();
1490 f=m_allFrames.next();
1491 while(f) {
1492 if(m_newBrushStyle != f->backgroundColor()) {
1493 allFramesSame=false;
1494 break;
1495 }
1496 f=m_allFrames.next();
1497 }
1498 m_overwriteColor->setChecked(allFramesSame);
1499 }
1500
1501 m_transparentCB->setChecked( m_newBrushStyle.style() == NoBrush );
1502
1503#if 0
1504 switch ( m_newBrushStyle.style() )
1505 {
1506 case NoBrush:
1507 brushStyle->setCurrentItem( 0 );
1508 break;
1509 case SolidPattern:
1510 brushStyle->setCurrentItem( 1 );
1511 break;
1512 case Dense1Pattern:
1513 brushStyle->setCurrentItem( 2 );
1514 break;
1515 case Dense2Pattern:
1516 brushStyle->setCurrentItem( 3 );
1517 break;
1518 case Dense3Pattern:
1519 brushStyle->setCurrentItem( 4 );
1520 break;
1521 case Dense4Pattern:
1522 brushStyle->setCurrentItem( 5 );
1523 break;
1524 case Dense5Pattern:
1525 brushStyle->setCurrentItem( 6 );
1526 break;
1527 case Dense6Pattern:
1528 brushStyle->setCurrentItem( 7 );
1529 break;
1530 case Dense7Pattern:
1531 brushStyle->setCurrentItem( 8 );
1532 break;
1533 case HorPattern:
1534 brushStyle->setCurrentItem( 9 );
1535 break;
1536 case VerPattern:
1537 brushStyle->setCurrentItem( 10 );
1538 break;
1539 case CrossPattern:
1540 brushStyle->setCurrentItem( 11 );
1541 break;
1542 case BDiagPattern:
1543 brushStyle->setCurrentItem( 12 );
1544 break;
1545 case FDiagPattern:
1546 brushStyle->setCurrentItem( 13 );
1547 break;
1548 case DiagCrossPattern:
1549 brushStyle->setCurrentItem( 14 );
1550 break;
1551 case CustomPattern:
1552 break;
1553 }
1554#endif
1555
1556 TQColor col = KWDocument::resolveBgColor( m_newBrushStyle.color(), 0 );
1557 m_brushColor->setColor( col );
1558}
1559
1560TQBrush KWFrameDia::frameBrushStyle() const
1561{
1562 TQBrush brush;
1563
1564 brush.setStyle( m_transparentCB->isChecked() ? TQt::NoBrush : TQt::SolidPattern );
1565
1566#if 0
1567 switch ( brushStyle->currentItem() )
1568 {
1569 case 0:
1570 brush.setStyle( NoBrush );
1571 break;
1572 case 1:
1573 brush.setStyle( SolidPattern );
1574 break;
1575 case 2:
1576 brush.setStyle( Dense1Pattern );
1577 break;
1578 case 3:
1579 brush.setStyle( Dense2Pattern );
1580 break;
1581 case 4:
1582 brush.setStyle( Dense3Pattern );
1583 break;
1584 case 5:
1585 brush.setStyle( Dense4Pattern );
1586 break;
1587 case 6:
1588 brush.setStyle( Dense5Pattern );
1589 break;
1590 case 7:
1591 brush.setStyle( Dense6Pattern );
1592 break;
1593 case 8:
1594 brush.setStyle( Dense7Pattern );
1595 break;
1596 case 9:
1597 brush.setStyle( HorPattern );
1598 break;
1599 case 10:
1600 brush.setStyle( VerPattern );
1601 break;
1602 case 11:
1603 brush.setStyle( CrossPattern );
1604 break;
1605 case 12:
1606 brush.setStyle( BDiagPattern );
1607 break;
1608 case 13:
1609 brush.setStyle( FDiagPattern );
1610 break;
1611 case 14:
1612 brush.setStyle( DiagCrossPattern );
1613 break;
1614 }
1615#endif
1616
1617 brush.setColor( m_brushColor->color() );
1618
1619 return brush;
1620}
1621
1622#if 0
1623void KWFrameDia::updateBrushPreview()
1624{
1625 if(brushStyle->currentItem()==0) {
1626 brushPreview->hide();
1627 } else {
1628 brushPreview->show();
1629 brushPreview->setBrush(frameBrushStyle());
1630 brushPreview->repaint(true);
1631 }
1632}
1633#endif
1634
1635// Called when "m_reconnect" or "no followup" is checked
1636void KWFrameDia::setFrameBehaviorInputOn() {
1637 if ( m_tab4 && m_floating->isChecked() )
1638 return;
1639 if( m_rAppendFrame && m_rResizeFrame && m_rNoShow /*&& !m_rAppendFrame->isEnabled()*/ ) {
1640 if(m_frameBehavior== KWFrame::AutoExtendFrame) {
1641 m_rResizeFrame->setChecked(true);
1642 } else if (m_frameBehavior== KWFrame::AutoCreateNewFrame) {
1643 m_rAppendFrame->setChecked(true);
1644 } else {
1645 m_rNoShow->setChecked(true);
1646 }
1647 m_rResizeFrame->setEnabled(true);
1648 // Can't have "create a new page" if "no followup", that wouldn't work
1649 kdDebug() << "setFrameBehaviorInputOn: m_reconnect->isChecked()==" << m_reconnect->isChecked() << endl;
1650 m_rAppendFrame->setEnabled( m_reconnect->isChecked() );
1651 m_rNoShow->setEnabled(true);
1652 }
1653}
1654
1655// Called when "place a copy" is checked
1656void KWFrameDia::setFrameBehaviorInputOff() {
1657 if ( m_tab4 && m_floating->isChecked() )
1658 return;
1659 if( m_rAppendFrame && m_rResizeFrame && m_rNoShow && m_rAppendFrame->isEnabled() ) {
1660 if(m_rResizeFrame->isChecked()) {
1661 m_frameBehavior=KWFrame::AutoExtendFrame;
1662 } else if ( m_rAppendFrame->isChecked()) {
1663 m_frameBehavior=KWFrame::AutoCreateNewFrame;
1664 } else {
1665 m_frameBehavior=KWFrame::Ignore;
1666 }
1667 // In "Place a copy" mode, we can't have "create new page if text too long"
1668 if ( m_rAppendFrame->isChecked() )
1669 m_rNoShow->setChecked(true);
1670 m_rAppendFrame->setEnabled(false);
1671 m_rResizeFrame->setEnabled(true);
1672 m_rNoShow->setEnabled(true);
1673 }
1674}
1675
1676void KWFrameDia::enableSizeAndPosition()
1677{
1678 bool canMove = ( m_floating->state() == TQButton::Off ) // can move if no frame is floating
1679 && ( m_protectSize->state() == TQButton::Off ) // protects size too
1680 && !m_defaultFrameSetIncluded // those can't be moved
1681 && m_frame; // can't move if multiple frames selected
1682 m_sx->setEnabled( canMove );
1683 m_sy->setEnabled( canMove );
1684 bool canResize = ( m_protectSize->state() == TQButton::Off ) // can resize if no frame is protect-size'd
1685 && !m_defaultFrameSetIncluded; // those can't be resized
1686 m_sw->setEnabled( canResize );
1687 m_sh->setEnabled( canResize );
1688}
1689
1690void KWFrameDia::slotProtectSizeToggled(bool)
1691{
1692 enableSizeAndPosition();
1693}
1694
1695void KWFrameDia::slotFloatingToggled(bool b)
1696{
1697 enableSizeAndPosition();
1698 if (m_tab1 && m_rAppendFrame && m_rResizeFrame && m_rNoShow ) {
1699 m_cbCopy->setEnabled( !b ); // 'copy' irrelevant for floating frames.
1700 if ( m_rAppendFrame )
1701 {
1702 m_rAppendFrame->setEnabled( !b ); // 'create new page' irrelevant for floating frames.
1703 if ( b && m_rAppendFrame->isChecked() )
1704 m_rNoShow->setChecked( true );
1705 }
1706 enableOnNewPageOptions();
1707 if ( b ) {
1708 m_noFollowup->setChecked( true );
1709 m_cbCopy->setChecked( false );
1710 } else {
1711 // Revert to non-inline frame stuff
1712 m_rResizeFrame->setEnabled(true);
1713 m_rAppendFrame->setEnabled(true);
1714 m_rNoShow->setEnabled(true);
1715 }
1716 }
1717
1718 enableRunAround();
1719}
1720
1721// Enable or disable the "on new page" options
1722void KWFrameDia::enableOnNewPageOptions()
1723{
1724 if ( m_tab1 )
1725 {
1726 bool f = m_tab4 && m_floating->isChecked();
1727 // 'what happens on new page' is irrelevant for floating frames
1728 m_reconnect->setEnabled( !f );
1729 m_noFollowup->setEnabled( !f );
1730 m_copyRadio->setEnabled( !f );
1731
1732 if( m_frameType != FT_TEXT )
1733 m_reconnect->setEnabled( false );
1734 else if(m_frame) {
1735 KWFrameSet *fs = m_frame->frameSet(); // 0 when creating a frame
1736 if ( fs && (fs->isHeaderOrFooter() || fs->isFootEndNote() ))
1737 {
1738 m_reconnect->setEnabled( false );
1739 m_noFollowup->setEnabled( false );
1740 }
1741 }
1742 }
1743}
1744
1745void KWFrameDia::enableRunAround()
1746{
1747 if ( m_tab2 )
1748 {
1749 if ( m_tab4 && m_floating->isChecked() ) {
1750 m_runGroup->setEnabled( false ); // Runaround options don't make sense for floating frames
1751 } else
1752 {
1753 if ( m_frame && m_frame->frameSet() )
1754 m_runGroup->setEnabled( !m_frameSetFloating && !m_frame->frameSet()->isMainFrameset() && !m_frame->frameSet()->isHeaderOrFooter() && !m_frame->frameSet()->isFootEndNote() );
1755 else
1756 m_runGroup->setEnabled( true );
1757 }
1758 m_runSideGroup->setEnabled( m_runGroup->isEnabled() && m_rRunBounding->isChecked() );
1759 m_raDistConfigWidget->setEnabled( m_runGroup->isEnabled() &&
1760 ( m_rRunBounding->isChecked() || m_rRunSkip->isChecked() ) );
1761 }
1762}
1763
1764bool KWFrameDia::applyChanges()
1765{
1766 kdDebug() << "KWFrameDia::applyChanges"<<endl;
1767 KWFrame *frameCopy = 0L;
1768 bool isNewFrame=false;
1769 if(m_frame) { // only do undo/redo when we have 1 frame to change for now..
1770 frameCopy = m_frame->getCopy(); // keep a copy of the original (for undo/redo)
1771 isNewFrame = m_frame->frameSet() == 0L; // true if we are creating a newframe
1772 }
1773 TQString name=TQString();
1774
1775 KMacroCommand * macroCmd=0L;
1776 if ( m_tab3 ) { // TAB Frameset
1777 // Frame/Frameset belonging, and frameset naming
1778 // We basically have three cases:
1779 // * Creating a new frame (fs==0), and creating a frameset (m_rNewFrameset selected)
1780 // * Creating a frame (fs==0), and attaching to an existing frameset (other)
1781 // * Editing a frame (fs!=0), possibly changing the frameset attachment (maybe creating a new one)
1782
1783 name = m_eFrameSetName->text();
1784 if ( name.isEmpty() ) // Don't allow empty names
1785 name = m_doc->generateFramesetName( i18n( "Text Frameset %1" ) );
1786 KWFrameSet *fs = 0L;
1787 TQListViewItem *frameSetItem = m_lFrameSList->selectedItem();
1788 if(frameSetItem) {
1789 TQString str = frameSetItem->text( 0 );
1790 fs = m_doc->frameSet(str.toInt() - 1);
1791 }
1792 if(m_rNewFrameset->isChecked()) { // create a new FS.
1793 if(m_frame && m_frame->frameSet()) {
1794 // disconnect.
1795 if(! mayDeleteFrameSet( static_cast<KWTextFrameSet*>(m_frame->frameSet())))
1796 return false;
1797 m_frame->frameSet()->deleteFrame( m_frame, false );
1798 } else {
1799 // first check all frames and ask the user if its ok to disconnect.
1800 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
1801 if(! mayDeleteFrameSet( static_cast<KWTextFrameSet*>(f->frameSet())))
1802 return false;
1803 }
1804 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
1805 f->frameSet()->deleteFrame( f, false );
1806 }
1807 } else if(m_rExistingFrameset->isChecked()) { // rename and/or m_reconnect a new frameset for this frame.
1808 if(frameSetItem && (fs->name() != frameSetItem->text( 1 ))) { // rename FS.
1809 if(!macroCmd)
1810 macroCmd = new KMacroCommand( i18n("Rename Frameset") );
1811 // Rename frameset
1812 typedef KoSetPropCommand<TQString, KWFrameSet, &KWFrameSet::setName> FramesetNameCommand;
1813 FramesetNameCommand* cmd = new FramesetNameCommand( fs, i18n( "Rename Frameset" ), fs->name(), frameSetItem->text( 1 ) );
1814 macroCmd->addCommand(cmd);
1815 cmd->execute();
1816 }
1817 if(m_frame && fs ) {
1818 if(m_frame->frameSet() != fs) {
1819 if(m_frame->frameSet()!=0) {
1820 // m_reconnect.
1821 if(! mayDeleteFrameSet( dynamic_cast<KWTextFrameSet*>(m_frame->frameSet())))
1822 return false;
1823 m_frame->frameSet()->deleteFrame( m_frame, false );
1824 }
1825 fs->addFrame(m_frame);
1826 }
1827 } else if ( fs ){
1828 // first check all frames and ask the user if its ok to m_reconnect.
1829 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
1830 if(f->frameSet() != fs) { // m_reconnect.
1831 if(! mayDeleteFrameSet( dynamic_cast<KWTextFrameSet*>(f->frameSet())))
1832 return false;
1833 }
1834 }
1835 if ( fs )
1836 {
1837 // then do the reconnects.
1838 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
1839 KWFrameSet *fs2=f->frameSet();
1840 if(! (fs2->isHeaderOrFooter() || fs2->isMainFrameset()) ) {
1841 if(fs2 != fs) { // m_reconnect.
1842 f->frameSet()->deleteFrame( f, false );
1843 fs->addFrame(f);
1844 }
1845 }
1846 }
1847 }
1848 }
1849 }
1850 if(m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked()) {
1851 // check if new name is unique
1852 for (TQPtrListIterator<KWFrameSet> fit = m_doc->framesetsIterator(); fit.current() ; ++fit ) {
1853 if ( !fit.current()->isDeleted() && // Allow to reuse a deleted frameset's name
1854 fs != fit.current() && fit.current()->name() == name) {
1855 if ( m_rNewFrameset->isChecked() )
1856 KMessageBox::sorry( this,
1857 i18n( "A new frameset with the name '%1' "
1858 "can not be made because a frameset with that name "
1859 "already exists. Please enter another name or select "
1860 "an existing frameset from the list.").arg(name));
1861 else
1862 KMessageBox::sorry( this,
1863 i18n( "A frameset with the name '%1' "
1864 "already exists. Please enter another name." ).arg(name) );
1865 m_eFrameSetName->setText(m_oldFrameSetName);
1866 return false;
1867 }
1868 }
1869 }
1870 }
1871 if ( m_tab1 ) { // TAB Frame Options
1872 // Copy
1873 if(m_frame)
1874 m_frame->setCopy( m_cbCopy->isChecked() );
1875 else if(m_cbCopy->state() != TQButton::NoChange) {
1876 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
1877 if(f == f->frameSet()->frame(0)) continue; // skip first frame of any frameset.
1878 f->setCopy( m_cbCopy->isChecked() );
1879 }
1880 }
1881
1882 // FrameBehavior
1883 if ( m_frameType == FT_TEXT )
1884 {
1885 bool update=true;
1886 KWFrame::FrameBehavior fb=KWFrame::AutoCreateNewFrame;
1887 if(m_rResizeFrame->isChecked())
1888 fb = KWFrame::AutoExtendFrame;
1889 else if ( m_rAppendFrame->isChecked())
1890 fb = KWFrame::AutoCreateNewFrame;
1891 else if ( m_rNoShow->isChecked())
1892 fb = KWFrame::Ignore;
1893 else
1894 update=false;
1895
1896 if(m_frame)
1897 if(m_cbAllFrames->isChecked() && m_frame->frameSet())
1898 m_frame->frameSet()->setFrameBehavior(fb);
1899 else
1900 m_frame->setFrameBehavior(fb);
1901 else if(update) {
1902 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
1903 if(m_cbAllFrames->isChecked())
1904 f->frameSet()->setFrameBehavior(fb);
1905 else
1906 f->setFrameBehavior(fb);
1907 }
1908 if ( m_frame && m_frame->frameSet())
1909 {
1910 KWTextFrameSet * frm=static_cast<KWTextFrameSet *>( m_frame->frameSet() );
1911 if(frm->textObject()->protectContent()!=m_cbProtectContent->isChecked())
1912 {
1913 if(!macroCmd)
1914 macroCmd = new KMacroCommand( i18n("Protect Content") );
1915 KWProtectContentCommand * cmd = new KWProtectContentCommand( i18n("Protect Content"), frm,m_cbProtectContent->isChecked() );
1916 cmd->execute();
1917 macroCmd->addCommand(cmd);
1918 }
1919 }
1920 else
1921 {
1922 if ( m_cbProtectContent->state() != TQButton::NoChange)
1923 {
1924 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
1925 {
1926 KWTextFrameSet * frm=dynamic_cast<KWTextFrameSet *>( f->frameSet() );
1927 if ( frm )
1928 {
1929 if(frm->textObject()->protectContent()!=m_cbProtectContent->isChecked())
1930 {
1931 if(!macroCmd)
1932 macroCmd = new KMacroCommand( i18n("Protect Content") );
1933 KWProtectContentCommand * cmd = new KWProtectContentCommand( i18n("Protect Content"), frm,m_cbProtectContent->isChecked() );
1934 cmd->execute();
1935 macroCmd->addCommand(cmd);
1936 }
1937 }
1938
1939 }
1940 }
1941 }
1942
1943 }
1944 // NewFrameBehavior
1945 bool update=true;
1946 KWFrame::NewFrameBehavior nfb=KWFrame::Reconnect;
1947 if( m_reconnect && m_reconnect->isChecked() )
1948 nfb = KWFrame::Reconnect;
1949 else if ( m_noFollowup->isChecked() )
1950 nfb = KWFrame::NoFollowup;
1951 else if ( m_copyRadio->isChecked() )
1952 nfb = KWFrame::Copy;
1953 else
1954 update=false;
1955
1956 if(m_frame)
1957 if(m_cbAllFrames->isChecked() && m_frame->frameSet())
1958 m_frame->frameSet()->setNewFrameBehavior(nfb);
1959 else
1960 m_frame->setNewFrameBehavior(nfb);
1961 else if(update)
1962 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
1963 if(m_cbAllFrames->isChecked())
1964 f->frameSet()->setNewFrameBehavior(nfb);
1965 else
1966 f->setNewFrameBehavior(nfb);
1967
1968 // aspect ratio
1969 if ( m_cbAspectRatio && (m_frameType==FT_PICTURE))
1970 {
1971 typedef KoSetBasicPropCommand<bool, KWPictureFrameSet, &KWPictureFrameSet::setKeepAspectRatio> FramesetSetKeepAspectRatioCommand;
1972 if(m_frame) {
1973 KWPictureFrameSet * frm=static_cast<KWPictureFrameSet *>( m_frame->frameSet() );
1974 if ( frm->keepAspectRatio() != m_cbAspectRatio->isChecked() )
1975 {
1976 if(!macroCmd)
1977 macroCmd = new KMacroCommand( i18n("Frame Properties") );
1978 FramesetSetKeepAspectRatioCommand* cmd = new FramesetSetKeepAspectRatioCommand( frm, TQString(), frm->keepAspectRatio(), m_cbAspectRatio->isChecked() );
1979
1980 cmd->execute();
1981
1982 macroCmd->addCommand(cmd);
1983 }
1984 } else if(m_cbAspectRatio->state() != TQButton::NoChange) {
1985 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
1986 KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
1987 if(fs) {
1988 if(fs->keepAspectRatio()!=m_cbAspectRatio->isChecked())
1989 {
1990 if(!macroCmd)
1991 macroCmd = new KMacroCommand( i18n("Frame Properties") );
1992 FramesetSetKeepAspectRatioCommand* cmd = new FramesetSetKeepAspectRatioCommand( fs, TQString(), fs->keepAspectRatio(), m_cbAspectRatio->isChecked() );
1993
1994 cmd->execute();
1995
1996 macroCmd->addCommand(cmd);
1997 }
1998 }
1999 }
2000 }
2001 }
2002 }
2003 if ( m_tab2 ) { // TAB Text Runaround
2004 // Run around
2005 KWFrame::RunAround ra=KWFrame::RA_BOUNDINGRECT;
2006 bool update=true;
2007 if ( m_rRunNo->isChecked() )
2008 ra = KWFrame::RA_NO;
2009 else if ( m_rRunBounding->isChecked() )
2010 ra = KWFrame::RA_BOUNDINGRECT;
2011 else if ( m_rRunSkip->isChecked() )
2012 ra = KWFrame::RA_SKIP;
2013 else
2014 update=false;
2015 if(m_frame)
2016 m_frame->setRunAround(ra);
2017 else if (update) {
2018 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
2019 f->setRunAround(ra);
2020 }
2021
2022 // Run around side.
2023 KWFrame::RunAroundSide rs=KWFrame::RA_BIGGEST;
2024 update=true;
2025 if ( m_rRunLeft->isChecked() )
2026 rs = KWFrame::RA_LEFT;
2027 else if ( m_rRunRight->isChecked() )
2028 rs = KWFrame::RA_RIGHT;
2029 else if ( m_rRunBiggest->isChecked() )
2030 rs = KWFrame::RA_BIGGEST;
2031 else
2032 update=false;
2033 if(m_frame)
2034 m_frame->setRunAroundSide(rs);
2035 else if (update) {
2036 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
2037 f->setRunAroundSide(rs);
2038 }
2039
2040 // Run around gap.
2041 double runAroundLeft = m_raDistConfigWidget->leftValue();
2042 double runAroundRight = m_raDistConfigWidget->rightValue();
2043 double runAroundTop = m_raDistConfigWidget->topValue();
2044 double runAroundBottom = m_raDistConfigWidget->bottomValue();
2045
2046 if(m_frame) {
2047 m_frame->setRunAroundGap( runAroundLeft, runAroundRight, runAroundTop, runAroundBottom );
2048 }
2049 else
2050 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
2051 f->setRunAroundGap( runAroundLeft, runAroundRight, runAroundTop, runAroundBottom );
2052 }
2053 if(m_tab5) { // Tab Background fill/color
2054 TQBrush tmpBrush=frameBrushStyle();
2055 if(m_frame) {
2056 if ( tmpBrush != KWDocument::resolveBgBrush( m_frame->backgroundColor() ) ) {
2057 m_frame->setBackgroundColor(tmpBrush);
2058 }
2059 } else if(m_overwriteColor->isChecked()) {
2060 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
2061 f->setBackgroundColor(tmpBrush);
2062 }
2063 }
2064
2065
2066 double px=0.0;
2067 double py=0.0;
2068 double pw=0.0;
2069 double ph=0.0;
2070 double uLeft = 0.0;
2071 double uTop = 0.0;
2072 double uBottom = 0.0;
2073 double uRight = 0.0;
2074 if(m_tab4) { // TAB Geometry
2075 if ( m_frame ) {
2076 px = TQMAX( 0, m_sx->value() );
2077 int pageNum = m_doc->pageManager()->pageNumber(m_frame);
2078 py = TQMAX( 0, m_sy->value() ) + m_doc->pageManager()->topOfPage(pageNum);
2079 }
2080 pw = TQMAX( m_sw->value(), 0 );
2081 ph = TQMAX( m_sh->value(), 0 );
2082 if ( m_paddingConfigWidget )
2083 {
2084 uLeft = m_paddingConfigWidget->leftValue();
2085 uRight = m_paddingConfigWidget->rightValue();
2086 uTop = m_paddingConfigWidget->topValue();
2087 uBottom = m_paddingConfigWidget->bottomValue();
2088 }
2089 }
2090 KoRect rect( px, py, pw, ph );
2091
2092 //kdDebug() << "New geom: " << m_sx->text().toDouble() << ", " << m_sy->text().toDouble()
2093 //<< " " << m_sw->text().toDouble() << "x" << m_sh->text().toDouble() << endl;
2094 //kdDebug()<<" rect :"<<px <<" py :"<<py<<" pw :"<<pw <<" ph "<<ph<<endl;
2095 // Undo/redo for frame properties
2096 if(m_frame) { // only do undo/redo when we edit 1 frame for now..
2097
2098 if(m_frame->frameSet() == 0L ) { // if there is no frameset (anymore)
2099 KWTextFrameSet *frameSet = new KWTextFrameSet( m_doc, name );
2100 frameSet->addFrame( m_frame );
2101 KWPage *page = m_doc->pageManager()->page(m_frame);
2102 if( page->rect().contains(rect) ) {
2103 m_frame->setRect( px, py, pw, ph );
2104 //don't change margins when frame is protected.
2105 if ( m_paddingConfigWidget && ( !m_tab1 || (m_tab1 && m_cbProtectContent && !m_cbProtectContent->isChecked())) )
2106 m_frame->setFramePadding( uLeft, uTop, uRight, uBottom );
2107 m_doc->frameChanged( m_frame );
2108 } else {
2109 KMessageBox::sorry( this,i18n("The frame will not be resized because the new size would be greater than the size of the page."));
2110 }
2111
2112 m_doc->addFrameSet( frameSet );
2113 if(!macroCmd)
2114 macroCmd = new KMacroCommand( i18n("Create Text Frame") );
2115 KWCreateFrameCommand *cmd=new KWCreateFrameCommand( i18n("Create Text Frame"), m_frame) ;
2116 macroCmd->addCommand(cmd);
2117 }
2118 if(!isNewFrame && (frameCopy->isCopy()!=m_frame->isCopy()
2119 || frameCopy->frameBehavior()!=m_frame->frameBehavior()
2120 || frameCopy->newFrameBehavior()!=m_frame->newFrameBehavior()
2121 || frameCopy->runAround()!=m_frame->runAround()
2122 || frameCopy->runAroundSide()!=m_frame->runAroundSide()
2123 || frameCopy->runAroundLeft()!=m_frame->runAroundLeft()
2124 || frameCopy->runAroundRight()!=m_frame->runAroundRight()
2125 || frameCopy->runAroundTop()!=m_frame->runAroundTop()
2126 || frameCopy->runAroundBottom()!=m_frame->runAroundBottom()
2127 || (m_tab5 && KWDocument::resolveBgBrush( frameCopy->backgroundColor() )!=frameBrushStyle())))
2128 {
2129 if(!macroCmd)
2130 macroCmd = new KMacroCommand( i18n("Frame Properties") );
2131
2132 KWFramePropertiesCommand*cmd = new KWFramePropertiesCommand( TQString(), frameCopy, m_frame );
2133 macroCmd->addCommand(cmd);
2134 frameCopy = 0L;
2135 } else
2136 delete frameCopy;
2137 }
2138 if ( m_tab4 ) { // TAB Geometry
2139
2140 KWFrame *f=m_allFrames.first();
2141 if(f==0L) f=m_frame;
2142 while(f) {
2143 // The floating attribute applies to the whole frameset...
2144 KWFrameSet * fs = f->frameSet();
2145 KWFrameSet * parentFs = fs->groupmanager() ? fs->groupmanager() : fs;
2146
2147 // Floating
2148 if ( m_floating->isChecked() &&
2149 m_floating->state() != TQButton::NoChange &&
2150 !parentFs->isFloating() )
2151 {
2152 if(!macroCmd)
2153 macroCmd = new KMacroCommand( i18n("Make Frameset Inline") );
2154
2155 TQValueList<FrameIndex> frameindexList;
2156 TQValueList<FrameMoveStruct> frameindexMove;
2157
2158 KoPoint oldPos = f->topLeft();
2159
2160 // turn non-floating frame into floating frame
2161 KWFrameSetInlineCommand *cmd = new KWFrameSetInlineCommand( TQString(), parentFs, true );
2162 cmd->execute();
2163
2164 frameindexList.append( FrameIndex( f ) );
2165 frameindexMove.append( FrameMoveStruct( oldPos, f->topLeft() ) );
2166
2167 KWFrameMoveCommand *cmdMoveFrame = new KWFrameMoveCommand( TQString(), frameindexList, frameindexMove );
2168
2169 macroCmd->addCommand(cmdMoveFrame);
2170 macroCmd->addCommand(cmd);
2171 }
2172 else if ( !m_floating->isChecked() &&
2173 m_floating->state() != TQButton::NoChange &&
2174 parentFs->isFloating() )
2175 {
2176 if(!macroCmd)
2177 macroCmd = new KMacroCommand( i18n("Make Frameset Non-Inline") );
2178 // turn floating-frame into non-floating frame
2179 KWFrameSetInlineCommand *cmd = new KWFrameSetInlineCommand( TQString(), parentFs, false );
2180 macroCmd->addCommand(cmd);
2181 cmd->execute();
2182 }
2183 if ( fs->isProtectSize() != m_protectSize->isChecked()
2184 && m_protectSize->state() != TQButton::NoChange )
2185 {
2186 if(!macroCmd)
2187 macroCmd = new KMacroCommand( i18n("Protect Size") );
2188 typedef KoSetBasicPropCommand<bool, KWFrameSet, &KWFrameSet::setProtectSize> FramesetSetProtectSizeCommand;
2189 FramesetSetProtectSizeCommand* cmd = new FramesetSetProtectSizeCommand( fs, TQString(), fs->isProtectSize(), m_protectSize->isChecked() );
2190 macroCmd->addCommand(cmd);
2191 cmd->execute();
2192 m_frameSetProtectedSize = m_protectSize->isChecked();
2193 }
2194 if ( !fs->isMainFrameset() &&
2195 ( ( m_oldX != m_sx->value() && m_sx->isEnabled() )|| ( m_oldY != m_sy->value() && m_sy->isEnabled() ) || ( m_oldW != m_sw->value() && m_sw->isEnabled() ) || ( m_oldH != m_sh->value() && m_sh->isEnabled() ) ) )
2196 {
2197 //kdDebug() << "Old geom: " << m_oldX << ", " << m_oldY<< " " << m_oldW << "x" << m_oldH << endl;
2198 //kdDebug() << "New geom: " << m_sx->text().toDouble() << ", " << m_sy->text().toDouble()
2199 // << " " << m_sw->text().toDouble() << "x" << m_sh->text().toDouble() << endl;
2200
2201 if( m_doc->pageManager()->page(f)->rect().contains(rect) )
2202 {
2203 FrameIndex index( f );
2204 KoRect initialRect = f->normalize();
2205 double initialMinFrameHeight = f->minimumFrameHeight();
2206 if ( m_frame ) // single frame: can be moved and resized
2207 f->setRect( px, py, pw, ph );
2208 else { // multiple frames: can only be resized
2209 f->setWidth( pw );
2210 f->setHeight( ph );
2211 }
2212 FrameResizeStruct tmpResize( initialRect, initialMinFrameHeight, f->normalize() );
2213 if(!macroCmd)
2214 macroCmd = new KMacroCommand( i18n("Resize Frame") );
2215
2216 KWFrameResizeCommand *cmd = new KWFrameResizeCommand( i18n("Resize Frame"), index, tmpResize ) ;
2217 macroCmd->addCommand(cmd);
2218 m_doc->frameChanged( f );
2219 }
2220 else
2221 {
2222 KMessageBox::sorry( this,i18n("The frame will not be resized because the new size would be greater than the size of the page."));
2223 }
2224 }
2225 if ( m_paddingConfigWidget &&
2226 (!m_tab1 || (m_tab1 && m_cbProtectContent && !m_cbProtectContent->isChecked())) &&
2227 m_paddingConfigWidget->changed() )
2228 {
2229 FrameIndex index( f );
2230 FramePaddingStruct tmpMargBegin(f);
2231 FramePaddingStruct tmpMargEnd(uLeft, uTop, uRight, uBottom);
2232 if(!macroCmd)
2233 macroCmd = new KMacroCommand( i18n("Change Margin Frame") );
2234 KWFrameChangeFramePaddingCommand *cmd = new KWFrameChangeFramePaddingCommand( i18n("Change Margin Frame"), index, tmpMargBegin, tmpMargEnd) ;
2235 cmd->execute();
2236 macroCmd->addCommand(cmd);
2237 }
2238 f=m_allFrames.next();
2239 }
2240 }
2241 if ( m_tab6 ) // Border style
2242 {
2243 if ( m_mainFrame )
2244 m_allFrames.append( m_mainFrame );
2245
2246 KWFrame *f = m_allFrames.first();
2247 if(f==0L) f=m_frame;
2248 for ( ; f ; f = m_allFrames.next() )
2249 {
2250 // TODO can't this become shorter??
2251 if ( f->leftBorder() != m_leftBorder )
2252 {
2253 kdDebug() << "Changing borders!" << endl;
2254 TQPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
2255 TQPtrList<FrameIndex> frameindexList;
2257 FrameIndex *index = new FrameIndex( f );
2258 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
2259 tmp->m_OldBorder = f->leftBorder();
2260 tmp->m_EFrameType = KoBorder::LeftBorder;
2261 tmpBorderList.append( tmp );
2262 frameindexList.append( index );
2263 if ( !macroCmd )
2264 macroCmd = new KMacroCommand( i18n("Change Border"));
2265 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Left Border Frame"), frameindexList, tmpBorderList, m_leftBorder);
2266 cmd->execute();
2267 macroCmd->addCommand( cmd);
2268 }
2269 if ( f->rightBorder() != m_rightBorder )
2270 {
2271 TQPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
2272 TQPtrList<FrameIndex> frameindexList;
2274 FrameIndex *index = new FrameIndex( f );
2275 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
2276 tmp->m_OldBorder = f->rightBorder();
2277 tmp->m_EFrameType = KoBorder::RightBorder;
2278 tmpBorderList.append( tmp );
2279 frameindexList.append( index );
2280 if ( !macroCmd )
2281 macroCmd = new KMacroCommand( i18n("Change Border"));
2282 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Right Border Frame"), frameindexList, tmpBorderList, m_rightBorder);
2283 cmd->execute();
2284 macroCmd->addCommand( cmd);
2285 }
2286 if ( f->topBorder() != m_topBorder )
2287 {
2288 TQPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
2289 TQPtrList<FrameIndex> frameindexList;
2291 FrameIndex *index = new FrameIndex( f );
2292 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
2293 tmp->m_OldBorder = f->topBorder();
2294 tmp->m_EFrameType = KoBorder::TopBorder;
2295 tmpBorderList.append( tmp );
2296 frameindexList.append( index );
2297 if ( !macroCmd )
2298 macroCmd = new KMacroCommand( i18n("Change Border"));
2299 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Top Border Frame"), frameindexList, tmpBorderList, m_topBorder);
2300 cmd->execute();
2301 macroCmd->addCommand( cmd);
2302 }
2303 if ( f->bottomBorder() != m_bottomBorder )
2304 {
2305 TQPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
2306 TQPtrList<FrameIndex> frameindexList;
2308 FrameIndex *index = new FrameIndex( f );
2309 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
2310 tmp->m_OldBorder = f->bottomBorder();
2311 tmp->m_EFrameType = KoBorder::BottomBorder;
2312 tmpBorderList.append( tmp );
2313 frameindexList.append( index );
2314 if ( !macroCmd )
2315 macroCmd = new KMacroCommand( i18n("Change Border"));
2316 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Bottom Border Frame"), frameindexList, tmpBorderList, m_bottomBorder);
2317 cmd->execute();
2318 macroCmd->addCommand( cmd);
2319 }
2320 }
2321 }
2322
2323 if(macroCmd)
2324 m_doc->addCommand(macroCmd);
2325
2326 updateFrames();
2327 return true;
2328}
2329
2330void KWFrameDia::updateFrames()
2331{
2332 m_doc->updateAllFrames();
2333 m_doc->layout();
2334 m_doc->repaintAllViews();
2335}
2336
2337void KWFrameDia::slotApply()
2338{
2339 applyChanges();
2340 if ( m_tab4 )
2341 initGeometrySettings();
2342 if ( m_tab6 )
2343 initBorderSettings();
2344}
2345
2346void KWFrameDia::slotOk()
2347{
2348 if (applyChanges())
2349 {
2350 KDialogBase::slotOk();
2351 }
2352}
2353
2354void KWFrameDia::connectListSelected( TQListViewItem *item )
2355{
2356/* belongs to TAB3, is activated when the user selects another frameset from the list */
2357 if ( !item )
2358 item = m_lFrameSList->selectedItem();
2359
2360 if ( !item ) return; // assertion
2361
2362 m_rExistingFrameset->setChecked(true);
2363 m_eFrameSetName->setText( item->text(1) );
2364}
2365
2366bool KWFrameDia::mayDeleteFrameSet(KWTextFrameSet *fs) {
2367 if(fs==0) return true;
2368 if(fs->frameCount() > 1) return true;
2369 KoTextParag * parag = fs->textDocument()->firstParag();
2370 if(parag==0) return true;
2371 bool isEmpty = parag->next() == 0L && parag->length() == 1;
2372 if ( !isEmpty ) {
2373 int result = KMessageBox::warningContinueCancel(this,
2374 i18n( "You are about to reconnect the last frame of the "
2375 "frameset '%1'. "
2376 "The contents of this frameset will be deleted.\n"
2377 "Are you sure you want to do that?").arg(fs->name()),
2378 i18n("Reconnect Frame"), i18n("&Reconnect"));
2379 if (result != KMessageBox::Continue)
2380 return false;
2381 }
2382 return true;
2383}
2384
2385KWFourSideConfigWidget::KWFourSideConfigWidget( KWDocument* doc, const TQString& title,
2386 TQWidget* parent, const char* name )
2387 : TQGroupBox( title, parent, name ),
2388 m_doc( doc ),
2389 m_changed( false ), m_noSignal( false )
2390{
2391 TQGroupBox *grp2 = this;
2392 TQGridLayout* mGrid = new TQGridLayout( grp2, 4, 4, KDialog::marginHint(), KDialog::spacingHint() );
2393
2394 m_synchronize=new TQCheckBox( i18n("Synchronize changes"), grp2 );
2395 TQWhatsThis::add(m_synchronize, i18n("<b>Synchronize changes:</b><br/>"
2396 "When this is checked any change in margins will be used for all directions."));
2397 mGrid->addMultiCellWidget( m_synchronize, 1, 1, 0, 1 );
2398
2399 TQLabel* lml = new TQLabel( i18n( "Left:" ), grp2 );
2400 //lml->resize( lml->sizeHint() );
2401 mGrid->addWidget( lml, 2, 0 );
2402
2403 m_inputLeft = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
2404
2405 mGrid->addWidget( m_inputLeft, 2, 1 );
2406
2407 TQLabel* lmt = new TQLabel( i18n( "Top:" ), grp2 );
2408 //lmt->resize( lmt->sizeHint() );
2409 mGrid->addWidget( lmt, 2, 2 );
2410
2411 m_inputTop = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
2412
2413 //m_inputTop->resize( m_inputTop->sizeHint() );
2414
2415 mGrid->addWidget( m_inputTop, 2, 3 );
2416
2417 TQLabel* lmr = new TQLabel( i18n( "Right:" ), grp2 );
2418 //lmr->resize( lmr->sizeHint() );
2419 mGrid->addWidget( lmr, 3, 0 );
2420
2421 m_inputRight = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
2422
2423 //m_inputRight->resize( m_inputRight->sizeHint() );
2424 mGrid->addWidget( m_inputRight, 3, 1 );
2425
2426 TQLabel* lmb = new TQLabel( i18n( "Bottom:" ), grp2 );
2427 //lmb->resize( lmb->sizeHint() );
2428 mGrid->addWidget( lmb, 3, 2 );
2429
2430 m_inputBottom = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
2431
2432 //m_inputBottom->resize( m_inputBottom->sizeHint() );
2433 mGrid->addWidget( m_inputBottom, 3, 3 );
2434 mGrid->setRowSpacing( 0, KDialog::spacingHint() + 5 );
2435
2436 connect( m_inputLeft, TQ_SIGNAL( valueChanged(double)), this, TQ_SLOT( slotValueChanged( double )));
2437 connect( m_inputRight, TQ_SIGNAL( valueChanged(double)), this, TQ_SLOT( slotValueChanged( double )));
2438 connect( m_inputTop, TQ_SIGNAL( valueChanged(double)), this, TQ_SLOT( slotValueChanged( double )));
2439 connect( m_inputBottom, TQ_SIGNAL( valueChanged(double)), this, TQ_SLOT( slotValueChanged( double )));
2440}
2441
2442// Called right after the ctor, so m_synchronize can't be checked
2443void KWFourSideConfigWidget::setValues( double left, double right, double top, double bottom )
2444{
2445 m_inputLeft->setValue( KoUnit::toUserValue( left, m_doc->unit() ) );
2446 m_inputRight->setValue( KoUnit::toUserValue( right, m_doc->unit() ) );
2447 m_inputTop->setValue( KoUnit::toUserValue( top, m_doc->unit() ) );
2448 m_inputBottom->setValue( KoUnit::toUserValue( bottom, m_doc->unit() ) );
2449}
2450
2451void KWFourSideConfigWidget::slotValueChanged( double val )
2452{
2453 m_changed = true;
2454 if ( m_synchronize->isChecked() && !m_noSignal )
2455 {
2456 m_noSignal = true;
2457 m_inputLeft->setValue( val );
2458 m_inputBottom->setValue( val );
2459 m_inputRight->setValue( val );
2460 m_inputTop->setValue( val );
2461 m_noSignal = false;
2462 }
2463}
2464
2465double KWFourSideConfigWidget::leftValue() const
2466{
2467 return m_inputLeft->value();
2468}
2469
2470double KWFourSideConfigWidget::rightValue() const
2471{
2472 return m_inputRight->value();
2473}
2474
2475double KWFourSideConfigWidget::topValue() const
2476{
2477 return m_inputTop->value();
2478}
2479
2480double KWFourSideConfigWidget::bottomValue() const
2481{
2482 return m_inputBottom->value();
2483}
2484
2485/*
2486 TODO;
2487 features that are present in the frames but not shown (yet)
2488 - frames with 'copy' should have a radiogroup showing that its only going to be copied to
2489 the even/odd side or to both sides.
2490*/
Class: KWFrameSet Base type, a frameset holds content as well as frames to show that content.
Definition KWFrameSet.h:62
static KWFrame * settingsFrame(const KWFrame *frame)
Returns the original frame that the param frame is a copy off, or the frame itself.
virtual FrameSetType type() const
The type of frameset.
Definition KWFrameSet.h:76
bool isDeleted() const
True if the frameset was deleted (but not destroyed, since it's in the undo/redo).
Definition KWFrameSet.h:166
unsigned int frameCount() const
Get number of child frames.
Definition KWFrameSet.h:163
bool isFloating() const
Return true if this frameset is floating (inline), false if it's fixed.
Definition KWFrameSet.h:372
KWTableFrameSet * groupmanager() const
returns the groupManager this frameset belongs to.
Definition KWFrameSet.h:408
KWFrame * frame(unsigned int _num) const
get a frame by number
TQString name() const
get/set frameset name. For tables in particular, this must be unique
Definition KWFrameSet.h:428
Info frameSetInfo() const
Returns the type of TextFrameSet this is.
Definition KWFrameSet.h:95
This class represents a single frame.
Definition KWFrame.h:68
NewFrameBehavior
What happens on new page (create a new frame and reconnect, no followup, make copy).
Definition KWFrame.h:132
double minimumFrameHeight(void) const
Definition KWFrame.h:284
KWFrameSet * frameSet() const
Data stucture methods.
Definition KWFrame.h:143
FrameBehavior
what should happen when the frame is full
Definition KWFrame.h:116
RunAround
Runaround types RA_NO = No run around, all text is just printed.
Definition KWFrame.h:75
bool isCopy() const
Drawing property: if isCopy, this frame is a copy of the previous frame in the frameset.
Definition KWFrame.h:138
const KoBorder & leftBorder() const
All borders can be custom drawn with their own colors etc.
Definition KWFrame.h:170
RunAroundSide
Runaround side - only meaningful when RA_BOUNDINGRECT is used.
Definition KWFrame.h:79
KWFrame * getCopy()
returns a copy of self
Definition KWFrame.cpp:135
const KoRect rect() const
return a KoRect with the (pt) sizes of this page. Margins are ignored for this function.
Definition KWPage.cpp:137
Class: KWTextFrameSet Contains text (KoTextObject) and frames to display that text.
KoTextObject * textObject() const
Return the contained text object.