kword

KWFrameDia.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
00003    Copyright (C) 2005 Thomas Zander <zander@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "KWFrameDia.h"
00022 #include "KWTextFrameSet.h"
00023 #include "KWDocument.h"
00024 #include "KWFrameDia.moc"
00025 #include "KWCommand.h"
00026 #include "KWTableFrameSet.h"
00027 #include "KWPageManager.h"
00028 #include "KWPage.h"
00029 #include "KWPictureFrameSet.h"
00030 
00031 #include <KoSetPropCommand.h>
00032 #include <KoParagDia_p.h> // for KoBorderPreview
00033 
00034 #include <knuminput.h>
00035 #include <klocale.h>
00036 #include <kiconloader.h>
00037 #include <kmessagebox.h>
00038 #include <knumvalidator.h>
00039 #include <kcolorbutton.h>
00040 #include <kdebug.h>
00041 
00042 #include <qwhatsthis.h>
00043 #include <qlineedit.h>
00044 #include <qcheckbox.h>
00045 #include <qcombobox.h>
00046 #include <qhbuttongroup.h>
00047 #include <qlabel.h>
00048 #include <qradiobutton.h>
00049 #include <qlistview.h>
00050 #include <qbuttongroup.h>
00051 #include <qhbox.h>
00052 #include <qheader.h>
00053 #include <qlayout.h>
00054 
00055 #include <stdlib.h>
00056 #include <limits.h>
00057 
00058 /******************************************************************/
00059 /* Class KWBrushStylePreview - only used by kwframestylemanager   */
00060 /******************************************************************/
00061 KWBrushStylePreview::KWBrushStylePreview( QWidget* parent )
00062     : QFrame(parent)
00063 {
00064 }
00065 
00066 void KWBrushStylePreview::drawContents( QPainter* painter )
00067 {
00068     painter->save();
00069     painter->translate( contentsRect().x(), contentsRect().y() );
00070     painter->fillRect( contentsRect(), colorGroup().base() ); // in case of a transparent brush
00071     painter->fillRect( contentsRect(), brush );
00072     painter->restore();
00073 }
00074 
00075 
00076 /******************************************************************/
00077 /* Class: KWFrameDia                                              *
00078  *
00079  *  TAB Frame Options
00080  *      Set options dependent of frametype
00081  *  TAB Text Runaround
00082  *      Set the text behaviour of this frame
00083  *  TAB Frameset
00084  *      here the user can select from the current TEXT framesets, a new one is
00085  *      included in the list.
00086  *      Afterwards (on ok) the frame should be checked if it is already owned by a
00087  *      frameset, if so that connection must be disconnected (if different) and
00088  *      framebehaviour will be copied from the frameset
00089  *      then the new connection should be made.
00090  *
00091  *  TAB Geometry
00092  *      position/size
00093  ******************************************************************/
00094 
00095 KWFrameDia::KWFrameDia( QWidget* parent, KWFrame *frame)
00096     : KDialogBase( Tabbed, QString::null, Ok | Apply| Cancel, Ok, parent, "framedialog", true)
00097 {
00098     m_noSignal=false;
00099     m_frame = frame;
00100     m_mainFrame = 0;
00101     if(m_frame==0) {
00102         kdDebug() << "ERROR: KWFrameDia::constructor no frame.."<<endl;
00103         return;
00104     }
00105     setCaption( i18n( "Frame Properties for %1" ).arg( m_frame->frameSet()->name() ) );
00106     KWFrameSet *fs = m_frame->frameSet()->groupmanager();
00107     if(fs==0L) fs=m_frame->frameSet();
00108     m_frameType = fs->type();
00109     m_frameSetFloating = fs->isFloating();
00110     m_frameSetProtectedSize = fs->isProtectSize();
00111     m_mainFrameSetIncluded = fs->isMainFrameset();
00112     m_defaultFrameSetIncluded = fs->isMainFrameset() || fs->isHeaderOrFooter() || fs->isFootEndNote();
00113     if ( m_mainFrameSetIncluded )
00114         m_mainFrame = m_frame;
00115 
00116     m_doc = 0;
00117     init();
00118 }
00119 
00120 /* Contructor when the dialog is used on creation of frame */
00121 KWFrameDia::KWFrameDia( QWidget* parent, KWFrame *frame, KWDocument *doc, FrameSetType ft )
00122     : KDialogBase( Tabbed, i18n("Frame Properties for New Frame"), Ok | Cancel, Ok, parent, "framedialog", true)
00123 {
00124     m_noSignal=false;
00125     m_frameType=ft;
00126     m_doc = doc;
00127     m_frame= frame;
00128     m_frameSetFloating = false;
00129     m_frameSetProtectedSize = false;
00130     m_mainFrameSetIncluded = false;
00131     m_defaultFrameSetIncluded = false;
00132     if(m_frame==0) {
00133         kdDebug() << "ERROR: KWFrameDia::constructor no m_frame.."<<endl;
00134         return;
00135     }
00136     m_mainFrame = 0;
00137     init();
00138 }
00139 
00140 KWFrameDia::KWFrameDia( QWidget *parent, QPtrList<KWFrame> listOfFrames) : KDialogBase( Tabbed, i18n("Frames Properties"), Ok | Apply | Cancel, Ok, parent, "framedialog", true) , m_allFrames() {
00141     m_noSignal=false;
00142 
00143     m_mainFrame = m_frame = 0L;
00144     m_tab1 = m_tab2 = m_tab3 = m_tab4 = m_tab5 = m_tab6 = 0;
00145 
00146     KWFrame *f=listOfFrames.first();
00147     if(f==0) {
00148         kdDebug() << "ERROR: KWFrameDia::constructor no frames.."<<endl;
00149         return;
00150     }
00151     if ( listOfFrames.count() == 1 )
00152         setCaption( i18n( "Frame Settings for %1" ).arg( f->frameSet()->name() ) );
00153 
00154     KWFrameSet *fs = f->frameSet()->groupmanager();
00155     if(fs==0L) fs=f->frameSet();
00156     m_frameType = fs->type();
00157     bool frameTypeUnset=true;
00158     m_doc = fs->kWordDocument();
00159 
00160     if( !fs->isMainFrameset() ) { // don't include the main fs.
00161         m_allFrames.append(f);
00162         frameTypeUnset=false;
00163     }
00164     else
00165         m_mainFrame = f;
00166 
00167     f=listOfFrames.next();
00168     while(f) {
00169         fs = f->frameSet()->groupmanager();
00170         if(fs==0L) fs=f->frameSet();
00171         if(m_doc->processingType() != KWDocument::WP || m_doc->frameSet(0) != fs) { // don't include the main fs.
00172             if(!frameTypeUnset && m_frameType != fs->type()) m_frameType= FT_TEXT;
00173             if(frameTypeUnset) {
00174                 m_frameType = fs->type();
00175                 frameTypeUnset = false;
00176             } else if(m_frameType != fs->type()) m_frameType= FT_TEXT;
00177             m_allFrames.append(f);
00178         }
00179         f=listOfFrames.next();
00180     }
00181     if(m_allFrames.count()==0)
00182         m_allFrames.append(listOfFrames.first());
00183 
00184     // Now that m_allFrames is set, calculate m_mainFrameSetIncluded and m_defaultFrameSetIncluded
00185     m_mainFrameSetIncluded = false;
00186     m_defaultFrameSetIncluded = false;
00187     for ( f = m_allFrames.first(); f; f = m_allFrames.next() ) {
00188         fs = f->frameSet();
00189         if ( !m_mainFrameSetIncluded )
00190         {
00191             m_mainFrameSetIncluded = fs->isMainFrameset();
00192             if ( m_mainFrameSetIncluded )
00193                 m_mainFrame = f;
00194         }
00195         if ( !m_defaultFrameSetIncluded )
00196             m_defaultFrameSetIncluded = fs->isMainFrameset() || fs->isHeaderOrFooter() || fs->isFootEndNote();
00197     }
00198 
00199 
00200     init();
00201 }
00202 
00203 void KWFrameDia::init() {
00204 
00205     m_tab1 = m_tab2 = m_tab3 = m_tab4 = m_tab5 = m_tab6 = 0;
00206     m_sw = m_sh = 0L;
00207     m_cbAspectRatio=0L;
00208     KWFrameSet *fs=0;
00209     if(m_frame) {
00210         fs = m_frame->frameSet(); // 0 when creating a frame
00211         KoRect r = m_frame->normalize();
00212         m_frame->setRect( r.x(), r.y(), r.width(), r.height() );
00213     }
00214     if(!m_doc && fs)
00215     {
00216         m_doc = fs->kWordDocument();
00217     }
00218     if(!m_doc)
00219     {
00220         kdDebug() << "ERROR: KWFrameDia::init frame has no reference to m_doc.."<<endl;
00221         return;
00222     }
00223     if( fs && fs->isMainFrameset() )
00224     {
00225         setupTab6();
00226         setupTab5();
00227         setupTab4();
00228     }
00229     else if ( fs && (fs->isHeaderOrFooter() || fs->isFootEndNote()) )
00230     {
00231         setupTab1();
00232         if ( !fs->isMainFrameset() && !fs->isHeaderOrFooter() && !fs->isFootEndNote())
00233             setupTab2();
00234         setupTab4();
00235         setupTab5();
00236         setupTab6();
00237     }
00238     else if(m_frameType == FT_TEXT)
00239     {
00240         setupTab1();
00241         if ( fs && !fs->isMainFrameset() && !fs->isHeaderOrFooter() && !fs->isFootEndNote())
00242             setupTab2();
00243         else if ( !fs )
00244             setupTab2();
00245         setupTab3();
00246         setupTab4();
00247         setupTab5();
00248         setupTab6();
00249         if(! fs) // first creation
00250             showPage(2);
00251     }
00252     else if(m_frameType == FT_PICTURE)
00253     {
00254         setupTab1();
00255         if ( m_frameType == FT_PICTURE )
00256             setupTab2();
00257         if(m_frame)       // not for multiframe dia
00258             setupTab4();
00259         setupTab6();
00260         showPage(1); // while options are not implemented..
00261     }
00262     else if(m_frameType == FT_PART)
00263     {
00264         setupTab2();
00265         if(m_frame)       // not for multiframe dia
00266             setupTab4();
00267         setupTab6();
00268     }
00269     else if(m_frameType == FT_FORMULA)
00270     {
00271         setupTab1();
00272         setupTab2();
00273         if(m_frame)       // not for multiframe dia
00274             setupTab4();
00275         setupTab6();
00276         showPage(1); // while options are not implemented..
00277     }
00278     else if(m_frameType == FT_TABLE)
00279     {
00280         setupTab4();
00281         setupTab5();
00282         setupTab6();
00283     }
00284     setInitialSize( QSize(550, 400) );
00285 }
00286 
00287 void KWFrameDia::setupTab1(){ // TAB Frame Options
00288     //kdDebug() << "setup tab 1 Frame options"<<endl;
00289     m_tab1 = addPage( i18n("Options") );
00290     int columns = 0;
00291     if(m_frameType == FT_FORMULA || m_frameType == FT_PICTURE)
00292         columns = 1;
00293     else if(m_frameType == FT_TEXT)
00294         columns = 2;
00295 
00296     m_grid1 = new QGridLayout( m_tab1, 0 /*auto create*/, columns, 0, KDialog::spacingHint() );
00297 
00298     // Options for all types of frames
00299     m_cbCopy = new QCheckBox( i18n("Frame is a copy of the previous frame"),m_tab1 );
00300     m_grid1->addWidget(m_cbCopy,1,0);
00301 
00302     if(m_frame) {
00303         m_cbCopy->setChecked( m_frame->isCopy() );
00304         m_cbCopy->setEnabled( m_frame->frameSet() && m_frame->frameSet()->frame( 0 ) != m_frame ); // First one can't be a copy
00305     } else { // list of frames as input.
00306         KWFrame *f=m_allFrames.first();
00307         bool show=true;
00308         bool enabled=f->frameSet() && f->frameSet()->frame( 0 ) != f; // First one can't be a copy
00309         bool checked=f->isCopy();
00310         f=m_allFrames.next();
00311         while(f) {
00312             enabled=enabled || (f->frameSet() && f->frameSet()->frame( 0 ) != f);
00313             if(checked != f->isCopy()) show=false;
00314             f=m_allFrames.next();
00315         }
00316         if(! show) {
00317             m_cbCopy->setTristate();
00318             m_cbCopy->setNoChange();
00319         }
00320         else m_cbCopy->setChecked(checked);
00321         m_cbCopy->setEnabled( enabled );
00322     }
00323 
00324     // Well, for images, formulas etc. it doesn't make sense to activate 'is copy'. What else would it show ?
00325     if(m_frameType!=FT_TEXT)
00326         m_cbCopy->setEnabled( false );
00327 
00328     int row = 2;
00329     int column = 0;
00330 
00331     // Picture m_frame
00332     if(m_frameType==FT_PICTURE)
00333     {
00334         m_cbAspectRatio = new QCheckBox (i18n("Retain original aspect ratio"),m_tab1);
00335         connect( m_cbAspectRatio, SIGNAL(toggled(bool)),
00336                  this, SLOT(slotKeepRatioToggled(bool)));
00337         bool show=true;
00338         bool on=true;
00339         if(m_frame) {
00340             if ( m_frame->frameSet() )
00341                 on= static_cast<KWPictureFrameSet *>( m_frame->frameSet() )->keepAspectRatio();
00342         } else {
00343             KWFrame *f=m_allFrames.first();
00344             KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
00345             if(fs)
00346                 on=fs->keepAspectRatio();
00347             f=m_allFrames.next();
00348             while(f) {
00349                 KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
00350                 if(fs)
00351                     if(on != fs->keepAspectRatio()) {
00352                         show=false;
00353                         break;
00354                     }
00355                 f=m_allFrames.next();
00356             }
00357         }
00358         m_cbAspectRatio->setChecked( on );
00359         if(! show) {
00360             m_cbAspectRatio->setTristate();
00361             m_cbAspectRatio->setNoChange();
00362         }
00363         m_grid1->addWidget(m_cbAspectRatio, row, 0);
00364         ++row;
00365     }
00366     else
00367         m_cbAspectRatio = 0L;
00368 
00369     // Text m_frame
00370     if(m_frameType==FT_TEXT)
00371     {
00372         // AutoCreateNewFrame policy.
00373         m_endOfFrame = new QGroupBox(i18n("If Text is Too Long for Frame"), m_tab1 );
00374         m_grid1->addWidget( m_endOfFrame, row, 0 );
00375 
00376         m_eofGrid= new QGridLayout (m_endOfFrame, 4, 1, KDialog::marginHint(), KDialog::spacingHint());
00377         m_rAppendFrame = new QRadioButton( i18n( "Create a new page" ), m_endOfFrame );
00378         QWhatsThis::add( m_rAppendFrame, "<b>Create a new page:</b><br/> if there is too "
00379             "much text for this text frame, a new page will be created and, "
00380             "since \"Reconnect frame to current flow\" is the only possible "
00381             "option together with this one, "
00382             "the new page will have a frame for showing the additional text." );
00383         m_eofGrid->addWidget( m_rAppendFrame, 1, 0 );
00384 
00385         m_rResizeFrame = new QRadioButton( i18n( "Resize last frame" ), m_endOfFrame );
00386         QWhatsThis::add( m_rResizeFrame, "<b>Resize last frame:</b><br/> "
00387             "if there is too much text for this text frame, "
00388             "the frame will resize itself (increasing its height) as much as it needs, "
00389             "to be able to contain all the text. More precisely, when the frameset has "
00390             "multiple chained frames, it's always the last one which will be resized." );
00391         m_eofGrid->addWidget( m_rResizeFrame, 2, 0 );
00392 
00393         m_rNoShow = new QRadioButton( i18n( "Don't show the extra text" ), m_endOfFrame );
00394         QWhatsThis::add( m_rNoShow, "<b>Don't show the extra text:</b><br/> "
00395             "if there is too much text for this text frame, nothing happens "
00396             "automatically. Initially the extra text won't appear. One possibility "
00397             "then is to resize the frame manually. The other possibility is, with the option "
00398             "\"Reconnect frame to current flow\" selected, to create a new page "
00399             "which will then have a followup frame with the extra text." );
00400         m_eofGrid->addWidget( m_rNoShow, 3, 0 );
00401         QButtonGroup *grp = new QButtonGroup( m_endOfFrame );
00402         grp->hide();
00403         grp->setExclusive( true );
00404         grp->insert( m_rAppendFrame );
00405         grp->insert( m_rResizeFrame );
00406         grp->insert( m_rNoShow );
00407 
00408         m_eofGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
00409         KWFrame::FrameBehavior fb;
00410         bool show=true;
00411         if(m_frame) {
00412             fb = m_frame->frameBehavior();
00413         } else {
00414             KWFrame *f=m_allFrames.first();
00415             fb = f->frameBehavior();
00416             f=m_allFrames.next();
00417             while(f) {
00418                 if(fb != f->frameBehavior()) {
00419                     show=false;
00420                     break;
00421                 }
00422                 f=m_allFrames.next();
00423             }
00424         }
00425         if(show) {
00426             if(fb == KWFrame::AutoExtendFrame) {
00427                 m_rResizeFrame->setChecked(true);
00428             } else if (fb == KWFrame::AutoCreateNewFrame) {
00429                 m_rAppendFrame->setChecked(true);
00430             } else {
00431                 m_rNoShow->setChecked(true);
00432             }
00433         }
00434         column++;
00435     } else {
00436         m_rResizeFrame = 0L;
00437         m_rAppendFrame = 0L;
00438         m_rNoShow = 0L;
00439     }
00440 
00441     // NewFrameBehavior - now for all type of frames
00442     m_onNewPage = new QGroupBox(i18n("On New Page Creation"),m_tab1);
00443     m_grid1->addWidget( m_onNewPage, row, column );
00444 
00445     m_onpGrid = new QGridLayout( m_onNewPage, 4, 1, KDialog::marginHint(), KDialog::spacingHint() );
00446     m_reconnect = new QRadioButton (i18n ("Reconnect frame to current flow"), m_onNewPage);
00447     QWhatsThis::add(m_reconnect, i18n("<b>Reconnect frame to current flow:</b><br/>"
00448         "When a new page is created, a new frame will be created for this "
00449         "frameset, so that the text can flow from one page to the next if necessary. "
00450         "This is what happens for the \"main text frameset\", but this option makes it possible "
00451         "to choose the same behavior for other framesets, for instance in magazine layouts."));
00452     if ( m_rResizeFrame )
00453         connect( m_reconnect, SIGNAL( clicked() ), this, SLOT( setFrameBehaviorInputOn() ) );
00454     m_onpGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
00455     m_onpGrid->addWidget( m_reconnect, 1, 0 );
00456 
00457     m_noFollowup = new QRadioButton (i18n ("Do not create a followup frame"), m_onNewPage);
00458     QWhatsThis::add(m_noFollowup, i18n("<b>Do not create a followup frame:</b><br/>"
00459         "When a new page is created, no frame will be created for this frameset."));
00460     if ( m_rResizeFrame )
00461         connect( m_noFollowup, SIGNAL( clicked() ), this, SLOT( setFrameBehaviorInputOn() ) );
00462     m_onpGrid->addWidget( m_noFollowup, 2, 0 );
00463 
00464     m_copyRadio= new QRadioButton (i18n ("Place a copy of this frame"), m_onNewPage);
00465     QWhatsThis::add(m_copyRadio, i18n("<b>Place a copy of this frame:</b><br/>"
00466         "When a new page is created, a frame will be created for this frameset, "
00467         "which will always show the exact same thing as the frame on the previous "
00468         "page. This is what happens for headers and footers, but this option "
00469         "makes it possible to choose the same behavior for other framesets, for "
00470         "instance a company logo and/or title that should appear exactly the same on every page."));
00471     if ( m_rResizeFrame )
00472         connect( m_copyRadio, SIGNAL( clicked() ), this, SLOT( setFrameBehaviorInputOff() ) );
00473     m_onpGrid->addWidget( m_copyRadio, 3, 0);
00474 
00475     enableOnNewPageOptions();
00476 
00477     QButtonGroup *grp2 = new QButtonGroup( m_onNewPage );
00478     grp2->hide();
00479     grp2->setExclusive( true );
00480     grp2->insert( m_reconnect );
00481     grp2->insert( m_noFollowup );
00482     grp2->insert( m_copyRadio );
00483     m_grid1->addRowSpacing( row, m_onNewPage->height());
00484     KWFrame::NewFrameBehavior nfb;
00485     bool show=true;
00486     if(m_frame) {
00487         nfb = m_frame->newFrameBehavior();
00488     } else {
00489         KWFrame *f=m_allFrames.first();
00490         nfb = f->newFrameBehavior();
00491         f=m_allFrames.next();
00492         while(f) {
00493             if(nfb != f->newFrameBehavior()) {
00494                 show=false;
00495                 break;
00496             }
00497             f=m_allFrames.next();
00498         }
00499     }
00500     if(show) {
00501         if(nfb == KWFrame::Reconnect) {
00502             m_reconnect->setChecked(true);
00503         } else if(nfb == KWFrame::NoFollowup) {
00504             m_noFollowup->setChecked(true);
00505         } else {
00506             m_copyRadio->setChecked(true);
00507             setFrameBehaviorInputOff();
00508         }
00509     }
00510 
00511 
00512     // SideHeads definition - for text frames only
00513     if( false && m_frameType == FT_TEXT ) // disabled in the GUI for now! (TZ June 2002)
00514     {
00515         row++;
00516         m_sideHeads = new QGroupBox(i18n("SideHead Definition"),m_tab1);
00517         m_sideHeads->setEnabled(false); //###
00518         m_grid1->addWidget(m_sideHeads, row, 0);
00519 
00520         m_sideGrid = new QGridLayout( m_sideHeads, 4, 2, KDialog::marginHint(), KDialog::spacingHint() );
00521         sideTitle1 = new QLabel ( i18n("Size (%1):").arg(m_doc->unitName()),m_sideHeads);
00522         sideTitle1->resize(sideTitle1->sizeHint());
00523         m_sideGrid->addWidget(sideTitle1,1,0);
00524         m_sideWidth= new QLineEdit(m_sideHeads,"");
00525         m_sideWidth->setMaxLength(6);
00526         m_sideGrid->addWidget(m_sideWidth,1,1);
00527         sideTitle2 = new QLabel( i18n("Gap size (%1):").arg(m_doc->unitName()),m_sideHeads);
00528         sideTitle2->resize(sideTitle2->sizeHint());
00529         m_sideGrid->addWidget(sideTitle2,2,0);
00530         m_sideGap = new QLineEdit(m_sideHeads,"");
00531         m_sideGap->setMaxLength(6);
00532         m_sideGrid->addWidget(m_sideGap,2,1);
00533         m_sideAlign = new QComboBox (false,m_sideHeads);
00534         m_sideAlign->setAutoResize(false);
00535         m_sideAlign->insertItem ( i18n("Left"));
00536         m_sideAlign->insertItem ( i18n("Right"));
00537         m_sideAlign->insertItem ( i18n("Closest to Binding"));
00538         m_sideAlign->insertItem ( i18n("Closest to Page Edge"));
00539         m_sideAlign->resize(m_sideAlign->sizeHint());
00540         m_sideGrid->addMultiCellWidget(m_sideAlign,3,3,0,1);
00541         m_sideGrid->addRowSpacing( 0, KDialog::marginHint() + 5 );
00542 
00543         // init for sideheads.
00544         m_sideWidth->setText("0");
00545         m_sideWidth->setValidator( new KFloatValidator(0,9999,true, m_sideWidth) );
00546 
00547         m_sideGap->setText("0");
00548         m_sideGap->setValidator( new KFloatValidator(0,9999,true, m_sideGap) );
00549         // add rest of sidehead init..
00550     }
00551 
00552     m_cbAllFrames = new QCheckBox (i18n("Changes will be applied to all frames in frameset"),m_tab1);
00553     m_cbAllFrames->setChecked(m_frame!=0L);
00554     row++;
00555     m_grid1->addMultiCellWidget(m_cbAllFrames,row,row, 0, 1);
00556     m_cbProtectContent = new QCheckBox( i18n("Protect content"), m_tab1);
00557     QWhatsThis::add(m_cbProtectContent, i18n("<b>Protect content:</b><br/>"
00558         "Disallow changes to be made to the contents of the frame(s)."));
00559     connect( m_cbProtectContent, SIGNAL(toggled ( bool ) ), this, SLOT(slotProtectContentChanged( bool )));
00560     row++;
00561     m_grid1->addMultiCellWidget(m_cbProtectContent,row,row, 0, 1);
00562     if( m_frameType != FT_TEXT || m_frame!=0 && m_frame->frameSet()==0) {
00563         m_cbAllFrames->setChecked(false);
00564         m_cbAllFrames->hide();
00565         m_cbProtectContent->setChecked( false );
00566         m_cbProtectContent->hide();
00567     }
00568     else if ( m_frameType == FT_TEXT /*&& m_frame!=0 && m_frame->frameSet()*/ )
00569     {
00570         bool show=true;
00571         bool on=true;
00572         if(m_frame)
00573         {
00574             if ( m_frame->frameSet() )
00575                 on= static_cast<KWTextFrameSet *>(m_frame->frameSet() )->textObject()->protectContent();
00576         }
00577         else
00578         {
00579             KWFrame *f=m_allFrames.first();
00580             KWTextFrameSet *fs = dynamic_cast<KWTextFrameSet *> (f->frameSet());
00581             if(fs)
00582                 on=fs->textObject()->protectContent();
00583             f=m_allFrames.next();
00584             while(f) {
00585                 KWTextFrameSet *fs = dynamic_cast<KWTextFrameSet *> (f->frameSet());
00586                 if(fs)
00587                 {
00588                     if(on != fs->textObject()->protectContent())
00589                     {
00590                         show=false;
00591                         break;
00592                     }
00593                 }
00594                 f=m_allFrames.next();
00595             }
00596         }
00597         m_cbProtectContent->setChecked( on );
00598         if(! show) {
00599             m_cbProtectContent->setTristate();
00600             m_cbProtectContent->setNoChange();
00601         }
00602     }
00603 
00604     for(int i=0;i < row;i++)
00605         m_grid1->setRowStretch( i, 0 );
00606     m_grid1->setRowStretch( row + 1, 1 );
00607 }
00608 
00609 void KWFrameDia::setupTab2() { // TAB Text Runaround
00610     m_tab2 = addPage( i18n( "Text Run Around" ) );
00611 
00612     QVBoxLayout *tabLayout = new QVBoxLayout( m_tab2, 0, KDialog::spacingHint(), "tabLayout");
00613 
00614     // First groupbox
00615     m_runGroup = new QButtonGroup(  i18n( "Layout of Text in Other Frames" ), m_tab2);
00616     m_runGroup->setColumnLayout( 0, Qt::Vertical );
00617     m_runGroup->layout()->setSpacing( KDialog::spacingHint() );
00618     QGridLayout *groupBox1Layout = new QGridLayout( m_runGroup->layout() );
00619     groupBox1Layout->setAlignment( Qt::AlignTop );
00620 
00621     m_rRunNo = new QRadioButton( i18n( "Text will run &through this frame" ), m_runGroup );
00622     groupBox1Layout->addWidget( m_rRunNo, 0, 1 );
00623 
00624     m_rRunBounding = new QRadioButton( i18n( "Text will run &around the frame" ), m_runGroup );
00625     groupBox1Layout->addWidget( m_rRunBounding, 1, 1 );
00626 
00627     m_rRunSkip = new QRadioButton( i18n( "Text will &not run around this frame" ), m_runGroup );
00628     groupBox1Layout->addWidget( m_rRunSkip, 2, 1 );
00629 
00630     QPixmap pixmap = KWBarIcon( "run_not" );
00631     QLabel *lRunNo = new QLabel( m_runGroup );
00632     lRunNo->setBackgroundPixmap( pixmap );
00633     lRunNo->setFixedSize( pixmap.size() );
00634     groupBox1Layout->addWidget( lRunNo, 0, 0 );
00635 
00636     pixmap = KWBarIcon( "run_bounding" );
00637     QLabel *lRunBounding = new QLabel( m_runGroup );
00638     lRunBounding->setBackgroundPixmap( pixmap );
00639     lRunBounding->setFixedSize( pixmap.size() );
00640     groupBox1Layout->addWidget( lRunBounding, 1, 0 );
00641 
00642     pixmap = KWBarIcon( "run_skip" );
00643     QLabel *lRunSkip = new QLabel( m_runGroup );
00644     lRunSkip->setBackgroundPixmap( pixmap );
00645     lRunSkip->setFixedSize( pixmap.size() );
00646     groupBox1Layout->addWidget( lRunSkip, 2, 0 );
00647 
00648     tabLayout->addWidget( m_runGroup );
00649 
00650     // Second groupbox
00651     m_runSideGroup = new QButtonGroup(  i18n( "Run Around Side" ), m_tab2);
00652     m_runSideGroup->setColumnLayout( 0, Qt::Vertical );
00653     m_runSideGroup->layout()->setSpacing( KDialog::spacingHint() );
00654     m_runSideGroup->layout()->setMargin( KDialog::marginHint() );
00655     QGridLayout *runSideLayout = new QGridLayout( m_runSideGroup->layout() );
00656     runSideLayout->setAlignment( Qt::AlignTop );
00657 
00658     m_rRunLeft = new QRadioButton( i18n( "Run Around", "&Left" ), m_runSideGroup );
00659     runSideLayout->addWidget( m_rRunLeft, 0, 0 /*1*/ );
00660 
00661     m_rRunRight = new QRadioButton( i18n( "Run Around", "&Right" ), m_runSideGroup );
00662     runSideLayout->addWidget( m_rRunRight, 1, 0 /*1*/ );
00663 
00664     m_rRunBiggest = new QRadioButton( i18n( "Run Around", "Lon&gest side" ), m_runSideGroup );
00665     runSideLayout->addWidget( m_rRunBiggest, 2, 0 /*1*/ );
00666 
00667 #if 0 // TODO icons!
00668     QPixmap pixmap = KWBarIcon( "run_left" );
00669     QLabel *label = new QLabel( m_runSideGroup );
00670     label->setBackgroundPixmap( pixmap );
00671     label->setFixedSize( pixmap.size() );
00672     runSideLayout->addWidget( label, 0, 0 );
00673 
00674     pixmap = KWBarIcon( "run_right" );
00675     label = new QLabel( m_runSideGroup );
00676     label->setBackgroundPixmap( pixmap );
00677     label->setFixedSize( pixmap.size() );
00678     runSideLayout->addWidget( label, 1, 0 );
00679 
00680     pixmap = KWBarIcon( "run_biggest" );
00681     label = new QLabel( m_runSideGroup );
00682     label->setBackgroundPixmap( pixmap );
00683     label->setFixedSize( pixmap.size() );
00684     runSideLayout->addWidget( label, 2, 0 );
00685 #endif
00686 
00687     tabLayout->addWidget( m_runSideGroup );
00688 
00689     m_raDistConfigWidget = new KWFourSideConfigWidget( m_doc, i18n("Distance Between Frame && Text"), m_tab2 );
00690     if ( m_frame )
00691         m_raDistConfigWidget->setValues( QMAX(0.00, m_frame->runAroundLeft()),
00692                                          QMAX(0.00, m_frame->runAroundRight()),
00693                                          QMAX(0.00, m_frame->runAroundTop()),
00694                                          QMAX(0.00, m_frame->runAroundBottom()) );
00695     tabLayout->addWidget( m_raDistConfigWidget );
00696 
00697 
00698 
00699     // Show current settings
00700 
00701     // Runaround
00702     bool show=true;
00703     KWFrame::RunAround ra = KWFrame::RA_NO;
00704     if ( m_frame )
00705         ra = m_frame->runAround();
00706     else {
00707         KWFrame *f=m_allFrames.first();
00708         ra = f->runAround();
00709         f=m_allFrames.next();
00710         while(f) {
00711             if(ra != f->runAround()) show=false;
00712             f=m_allFrames.next();
00713         }
00714     }
00715 
00716     if(show) {
00717         switch ( ra ) {
00718             case KWFrame::RA_NO: m_rRunNo->setChecked( true ); break;
00719             case KWFrame::RA_BOUNDINGRECT: m_rRunBounding->setChecked( true ); break;
00720             case KWFrame::RA_SKIP: m_rRunSkip->setChecked( true ); break;
00721         }
00722     }
00723 
00724     // Runaround side
00725     show = true;
00726     KWFrame::RunAroundSide rs = KWFrame::RA_BIGGEST;
00727     if ( m_frame )
00728         rs = m_frame->runAroundSide();
00729     else {
00730         KWFrame *f=m_allFrames.first();
00731         rs = f->runAroundSide();
00732         f = m_allFrames.next();
00733         while(f) {
00734             if(rs != f->runAroundSide()) show=false;
00735             f=m_allFrames.next();
00736         }
00737     }
00738 
00739     if(show) {
00740         switch ( rs ) {
00741             case KWFrame::RA_LEFT: m_rRunLeft->setChecked( true ); break;
00742             case KWFrame::RA_RIGHT: m_rRunRight->setChecked( true ); break;
00743             case KWFrame::RA_BIGGEST: m_rRunBiggest->setChecked( true ); break;
00744         }
00745     }
00746 
00747     // Runaround gap
00748     show=true;
00749     double ragapLeft = 0;
00750     double ragapRight = 0;
00751     double ragapTop = 0;
00752     double ragapBottom = 0;
00753     if ( m_frame ) {
00754         ragapLeft = m_frame->runAroundLeft();
00755         ragapRight = m_frame->runAroundRight();
00756         ragapTop = m_frame->runAroundTop();
00757         ragapBottom = m_frame->runAroundBottom();
00758     }
00759     else {
00760         KWFrame *f = m_allFrames.first();
00761         ragapLeft = f->runAroundLeft();
00762         ragapRight = f->runAroundRight();
00763         ragapTop = f->runAroundTop();
00764         ragapBottom = f->runAroundBottom();
00765         for( f = m_allFrames.next() ; f ; f = m_allFrames.next() ) {
00766             if( ragapLeft != f->runAroundLeft() ||
00767                 ragapRight != f->runAroundRight() ||
00768                 ragapTop != f->runAroundTop() ||
00769                 ragapBottom != f->runAroundBottom() )
00770                 show = false; // TODO special value in the spinbox
00771             f = m_allFrames.next();
00772         }
00773     }
00774 
00775     if(show)
00776         m_raDistConfigWidget->setValues( ragapLeft, ragapRight, ragapTop, ragapBottom );
00777 
00778     enableRunAround();
00779 
00780     // Changing the type of runaround needs to enable/disable the runaround-side options
00781     connect( m_runGroup, SIGNAL( clicked(int) ), this, SLOT( enableRunAround() ) );
00782 }
00783 
00784 void KWFrameDia::setupTab3(){ // TAB Frameset
00785     /*
00786      * here the user can select from the current TEXT framesets
00787      * Afterwards (on ok) the frame should be checked if it is already owned by a
00788      * frameset, if so that connection must be disconnected (if different) and
00789      * framebehaviour will be copied from the frameset
00790      * then the new connection should be made.
00791      */
00792     //kdDebug() << "setup tab 3 frameSet"<<endl;
00793     m_tab3 = addPage( i18n( "Connect Text Frames" ) );
00794 
00795     QVBoxLayout *tabLayout = new QVBoxLayout( m_tab3, 0, KDialog::spacingHint());
00796 
00797     QButtonGroup *myGroup = new QButtonGroup(this);
00798     myGroup->hide();
00799 
00800     m_rExistingFrameset = new QRadioButton( m_tab3, "m_rExistingFrameset" );
00801     m_rExistingFrameset->setText( i18n("Select existing frameset to connect frame to:") );
00802     tabLayout->addWidget( m_rExistingFrameset );
00803     myGroup->insert(m_rExistingFrameset,1);
00804     connect (m_rExistingFrameset, SIGNAL( toggled(bool)), this, SLOT(ensureValidFramesetSelected()));
00805 
00806     QHBoxLayout *layout2 = new QHBoxLayout( 0, 0, 6);
00807     QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
00808     layout2->addItem( spacer );
00809 
00810     m_lFrameSList = new QListView( m_tab3, "m_lFrameSList" );
00811     m_lFrameSList->addColumn( i18n("No.") );
00812     m_lFrameSList->addColumn( i18n("Frameset Name") );
00813     m_lFrameSList->setAllColumnsShowFocus( true );
00814     m_lFrameSList->header()->setMovingEnabled( false );
00815     connect( m_lFrameSList, SIGNAL(selectionChanged ()),this,SLOT(selectExistingFrameset ()) );
00816     connect (m_lFrameSList, SIGNAL( selectionChanged()), this, SLOT(ensureValidFramesetSelected()));
00817 
00818     layout2->addWidget( m_lFrameSList );
00819     tabLayout->addLayout( layout2 );
00820 
00821     m_rNewFrameset = new QRadioButton( m_tab3);
00822     m_rNewFrameset->setText( i18n( "Create a new frameset" ) );
00823     tabLayout->addWidget( m_rNewFrameset );
00824     myGroup->insert(m_rNewFrameset,2);
00825 
00826     QFrame *line1 = new QFrame( m_tab3 );
00827     line1->setProperty( "frameShape", (int)QFrame::HLine );
00828     line1->setFrameShadow( QFrame::Plain );
00829     line1->setFrameShape( QFrame::HLine );
00830     tabLayout->addWidget( line1 );
00831 
00832     QHBoxLayout *layout1 = new QHBoxLayout( 0, 0, 6 );
00833     QLabel *textLabel1 = new QLabel( m_tab3 );
00834     textLabel1->setText( i18n( "Name of frameset:" ) );
00835     layout1->addWidget( textLabel1 );
00836 
00837     m_eFrameSetName = new QLineEdit( m_tab3 );
00838     layout1->addWidget( m_eFrameSetName );
00839     tabLayout->addLayout( layout1 );
00840 
00841     int amount=0;
00842     // now fill the gui.
00843     for ( unsigned int i = 0; i < m_doc->frameSetCount(); i++ ) {
00844         KWFrameSet * fs = m_doc->frameSet( i );
00845         if ( i == 0 && m_doc->processingType() == KWDocument::WP )
00846             continue;
00847         if ( fs->type() != FT_TEXT || fs->isHeaderOrFooter() )
00848             continue;
00849         if ( fs->frameSetInfo() == KWFrameSet::FI_FOOTNOTE )
00850             continue;
00851         if ( fs->groupmanager() )
00852             continue;
00853         if ( fs->isDeleted() )
00854             continue;
00855         QListViewItem *item = new QListViewItem( m_lFrameSList );
00856         item->setText( 0, QString( "%1" ).arg( i + 1 ) );
00857         item->setText( 1, fs->name() );
00858         amount++;
00859         if( m_frame && m_frame->frameSet() == fs ) {
00860             m_lFrameSList->setSelected(item, TRUE );
00861             m_oldFrameSetName = fs->name();
00862             m_rExistingFrameset->setChecked(true);
00863         }
00864     }
00865     if(amount==0) {
00866         m_rNewFrameset->setChecked(/*true*/false);
00867         m_rNewFrameset->setEnabled(false);
00868         m_rExistingFrameset->setEnabled(false);
00869         m_lFrameSList->setEnabled(false);
00870     }
00871     //we can't create a new frame when we select
00872     //multi frame!!!!
00873     if ( m_allFrames.count() > 1 ) {
00874         m_rNewFrameset->setChecked(false);
00875         m_rNewFrameset->setEnabled(false);
00876         myGroup->setRadioButtonExclusive( false );
00877     }
00878     if(m_frame && m_frame->frameSet() == 0) {
00879         m_oldFrameSetName = m_doc->generateFramesetName( i18n( "Text Frameset %1" ) );
00880         m_rNewFrameset->setChecked(true);
00881     }
00882     m_eFrameSetName->setText( m_oldFrameSetName );
00883 
00884     connect( m_lFrameSList, SIGNAL( currentChanged( QListViewItem * ) ),
00885              this, SLOT( connectListSelected( QListViewItem * ) ) );
00886     connect(m_eFrameSetName, SIGNAL(textChanged ( const QString & ) ),
00887              this,SLOT(textNameFrameChanged ( const QString & ) ) );
00888     connect(m_eFrameSetName, SIGNAL(textChanged ( const QString & )),
00889              this,SLOT(textNameFrameChanged ( const QString & ) ));
00890     connect( m_rNewFrameset, SIGNAL(toggled (bool)),
00891              this,SLOT(selectNewFrameset (bool)) );
00892 }
00893 
00894 void KWFrameDia::selectExistingFrameset() {
00895     m_rExistingFrameset->setChecked(true);
00896 }
00897 
00898 void KWFrameDia::selectNewFrameset(bool on) {
00899     if(!on) return;
00900 
00901     QListViewItem *frameSetItem  = m_lFrameSList->selectedItem();
00902     if ( !frameSetItem)
00903         return;
00904     QString str = frameSetItem->text( 0 );
00905     KWFrameSet *fs = m_doc->frameSet(str.toInt() - 1);
00906 
00907     frameSetItem->setText(1, fs->name() );
00908 }
00909 
00910 void KWFrameDia::textNameFrameChanged ( const QString &text )
00911 {
00912     if(m_rExistingFrameset->isChecked()) {
00913         QListViewItem *item = m_lFrameSList->selectedItem();
00914         if ( !item )
00915             return;
00916         item->setText(1, text );
00917     }
00918     if(m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked()) //when one of both is clicked.
00919         enableButtonOK( !text.isEmpty() );
00920     else
00921         enableButtonOK( true );
00922 }
00923 
00924 void KWFrameDia::setupTab4() { // TAB Geometry
00925     m_noSignal = true;
00926 
00927     m_tab4 = addPage( i18n( "Geometry" ) );
00928     QGridLayout* grid4 = new QGridLayout( m_tab4, 5, 1, 0, KDialog::spacingHint() );
00929 
00930     m_floating = new QCheckBox( i18n("Frame is inline"), m_tab4 );
00931 
00932     connect( m_floating, SIGNAL( toggled(bool) ), this, SLOT( slotFloatingToggled(bool) ) );
00933     int row = 0;
00934     grid4->addMultiCellWidget( m_floating, row, row, 0, 1 );
00935 
00936     row++;
00937     m_protectSize = new QCheckBox( i18n("Protect size and position"), m_tab4);
00938     grid4->addMultiCellWidget( m_protectSize, row, row, 0, 1 );
00939     connect( m_protectSize, SIGNAL( toggled(bool) ), this, SLOT( slotProtectSizeToggled(bool) ) );
00940 
00941     /* ideally the following properties could be given to any floating frame:
00942        Position: (y)
00943         Top of frame
00944         Top of paragraph
00945         Above current line
00946         At insertion point
00947         Below current line
00948         Bottom of paragraph
00949         Bottom of frame
00950         Absolute
00951        Alignment: (x)
00952         Left
00953         Right
00954         Center
00955         Closest to binding
00956         Further from binding
00957         Absolute
00958     */
00959 
00960     m_grp1 = new QGroupBox( i18n("Position"), m_tab4 );
00961     QGridLayout* pGrid = new QGridLayout( m_grp1, 3, 4, KDialog::marginHint(), KDialog::spacingHint() );
00962 
00963     m_lx = new QLabel( i18n( "Left:" ), m_grp1 );
00964     m_lx->resize( m_lx->sizeHint() );
00965     pGrid->addWidget( m_lx, 1, 0 );
00966 
00967     m_sx = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
00968 
00969     m_sx->resize( m_sx->sizeHint() );
00970     pGrid->addWidget( m_sx, 1, 1 );
00971 
00972     m_ly = new QLabel( i18n( "Top:" ), m_grp1 );
00973     m_ly->resize( m_ly->sizeHint() );
00974     pGrid->addWidget( m_ly, 1, 2 );
00975 
00976     m_sy = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
00977     m_sy->resize( m_sy->sizeHint() );
00978     pGrid->addWidget( m_sy, 1, 3 );
00979 
00980     m_lw = new QLabel( i18n( "Width:" ), m_grp1 );
00981     m_lw->resize( m_lw->sizeHint() );
00982     pGrid->addWidget( m_lw, 2, 0 );
00983 
00984     m_sw = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
00985 
00986     m_sw->resize( m_sw->sizeHint() );
00987     connect( m_sw, SIGNAL(valueChanged(double)),
00988              this, SLOT(slotUpdateHeightForWidth(double)) );
00989 
00990     pGrid->addWidget( m_sw, 2, 1 );
00991 
00992     m_lh = new QLabel( i18n( "Height:" ), m_grp1 );
00993     m_lh->resize( m_lh->sizeHint() );
00994     pGrid->addWidget( m_lh, 2, 2 );
00995 
00996     m_sh = new KoUnitDoubleSpinBox( m_grp1, 0, 9999, 1, 0.0, m_doc->unit() );
00997     connect( m_sh, SIGNAL(valueChanged(double)),
00998              this, SLOT(slotUpdateWidthForHeight(double)) );
00999 
01000     m_sh->resize( m_sh->sizeHint() );
01001 
01002     pGrid->addWidget( m_sh, 2, 3 );
01003 
01004     pGrid->setRowSpacing( 0, KDialog::spacingHint() + 5 );
01005 
01006     row++;
01007     grid4->addMultiCellWidget( m_grp1, row, row, 0,1 );
01008 
01009     if(m_frame) {
01010         m_paddingConfigWidget = new KWFourSideConfigWidget( m_doc, i18n("Margins"), m_tab4 );
01011         m_paddingConfigWidget->setValues( QMAX(0.00, m_frame->paddingLeft()),
01012                                           QMAX(0.00, m_frame->paddingRight()),
01013                                           QMAX(0.00, m_frame->paddingTop()),
01014                                           QMAX(0.00, m_frame->paddingBottom()) );
01015         row++;
01016         grid4->addMultiCellWidget( m_paddingConfigWidget, row, row, 0, 1 );
01017 
01018         if ( m_tab1 && m_cbProtectContent )
01019         {
01020             m_paddingConfigWidget->setEnabled( !m_cbProtectContent->isChecked() );
01021         }
01022     }
01023     else
01024     {
01025         m_paddingConfigWidget = 0;
01026     }
01027 
01028     initGeometrySettings();
01029 
01030     if ( !m_frame || m_defaultFrameSetIncluded ) {
01031         // is multi frame, positions don't work for that..
01032         // also not for default frames.
01033         m_sx->setEnabled( false );
01034         m_sy->setEnabled( false );
01035         m_lx->setEnabled( false );
01036         m_ly->setEnabled( false );
01037         m_lw->setEnabled( false );
01038         m_lh->setEnabled( false );
01039         m_floating->setEnabled( false );
01040     }
01041 
01042     if ( m_defaultFrameSetIncluded || m_mainFrameSetIncluded)
01043     {
01044         m_sw->setEnabled( false );
01045         m_sh->setEnabled( false );
01046         m_grp1->setEnabled( false );
01047     }
01048 
01049     if ( m_mainFrameSetIncluded )
01050     {
01051         m_grp1->hide();
01052         m_floating->hide( );
01053         m_protectSize->hide();
01054     }
01055     m_noSignal=false;
01056 
01057     ++row;
01058     grid4->setRowStretch( row, 1 );
01059 }
01060 
01061 void KWFrameDia::initGeometrySettings()
01062 {
01063     if ( m_frame ) {
01064         // is single frame dia. Fill position strings and checkboxes now.
01065 
01066         // Can't use frame->pageNum() here since frameset might be 0
01067         int pageNum = m_doc->pageManager()->pageNumber(m_frame);
01068 
01069         m_sx->setValue( KoUnit::toUserValue( m_frame->x(), m_doc->unit() ) );
01070         m_sy->setValue( KoUnit::toUserValue( m_frame->y() - m_doc->pageManager()->topOfPage(pageNum), m_doc->unit() ) );
01071         m_sw->setValue( KoUnit::toUserValue( m_frame->width(), m_doc->unit() ) );
01072         m_sh->setValue( KoUnit::toUserValue( m_frame->height(), m_doc->unit() ) );
01073 
01074         calcRatio();
01075 
01076         // userValue leads to some rounding -> store old values from the ones
01077         // displayed, so that the "change detection" in apply() works.
01078         m_oldX = m_sx->value();
01079         m_oldY = m_sy->value();
01080         m_oldW = m_sw->value();
01081         m_oldH = m_sh->value();
01082 
01083 #ifdef ALLOW_NON_INLINE_TABLES
01084         KWFrameSet * fs = m_frame->frameSet();
01085         if ( fs && fs->groupmanager() )
01086             m_floating->setText( i18n( "Table is inline" ) );
01087 #else
01088         m_floating->hide();
01089 #endif
01090 
01091         m_floating->setChecked( m_frameSetFloating );
01092         m_protectSize->setChecked( m_frameSetProtectedSize);
01093     } else {
01094         // multi frame. Fill inline and protect checkbox, leave away the position strings.
01095         KWFrame *f=m_allFrames.first();
01096         KWFrameSet *fs=f->frameSet();
01097         bool ps=fs->isProtectSize();
01098         m_protectSize->setChecked( ps );
01099 
01100         bool table=fs->groupmanager();
01101         if(table)
01102             fs=fs->groupmanager();
01103         bool inlineframe =fs->isFloating();
01104         m_floating->setChecked( inlineframe );
01105 
01106         double commonWidth = f->width();
01107         double commonHeight = f->height();
01108         m_sw->setEnabled( true );
01109         m_sh->setEnabled( true );
01110 
01111         f=m_allFrames.next();
01112         while(f) {
01113             KWFrameSet *fs=f->frameSet();
01114             if(ps != fs->isProtectSize()) {
01115                 m_protectSize->setTristate();
01116                 m_protectSize->setNoChange();
01117             }
01118             if(fs->groupmanager()) //table
01119                 fs=fs->groupmanager();
01120             else
01121                 table=false;
01122 
01123             if(inlineframe != fs->isFloating()) {
01124                 m_floating->setTristate();
01125                 m_floating->setNoChange();
01126             }
01127 
01128             if ( kAbs( f->width() - commonWidth ) > 1E-6 ) {
01129                 kdDebug() << k_funcinfo << "width differs:" << f->width() << " " << commonWidth << endl;
01130                 m_sw->setEnabled( false );
01131             }
01132             if ( kAbs( f->height() - commonHeight ) > 1E-6 ) {
01133                 kdDebug() << k_funcinfo << "height differs:" << f->height() << " " << commonHeight << endl;
01134                 m_sh->setEnabled( false );
01135             }
01136 
01137             f=m_allFrames.next();
01138         }
01139         // TODO show a special value when frames have a different width/height
01140         if ( m_sw->isEnabled() )
01141             m_sw->setValue( KoUnit::toUserValue( commonWidth, m_doc->unit() ) );
01142         if ( m_sh->isEnabled() )
01143             m_sh->setValue( KoUnit::toUserValue( commonHeight, m_doc->unit() ) );
01144         if(table)
01145         {
01146 #ifdef ALLOW_NON_INLINE_TABLES
01147             m_floating->setText( i18n( "Table is inline" ) );
01148 #else
01149             m_floating->hide();
01150 #endif
01151         }
01152     }
01153 }
01154 
01155 void KWFrameDia::setupTab5() { // Tab Background fill/color
01156     m_tab5 = addPage( i18n("Background") );
01157     QGridLayout* grid5 = new QGridLayout( m_tab5, 0 /*auto*/, 2, 0, KDialog::spacingHint() );
01158 
01159     int row = 0;
01160     if (!m_frame ) {
01161         m_overwriteColor = new QCheckBox (i18n("Set new color on all selected frames"), m_tab5);
01162         grid5->addMultiCellWidget(m_overwriteColor,row,row,0,1);
01163         row++;
01164     }
01165     //brushPreview=new KWBrushStylePreview(m_tab5);
01166     //grid5->addMultiCellWidget(brushPreview,row,5,1,1);
01167 
01168     m_transparentCB = new QCheckBox( i18n( "Transparent background" ), m_tab5 );
01169     grid5->addWidget(m_transparentCB,row++,0);
01170     m_transparentCB->setEnabled( !m_mainFrameSetIncluded );
01171 
01172     QLabel *labelBgColor = new QLabel( i18n( "Background color:" ), m_tab5 );
01173 
01174     grid5->addWidget(labelBgColor,row++,0);
01175 
01176     m_brushColor = new KColorButton( Qt::white, KWDocument::defaultBgColor(0), m_tab5 );
01177     grid5->addWidget(m_brushColor,row++,0);
01178 
01179 //    connect( m_brushColor, SIGNAL( changed( const QColor & ) ),
01180 //        this, SLOT( updateBrushPreview() ) );
01181 
01182 
01183     // ###########################
01184     // Fill styles are ugly and not WYSIWYG (due to being pixel-based)
01185     // Feature not in OOo either (they have a configurable level of transparency instead, much nicer)
01186 #if 0
01187     l = new QLabel( i18n( "Background style:" ), m_tab5 );
01188     grid5->addWidget(l,row++,0);
01189 
01190     brushStyle = new QComboBox( false,m_tab5, "BStyle" );
01191     grid5->addWidget(brushStyle,row++,0);
01192 
01193     brushStyle->insertItem( i18n( "No Background Fill" ) );
01194     // xgettext:no-c-format
01195     brushStyle->insertItem( i18n( "100% Fill Pattern" ) );
01196     // xgettext:no-c-format
01197     brushStyle->insertItem( i18n( "94% Fill Pattern" ) );
01198     // xgettext:no-c-format
01199     brushStyle->insertItem( i18n( "88% Fill Pattern" ) );
01200     // xgettext:no-c-format
01201     brushStyle->insertItem( i18n( "63% Fill Pattern" ) );
01202     // xgettext:no-c-format
01203     brushStyle->insertItem( i18n( "50% Fill Pattern" ) );
01204     // xgettext:no-c-format
01205     brushStyle->insertItem( i18n( "37% Fill Pattern" ) );
01206     // xgettext:no-c-format
01207     brushStyle->insertItem( i18n( "12% Fill Pattern" ) );
01208     // xgettext:no-c-format
01209     brushStyle->insertItem( i18n( "6% Fill Pattern" ) );
01210     brushStyle->insertItem( i18n( "Horizontal Lines" ) );
01211     brushStyle->insertItem( i18n( "Vertical Lines" ) );
01212     brushStyle->insertItem( i18n( "Crossing Lines" ) );
01213     brushStyle->insertItem( i18n( "Diagonal Lines ( / )" ) );
01214     brushStyle->insertItem( i18n( "Diagonal Lines ( \\ )" ) );
01215     brushStyle->insertItem( i18n( "Diagonal Crossing Lines" ) );
01216     connect(  brushStyle, SIGNAL( activated( int ) ),
01217         this, SLOT( updateBrushPreview() ) );
01218 
01219     updateBrushPreview();
01220 #endif
01221 
01222     connect( m_transparentCB, SIGNAL( toggled( bool ) ), labelBgColor, SLOT( setDisabled( bool ) ) );
01223     connect( m_transparentCB, SIGNAL( toggled( bool ) ), m_brushColor, SLOT( setDisabled( bool ) ) );
01224     initBrush();
01225 
01226     QSpacerItem* spacer = new QSpacerItem( 10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding);
01227     grid5->addItem( spacer,row,0 );
01228 }
01229 
01230 void KWFrameDia::setupTab6() // Border style
01231 {
01232     m_tab6 = addPage( i18n("&Borders") );
01233 
01234     QGridLayout *grid = new QGridLayout( m_tab6, 8, 2, 0, KDialog::spacingHint() );
01235 
01236     QLabel * lStyle = new QLabel( i18n( "St&yle:" ), m_tab6 );
01237     grid->addWidget( lStyle, 0, 0 );
01238 
01239     m_cStyle = new QComboBox( false, m_tab6 );
01240     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::SOLID ) );
01241     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH ) );
01242     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DOT ) );
01243     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH_DOT ) );
01244     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DASH_DOT_DOT ) );
01245     m_cStyle->insertItem( KoBorder::getStyle( KoBorder::DOUBLE_LINE  ) );
01246     lStyle->setBuddy( m_cStyle );
01247     grid->addWidget( m_cStyle, 1, 0 );
01248 
01249     QLabel * lWidth = new QLabel( i18n( "&Width:" ), m_tab6 );
01250     grid->addWidget( lWidth, 2, 0 );
01251 
01252     m_cWidth = new QComboBox( false, m_tab6 );
01253     for( unsigned int i = 1; i <= 10; i++ )
01254         m_cWidth->insertItem(QString::number(i));
01255     lWidth->setBuddy( m_cWidth );
01256     grid->addWidget( m_cWidth, 3, 0 );
01257 
01258     QLabel * lColor = new QLabel( i18n( "Co&lor:" ), m_tab6 );
01259     grid->addWidget( lColor, 4, 0 );
01260 
01261     m_bColor = new KColorButton( black,
01262                                 black,
01263                                 m_tab6 );
01264 
01265     lColor->setBuddy( m_bColor );
01266     grid->addWidget( m_bColor, 5, 0 );
01267 
01268     QButtonGroup * bb = new QHButtonGroup( m_tab6 );
01269     bb->setFrameStyle(QFrame::NoFrame);
01270     m_bLeft = new QPushButton(bb);
01271     m_bLeft->setPixmap( BarIcon( "borderleft" ) );
01272     m_bLeft->setToggleButton( true );
01273     m_bRight = new QPushButton(bb);
01274     m_bRight->setPixmap( BarIcon( "borderright" ) );
01275     m_bRight->setToggleButton( true );
01276     m_bTop = new QPushButton(bb);
01277     m_bTop->setPixmap( BarIcon( "bordertop" ) );
01278     m_bTop->setToggleButton( true );
01279     m_bBottom = new QPushButton(bb);
01280     m_bBottom->setPixmap( BarIcon( "borderbottom" ) );
01281     m_bBottom->setToggleButton( true );
01282     grid->addWidget( bb, 6, 0 );
01283 
01284     connect( m_bLeft, SIGNAL( toggled( bool ) ), this, SLOT( brdLeftToggled( bool ) ) );
01285     connect( m_bRight, SIGNAL( toggled( bool ) ), this, SLOT( brdRightToggled( bool ) ) );
01286     connect( m_bTop, SIGNAL( toggled( bool ) ), this, SLOT( brdTopToggled( bool ) ) );
01287     connect( m_bBottom, SIGNAL( toggled( bool ) ), this, SLOT( brdBottomToggled( bool ) ) );
01288 
01289     initBorderSettings();
01290 
01291     QGroupBox *grp=new QGroupBox( 0, Qt::Vertical, i18n( "Preview" ), m_tab6, "previewgrp" );
01292     grid->addMultiCellWidget( grp , 0, 7, 1, 1 );
01293     grp->layout()->setSpacing(KDialog::spacingHint());
01294     grp->layout()->setMargin(KDialog::marginHint());
01295     m_prev3 = new KoBorderPreview( grp );
01296     QVBoxLayout *lay1 = new QVBoxLayout( grp->layout() );
01297     lay1->addWidget(m_prev3);
01298 
01299     connect( m_prev3, SIGNAL( choosearea(QMouseEvent * ) ),
01300              this, SLOT( slotPressEvent(QMouseEvent *) ) );
01301 
01302     // update the bordet preview widget
01303     m_prev3->setLeftBorder( m_leftBorder );
01304     m_prev3->setRightBorder( m_rightBorder );
01305     m_prev3->setTopBorder( m_topBorder );
01306     m_prev3->setBottomBorder( m_bottomBorder );
01307 
01308     grid->setRowStretch( 7, 1 );
01309     grid->setColStretch( 1, 1 );
01310 }
01311 
01312 void KWFrameDia::initBorderSettings()
01313 {
01314     KWFrame *f = m_mainFrame ? m_mainFrame : ( m_frame ? m_frame : m_allFrames.first() );
01315     m_leftBorder = f->leftBorder();
01316     m_rightBorder = f->rightBorder();
01317     m_topBorder = f->topBorder();
01318     m_bottomBorder = f->bottomBorder();
01319 }
01320 
01321 #define OFFSETX 15
01322 #define OFFSETY 7
01323 #define Ko_SPACE 30
01324 void KWFrameDia::slotPressEvent(QMouseEvent *ev)
01325 {
01326     QRect r = m_prev3->contentsRect();
01327     QRect rect(r.x()+OFFSETX,r.y()+OFFSETY,r.width()-OFFSETX,r.y()+OFFSETY+Ko_SPACE);
01328     if(rect.contains(QPoint(ev->x(),ev->y())))
01329     {
01330         if( (  ((int)m_topBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_topBorder.color != m_bColor->color() )
01331                ||(m_topBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bTop->isOn() )
01332         {
01333             m_topBorder.setPenWidth( m_cWidth->currentText().toInt() );
01334             m_topBorder.color = QColor( m_bColor->color() );
01335             m_topBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
01336             m_prev3->setTopBorder( m_topBorder );
01337         }
01338         else
01339             m_bTop->setOn(!m_bTop->isOn());
01340     }
01341     rect.setCoords(r.x()+OFFSETX,r.height()-OFFSETY-Ko_SPACE,r.width()-OFFSETX,r.height()-OFFSETY);
01342     if(rect.contains(QPoint(ev->x(),ev->y())))
01343     {
01344         if( (  ((int)m_bottomBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_bottomBorder.color != m_bColor->color() )
01345                ||(m_bottomBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bBottom->isOn() )
01346         {
01347             m_bottomBorder.setPenWidth(m_cWidth->currentText().toInt());
01348             m_bottomBorder.color = QColor( m_bColor->color() );
01349             m_bottomBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
01350             m_prev3->setBottomBorder( m_bottomBorder );
01351         }
01352         else
01353             m_bBottom->setOn(!m_bBottom->isOn());
01354     }
01355 
01356     rect.setCoords(r.x()+OFFSETX,r.y()+OFFSETY,r.x()+Ko_SPACE+OFFSETX,r.height()-OFFSETY);
01357     if(rect.contains(QPoint(ev->x(),ev->y())))
01358     {
01359 
01360         if( (  ((int)m_leftBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_leftBorder.color != m_bColor->color() )
01361                ||(m_leftBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bLeft->isOn() )
01362         {
01363             m_leftBorder.setPenWidth( m_cWidth->currentText().toInt());
01364             m_leftBorder.color = QColor( m_bColor->color() );
01365             m_leftBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
01366             m_prev3->setLeftBorder( m_leftBorder );
01367         }
01368         else
01369             m_bLeft->setOn(!m_bLeft->isOn());
01370     }
01371     rect.setCoords(r.width()-OFFSETX-Ko_SPACE,r.y()+OFFSETY,r.width()-OFFSETX,r.height()-OFFSETY);
01372     if(rect.contains(QPoint(ev->x(),ev->y())))
01373     {
01374 
01375         if( (  ((int)m_rightBorder.penWidth() != m_cWidth->currentText().toInt()) ||(m_rightBorder.color != m_bColor->color() )
01376                ||(m_rightBorder.getStyle()!=KoBorder::getStyle(m_cStyle->currentText()) )) && m_bRight->isOn() )
01377         {
01378             m_rightBorder.setPenWidth( m_cWidth->currentText().toInt());
01379             m_rightBorder.color = m_bColor->color();
01380             m_rightBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
01381             m_prev3->setRightBorder( m_rightBorder );
01382         }
01383         else
01384             m_bRight->setOn(!m_bRight->isOn());
01385     }
01386 }
01387 #undef OFFSETX
01388 #undef OFFSETY
01389 #undef Ko_SPACE
01390 
01391 
01392 void KWFrameDia::brdLeftToggled( bool on )
01393 {
01394     if ( !on )
01395         m_leftBorder.setPenWidth(0);
01396     else {
01397         m_leftBorder.setPenWidth(m_cWidth->currentText().toInt());
01398         m_leftBorder.color = m_bColor->color();
01399         m_leftBorder.setStyle(KoBorder::getStyle( m_cStyle->currentText() ));
01400     }
01401     m_prev3->setLeftBorder( m_leftBorder );
01402 }
01403 
01404 void KWFrameDia::brdRightToggled( bool on )
01405 {
01406     if ( !on )
01407         m_rightBorder.setPenWidth(0);
01408     else {
01409         m_rightBorder.setPenWidth(m_cWidth->currentText().toInt());
01410         m_rightBorder.color = m_bColor->color();
01411         m_rightBorder.setStyle( KoBorder::getStyle( m_cStyle->currentText() ));
01412     }
01413     m_prev3->setRightBorder( m_rightBorder );
01414 }
01415 
01416 void KWFrameDia::brdTopToggled( bool on )
01417 {
01418     if ( !on )
01419         m_topBorder.setPenWidth(0);
01420     else {
01421         m_topBorder.setPenWidth(m_cWidth->currentText().toInt());
01422         m_topBorder.color = m_bColor->color();
01423         m_topBorder.setStyle(KoBorder::getStyle( m_cStyle->currentText() ));
01424     }
01425     m_prev3->setTopBorder( m_topBorder );
01426 }
01427 
01428 void KWFrameDia::brdBottomToggled( bool on )
01429 {
01430     if ( !on )
01431         m_bottomBorder.setPenWidth ( 0 );
01432     else {
01433         m_bottomBorder.setPenWidth( m_cWidth->currentText().toInt());
01434         m_bottomBorder.color = m_bColor->color();
01435         m_bottomBorder.setStyle(KoBorder::getStyle(m_cStyle->currentText()));
01436     }
01437     m_prev3->setBottomBorder( m_bottomBorder );
01438 }
01439 
01440 void KWFrameDia::slotProtectContentChanged( bool b )
01441 {
01442     if (m_tab4 && !m_noSignal && m_paddingConfigWidget) {
01443         m_paddingConfigWidget->setEnabled( !b );
01444     }
01445 }
01446 
01447 void KWFrameDia::slotUpdateWidthForHeight(double height)
01448 {
01449     if ( !m_cbAspectRatio || m_cbAspectRatio->state() != QButton::NoChange)
01450         return;
01451     if ( m_heightByWidthRatio == 0 )
01452         return; // avoid DBZ
01453     m_sw->setValue( height / m_heightByWidthRatio );
01454 
01455 }
01456 
01457 void KWFrameDia::slotUpdateHeightForWidth( double width )
01458 {
01459     if ( !m_cbAspectRatio || m_cbAspectRatio->state() != QButton::NoChange)
01460         return;
01461     m_sh->setValue( width * m_heightByWidthRatio );
01462 }
01463 
01464 void KWFrameDia::slotKeepRatioToggled(bool on)
01465 {
01466     if ( !on || !m_sw || !m_sh) return;
01467     calcRatio();
01468 }
01469 void KWFrameDia::ensureValidFramesetSelected()
01470 {
01471     enableButtonOK( m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked() && m_lFrameSList->selectedItem() != NULL);
01472 }
01473 
01474 void KWFrameDia::calcRatio()
01475 {
01476     if ( m_sw->value() == 0 )
01477         m_heightByWidthRatio = 1.0; // arbitrary
01478     else
01479         m_heightByWidthRatio = m_sh->value() / m_sw->value();
01480 }
01481 
01482 void KWFrameDia::initBrush()
01483 {
01484     bool allFramesSame=true;
01485     if ( m_frame )
01486         m_newBrushStyle = m_frame->backgroundColor();
01487     else {
01488         KWFrame *f=m_allFrames.first();
01489         m_newBrushStyle = f->backgroundColor();
01490         f=m_allFrames.next();
01491         while(f) {
01492             if(m_newBrushStyle != f->backgroundColor()) {
01493                 allFramesSame=false;
01494                 break;
01495             }
01496             f=m_allFrames.next();
01497         }
01498         m_overwriteColor->setChecked(allFramesSame);
01499     }
01500 
01501     m_transparentCB->setChecked( m_newBrushStyle.style() == NoBrush );
01502 
01503 #if 0
01504     switch ( m_newBrushStyle.style() )
01505     {
01506         case NoBrush:
01507             brushStyle->setCurrentItem( 0 );
01508             break;
01509         case SolidPattern:
01510             brushStyle->setCurrentItem( 1 );
01511             break;
01512         case Dense1Pattern:
01513             brushStyle->setCurrentItem( 2 );
01514             break;
01515         case Dense2Pattern:
01516             brushStyle->setCurrentItem( 3 );
01517             break;
01518         case Dense3Pattern:
01519             brushStyle->setCurrentItem( 4 );
01520             break;
01521         case Dense4Pattern:
01522             brushStyle->setCurrentItem( 5 );
01523             break;
01524         case Dense5Pattern:
01525             brushStyle->setCurrentItem( 6 );
01526             break;
01527         case Dense6Pattern:
01528             brushStyle->setCurrentItem( 7 );
01529             break;
01530         case Dense7Pattern:
01531             brushStyle->setCurrentItem( 8 );
01532             break;
01533         case HorPattern:
01534             brushStyle->setCurrentItem( 9 );
01535             break;
01536         case VerPattern:
01537             brushStyle->setCurrentItem( 10 );
01538             break;
01539         case CrossPattern:
01540             brushStyle->setCurrentItem( 11 );
01541             break;
01542         case BDiagPattern:
01543             brushStyle->setCurrentItem( 12 );
01544             break;
01545         case FDiagPattern:
01546             brushStyle->setCurrentItem( 13 );
01547             break;
01548         case DiagCrossPattern:
01549             brushStyle->setCurrentItem( 14 );
01550             break;
01551         case CustomPattern:
01552             break;
01553     }
01554 #endif
01555 
01556     QColor col = KWDocument::resolveBgColor( m_newBrushStyle.color(), 0 );
01557     m_brushColor->setColor( col );
01558 }
01559 
01560 QBrush KWFrameDia::frameBrushStyle() const
01561 {
01562     QBrush brush;
01563 
01564     brush.setStyle( m_transparentCB->isChecked() ? NoBrush : SolidPattern );
01565 
01566 #if 0
01567     switch ( brushStyle->currentItem() )
01568     {
01569         case 0:
01570             brush.setStyle( NoBrush );
01571             break;
01572         case 1:
01573             brush.setStyle( SolidPattern );
01574             break;
01575         case 2:
01576             brush.setStyle( Dense1Pattern );
01577             break;
01578         case 3:
01579             brush.setStyle( Dense2Pattern );
01580             break;
01581         case 4:
01582             brush.setStyle( Dense3Pattern );
01583             break;
01584         case 5:
01585             brush.setStyle( Dense4Pattern );
01586             break;
01587         case 6:
01588             brush.setStyle( Dense5Pattern );
01589             break;
01590         case 7:
01591             brush.setStyle( Dense6Pattern );
01592             break;
01593         case 8:
01594             brush.setStyle( Dense7Pattern );
01595             break;
01596         case 9:
01597             brush.setStyle( HorPattern );
01598             break;
01599         case 10:
01600             brush.setStyle( VerPattern );
01601             break;
01602         case 11:
01603             brush.setStyle( CrossPattern );
01604             break;
01605         case 12:
01606             brush.setStyle( BDiagPattern );
01607             break;
01608         case 13:
01609             brush.setStyle( FDiagPattern );
01610             break;
01611         case 14:
01612             brush.setStyle( DiagCrossPattern );
01613             break;
01614     }
01615 #endif
01616 
01617     brush.setColor( m_brushColor->color() );
01618 
01619     return brush;
01620 }
01621 
01622 #if 0
01623 void KWFrameDia::updateBrushPreview()
01624 {
01625     if(brushStyle->currentItem()==0) {
01626         brushPreview->hide();
01627     } else {
01628         brushPreview->show();
01629         brushPreview->setBrush(frameBrushStyle());
01630         brushPreview->repaint(true);
01631     }
01632 }
01633 #endif
01634 
01635 // Called when "m_reconnect" or "no followup" is checked
01636 void KWFrameDia::setFrameBehaviorInputOn() {
01637     if ( m_tab4 && m_floating->isChecked() )
01638         return;
01639     if( m_rAppendFrame && m_rResizeFrame && m_rNoShow /*&& !m_rAppendFrame->isEnabled()*/ ) {
01640         if(m_frameBehavior== KWFrame::AutoExtendFrame) {
01641             m_rResizeFrame->setChecked(true);
01642         } else if (m_frameBehavior== KWFrame::AutoCreateNewFrame) {
01643             m_rAppendFrame->setChecked(true);
01644         } else {
01645             m_rNoShow->setChecked(true);
01646         }
01647         m_rResizeFrame->setEnabled(true);
01648         // Can't have "create a new page" if "no followup", that wouldn't work
01649         kdDebug() << "setFrameBehaviorInputOn: m_reconnect->isChecked()==" << m_reconnect->isChecked() << endl;
01650         m_rAppendFrame->setEnabled( m_reconnect->isChecked() );
01651         m_rNoShow->setEnabled(true);
01652     }
01653 }
01654 
01655 // Called when "place a copy" is checked
01656 void KWFrameDia::setFrameBehaviorInputOff() {
01657     if ( m_tab4 && m_floating->isChecked() )
01658         return;
01659     if( m_rAppendFrame && m_rResizeFrame && m_rNoShow && m_rAppendFrame->isEnabled() ) {
01660         if(m_rResizeFrame->isChecked()) {
01661             m_frameBehavior=KWFrame::AutoExtendFrame;
01662         } else if ( m_rAppendFrame->isChecked()) {
01663             m_frameBehavior=KWFrame::AutoCreateNewFrame;
01664         } else {
01665             m_frameBehavior=KWFrame::Ignore;
01666         }
01667         // In "Place a copy" mode, we can't have "create new page if text too long"
01668         if ( m_rAppendFrame->isChecked() )
01669             m_rNoShow->setChecked(true);
01670         m_rAppendFrame->setEnabled(false);
01671         m_rResizeFrame->setEnabled(true);
01672         m_rNoShow->setEnabled(true);
01673     }
01674 }
01675 
01676 void KWFrameDia::enableSizeAndPosition()
01677 {
01678     bool canMove = ( m_floating->state() == QButton::Off ) // can move if no frame is floating
01679                    && ( m_protectSize->state() == QButton::Off ) // protects size too
01680                    && !m_defaultFrameSetIncluded // those can't be moved
01681                    && m_frame; // can't move if multiple frames selected
01682     m_sx->setEnabled( canMove );
01683     m_sy->setEnabled( canMove );
01684     bool canResize = ( m_protectSize->state() == QButton::Off ) // can resize if no frame is protect-size'd
01685                      && !m_defaultFrameSetIncluded; // those can't be resized
01686     m_sw->setEnabled( canResize );
01687     m_sh->setEnabled( canResize );
01688 }
01689 
01690 void KWFrameDia::slotProtectSizeToggled(bool)
01691 {
01692     enableSizeAndPosition();
01693 }
01694 
01695 void KWFrameDia::slotFloatingToggled(bool b)
01696 {
01697     enableSizeAndPosition();
01698     if (m_tab1 && m_rAppendFrame && m_rResizeFrame && m_rNoShow ) {
01699         m_cbCopy->setEnabled( !b ); // 'copy' irrelevant for floating frames.
01700         if ( m_rAppendFrame )
01701         {
01702             m_rAppendFrame->setEnabled( !b ); // 'create new page' irrelevant for floating frames.
01703             if ( b && m_rAppendFrame->isChecked() )
01704                 m_rNoShow->setChecked( true );
01705         }
01706         enableOnNewPageOptions();
01707         if ( b ) {
01708             m_noFollowup->setChecked( true );
01709             m_cbCopy->setChecked( false );
01710         } else {
01711             // Revert to non-inline frame stuff
01712             m_rResizeFrame->setEnabled(true);
01713             m_rAppendFrame->setEnabled(true);
01714             m_rNoShow->setEnabled(true);
01715         }
01716     }
01717 
01718     enableRunAround();
01719 }
01720 
01721 // Enable or disable the "on new page" options
01722 void KWFrameDia::enableOnNewPageOptions()
01723 {
01724     if ( m_tab1 )
01725     {
01726         bool f = m_tab4 && m_floating->isChecked();
01727         // 'what happens on new page' is irrelevant for floating frames
01728         m_reconnect->setEnabled( !f );
01729         m_noFollowup->setEnabled( !f );
01730         m_copyRadio->setEnabled( !f );
01731 
01732         if( m_frameType != FT_TEXT )
01733             m_reconnect->setEnabled( false );
01734         else if(m_frame) {
01735             KWFrameSet *fs = m_frame->frameSet(); // 0 when creating a frame
01736             if ( fs && (fs->isHeaderOrFooter() || fs->isFootEndNote() ))
01737             {
01738                 m_reconnect->setEnabled( false );
01739                 m_noFollowup->setEnabled( false );
01740             }
01741         }
01742     }
01743 }
01744 
01745 void KWFrameDia::enableRunAround()
01746 {
01747     if ( m_tab2 )
01748     {
01749         if ( m_tab4 && m_floating->isChecked() ) {
01750             m_runGroup->setEnabled( false ); // Runaround options don't make sense for floating frames
01751         } else
01752         {
01753             if ( m_frame && m_frame->frameSet() )
01754                 m_runGroup->setEnabled( !m_frameSetFloating && !m_frame->frameSet()->isMainFrameset() && !m_frame->frameSet()->isHeaderOrFooter() && !m_frame->frameSet()->isFootEndNote() );
01755             else
01756                 m_runGroup->setEnabled( true );
01757         }
01758         m_runSideGroup->setEnabled( m_runGroup->isEnabled() && m_rRunBounding->isChecked() );
01759         m_raDistConfigWidget->setEnabled( m_runGroup->isEnabled() &&
01760             ( m_rRunBounding->isChecked() || m_rRunSkip->isChecked() ) );
01761     }
01762 }
01763 
01764 bool KWFrameDia::applyChanges()
01765 {
01766     kdDebug() << "KWFrameDia::applyChanges"<<endl;
01767     KWFrame *frameCopy = 0L;
01768     bool isNewFrame=false;
01769     if(m_frame) { // only do undo/redo when we have 1 frame to change for now..
01770         frameCopy = m_frame->getCopy(); // keep a copy of the original (for undo/redo)
01771         isNewFrame = m_frame->frameSet() == 0L; // true if we are creating a newframe
01772     }
01773     QString name=QString::null;
01774 
01775     KMacroCommand * macroCmd=0L;
01776     if ( m_tab3 ) { // TAB Frameset
01777         // Frame/Frameset belonging, and frameset naming
01778         // We basically have three cases:
01779         // * Creating a new frame (fs==0), and creating a frameset (m_rNewFrameset selected)
01780         // * Creating a frame (fs==0), and attaching to an existing frameset (other)
01781         // * Editing a frame (fs!=0), possibly changing the frameset attachment (maybe creating a new one)
01782 
01783         name = m_eFrameSetName->text();
01784         if ( name.isEmpty() ) // Don't allow empty names
01785             name = m_doc->generateFramesetName( i18n( "Text Frameset %1" ) );
01786         KWFrameSet *fs = 0L;
01787         QListViewItem *frameSetItem  = m_lFrameSList->selectedItem();
01788         if(frameSetItem) {
01789             QString str = frameSetItem->text( 0 );
01790             fs = m_doc->frameSet(str.toInt() - 1);
01791         }
01792         if(m_rNewFrameset->isChecked()) { // create a new FS.
01793             if(m_frame && m_frame->frameSet()) {
01794                 // disconnect.
01795                 if(! mayDeleteFrameSet( static_cast<KWTextFrameSet*>(m_frame->frameSet())))
01796                     return false;
01797                 m_frame->frameSet()->deleteFrame( m_frame, false );
01798             } else {
01799                 // first check all frames and ask the user if its ok to disconnect.
01800                 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
01801                     if(! mayDeleteFrameSet( static_cast<KWTextFrameSet*>(f->frameSet())))
01802                         return false;
01803                 }
01804                 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
01805                     f->frameSet()->deleteFrame( f, false );
01806             }
01807         } else if(m_rExistingFrameset->isChecked()) { // rename and/or m_reconnect a new frameset for this frame.
01808             if(frameSetItem && (fs->name() != frameSetItem->text( 1 ))) { // rename FS.
01809                 if(!macroCmd)
01810                     macroCmd = new KMacroCommand( i18n("Rename Frameset") );
01811                 // Rename frameset
01812                 typedef KoSetPropCommand<QString, KWFrameSet, &KWFrameSet::setName> FramesetNameCommand;
01813                 FramesetNameCommand* cmd = new FramesetNameCommand( fs, i18n( "Rename Frameset" ), fs->name(), frameSetItem->text( 1 ) );
01814                 macroCmd->addCommand(cmd);
01815                 cmd->execute();
01816             }
01817             if(m_frame && fs ) {
01818                 if(m_frame->frameSet() != fs)  {
01819                     if(m_frame->frameSet()!=0) {
01820                         // m_reconnect.
01821                         if(! mayDeleteFrameSet( dynamic_cast<KWTextFrameSet*>(m_frame->frameSet())))
01822                             return false;
01823                         m_frame->frameSet()->deleteFrame( m_frame, false );
01824                     }
01825                     fs->addFrame(m_frame);
01826                 }
01827             } else if ( fs ){
01828                 // first check all frames and ask the user if its ok to m_reconnect.
01829                 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
01830                     if(f->frameSet() != fs) {  // m_reconnect.
01831                         if(! mayDeleteFrameSet( dynamic_cast<KWTextFrameSet*>(f->frameSet())))
01832                             return false;
01833                     }
01834                 }
01835                 if ( fs )
01836                 {
01837                     // then do the reconnects.
01838                     for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
01839                         KWFrameSet *fs2=f->frameSet();
01840                         if(! (fs2->isHeaderOrFooter() || fs2->isMainFrameset()) ) {
01841                             if(fs2 != fs) {  // m_reconnect.
01842                                 f->frameSet()->deleteFrame( f, false );
01843                                 fs->addFrame(f);
01844                             }
01845                         }
01846                     }
01847                 }
01848             }
01849         }
01850         if(m_rNewFrameset->isChecked() || m_rExistingFrameset->isChecked()) {
01851             // check if new name is unique
01852             for (QPtrListIterator<KWFrameSet> fit = m_doc->framesetsIterator(); fit.current() ; ++fit ) {
01853                 if ( !fit.current()->isDeleted() &&  // Allow to reuse a deleted frameset's name
01854                      fs != fit.current() && fit.current()->name() == name) {
01855                     if ( m_rNewFrameset->isChecked() )
01856                         KMessageBox::sorry( this,
01857                                             i18n( "A new frameset with the name '%1' "
01858                                                   "can not be made because a frameset with that name "
01859                                                   "already exists. Please enter another name or select "
01860                                                   "an existing frameset from the list.").arg(name));
01861                     else
01862                         KMessageBox::sorry( this,
01863                                             i18n( "A frameset with the name '%1' "
01864                                                   "already exists. Please enter another name." ).arg(name) );
01865                     m_eFrameSetName->setText(m_oldFrameSetName);
01866                     return false;
01867                 }
01868             }
01869         }
01870     }
01871     if ( m_tab1 ) { // TAB Frame Options
01872         // Copy
01873         if(m_frame)
01874             m_frame->setCopy( m_cbCopy->isChecked() );
01875         else if(m_cbCopy->state() != QButton::NoChange) {
01876             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
01877                 if(f == f->frameSet()->frame(0))  continue; // skip first frame of any frameset.
01878                 f->setCopy( m_cbCopy->isChecked() );
01879             }
01880         }
01881 
01882         // FrameBehavior
01883         if ( m_frameType == FT_TEXT )
01884         {
01885             bool update=true;
01886             KWFrame::FrameBehavior fb=KWFrame::AutoCreateNewFrame;
01887             if(m_rResizeFrame->isChecked())
01888                 fb = KWFrame::AutoExtendFrame;
01889             else if ( m_rAppendFrame->isChecked())
01890                 fb = KWFrame::AutoCreateNewFrame;
01891             else if ( m_rNoShow->isChecked())
01892                 fb = KWFrame::Ignore;
01893             else
01894                 update=false;
01895 
01896             if(m_frame)
01897                 if(m_cbAllFrames->isChecked() && m_frame->frameSet())
01898                     m_frame->frameSet()->setFrameBehavior(fb);
01899                 else
01900                     m_frame->setFrameBehavior(fb);
01901             else if(update) {
01902                 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
01903                     if(m_cbAllFrames->isChecked())
01904                         f->frameSet()->setFrameBehavior(fb);
01905                     else
01906                         f->setFrameBehavior(fb);
01907             }
01908             if ( m_frame && m_frame->frameSet())
01909             {
01910                 KWTextFrameSet * frm=static_cast<KWTextFrameSet *>( m_frame->frameSet() );
01911                 if(frm->textObject()->protectContent()!=m_cbProtectContent->isChecked())
01912                 {
01913                     if(!macroCmd)
01914                         macroCmd = new KMacroCommand( i18n("Protect Content") );
01915                     KWProtectContentCommand * cmd = new KWProtectContentCommand( i18n("Protect Content"), frm,m_cbProtectContent->isChecked() );
01916                     cmd->execute();
01917                     macroCmd->addCommand(cmd);
01918                 }
01919             }
01920             else
01921             {
01922                 if ( m_cbProtectContent->state() != QButton::NoChange)
01923                 {
01924                     for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
01925                     {
01926                         KWTextFrameSet * frm=dynamic_cast<KWTextFrameSet *>( f->frameSet() );
01927                         if ( frm )
01928                         {
01929                             if(frm->textObject()->protectContent()!=m_cbProtectContent->isChecked())
01930                             {
01931                                 if(!macroCmd)
01932                                     macroCmd = new KMacroCommand( i18n("Protect Content") );
01933                                 KWProtectContentCommand * cmd = new KWProtectContentCommand( i18n("Protect Content"), frm,m_cbProtectContent->isChecked() );
01934                                 cmd->execute();
01935                                 macroCmd->addCommand(cmd);
01936                             }
01937                         }
01938 
01939                     }
01940                 }
01941             }
01942 
01943         }
01944         // NewFrameBehavior
01945         bool update=true;
01946         KWFrame::NewFrameBehavior nfb=KWFrame::Reconnect;
01947         if( m_reconnect && m_reconnect->isChecked() )
01948             nfb = KWFrame::Reconnect;
01949         else if ( m_noFollowup->isChecked() )
01950             nfb = KWFrame::NoFollowup;
01951         else if ( m_copyRadio->isChecked() )
01952             nfb = KWFrame::Copy;
01953         else
01954             update=false;
01955 
01956         if(m_frame)
01957             if(m_cbAllFrames->isChecked() && m_frame->frameSet())
01958                 m_frame->frameSet()->setNewFrameBehavior(nfb);
01959             else
01960                 m_frame->setNewFrameBehavior(nfb);
01961         else if(update)
01962             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
01963                 if(m_cbAllFrames->isChecked())
01964                     f->frameSet()->setNewFrameBehavior(nfb);
01965                 else
01966                     f->setNewFrameBehavior(nfb);
01967 
01968         // aspect ratio
01969         if ( m_cbAspectRatio && (m_frameType==FT_PICTURE))
01970         {
01971             typedef KoSetBasicPropCommand<bool, KWPictureFrameSet, &KWPictureFrameSet::setKeepAspectRatio> FramesetSetKeepAspectRatioCommand;
01972             if(m_frame) {
01973                 KWPictureFrameSet * frm=static_cast<KWPictureFrameSet *>( m_frame->frameSet() );
01974                 if ( frm->keepAspectRatio() != m_cbAspectRatio->isChecked() )
01975                 {
01976                     if(!macroCmd)
01977                         macroCmd = new KMacroCommand( i18n("Frame Properties") );
01978                     FramesetSetKeepAspectRatioCommand* cmd = new FramesetSetKeepAspectRatioCommand( frm, QString::null, frm->keepAspectRatio(), m_cbAspectRatio->isChecked() );
01979 
01980                     cmd->execute();
01981 
01982                     macroCmd->addCommand(cmd);
01983                 }
01984             } else if(m_cbAspectRatio->state() != QButton::NoChange) {
01985                 for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next()) {
01986                     KWPictureFrameSet *fs = dynamic_cast<KWPictureFrameSet *> (f->frameSet());
01987                     if(fs) {
01988                         if(fs->keepAspectRatio()!=m_cbAspectRatio->isChecked())
01989                         {
01990                             if(!macroCmd)
01991                                 macroCmd = new KMacroCommand( i18n("Frame Properties") );
01992                             FramesetSetKeepAspectRatioCommand* cmd = new FramesetSetKeepAspectRatioCommand( fs, QString::null, fs->keepAspectRatio(), m_cbAspectRatio->isChecked() );
01993 
01994                             cmd->execute();
01995 
01996                             macroCmd->addCommand(cmd);
01997                         }
01998                     }
01999                 }
02000             }
02001         }
02002     }
02003     if ( m_tab2 ) { // TAB Text Runaround
02004         // Run around
02005         KWFrame::RunAround ra=KWFrame::RA_BOUNDINGRECT;
02006         bool update=true;
02007         if ( m_rRunNo->isChecked() )
02008             ra = KWFrame::RA_NO;
02009         else if ( m_rRunBounding->isChecked() )
02010             ra = KWFrame::RA_BOUNDINGRECT;
02011         else if ( m_rRunSkip->isChecked() )
02012             ra = KWFrame::RA_SKIP;
02013         else
02014             update=false;
02015         if(m_frame)
02016             m_frame->setRunAround(ra);
02017         else if (update) {
02018             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
02019                 f->setRunAround(ra);
02020         }
02021 
02022         // Run around side.
02023         KWFrame::RunAroundSide rs=KWFrame::RA_BIGGEST;
02024         update=true;
02025         if ( m_rRunLeft->isChecked() )
02026             rs = KWFrame::RA_LEFT;
02027         else if ( m_rRunRight->isChecked() )
02028             rs = KWFrame::RA_RIGHT;
02029         else if ( m_rRunBiggest->isChecked() )
02030             rs = KWFrame::RA_BIGGEST;
02031         else
02032             update=false;
02033         if(m_frame)
02034             m_frame->setRunAroundSide(rs);
02035         else if (update) {
02036             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
02037                 f->setRunAroundSide(rs);
02038         }
02039 
02040         // Run around gap.
02041         double runAroundLeft = m_raDistConfigWidget->leftValue();
02042         double runAroundRight = m_raDistConfigWidget->rightValue();
02043         double runAroundTop = m_raDistConfigWidget->topValue();
02044         double runAroundBottom = m_raDistConfigWidget->bottomValue();
02045 
02046         if(m_frame) {
02047             m_frame->setRunAroundGap( runAroundLeft, runAroundRight, runAroundTop, runAroundBottom );
02048         }
02049         else
02050             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
02051                 f->setRunAroundGap( runAroundLeft, runAroundRight, runAroundTop, runAroundBottom );
02052     }
02053     if(m_tab5) { // Tab Background fill/color
02054         QBrush tmpBrush=frameBrushStyle();
02055         if(m_frame) {
02056             if ( tmpBrush != KWDocument::resolveBgBrush( m_frame->backgroundColor() ) ) {
02057                 m_frame->setBackgroundColor(tmpBrush);
02058             }
02059         } else if(m_overwriteColor->isChecked()) {
02060             for(KWFrame *f=m_allFrames.first();f; f=m_allFrames.next())
02061                 f->setBackgroundColor(tmpBrush);
02062         }
02063     }
02064 
02065 
02066     double px=0.0;
02067     double py=0.0;
02068     double pw=0.0;
02069     double ph=0.0;
02070     double uLeft = 0.0;
02071     double uTop = 0.0;
02072     double uBottom = 0.0;
02073     double uRight = 0.0;
02074     if(m_tab4) { // TAB Geometry
02075         if ( m_frame ) {
02076             px = QMAX( 0, m_sx->value() );
02077             int pageNum = m_doc->pageManager()->pageNumber(m_frame);
02078             py = QMAX( 0, m_sy->value() ) + m_doc->pageManager()->topOfPage(pageNum);
02079         }
02080         pw = QMAX( m_sw->value(), 0 );
02081         ph = QMAX( m_sh->value(), 0 );
02082         if ( m_paddingConfigWidget )
02083         {
02084             uLeft = m_paddingConfigWidget->leftValue();
02085             uRight = m_paddingConfigWidget->rightValue();
02086             uTop = m_paddingConfigWidget->topValue();
02087             uBottom = m_paddingConfigWidget->bottomValue();
02088         }
02089     }
02090     KoRect rect( px, py, pw, ph );
02091 
02092     //kdDebug() << "New geom: " << m_sx->text().toDouble() << ", " << m_sy->text().toDouble()
02093     //<< " " << m_sw->text().toDouble() << "x" << m_sh->text().toDouble() << endl;
02094     //kdDebug()<<" rect :"<<px <<" py :"<<py<<" pw :"<<pw <<" ph "<<ph<<endl;
02095     // Undo/redo for frame properties
02096     if(m_frame) { // only do undo/redo when we edit 1 frame for now..
02097 
02098         if(m_frame->frameSet() == 0L ) { // if there is no frameset (anymore)
02099             KWTextFrameSet *frameSet = new KWTextFrameSet( m_doc, name );
02100             frameSet->addFrame( m_frame );
02101             KWPage *page = m_doc->pageManager()->page(m_frame);
02102             if( page->rect().contains(rect) ) {
02103                 m_frame->setRect( px, py, pw, ph );
02104                 //don't change margins when frame is protected.
02105                 if ( m_paddingConfigWidget && ( !m_tab1 || (m_tab1 && m_cbProtectContent && !m_cbProtectContent->isChecked())) )
02106                     m_frame->setFramePadding( uLeft, uTop, uRight, uBottom );
02107                 m_doc->frameChanged( m_frame );
02108             } else {
02109                 KMessageBox::sorry( this,i18n("The frame will not be resized because the new size would be greater than the size of the page."));
02110             }
02111 
02112             m_doc->addFrameSet( frameSet );
02113             if(!macroCmd)
02114                 macroCmd = new KMacroCommand( i18n("Create Text Frame") );
02115             KWCreateFrameCommand *cmd=new KWCreateFrameCommand( i18n("Create Text Frame"), m_frame) ;
02116             macroCmd->addCommand(cmd);
02117         }
02118         if(!isNewFrame && (frameCopy->isCopy()!=m_frame->isCopy()
02119                            || frameCopy->frameBehavior()!=m_frame->frameBehavior()
02120                            || frameCopy->newFrameBehavior()!=m_frame->newFrameBehavior()
02121                            || frameCopy->runAround()!=m_frame->runAround()
02122                            || frameCopy->runAroundSide()!=m_frame->runAroundSide()
02123                            || frameCopy->runAroundLeft()!=m_frame->runAroundLeft()
02124                            || frameCopy->runAroundRight()!=m_frame->runAroundRight()
02125                            || frameCopy->runAroundTop()!=m_frame->runAroundTop()
02126                            || frameCopy->runAroundBottom()!=m_frame->runAroundBottom()
02127                            || (m_tab5 && KWDocument::resolveBgBrush( frameCopy->backgroundColor() )!=frameBrushStyle())))
02128         {
02129             if(!macroCmd)
02130                 macroCmd = new KMacroCommand( i18n("Frame Properties") );
02131 
02132             KWFramePropertiesCommand*cmd = new KWFramePropertiesCommand( QString::null, frameCopy, m_frame );
02133             macroCmd->addCommand(cmd);
02134             frameCopy = 0L;
02135         } else
02136             delete frameCopy;
02137     }
02138     if ( m_tab4 ) { // TAB Geometry
02139 
02140         KWFrame *f=m_allFrames.first();
02141         if(f==0L) f=m_frame;
02142         while(f) {
02143             // The floating attribute applies to the whole frameset...
02144             KWFrameSet * fs = f->frameSet();
02145             KWFrameSet * parentFs = fs->groupmanager() ? fs->groupmanager() : fs;
02146 
02147             // Floating
02148             if ( m_floating->isChecked() &&
02149                  m_floating->state() != QButton::NoChange &&
02150                  !parentFs->isFloating() )
02151             {
02152                 if(!macroCmd)
02153                     macroCmd = new KMacroCommand( i18n("Make Frameset Inline") );
02154 
02155                 QValueList<FrameIndex> frameindexList;
02156                 QValueList<FrameMoveStruct> frameindexMove;
02157 
02158                 KoPoint oldPos = f->topLeft();
02159 
02160                 // turn non-floating frame into floating frame
02161                 KWFrameSetInlineCommand *cmd = new KWFrameSetInlineCommand( QString::null, parentFs, true );
02162                 cmd->execute();
02163 
02164                 frameindexList.append( FrameIndex( f ) );
02165                 frameindexMove.append( FrameMoveStruct( oldPos, f->topLeft() ) );
02166 
02167                 KWFrameMoveCommand *cmdMoveFrame = new KWFrameMoveCommand( QString::null, frameindexList, frameindexMove );
02168 
02169                 macroCmd->addCommand(cmdMoveFrame);
02170                 macroCmd->addCommand(cmd);
02171             }
02172             else if ( !m_floating->isChecked() &&
02173                       m_floating->state() != QButton::NoChange &&
02174                       parentFs->isFloating() )
02175             {
02176                 if(!macroCmd)
02177                     macroCmd = new KMacroCommand( i18n("Make Frameset Non-Inline") );
02178                 // turn floating-frame into non-floating frame
02179                 KWFrameSetInlineCommand *cmd = new KWFrameSetInlineCommand( QString::null, parentFs, false );
02180                 macroCmd->addCommand(cmd);
02181                 cmd->execute();
02182             }
02183             if ( fs->isProtectSize() != m_protectSize->isChecked()
02184                  && m_protectSize->state() != QButton::NoChange )
02185             {
02186                 if(!macroCmd)
02187                     macroCmd = new KMacroCommand( i18n("Protect Size") );
02188                 typedef KoSetBasicPropCommand<bool, KWFrameSet, &KWFrameSet::setProtectSize> FramesetSetProtectSizeCommand;
02189                 FramesetSetProtectSizeCommand* cmd = new FramesetSetProtectSizeCommand( fs, QString::null, fs->isProtectSize(), m_protectSize->isChecked() );
02190                 macroCmd->addCommand(cmd);
02191                 cmd->execute();
02192                 m_frameSetProtectedSize = m_protectSize->isChecked();
02193             }
02194             if ( !fs->isMainFrameset() &&
02195                 ( ( 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() ) ) )
02196             {
02197                 //kdDebug() << "Old geom: " << m_oldX << ", " << m_oldY<< " " << m_oldW << "x" << m_oldH << endl;
02198                 //kdDebug() << "New geom: " << m_sx->text().toDouble() << ", " << m_sy->text().toDouble()
02199                   //        << " " << m_sw->text().toDouble() << "x" << m_sh->text().toDouble() << endl;
02200 
02201                 if( m_doc->pageManager()->page(f)->rect().contains(rect) )
02202                 {
02203                     FrameIndex index( f );
02204                     KoRect initialRect = f->normalize();
02205                     double initialMinFrameHeight = f->minimumFrameHeight();
02206                     if ( m_frame ) // single frame: can be moved and resized
02207                         f->setRect( px, py, pw, ph );
02208                     else { // multiple frames: can only be resized
02209                         f->setWidth( pw );
02210                         f->setHeight( ph );
02211                     }
02212                     FrameResizeStruct tmpResize( initialRect, initialMinFrameHeight, f->normalize() );
02213                     if(!macroCmd)
02214                         macroCmd = new KMacroCommand( i18n("Resize Frame") );
02215 
02216                     KWFrameResizeCommand *cmd = new KWFrameResizeCommand( i18n("Resize Frame"), index, tmpResize ) ;
02217                     macroCmd->addCommand(cmd);
02218                     m_doc->frameChanged( f );
02219                 }
02220                 else
02221                 {
02222                     KMessageBox::sorry( this,i18n("The frame will not be resized because the new size would be greater than the size of the page."));
02223                 }
02224             }
02225             if ( m_paddingConfigWidget &&
02226                  (!m_tab1 || (m_tab1 && m_cbProtectContent && !m_cbProtectContent->isChecked())) &&
02227                  m_paddingConfigWidget->changed() )
02228             {
02229                 FrameIndex index( f );
02230                 FramePaddingStruct tmpMargBegin(f);
02231                 FramePaddingStruct tmpMargEnd(uLeft, uTop, uRight, uBottom);
02232                 if(!macroCmd)
02233                     macroCmd = new KMacroCommand( i18n("Change Margin Frame") );
02234                 KWFrameChangeFramePaddingCommand *cmd = new KWFrameChangeFramePaddingCommand( i18n("Change Margin Frame"), index, tmpMargBegin, tmpMargEnd) ;
02235                 cmd->execute();
02236                 macroCmd->addCommand(cmd);
02237             }
02238             f=m_allFrames.next();
02239         }
02240     }
02241     if ( m_tab6 ) // Border style
02242     {
02243         if ( m_mainFrame )
02244             m_allFrames.append( m_mainFrame );
02245 
02246         KWFrame *f = m_allFrames.first();
02247         if(f==0L) f=m_frame;
02248         for ( ; f ; f = m_allFrames.next() )
02249         {
02250             // TODO can't this become shorter??
02251             if ( f->leftBorder() != m_leftBorder )
02252             {
02253                 kdDebug() << "Changing borders!" << endl;
02254                 QPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
02255                 QPtrList<FrameIndex> frameindexList;
02256                 f = KWFrameSet::settingsFrame( f );
02257                 FrameIndex *index = new FrameIndex( f );
02258                 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
02259                 tmp->m_OldBorder = f->leftBorder();
02260                 tmp->m_EFrameType = KoBorder::LeftBorder;
02261                 tmpBorderList.append( tmp );
02262                 frameindexList.append( index );
02263                 if ( !macroCmd )
02264                     macroCmd = new KMacroCommand( i18n("Change Border"));
02265                 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Left Border Frame"), frameindexList, tmpBorderList, m_leftBorder);
02266                 cmd->execute();
02267                 macroCmd->addCommand( cmd);
02268             }
02269             if ( f->rightBorder() != m_rightBorder )
02270             {
02271                 QPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
02272                 QPtrList<FrameIndex> frameindexList;
02273                 f = KWFrameSet::settingsFrame( f );
02274                 FrameIndex *index = new FrameIndex( f );
02275                 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
02276                 tmp->m_OldBorder = f->rightBorder();
02277                 tmp->m_EFrameType = KoBorder::RightBorder;
02278                 tmpBorderList.append( tmp );
02279                 frameindexList.append( index );
02280                 if ( !macroCmd )
02281                     macroCmd = new KMacroCommand( i18n("Change Border"));
02282                 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Right Border Frame"), frameindexList, tmpBorderList, m_rightBorder);
02283                 cmd->execute();
02284                 macroCmd->addCommand( cmd);
02285             }
02286             if ( f->topBorder() != m_topBorder )
02287             {
02288                 QPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
02289                 QPtrList<FrameIndex> frameindexList;
02290                 f = KWFrameSet::settingsFrame( f );
02291                 FrameIndex *index = new FrameIndex( f );
02292                 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
02293                 tmp->m_OldBorder = f->topBorder();
02294                 tmp->m_EFrameType = KoBorder::TopBorder;
02295                 tmpBorderList.append( tmp );
02296                 frameindexList.append( index );
02297                 if ( !macroCmd )
02298                     macroCmd = new KMacroCommand( i18n("Change Border"));
02299                 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Top Border Frame"), frameindexList, tmpBorderList, m_topBorder);
02300                 cmd->execute();
02301                 macroCmd->addCommand( cmd);
02302             }
02303             if ( f->bottomBorder() != m_bottomBorder )
02304             {
02305                 QPtrList<KWFrameBorderCommand::FrameBorderTypeStruct> tmpBorderList;
02306                 QPtrList<FrameIndex> frameindexList;
02307                 f = KWFrameSet::settingsFrame( f );
02308                 FrameIndex *index = new FrameIndex( f );
02309                 KWFrameBorderCommand::FrameBorderTypeStruct *tmp =new KWFrameBorderCommand::FrameBorderTypeStruct;
02310                 tmp->m_OldBorder = f->bottomBorder();
02311                 tmp->m_EFrameType = KoBorder::BottomBorder;
02312                 tmpBorderList.append( tmp );
02313                 frameindexList.append( index );
02314                 if ( !macroCmd )
02315                     macroCmd = new KMacroCommand( i18n("Change Border"));
02316                 KWFrameBorderCommand *cmd = new KWFrameBorderCommand(i18n("Change Bottom Border Frame"), frameindexList, tmpBorderList, m_bottomBorder);
02317                 cmd->execute();
02318                 macroCmd->addCommand( cmd);
02319             }
02320         }
02321     }
02322 
02323     if(macroCmd)
02324         m_doc->addCommand(macroCmd);
02325 
02326     updateFrames();
02327     return true;
02328 }
02329 
02330 void KWFrameDia::updateFrames()
02331 {
02332     m_doc->updateAllFrames();
02333     m_doc->layout();
02334     m_doc->repaintAllViews();
02335 }
02336 
02337 void KWFrameDia::slotApply()
02338 {
02339     applyChanges();
02340     if ( m_tab4 )
02341         initGeometrySettings();
02342     if ( m_tab6 )
02343         initBorderSettings();
02344 }
02345 
02346 void KWFrameDia::slotOk()
02347 {
02348     if (applyChanges())
02349     {
02350         KDialogBase::slotOk();
02351     }
02352 }
02353 
02354 void KWFrameDia::connectListSelected( QListViewItem *item )
02355 {
02356 /* belongs to TAB3, is activated when the user selects another frameset from the list */
02357     if ( !item )
02358         item = m_lFrameSList->selectedItem();
02359 
02360     if ( !item ) return; // assertion
02361 
02362     m_rExistingFrameset->setChecked(true);
02363     m_eFrameSetName->setText( item->text(1) );
02364 }
02365 
02366 bool KWFrameDia::mayDeleteFrameSet(KWTextFrameSet *fs) {
02367     if(fs==0) return true;
02368     if(fs->frameCount() > 1) return true;
02369     KoTextParag * parag = fs->textDocument()->firstParag();
02370     if(parag==0) return true;
02371     bool isEmpty = parag->next() == 0L && parag->length() == 1;
02372     if ( !isEmpty ) {
02373         int result = KMessageBox::warningContinueCancel(this,
02374            i18n( "You are about to reconnect the last frame of the "
02375            "frameset '%1'. "
02376            "The contents of this frameset will be deleted.\n"
02377            "Are you sure you want to do that?").arg(fs->name()),
02378            i18n("Reconnect Frame"), i18n("&Reconnect"));
02379         if (result != KMessageBox::Continue)
02380             return false;
02381     }
02382     return true;
02383 }
02384 
02385 KWFourSideConfigWidget::KWFourSideConfigWidget( KWDocument* doc, const QString& title,
02386                                                 QWidget* parent, const char* name )
02387     : QGroupBox( title, parent, name ),
02388       m_doc( doc ),
02389       m_changed( false ), m_noSignal( false )
02390 {
02391     QGroupBox *grp2 = this;
02392     QGridLayout* mGrid = new QGridLayout( grp2, 4, 4, KDialog::marginHint(), KDialog::spacingHint() );
02393 
02394     m_synchronize=new QCheckBox( i18n("Synchronize changes"), grp2 );
02395     QWhatsThis::add(m_synchronize, i18n("<b>Synchronize changes:</b><br/>"
02396         "When this is checked any change in margins will be used for all directions."));
02397     mGrid->addMultiCellWidget( m_synchronize, 1, 1, 0, 1 );
02398 
02399     QLabel* lml = new QLabel( i18n( "Left:" ), grp2 );
02400     //lml->resize( lml->sizeHint() );
02401     mGrid->addWidget( lml, 2, 0 );
02402 
02403     m_inputLeft = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
02404 
02405     mGrid->addWidget( m_inputLeft, 2, 1 );
02406 
02407     QLabel* lmt = new QLabel( i18n( "Top:" ), grp2 );
02408     //lmt->resize( lmt->sizeHint() );
02409     mGrid->addWidget( lmt, 2, 2 );
02410 
02411     m_inputTop = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
02412 
02413     //m_inputTop->resize( m_inputTop->sizeHint() );
02414 
02415     mGrid->addWidget( m_inputTop, 2, 3 );
02416 
02417     QLabel* lmr = new QLabel( i18n( "Right:" ), grp2 );
02418     //lmr->resize( lmr->sizeHint() );
02419     mGrid->addWidget( lmr, 3, 0 );
02420 
02421     m_inputRight = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
02422 
02423     //m_inputRight->resize( m_inputRight->sizeHint() );
02424     mGrid->addWidget( m_inputRight, 3, 1 );
02425 
02426     QLabel* lmb = new QLabel( i18n( "Bottom:" ), grp2 );
02427     //lmb->resize( lmb->sizeHint() );
02428     mGrid->addWidget( lmb, 3, 2 );
02429 
02430     m_inputBottom = new KoUnitDoubleSpinBox( grp2, 0, 9999, 1, 0.0, m_doc->unit() );
02431 
02432     //m_inputBottom->resize( m_inputBottom->sizeHint() );
02433     mGrid->addWidget( m_inputBottom, 3, 3 );
02434     mGrid->setRowSpacing( 0, KDialog::spacingHint() + 5 );
02435 
02436     connect( m_inputLeft, SIGNAL( valueChanged(double)), this, SLOT( slotValueChanged( double )));
02437     connect( m_inputRight, SIGNAL( valueChanged(double)), this, SLOT( slotValueChanged( double )));
02438     connect( m_inputTop, SIGNAL( valueChanged(double)), this, SLOT( slotValueChanged( double )));
02439     connect( m_inputBottom, SIGNAL( valueChanged(double)), this, SLOT( slotValueChanged( double )));
02440 }
02441 
02442 // Called right after the ctor, so m_synchronize can't be checked
02443 void KWFourSideConfigWidget::setValues( double left, double right, double top, double bottom )
02444 {
02445     m_inputLeft->setValue( KoUnit::toUserValue( left, m_doc->unit() ) );
02446     m_inputRight->setValue( KoUnit::toUserValue( right, m_doc->unit() ) );
02447     m_inputTop->setValue( KoUnit::toUserValue( top, m_doc->unit() ) );
02448     m_inputBottom->setValue( KoUnit::toUserValue( bottom, m_doc->unit() ) );
02449 }
02450 
02451 void KWFourSideConfigWidget::slotValueChanged( double val )
02452 {
02453     m_changed = true;
02454     if ( m_synchronize->isChecked() && !m_noSignal )
02455     {
02456         m_noSignal = true;
02457         m_inputLeft->setValue( val );
02458         m_inputBottom->setValue( val );
02459         m_inputRight->setValue( val );
02460         m_inputTop->setValue( val );
02461         m_noSignal = false;
02462     }
02463 }
02464 
02465 double KWFourSideConfigWidget::leftValue() const
02466 {
02467     return m_inputLeft->value();
02468 }
02469 
02470 double KWFourSideConfigWidget::rightValue() const
02471 {
02472     return m_inputRight->value();
02473 }
02474 
02475 double KWFourSideConfigWidget::topValue() const
02476 {
02477     return m_inputTop->value();
02478 }
02479 
02480 double KWFourSideConfigWidget::bottomValue() const
02481 {
02482     return m_inputBottom->value();
02483 }
02484 
02485 /*
02486     TODO;
02487     features that are present in the frames but not shown (yet)
02488         - frames with 'copy' should have a radiogroup showing that its only going to be copied to
02489           the even/odd side or to both sides.
02490 */
KDE Home | KDE Accessibility Home | Description of Access Keys