163
* Temporary storage for the initial edition info
164
* (activeFrameset, cursorParagraph and cursorIndex attributes of the XML
166
class KWDocument::InitialEditing {
168
QString m_initialFrameSet;
169
int m_initialCursorParag;
170
int m_initialCursorIndex;
173
KWBookMark::KWBookMark(const QString &_name)
183
KWBookMark::KWBookMark(const QString &_name, KoTextParag *_startParag, KoTextParag *_endParag,KWFrameSet *_frameSet, int _pos, int _end)
185
m_startParag(_startParag),
186
m_endParag(_endParag),
187
m_frameSet(_frameSet),
188
m_startIndex( _pos ),
193
KWBookMark::~KWBookMark()
142
200
/******************************************************************/
143
201
/* Class: KWDocument */
144
202
/******************************************************************/
203
const int KWDocument::CURRENT_SYNTAX_VERSION = 3;
146
205
KWDocument::KWDocument(QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name, bool singleViewMode )
147
206
: KoDocument( parentWidget, widgetName, parent, name, singleViewMode ),
148
m_unit( KWUnit::U_MM ), // footNoteManager( this ),
207
m_unit( KoUnit::U_MM ),
212
m_tabStop = MM_TO_POINT( 15.0 );
213
bgFrameSpellChecked = 0L;
214
m_processingType = WP;
151
216
m_lstViews.setAutoDelete( false );
152
217
m_lstChildren.setAutoDelete( true );
153
m_styleList.setAutoDelete( false );
154
m_deletedStyles.setAutoDelete( true );
155
218
// varFormats.setAutoDelete(true);
156
frames.setAutoDelete( true );
219
m_lstFrameSet.setAutoDelete( true );
220
// m_textImageRequests does not create or delete the KWTextImage classes
221
m_textImageRequests.setAutoDelete(false);
222
m_bookmarkList.setAutoDelete( true );
224
m_styleColl=new KoStyleCollection();
225
m_frameStyleColl = new KWFrameStyleCollection();
226
m_tableStyleColl = new KWTableStyleCollection();
227
m_tableTemplateColl = new KWTableTemplateCollection();
229
m_personalExpressionPath = KWFactory::global()->dirs()->resourceDirs("expression");
230
m_picturePath= KGlobalSettings::documentPath();
232
#if 0 // KWORD_HORIZONTAL_LINE
233
m_horizontalLinePath = KWFactory::global()->dirs()->resourceDirs("horizontalLine");
158
236
setInstance( KWFactory::global(), false );
160
m_gridX = m_gridY = 10;
238
m_gridX = m_gridY = 10.0;
161
239
m_indent = MM_TO_POINT( 10.0 );
163
241
m_iNbPagePerRow = 4;
164
242
m_maxRecentFiles = 10;
243
m_defaultColumnSpacing=3;
166
244
m_bShowRuler = true;
246
m_footNoteSeparatorLinePos=SLP_LEFT;
248
//by default it's 1/5
249
m_iFootNoteSeparatorLineLength = 20;
250
m_footNoteSeparatorLineWidth = 2.0;
251
m_footNoteSeparatorLineType = SLT_SOLID;
168
253
m_viewFormattingChars = false;
255
m_viewFormattingEndParag = true;
256
m_viewFormattingSpace = true;
257
m_viewFormattingTabs = true;
258
m_viewFormattingBreak = true;
169
260
m_viewFrameBorders = true;
171
m_bDontCheckUpperWord = false;
172
m_bDontCheckTitleCase = false;
173
//m_onlineSpellCheck = false;
175
m_autoFormat = new KWAutoFormat(this);
261
m_repaintAllViewsPending = false;
262
m_recalcFramesPending = -1;
263
m_bShowDocStruct = true;
265
m_bShowStatusBar = true;
266
m_bAllowAutoFormat = true;
267
m_pgUpDownMovesCaret = false;
268
m_bShowScrollBar = true;
269
m_cursorInProtectectedArea = true;
270
m_bHasEndNotes = false;
272
m_bInsertDirectCursor=false;
273
m_globalLanguage = KGlobal::locale()->language();
274
m_bGlobalHyphenation = false;
275
m_lastViewMode="ModeNormal";
177
278
m_commandHistory = new KWCommandHistory( this );
178
#if KDE_VERSION >= 220 // kdelibs >= 2.2 only
179
279
connect( m_commandHistory, SIGNAL( documentRestored() ), this, SLOT( slotDocumentRestored() ) );
181
280
connect( m_commandHistory, SIGNAL( commandExecuted() ), this, SLOT( slotCommandExecuted() ) );
183
connect( documentInfo(), SIGNAL( sigDocumentInfoModifed()),this,SLOT(slotDocumentInfoModifed() ) );
185
m_formulaDocument = new KFormula::KFormulaDocument(actionCollection(), m_commandHistory);
190
282
//styleMask = U_FONT_FAMILY_ALL_SIZE | U_COLOR | U_BORDER | U_INDENT |
191
283
// U_NUMBERING | U_ALIGN | U_TABS | U_SMART;
192
284
m_headerVisible = false;
193
285
m_footerVisible = false;
198
287
m_pasteFramesetsMap = 0L;
200
slDataBase = new KWSerialLetterDataBase( this );
288
m_initialEditing = 0L;
290
m_varFormatCollection = new KoVariableFormatCollection;
291
m_varColl = new KWVariableCollection( new KWVariableSettings(), m_varFormatCollection );
293
m_autoFormat = new KoAutoFormat(this,m_varColl,m_varFormatCollection );
295
m_bgSpellCheck = new KWBgSpellCheck(this);
297
m_slDataBase = new KWMailMergeDataBase( this );
201
298
slRecordNum = -1;
203
// Get default font from KDE
204
m_defaultFont = KGlobalSettings::generalFont();
205
KGlobal::charsets()->setQFont(m_defaultFont, KGlobal::locale()->charset());
207
300
m_syntaxVersion = CURRENT_SYNTAX_VERSION;
302
m_pKOSpellConfig = 0;
306
// It's important to call this to have the kformula actions
307
// created. The real document is still to be created if needed.
308
m_formulaDocumentWrapper =
309
new KFormula::DocumentWrapper( instance()->config(),
212
getFormulaDocument()->setResolution( m_zoomedResolutionX, m_zoomedResolutionY );
318
// Get default font from the KWord config file
319
KConfig *config = KWFactory::global()->config();
320
config->setGroup("Document defaults" );
321
QString defaultFontname=config->readEntry("DefaultFont");
322
if ( !defaultFontname.isEmpty() )
323
m_defaultFont.fromString( defaultFontname );
324
// If not found, we automatically fallback to the application font (the one from KControl's font module)
326
// Try to force a scalable font.
327
m_defaultFont.setStyleStrategy( QFont::ForceOutline );
329
int ptSize = m_defaultFont.pointSize();
330
if ( ptSize == -1 ) // specified with a pixel size ?
331
ptSize = QFontInfo(m_defaultFont).pointSize();
333
//kdDebug() << "Default font: requested family: " << m_defaultFont.family() << endl;
334
//kdDebug() << "Default font: real family: " << QFontInfo(m_defaultFont).family() << endl;
214
336
// Some simple import filters don't define any style,
215
337
// so let's have a Standard style at least
216
338
KWStyle * standardStyle = new KWStyle( "Standard" ); // This gets translated later on
217
addStyleTemplate( standardStyle );
339
//kdDebug() << "KWDocument::KWDocument creating standardStyle " << standardStyle << endl;
340
standardStyle->format().setFont( m_defaultFont );
341
m_styleColl->addStyleTemplate( standardStyle );
343
// And let's do the same for framestyles
344
KWFrameStyle * standardFrameStyle = new KWFrameStyle( "Plain" );
345
standardFrameStyle->setBackgroundColor(QColor("white"));
346
standardFrameStyle->setTopBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
347
standardFrameStyle->setRightBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
348
standardFrameStyle->setLeftBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
349
standardFrameStyle->setBottomBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
350
m_frameStyleColl->addFrameStyleTemplate( standardFrameStyle );
352
// And let's do the same for tablestyles
353
KWTableStyle *standardTableStyle = new KWTableStyle( "Plain", standardStyle, standardFrameStyle );
354
m_tableStyleColl->addTableStyleTemplate( standardTableStyle );
358
connect(m_varColl,SIGNAL(repaintVariable()),this,SLOT(slotRepaintVariable()));
361
/*==============================================================*/
362
DCOPObject* KWDocument::dcopObject()
365
dcop = new KWordDocIface( this );
220
371
KWDocument::~KWDocument()
373
//don't save config when kword is embedded into konqueror
376
// formula frames have to be deleted before m_formulaDocumentWrapper
377
m_lstFrameSet.clear();
378
m_bookmarkList.clear();
379
m_tmpBookMarkList.clear();
223
380
delete m_autoFormat;
224
delete m_formulaDocument;
381
delete m_formulaDocumentWrapper;
225
382
delete m_commandHistory;
384
delete m_varFormatCollection;
387
delete m_bgSpellCheck;
389
delete m_frameStyleColl;
390
delete m_tableStyleColl;
391
delete m_tableTemplateColl;
392
delete m_pKOSpellConfig;
228
397
void KWDocument::initConfig()
230
399
KConfig *config = KWFactory::global()->config();
231
KSpellConfig ksconfig;
400
KOSpellConfig kosconfig;
232
401
if( config->hasGroup("KSpell kword" ) )
234
403
config->setGroup( "KSpell kword" );
235
ksconfig.setNoRootAffix(config->readNumEntry ("KSpell_NoRootAffix", 0));
236
ksconfig.setRunTogether(config->readNumEntry ("KSpell_RunTogether", 0));
237
ksconfig.setDictionary(config->readEntry ("KSpell_Dictionary", ""));
238
ksconfig.setDictFromList(config->readNumEntry ("KSpell_DictFromList", FALSE));
239
ksconfig.setEncoding(config->readNumEntry ("KSpell_Encoding", KS_E_ASCII));
240
ksconfig.setClient(config->readNumEntry ("KSpell_Client", KS_CLIENT_ISPELL));
241
setKSpellConfig(ksconfig);
242
setDontCheckUpperWord(config->readBoolEntry("KSpell_dont_check_upper_word",false));
243
setDontCheckTitleCase(config->readBoolEntry("KSpell_dont_check_title_case",false));
404
kosconfig.setNoRootAffix(config->readNumEntry ("KSpell_NoRootAffix", 0));
405
kosconfig.setRunTogether(config->readNumEntry ("KSpell_RunTogether", 0));
406
kosconfig.setDictionary(config->readEntry ("KSpell_Dictionary", ""));
407
kosconfig.setDictFromList(config->readNumEntry ("KSpell_DictFromList", FALSE));
408
kosconfig.setEncoding(config->readNumEntry ("KSpell_Encoding", KOS_E_ASCII));
409
kosconfig.setClient(config->readNumEntry ("KSpell_Client", KOS_CLIENT_ISPELL));
411
kosconfig.setIgnoreCase( config->readNumEntry( "KSpell_IgnoreCase", 0));
412
kosconfig.setIgnoreAccent( config->readNumEntry( "KSpell_IgnoreAccent", 0));
413
kosconfig.setDontCheckUpperWord(config->readBoolEntry("KSpell_dont_check_upper_word",false));
414
kosconfig.setDontCheckTitleCase(config->readBoolEntry("KSpell_dont_check_title_case",false));
415
kosconfig.setSpellWordWithNumber( config->readNumEntry("KSpell_SpellWordWithNumber", false));
417
setKOSpellConfig( kosconfig );
419
// Default is false for spellcheck, but the spell-check config dialog
420
// should write out "true" when the user configures spell checking.
422
m_bgSpellCheck->enableBackgroundSpellCheck(config->readBoolEntry( "SpellCheck", false ));
424
m_bgSpellCheck->enableBackgroundSpellCheck( false );
246
428
if(config->hasGroup("Interface" ) )
248
430
config->setGroup( "Interface" );
249
setGridY(config->readNumEntry("GridY",10));
250
setGridX(config->readNumEntry("GridX",10));
431
setGridY(QMAX( config->readDoubleNumEntry("GridY",10.0), 0.1));
432
setGridX(QMAX( config->readDoubleNumEntry("GridX",10.0), 0.1));
433
setCursorInProtectedArea( config->readBoolEntry( "cursorInProtectArea", true ));
251
434
// Config-file value in mm, default 10 pt
252
double indent = MM_TO_POINT( config->readDoubleNumEntry("Indent", POINT_TO_MM(10.0) ) );
435
double indent = config->readDoubleNumEntry("Indent", MM_TO_POINT(10.0) ) ;
253
436
setIndentValue(indent);
254
437
setShowRuler(config->readBoolEntry("Rulers",true));
255
setAutoSave((config->readNumEntry("AutoSave",KoDocument::defaultAutoSave()))*60);
438
int defaultAutoSave = KoDocument::defaultAutoSave()/60; // in minutes
439
setAutoSave(config->readNumEntry("AutoSave",defaultAutoSave)*60); // read key in minutes, call setAutoSave(seconds)
440
setBackupFile( config->readNumEntry("BackupFile", true));
256
442
setNbPagePerRow(config->readNumEntry("nbPagePerRow",4));
257
443
m_maxRecentFiles = config->readNumEntry( "NbRecentFile", 10 );
259
445
m_viewFormattingChars = config->readBoolEntry( "ViewFormattingChars", false );
446
m_viewFormattingBreak = config->readBoolEntry( "ViewFormattingBreaks", true );
447
m_viewFormattingSpace = config->readBoolEntry( "ViewFormattingSpace", true );
448
m_viewFormattingEndParag = config->readBoolEntry( "ViewFormattingEndParag", true );
449
m_viewFormattingTabs = config->readBoolEntry( "ViewFormattingTabs", true );
260
451
m_viewFrameBorders = config->readBoolEntry( "ViewFrameBorders", true );
262
453
m_zoom = config->readNumEntry( "Zoom", 100 );
454
m_bShowDocStruct = config->readBoolEntry( "showDocStruct", true );
455
m_lastViewMode = config->readEntry( "viewmode", "ModeNormal" );
456
setShowStatusBar( config->readBoolEntry( "ShowStatusBar" , true ) );
457
setAllowAutoFormat( config->readBoolEntry( "AllowAutoFormat" , true ) );
458
setShowScrollBar( config->readBoolEntry( "ShowScrollBar", true ) );
460
m_bShowDocStruct = false; // off by default for embedded docs, but still toggleable
461
m_pgUpDownMovesCaret = config->readBoolEntry( "PgUpDownMovesCaret", false );
462
m_bInsertDirectCursor= config->readBoolEntry( "InsertDirectCursor", false );
463
m_globalLanguage=config->readEntry("language", KGlobal::locale()->language());
464
m_bGlobalHyphenation=config->readBoolEntry("hyphenation", false);
267
setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY(), false, false );
469
if(config->hasGroup("Misc" ) )
471
config->setGroup( "Misc" );
472
undo=config->readNumEntry("UndoRedo",-1);
475
setUndoRedoLimit(undo);
477
setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY() );
479
//text mode view is not a good default for a readonly document...
480
if ( !isReadWrite() && m_lastViewMode =="ModeText" )
481
m_lastViewMode= "ModeNormal";
483
m_viewMode = KWViewMode::create( m_lastViewMode, this );
485
if(config->hasGroup("Kword Path" ) )
487
config->setGroup( "Kword Path" );
488
if ( config->hasKey( "expression path" ) )
489
m_personalExpressionPath = config->readListEntry( "expression path" );
490
#if 0 // KWORD_HORIZONTAL_LINE
491
if ( config->hasKey( "horizontal line path" ) )
492
m_horizontalLinePath = config->readListEntry( "horizontal line path" );
494
if ( config->hasKey( "picture path" ) )
495
m_picturePath = config->readPathEntry( "picture path" );
496
setBackupPath(config->readPathEntry( "backup path" ));
270
500
void KWDocument::saveConfig()
502
if ( isEmbedded() || !isReadWrite() )
272
504
// Only save the config that is manipulated by the UI directly.
273
505
// The config from the config dialog is saved by the dialog itself.
274
506
KConfig *config = KWFactory::global()->config();
275
507
config->setGroup( "Interface" );
276
508
config->writeEntry( "ViewFormattingChars", m_viewFormattingChars );
509
config->writeEntry( "ViewFormattingBreaks", m_viewFormattingBreak );
510
config->writeEntry( "ViewFormattingEndParag", m_viewFormattingEndParag );
511
config->writeEntry( "ViewFormattingTabs", m_viewFormattingTabs );
512
config->writeEntry( "ViewFormattingSpace", m_viewFormattingSpace );
277
513
config->writeEntry( "ViewFrameBorders", m_viewFrameBorders );
278
514
config->writeEntry( "Zoom", m_zoom );
281
void KWDocument::setZoomAndResolution( int zoom, int dpiX, int dpiY, bool updateViews, bool forPrint )
283
KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY, updateViews, forPrint );
284
newZoomAndResolution( updateViews, forPrint );
515
config->writeEntry( "showDocStruct", m_bShowDocStruct);
516
config->writeEntry( "Rulers", m_bShowRuler);
517
config->writeEntry( "viewmode", m_lastViewMode);
518
config->writeEntry( "AllowAutoFormat", m_bAllowAutoFormat );
521
void KWDocument::setZoomAndResolution( int zoom, int dpiX, int dpiY )
523
KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY );
524
if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
525
formulaDocument->setZoomAndResolution( zoom, dpiX, dpiY );
528
KWTextFrameSet * KWDocument::textFrameSet ( unsigned int _num ) const
531
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
532
for ( ; fit.current() ; ++fit )
534
if(fit.current()->isDeleted()) continue;
535
if(fit.current()->type()==FT_TEXT)
538
return static_cast<KWTextFrameSet*>(fit.current());
542
return static_cast<KWTextFrameSet*>(m_lstFrameSet.getFirst());
287
545
void KWDocument::newZoomAndResolution( bool updateViews, bool forPrint )
289
getFormulaDocument()->setResolution( m_zoomedResolutionX, m_zoomedResolutionY );
292
QListIterator<KWFrameSet> fit = framesetsIterator();
547
if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
548
formulaDocument->newZoomAndResolution( updateViews,forPrint );
550
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
293
551
for ( ; fit.current() ; ++fit )
294
552
fit.current()->zoom( forPrint );
297
556
updateAllFrames();
305
564
bool KWDocument::initDoc()
307
m_pageLayout.unit = PG_MM;
310
568
m_pageColumns.columns = 1;
311
m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
569
m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
313
571
m_pageHeaderFooter.header = HF_SAME;
314
572
m_pageHeaderFooter.footer = HF_SAME;
315
573
m_pageHeaderFooter.ptHeaderBodySpacing = 10;
316
574
m_pageHeaderFooter.ptFooterBodySpacing = 10;
317
m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
318
m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
319
m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
320
m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
575
m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
322
577
QString _template;
581
KoTemplateChooseDia::DialogType dlgtype;
582
if (initDocFlags() != KoDocument::InitDocFileNew)
583
dlgtype = KoTemplateChooseDia::Everything;
585
dlgtype = KoTemplateChooseDia::OnlyTemplates;
325
588
KoTemplateChooseDia::ReturnType ret = KoTemplateChooseDia::choose(
326
589
KWFactory::global(), _template, "application/x-kword", "*.kwd", i18n("KWord"),
327
KoTemplateChooseDia::Everything, "kword_template");
590
dlgtype, "kword_template");
328
591
if ( ret == KoTemplateChooseDia::Template ) {
329
592
QFileInfo fileInfo( _template );
330
593
QString fileName( fileInfo.dirPath( TRUE ) + "/" + fileInfo.baseName() + ".kwt" );
332
595
ok = loadNativeFormat( fileName );
334
598
} else if ( ret == KoTemplateChooseDia::File ) {
335
599
KURL url( _template);
336
kdDebug() << "KWDocument::initDoc opening URL " << url.prettyURL() << endl;
600
//kdDebug() << "KWDocument::initDoc opening URL " << url.prettyURL() << endl;
337
601
ok = openURL( url );
338
602
} else if ( ret == KoTemplateChooseDia::Empty ) {
339
603
QString fileName( locate( "kword_template", "Normal/.source/PlainText.kwt" , KWFactory::global() ) );
341
605
ok = loadNativeFormat( fileName );
344
609
setModified( FALSE );
613
void KWDocument::initUnit()
615
//load unit config after we load file.
616
//load it for new file or empty file
617
KConfig *config = KWFactory::global()->config();
618
if(config->hasGroup("Misc") )
620
config->setGroup( "Misc" );
621
setUnit(KoUnit::unit( config->readEntry("Units",KoUnit::unitName(KoUnit::U_MM ))));
622
setDefaultColumnSpacing( config->readDoubleNumEntry("ColumnSpacing", 3.0) );
624
m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
348
627
void KWDocument::initEmpty()
350
m_pageLayout.unit = PG_MM;
353
631
m_pageColumns.columns = 1;
354
m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
632
m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
356
634
m_pageHeaderFooter.header = HF_SAME;
357
635
m_pageHeaderFooter.footer = HF_SAME;
358
636
m_pageHeaderFooter.ptHeaderBodySpacing = 10;
359
637
m_pageHeaderFooter.ptFooterBodySpacing = 10;
360
m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
361
m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
362
m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
363
m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
638
m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
365
640
QString fileName( locate( "kword_template", "Normal/.source/PlainText.kwt" , KWFactory::global() ) );
366
641
/*bool ok = */loadNativeFormat( fileName );
421
703
/ m_pageColumns.columns;
706
class KWFootNoteFrameSetList : public QPtrList<KWFootNoteFrameSet>
709
KWFootNoteFrameSetList( bool reversed ) : m_reversed( reversed ) {}
711
// Compare the order of the associated variables
712
virtual int compareItems(QPtrCollection::Item a, QPtrCollection::Item b)
714
KWFootNoteFrameSet* fsa = ((KWFootNoteFrameSet *)a);
715
KWFootNoteFrameSet* fsb = ((KWFootNoteFrameSet *)b);
716
Q_ASSERT( fsa->footNoteVariable() );
717
Q_ASSERT( fsb->footNoteVariable() );
718
if ( fsa->footNoteVariable() && fsb->footNoteVariable() )
720
int numa = fsa->footNoteVariable()->num();
721
int numb = fsb->footNoteVariable()->num();
722
if (numa == numb) return 0;
723
if (numa > numb) return m_reversed ? -1 : 1;
724
return m_reversed ? 1 : -1;
726
return -1; // whatever
424
732
/* append headers and footers if needed, and create enough pages for all the existing frames */
425
void KWDocument::recalcFrames()
733
void KWDocument::recalcFrames( int fromPage, int toPage /*-1 for all*/, uint flags )
427
kdDebug(32002) << "KWDocument::recalcFrames" << endl;
428
if ( frames.isEmpty() )
735
if ( m_lstFrameSet.isEmpty() )
431
KWFrameSet *frameset = frames.at( 0 );
433
double ptColumnWidth = this->ptColumnWidth();
435
int firstHeadOffset = 0, evenHeadOffset = 0, oddHeadOffset = 0;
436
int firstFootOffset = 0, evenFootOffset = 0, oddFootOffset = 0;
437
KWTextFrameSet *firstHeader = 0L, *evenHeader = 0L, *oddHeader = 0L;
438
KWTextFrameSet *firstFooter = 0L, *evenFooter = 0L, *oddFooter = 0L;
440
// Lookup the various header / footer framesets into the variables above
441
// [Done in all cases, in order to hide unused framesets]
443
QListIterator<KWFrameSet> fit = framesetsIterator();
444
for ( ; fit.current() ; ++fit )
446
KWFrameSet * fs = fit.current();
447
switch ( fs->frameSetInfo() ) {
738
kdDebug(32002) << "KWDocument::recalcFrames from=" << fromPage << " to=" << toPage << endl;
740
KWFrameSet *frameset = m_lstFrameSet.getFirst();
742
if ( m_processingType == WP ) { // In WP mode the pages are created automatically. In DTP not...
744
KWTextFrameSet *firstHeader = 0L, *evenHeader = 0L, *oddHeader = 0L;
745
KWTextFrameSet *firstFooter = 0L, *evenFooter = 0L, *oddFooter = 0L;
746
m_bHasEndNotes = false; // will be set to true if we find any endnote
748
// Lookup the various header / footer framesets into the variables above
749
// [Done in all cases, in order to hide unused framesets]
751
KWFootNoteFrameSetList footnotesList( true ); // Reversed, we want footnotes from bottom to top
752
KWFootNoteFrameSetList endnotesList( false ); // Endnotes are in top to bottom order
753
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
754
for ( ; fit.current() ; ++fit )
756
KWFrameSet * fs = fit.current();
757
switch ( fs->frameSetInfo() ) {
448
758
case KWFrameSet::FI_FIRST_HEADER:
449
759
if ( isHeaderVisible() ) {
450
760
firstHeader = dynamic_cast<KWTextFrameSet*>( fs );
451
firstHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
452
fs->getFrame( 0 )->height());
761
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
763
case KWFrameSet::FI_ODD_HEADER:
764
if ( isHeaderVisible() ) {
765
oddHeader = dynamic_cast<KWTextFrameSet*>( fs );
453
766
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
455
768
case KWFrameSet::FI_EVEN_HEADER:
456
769
if ( isHeaderVisible() ) {
457
770
evenHeader = dynamic_cast<KWTextFrameSet*>( fs );
458
evenHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
459
fs->getFrame( 0 )->height());
460
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
462
case KWFrameSet::FI_ODD_HEADER:
463
if ( isHeaderVisible() ) {
464
oddHeader = dynamic_cast<KWTextFrameSet*>( fs );
465
oddHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
466
fs->getFrame( 0 )->height());
467
771
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
469
773
case KWFrameSet::FI_FIRST_FOOTER:
470
774
if ( isFooterVisible() ) {
471
775
firstFooter = dynamic_cast<KWTextFrameSet*>( fs );
472
firstFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
473
fs->getFrame( 0 )->height());
776
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
778
case KWFrameSet::FI_ODD_FOOTER:
779
if ( isFooterVisible() ) {
780
oddFooter = dynamic_cast<KWTextFrameSet*>( fs );
474
781
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
476
783
case KWFrameSet::FI_EVEN_FOOTER:
477
784
if ( isFooterVisible() ) {
478
785
evenFooter = dynamic_cast<KWTextFrameSet*>( fs );
479
evenFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
480
fs->getFrame( 0 )->height());
481
786
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
787
case KWFrameSet::FI_FOOTNOTE: {
788
KWFootNoteFrameSet* fnfs = dynamic_cast<KWFootNoteFrameSet *>(fs);
789
if ( fnfs && fnfs->isVisible() ) // not visible is when the footnote has been deleted
791
if ( fnfs->isFootNote() )
792
footnotesList.append( fnfs );
793
else if ( fnfs->isEndNote() ) {
794
endnotesList.append( fnfs );
795
m_bHasEndNotes = true;
483
case KWFrameSet::FI_ODD_FOOTER:
484
if ( isFooterVisible() ) {
485
oddFooter = dynamic_cast<KWTextFrameSet*>( fs );
486
oddFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
487
fs->getFrame( 0 )->height());
488
} else { fs->setVisible( false ); fs->deleteAllCopies(); }
492
// Now hide & forget the unused header/footer framesets (e.g. 'odd pages' if we are in 'all the same' mode etc.)
493
if ( isHeaderVisible() ) {
494
switch ( getHeaderType() ) {
496
evenHeader->setVisible( true );
497
oddHeader->setVisible( false );
498
oddHeader->deleteAllCopies();
499
firstHeader->setVisible( false );
500
firstHeader->deleteAllCopies();
502
oddHeader = evenHeader;
503
firstHeader = evenHeader;
504
oddHeadOffset = evenHeadOffset;
505
firstHeadOffset = evenHeadOffset;
508
evenHeader->setVisible( true );
509
oddHeader->setVisible( false );
510
oddHeader->deleteAllCopies();
511
firstHeader->setVisible( true );
513
oddHeader = evenHeader;
514
oddHeadOffset = evenHeadOffset;
517
evenHeader->setVisible( true );
518
oddHeader->setVisible( true );
519
firstHeader->setVisible( false );
520
firstHeader->deleteAllCopies();
522
firstHeader = oddHeader;
523
firstHeadOffset = oddHeadOffset;
527
if ( isFooterVisible() ) {
528
switch ( getFooterType() ) {
530
evenFooter->setVisible( true );
531
oddFooter->setVisible( false );
532
oddFooter->deleteAllCopies();
533
firstFooter->setVisible( false );
534
firstFooter->deleteAllCopies();
536
oddFooter = evenFooter;
537
firstFooter = evenFooter;
538
oddFootOffset = evenFootOffset;
539
firstFootOffset = evenFootOffset;
542
evenFooter->setVisible( true );
543
oddFooter->setVisible( false );
544
oddFooter->deleteAllCopies();
545
firstFooter->setVisible( true );
547
oddFooter = evenFooter;
548
oddFootOffset = evenFootOffset;
551
evenFooter->setVisible( true );
552
oddFooter->setVisible( true );
553
firstFooter->setVisible( false );
554
firstFooter->deleteAllCopies();
556
firstFooter = oddFooter;
557
firstFootOffset = oddFootOffset;
562
if ( m_processingType == WP ) { // In WP mode the pages are created automatically. In DTP not...
564
int headOffset = 0, footOffset = 0;
804
// This allocation each time might slow things down a bit.
805
// TODO KWHeaderFooterFrameSet : public KWTextFrameSet, and store the HeaderFooterFrameset data into there.
806
// ... hmm, and then KWFootNoteFrameSet needs to inherit KWHeaderFooterFrameSet
807
QPtrList<KWFrameLayout::HeaderFooterFrameset> headerFooterList;
808
headerFooterList.setAutoDelete( true );
810
// Now hide & forget the unused header/footer framesets (e.g. 'odd pages' if we are in 'all the same' mode etc.)
811
if ( isHeaderVisible() ) {
812
Q_ASSERT( firstHeader );
813
Q_ASSERT( oddHeader );
814
Q_ASSERT( evenHeader );
815
switch ( getHeaderType() ) {
817
oddHeader->setVisible( true );
818
evenHeader->setVisible( false );
819
evenHeader->deleteAllCopies();
820
firstHeader->setVisible( false );
821
firstHeader->deleteAllCopies();
823
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
824
oddHeader, 0, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
826
case HF_FIRST_EO_DIFF: // added for koffice-1.2-beta2
827
firstHeader->setVisible( true );
828
oddHeader->setVisible( true );
829
evenHeader->setVisible( true );
831
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
832
firstHeader, 0, 0, m_pageHeaderFooter.ptHeaderBodySpacing ) );
833
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
834
oddHeader, 2, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
835
KWFrameLayout::HeaderFooterFrameset::Odd ) );
836
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
837
evenHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
838
KWFrameLayout::HeaderFooterFrameset::Even ) );
841
oddHeader->setVisible( true );
842
evenHeader->setVisible( false );
843
evenHeader->deleteAllCopies();
844
firstHeader->setVisible( true );
846
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
847
firstHeader, 0, 0, m_pageHeaderFooter.ptHeaderBodySpacing ) );
848
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
849
oddHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
852
oddHeader->setVisible( true );
853
evenHeader->setVisible( true );
854
firstHeader->setVisible( false );
855
firstHeader->deleteAllCopies();
857
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
858
oddHeader, 0, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
859
KWFrameLayout::HeaderFooterFrameset::Odd ) );
860
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
861
evenHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
862
KWFrameLayout::HeaderFooterFrameset::Even ) );
866
if ( isFooterVisible() ) {
867
Q_ASSERT( firstFooter );
868
Q_ASSERT( oddFooter );
869
Q_ASSERT( evenFooter );
870
switch ( getFooterType() ) {
872
oddFooter->setVisible( true );
873
evenFooter->setVisible( false );
874
evenFooter->deleteAllCopies();
875
firstFooter->setVisible( false );
876
firstFooter->deleteAllCopies();
878
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
879
oddFooter, 0, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
881
case HF_FIRST_EO_DIFF: // added for koffice-1.2-beta2
882
firstFooter->setVisible( true );
883
oddFooter->setVisible( true );
884
evenFooter->setVisible( true );
886
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
887
firstFooter, 0, 0, m_pageHeaderFooter.ptFooterBodySpacing ) );
888
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
889
oddFooter, 2, -1, m_pageHeaderFooter.ptFooterBodySpacing,
890
KWFrameLayout::HeaderFooterFrameset::Odd ) );
891
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
892
evenFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
893
KWFrameLayout::HeaderFooterFrameset::Even ) );
896
oddFooter->setVisible( true );
897
evenFooter->setVisible( false );
898
evenFooter->deleteAllCopies();
899
firstFooter->setVisible( true );
901
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
902
firstFooter, 0, 0, m_pageHeaderFooter.ptFooterBodySpacing ) );
903
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
904
oddFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
907
oddFooter->setVisible( true );
908
evenFooter->setVisible( true );
909
firstFooter->setVisible( false );
910
firstFooter->deleteAllCopies();
912
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
913
oddFooter, 0, -1, m_pageHeaderFooter.ptFooterBodySpacing,
914
KWFrameLayout::HeaderFooterFrameset::Odd ) );
915
headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
916
evenFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
917
KWFrameLayout::HeaderFooterFrameset::Even ) );
922
// The frameset order _on screen_ is:
924
// Main text frame (if WP)
927
// In the list it will have to be from top and from bottom:
928
// Header, Footer, Footnote from bottom to top
929
QPtrList<KWFrameLayout::HeaderFooterFrameset> footnotesHFList;
930
footnotesHFList.setAutoDelete( true );
932
footnotesList.sort();
933
QPtrListIterator<KWFootNoteFrameSet> fnfsIt( footnotesList ); // fnfs == "footnote frameset"
934
for ( ; fnfsIt.current() ; ++fnfsIt )
936
KWFootNoteFrameSet* fnfs = fnfsIt.current();
937
int pageNum = -42; //fnfs->footNoteVariable()->pageNum(); // determined by KWFrameLayout
938
KWFrameLayout::HeaderFooterFrameset* hff = new KWFrameLayout::HeaderFooterFrameset(
939
fnfs, pageNum, pageNum,
940
m_pageHeaderFooter.ptFootNoteBodySpacing,
941
KWFrameLayout::HeaderFooterFrameset::All );
943
// With other kind of framesets, the height is simply frame->height.
944
// But for footnotes, the height to pass to KWFrameLayout is the sum of the frame heights.
946
for (QPtrListIterator<KWFrame> f = fnfs->frameIterator(); f.current() ; ++f )
947
hff->m_height += f.current()->height();
949
footnotesHFList.append( hff );
952
// Endnotes, however are laid out from top to bottom.
953
QPtrList<KWFrameLayout::HeaderFooterFrameset> endnotesHFList;
954
endnotesHFList.setAutoDelete( true );
957
QPtrListIterator<KWFootNoteFrameSet> enfsIt( endnotesList ); // enfs == "endnote frameset"
958
for ( ; enfsIt.current() ; ++enfsIt )
960
KWFootNoteFrameSet* enfs = enfsIt.current();
961
KWFrameLayout::HeaderFooterFrameset* hff = new KWFrameLayout::HeaderFooterFrameset(
962
enfs, -42, -42, // determined by KWFrameLayout
963
m_pageHeaderFooter.ptFootNoteBodySpacing,
964
KWFrameLayout::HeaderFooterFrameset::All );
966
// The height to pass to KWFrameLayout is the sum of the frame heights.
968
for (QPtrListIterator<KWFrame> f = enfs->frameIterator(); f.current() ; ++f )
969
hff->m_height += f.current()->height();
971
endnotesHFList.append( hff );
565
974
int oldPages = m_pages;
566
975
unsigned int frms = frameset->getNumFrames();
568
977
// Determine number of pages - first from the text frames
569
m_pages = static_cast<int>( ceil( static_cast<double>( frms ) / static_cast<double>( m_pageColumns.columns ) ) );
978
// - BUT NOT from the number of frames. Some people manage to end up with
979
// multiple frames of textframeset1 on the same page(!)
980
//m_pages = static_cast<int>( ceil( static_cast<double>( frms ) / static_cast<double>( m_pageColumns.columns ) ) );
570
981
#ifdef DEBUG_PAGES
571
kdDebug(32002) << "KWDocument::recalcFrames frms(" << frms << ") / columns(" << m_pageColumns.columns << ") = " << m_pages << endl;
982
//kdDebug(32002) << "KWDocument::recalcFrames frms(" << frms << ") / columns(" << m_pageColumns.columns << ") = " << m_pages << endl;
573
// Then from the other frames ( frameset-num > 0 )
984
m_pages = frameset->frame( frms - 1 )->pageNum() + 1;
986
// Then from the other frames ( framesetNum > 0 )
574
987
double maxBottom = 0;
575
988
for (int m = getNumFrameSets() - 1; m > 0; m-- )
577
KWFrameSet *fs=getFrameSet(m);
578
if ( fs->isVisible() && !fs->isAHeader() && !fs->isAFooter() )
990
KWFrameSet *fs=frameSet(m);
991
if ( fs->isVisible() && !fs->isAHeader() && !fs->isAFooter() && !fs->isFloating() && !fs->isFootEndNote() )
580
993
for (int n = fs->getNumFrames()-1; n >= 0 ; n--) {
581
994
//if ( n == fs->getNumFrames()-1 )
582
995
#ifdef DEBUG_PAGES
583
kdDebug(32002) << "KWDocument::recalcFrames frameset " << m << " " << fs->getName()
584
<< " frame " << n << " bottom=" << fs->getFrame(n)->bottom() << endl;
996
kdDebug(32002) << "KWDocument::recalcFrames frameset number " << m << " '" << fs->getName()
997
<< "' frame " << n << " bottom=" << fs->frame(n)->bottom() << endl;
586
maxBottom = QMAX(maxBottom, fs->getFrame(n)->bottom());
999
maxBottom = QMAX(maxBottom, fs->frame(n)->bottom());
597
1010
m_pages = QMAX( pages2, m_pages );
1013
toPage = m_pages - 1;
1014
if ( fromPage > toPage ) // this can happen with "endnotes only" pages :)
1015
fromPage = toPage; // ie. start at the last real page
1016
KWFrameLayout frameLayout( this, headerFooterList, footnotesHFList, endnotesHFList );
1017
frameLayout.layout( frameset, m_pageColumns.columns, fromPage, toPage, flags );
1019
// If the number of pages changed, update views and variables etc.
1020
// (now that the frame layout has been done)
598
1021
if ( m_pages != oldPages )
1023
// Very much like the end of appendPage, but we don't want to call recalcFrames ;)
1024
emit newContentsSize();
600
1025
emit pageNumChanged();
601
1026
recalcVariables( VT_PGNUM );
604
// Create new frames in the main text frameset
605
// ( taking into account the header/footer sizes )
606
for ( uint j = 0; j < (uint) m_pages; j++ ) {
608
headOffset = firstHeadOffset;
609
footOffset = firstFootOffset;
610
} else if ( ( ( j + 1 ) / 2 ) * 2 == j + 1 ) {
611
headOffset = evenHeadOffset;
612
footOffset = evenFootOffset;
614
headOffset = oddHeadOffset;
615
footOffset = oddFootOffset;
618
for ( int i = 0; i < m_pageColumns.columns; i++ ) {
619
if ( j * m_pageColumns.columns + i < frameset->getNumFrames() ) {
620
frameset->getFrame( j * m_pageColumns.columns + i )->setRect(
621
ptLeftBorder() + i * ( ptColumnWidth + ptColumnSpacing() ),
622
j * ptPaperHeight() + ptTopBorder() + headOffset,
624
ptPaperHeight() - ptTopBorder() - ptBottomBorder() -
625
headOffset - footOffset );
627
KWFrame * frame = new KWFrame(frameset, ptLeftBorder() +
628
i * ( ptColumnWidth + ptColumnSpacing() ),
629
j * ptPaperHeight() + ptTopBorder() + headOffset,
630
ptColumnWidth, ptPaperHeight() -
631
ptTopBorder() - ptBottomBorder() -
632
headOffset - footOffset );
633
frameset->addFrame( frame );
639
for (QListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
640
if(fit.current()->frameSetInfo()==KWFrameSet::FI_BODY) {
1030
// DTP mode: calculate the number of pages from the frames.
1032
for (QPtrListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
1033
if(fit.current()->isDeleted()) continue;
1034
if(fit.current()->frameSetInfo()==KWFrameSet::FI_BODY && !fit.current()->isFloating()) {
641
1035
KWFrameSet * fs = fit.current();
642
for (QListIterator<KWFrame> f = fs->frameIterator(); f.current() ; ++f ) {
643
height=QMAX(height, f.current()->bottom());
647
while(height > ptPaperHeight() * getPages()) {
652
if ( isHeaderVisible() ) {
653
switch ( getHeaderType() ) {
655
double h = evenHeader->getFrame( 0 )->height();
656
for ( int l = 0; l < m_pages; l++ ) {
657
if ( l < static_cast<int>( evenHeader->getNumFrames() ) )
658
evenHeader->getFrame( l )->setRect( ptLeftBorder(),
659
l * ptPaperHeight() + ptTopBorder(),
661
ptLeftBorder() - ptRightBorder(), h );
664
KWFrame *frame = new KWFrame( evenHeader,ptLeftBorder(), l * ptPaperHeight() + ptTopBorder(),
665
ptPaperWidth() - ptLeftBorder() -
666
ptRightBorder(), h );
667
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
668
frame->setNewFrameBehaviour( KWFrame::Copy );
669
frame->setCopy( true );
670
evenHeader->addFrame( frame );
673
if ( m_pages < static_cast<int>( evenHeader->getNumFrames() ) ) {
674
int diff = evenHeader->getNumFrames() - m_pages;
675
for ( ; diff > 0; diff-- )
676
evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
680
double h1 = evenHeader->getFrame( 0 )->height();
681
double h2 = oddHeader->getFrame( 0 )->height();
682
evenHeader->setCurrent( 0 );
683
oddHeader->setCurrent( 0 );
684
int even = 0, odd = 0;
685
for ( int l = 0; l < m_pages; l++ ) {
686
if ( ( ( l + 1 ) / 2 ) * 2 != l + 1 ) {
687
//kdDebug() << "KWDocument::recalcFrames considering page " << l << "(odd)" << endl;
689
if ( static_cast<int>( oddHeader->getCurrent() ) <
690
static_cast<int>( oddHeader->getNumFrames() ) ) {
691
oddHeader->getFrame( oddHeader->getCurrent() )->setRect( ptLeftBorder(),
692
l * ptPaperHeight() +
696
ptRightBorder(), h2 );
697
oddHeader->setCurrent( oddHeader->getCurrent() + 1 );
700
kdDebug() << "KWDocument::recalcFrames creating new odd header" << endl;
702
KWFrame *frame = new KWFrame( oddHeader, ptLeftBorder(), l * ptPaperHeight() +
704
ptPaperWidth() - ptLeftBorder() -
705
ptRightBorder(), h2 );
706
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
707
frame->setNewFrameBehaviour( KWFrame::Copy );
708
frame->setCopy( true );
709
oddHeader->addFrame( frame );
712
//kdDebug() << "KWDocument::recalcFrames considering page " << l << "(even)" << endl;
714
if ( static_cast<int>( evenHeader->getCurrent() ) <
715
static_cast<int>( evenHeader->getNumFrames() ) ) {
716
evenHeader->getFrame( evenHeader->getCurrent() )->setRect( ptLeftBorder(),
717
l * ptPaperHeight() +
721
ptRightBorder(), h1 );
722
evenHeader->setCurrent( evenHeader->getCurrent() + 1 );
725
kdDebug() << "KWDocument::recalcFrames creating new even header" << endl;
727
KWFrame *frame = new KWFrame( evenHeader,ptLeftBorder(), l * ptPaperHeight() +
729
ptPaperWidth() - ptLeftBorder() -
730
ptRightBorder(), h1 );
731
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
732
frame->setNewFrameBehaviour( KWFrame::Copy );
733
frame->setCopy( true );
734
evenHeader->addFrame( frame );
738
if ( even + 1 < static_cast<int>( evenHeader->getNumFrames() ) ) {
739
int diff = evenHeader->getNumFrames() - even;
741
kdDebug() << "KWDocument::recalcFrames deleting " << diff << " even headers" << endl;
743
for ( ; diff > 0; diff-- )
744
evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
746
if ( odd + 1 < static_cast<int>( oddHeader->getNumFrames() ) ) {
747
int diff = oddHeader->getNumFrames() - odd;
749
kdDebug() << "KWDocument::recalcFrames deleting " << diff << " odd headers" << endl;
751
for ( ; diff > 0; diff-- )
752
oddHeader->delFrame( oddHeader->getNumFrames() - 1 );
754
if ( m_pages == 1 && evenHeader->getNumFrames() > 0 ) {
756
kdDebug() << "KWDocument::recalcFrames 1 page, " << evenHeader->getNumFrames() << " frames" << endl;
759
for ( unsigned int m = 0; m < evenHeader->getNumFrames(); m++ )
760
evenHeader->getFrame( m )->setRect( 0, ptPaperHeight() + h1,
761
ptPaperWidth() - ptLeftBorder() -
762
ptRightBorder(), h1 );
765
case HF_FIRST_DIFF: {
766
double h = firstHeader->getFrame( 0 )->height();
767
firstHeader->getFrame( 0 )->setRect( ptLeftBorder(), ptTopBorder(),
768
ptPaperWidth() - ptLeftBorder() -
769
ptRightBorder(), h );
770
if ( firstHeader->getNumFrames() > 1 ) {
771
int diff = firstHeader->getNumFrames() - 1;
772
for ( ; diff > 0; diff-- )
773
firstHeader->delFrame( firstHeader->getNumFrames() - 1 );
775
h = evenHeader->getFrame( 0 )->height();
776
for ( int l = 1; l < m_pages; l++ ) {
777
if ( l - 1 < static_cast<int>( evenHeader->getNumFrames() ) )
778
evenHeader->getFrame( l - 1 )->setRect( ptLeftBorder(), l * ptPaperHeight() +
780
ptPaperWidth() - ptLeftBorder() -
781
ptRightBorder(), h );
783
KWFrame *frame = new KWFrame( evenHeader, ptLeftBorder(), l * ptPaperHeight() + ptTopBorder(),
784
ptPaperWidth() - ptLeftBorder() -
785
ptRightBorder(), h );
786
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
787
frame->setNewFrameBehaviour( KWFrame::Copy );
788
frame->setCopy( true );
789
evenHeader->addFrame( frame );
792
if ( m_pages < static_cast<int>( evenHeader->getNumFrames() ) ) {
793
int diff = evenHeader->getNumFrames() - m_pages;
794
for ( ; diff > 0; diff-- )
795
evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
797
if ( m_pages == 1 && evenHeader->getNumFrames() > 0 ) {
798
for ( unsigned int m = 0; m < evenHeader->getNumFrames(); m++ )
799
evenHeader->getFrame( m )->setRect( 0, ptPaperHeight() + h,
800
ptPaperWidth() - ptLeftBorder() -
801
ptRightBorder(), h );
807
if ( isFooterVisible() ) {
808
switch ( getFooterType() ) {
810
double h = evenFooter->getFrame( 0 )->height();
811
for ( int l = 0; l < m_pages; l++ ) {
812
if ( l < static_cast<int>( evenFooter->getNumFrames() ) )
813
evenFooter->getFrame( l )->setRect( ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
814
ptBottomBorder() - h,
815
ptPaperWidth() - ptLeftBorder() -
816
ptRightBorder(), h );
818
KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
819
ptBottomBorder() - h,
820
ptPaperWidth() - ptLeftBorder() -
821
ptRightBorder(), h );
822
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
823
frame->setNewFrameBehaviour( KWFrame::Copy );
824
frame->setCopy( true );
825
evenFooter->addFrame( frame );
828
if ( m_pages < static_cast<int>( evenFooter->getNumFrames() ) ) {
829
int diff = evenFooter->getNumFrames() - m_pages;
830
for ( ; diff > 0; diff-- )
831
evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
835
double h1 = evenFooter->getFrame( 0 )->height();
836
double h2 = oddFooter->getFrame( 0 )->height();
837
evenFooter->setCurrent( 0 );
838
oddFooter->setCurrent( 0 );
839
int even = 0, odd = 0;
840
for ( int l = 0; l < m_pages; l++ ) {
841
if ( ( ( l + 1 ) / 2 ) * 2 != l + 1 ) {
843
if ( static_cast<int>( oddFooter->getCurrent() ) < static_cast<int>( oddFooter->getNumFrames() ) ) {
844
oddFooter->getFrame( oddFooter->getCurrent() )->setRect( ptLeftBorder(),
847
ptBottomBorder() - h2,
850
ptRightBorder(), h2 );
851
oddFooter->setCurrent( oddFooter->getCurrent() + 1 );
853
KWFrame *frame = new KWFrame(oddFooter, ptLeftBorder(),
854
( l + 1 ) * ptPaperHeight() -
855
ptBottomBorder() - h2,
856
ptPaperWidth() - ptLeftBorder() -
857
ptRightBorder(), h2 );
858
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
859
frame->setNewFrameBehaviour( KWFrame::Copy );
860
frame->setCopy( true );
861
oddFooter->addFrame( frame );
865
if ( static_cast<int>( evenFooter->getCurrent() ) <
866
static_cast<int>( evenFooter->getNumFrames() ) ) {
867
evenFooter->getFrame( evenFooter->getCurrent() )->setRect( ptLeftBorder(),
870
ptBottomBorder() - h1,
873
ptRightBorder(), h1 );
874
evenFooter->setCurrent( evenFooter->getCurrent() + 1 );
876
KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(),
877
( l + 1 ) * ptPaperHeight() -
878
ptBottomBorder() - h1,
879
ptPaperWidth() - ptLeftBorder() -
880
ptRightBorder(), h1 );
881
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
882
frame->setNewFrameBehaviour( KWFrame::Copy );
883
frame->setCopy( true );
884
evenFooter->addFrame( frame );
888
if ( even + 1 < static_cast<int>( evenFooter->getNumFrames() ) ) {
889
int diff = evenFooter->getNumFrames() - even;
890
for ( ; diff > 0; diff-- )
891
evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
893
if ( odd + 1 < static_cast<int>( oddFooter->getNumFrames() ) ) {
894
int diff = oddFooter->getNumFrames() - odd;
895
for ( ; diff > 0; diff-- )
896
oddFooter->delFrame( oddFooter->getNumFrames() - 1 );
898
if ( m_pages == 1 && evenFooter->getNumFrames() > 0 ) {
899
for ( unsigned int m = 0; m < evenFooter->getNumFrames(); m++ )
900
evenFooter->getFrame( m )->setRect( 0, m_pages * ptPaperHeight() + h1,
901
ptPaperWidth() - ptLeftBorder() -
902
ptRightBorder(), h1 );
905
case HF_FIRST_DIFF: {
906
double h = firstFooter->getFrame( 0 )->height();
907
firstFooter->getFrame( 0 )->setRect( ptLeftBorder(), ptPaperHeight() - ptBottomBorder() - h,
908
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), h );
909
if ( firstFooter->getNumFrames() > 1 ) {
910
int diff = firstFooter->getNumFrames() - 1;
911
for ( ; diff > 0; diff-- )
912
firstFooter->delFrame( firstFooter->getNumFrames() - 1 );
914
h = evenFooter->getFrame( 0 )->height();
915
for ( int l = 1; l < m_pages; l++ ) {
916
if ( l - 1 < static_cast<int>( evenFooter->getNumFrames() ) )
917
evenFooter->getFrame( l - 1 )->setRect( ptLeftBorder(), ( l + 1 ) *
918
ptPaperHeight() - ptBottomBorder() - h,
919
ptPaperWidth() - ptLeftBorder() -
920
ptRightBorder(), h );
922
KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
923
ptBottomBorder() - h,
924
ptPaperWidth() - ptLeftBorder() -
925
ptRightBorder(), h );
926
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
927
frame->setNewFrameBehaviour( KWFrame::Copy );
928
frame->setCopy( true );
929
evenFooter->addFrame( frame );
932
if ( m_pages < static_cast<int>( evenFooter->getNumFrames() ) ) {
933
int diff = evenFooter->getNumFrames() - m_pages;
934
for ( ; diff > 0; diff-- )
935
evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
937
if ( m_pages == 1 && evenFooter->getNumFrames() > 0 ) {
938
for ( unsigned int m = 0; m < evenFooter->getNumFrames(); m++ )
939
evenFooter->getFrame( m )->setRect( 0, m_pages * ptPaperHeight() + h,
940
ptPaperWidth() - ptLeftBorder() -
941
ptRightBorder(), h );
1036
for (QPtrListIterator<KWFrame> f = fs->frameIterator(); f.current() ; ++f ) {
1038
kdDebug(32002) << " fs=" << fs->getName() << " bottom=" << f.current()->bottom() << endl;
1040
maxBottom=QMAX(maxBottom, f.current()->bottom());
1044
m_pages = static_cast<int>( ceil( maxBottom / ptPaperHeight() ) );
1046
kdDebug(32002) << "DTP mode: pages = maxBottom("<<maxBottom<<") / ptPaperHeight=" << ptPaperHeight() << " = " << m_pages << endl;
1048
if(m_pages < 1) m_pages=1;
948
1052
bool KWDocument::loadChildren( KoStore *_store )
950
QListIterator<KoDocumentChild> it( children() );
1054
//kdDebug(32001) << "KWDocument::loadChildren" << endl;
1055
QPtrListIterator<KoDocumentChild> it( children() );
951
1056
for( ; it.current(); ++it ) {
952
if ( !((KoDocumentChild*)it.current())->loadDocument( _store ) )
1057
if ( !it.current()->loadDocument( _store ) )
1064
void KWDocument::loadPictureMap ( QDomElement& domElement )
1066
m_pictureMap.clear();
1069
QDomElement picturesElem = domElement.namedItem( "PICTURES" ).toElement();
1070
if ( !picturesElem.isNull() )
1072
m_pictureCollection.readXML( picturesElem, m_pictureMap );
1076
QDomElement pixmapsElem = domElement.namedItem( "PIXMAPS" ).toElement();
1077
if ( !pixmapsElem.isNull() )
1079
m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
1083
QDomElement clipartsElem = domElement.namedItem( "CLIPARTS" ).toElement();
1084
if ( !clipartsElem.isNull() )
1086
m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
959
1091
bool KWDocument::loadXML( QIODevice *, const QDomDocument & doc )
963
1095
emit sigProgress( 0 );
964
kdDebug(32001) << "KWDocument::loadXML" << endl;
969
m_imageRequests.clear();
970
m_imageRequests2.clear();
1096
//kdDebug(32001) << "KWDocument::loadXML" << endl;
1097
m_pictureMap.clear();
1098
m_textImageRequests.clear();
1099
m_pictureRequests.clear();
971
1100
m_anchorRequests.clear();
972
m_clipartRequests.clear();
974
m_pageLayout.unit = PG_MM;
1101
m_footnoteVarRequests.clear();
1102
m_spellListIgnoreAll.clear();
976
1104
m_pageColumns.columns = 1;
977
m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
1105
m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
979
1107
m_pageHeaderFooter.header = HF_SAME;
980
1108
m_pageHeaderFooter.footer = HF_SAME;
981
1109
m_pageHeaderFooter.ptHeaderBodySpacing = 10;
982
1110
m_pageHeaderFooter.ptFooterBodySpacing = 10;
983
m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
984
m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
985
m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
986
m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
988
m_mapVariableFormats.clear();
1111
m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
1112
m_varFormatCollection->clear();
1115
m_bHasEndNotes = false;
992
1117
KoPageLayout __pgLayout;
993
__pgLayout.unit = PG_MM;
994
1118
KoColumns __columns;
1119
__columns.columns = 1;
1120
__columns.ptColumnSpacing = m_defaultColumnSpacing;
995
1121
KoKWHeaderFooter __hf;
996
1122
__hf.header = HF_SAME;
997
1123
__hf.footer = HF_SAME;
998
1124
__hf.ptHeaderBodySpacing = 10.0;
999
1125
__hf.ptFooterBodySpacing = 10.0;
1000
__hf.mmHeaderBodySpacing = POINT_TO_MM( 10 );
1001
__hf.mmFooterBodySpacing = POINT_TO_MM( 10 );
1002
__hf.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
1003
__hf.inchFooterBodySpacing = POINT_TO_INCH( 10 );
1126
__hf.ptFootNoteBodySpacing = 10.0;
1007
1129
QDomElement word = doc.documentElement();
1010
1131
value = KWDocument::getAttribute( word, "mime", QString::null );
1011
if ( value != "application/x-kword" && value != "application/vnd.kde.kword" )
1132
if ( value.isEmpty() )
1134
kdError(32001) << "No mime type specified!" << endl;
1135
setErrorMessage( i18n( "Invalid document. No mimetype specified." ) );
1138
else if ( value != "application/x-kword" && value != "application/vnd.kde.kword" )
1013
1140
kdError(32001) << "Unknown mime type " << value << endl;
1141
setErrorMessage( i18n( "Invalid document. Expected mimetype application/x-kword or application/vnd.kde.kword, got %1" ).arg( value ) );
1016
1144
m_syntaxVersion = KWDocument::getAttribute( word, "syntaxVersion", 0 );
1041
1172
__pgLayout.format = static_cast<KoFormat>( KWDocument::getAttribute( paper, "format", 0 ) );
1042
1173
__pgLayout.orientation = static_cast<KoOrientation>( KWDocument::getAttribute( paper, "orientation", 0 ) );
1043
getPointBasedAttribute( __pgLayout, Width, paper, "width", 0.0 );
1044
getPointBasedAttribute( __pgLayout, Height, paper, "height", 0.0 );
1174
__pgLayout.ptWidth = getAttribute( paper, "width", 0.0 );
1175
__pgLayout.ptHeight = getAttribute( paper, "height", 0.0 );
1045
1176
__hf.header = static_cast<KoHFType>( KWDocument::getAttribute( paper, "hType", 0 ) );
1046
1177
__hf.footer = static_cast<KoHFType>( KWDocument::getAttribute( paper, "fType", 0 ) );
1047
getPointBasedAttribute( __hf, HeaderBodySpacing, paper, "spHeadBody", 0.0 );
1048
getPointBasedAttribute( __hf, FooterBodySpacing, paper, "spFootBody", 0.0 );
1178
__hf.ptHeaderBodySpacing = getAttribute( paper, "spHeadBody", 0.0 );
1179
__hf.ptFooterBodySpacing = getAttribute( paper, "spFootBody", 0.0 );
1180
__hf.ptFootNoteBodySpacing = getAttribute( paper, "spFootNoteBody", 10.0 );
1181
m_iFootNoteSeparatorLineLength = getAttribute( paper, "slFootNoteLength", 20);
1182
m_footNoteSeparatorLineWidth = getAttribute( paper, "slFootNoteWidth",2.0);
1183
m_footNoteSeparatorLineType = static_cast<SeparatorLineLineType>(getAttribute( paper, "slFootNoteType",0));
1185
if ( paper.hasAttribute("slFootNotePosition"))
1187
QString tmp =paper.attribute("slFootNotePosition");
1188
if ( tmp =="centered" )
1189
m_footNoteSeparatorLinePos = SLP_CENTERED;
1190
else if ( tmp =="right")
1191
m_footNoteSeparatorLinePos = SLP_RIGHT;
1192
else if ( tmp =="left" )
1193
m_footNoteSeparatorLinePos = SLP_LEFT;
1049
1195
__columns.columns = KWDocument::getAttribute( paper, "columns", 1 );
1050
1196
__columns.ptColumnSpacing = KWDocument::getAttribute( paper, "columnspacing", 0.0 );
1051
1197
// Now part of the app config
1052
1198
//m_zoom = KWDocument::getAttribute( paper, "zoom", 100 );
1053
1199
//if(m_zoom!=100)
1054
1200
// setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY(), false, false );
1055
1203
// Support the undocumented syntax actually used by KDE 2.0 for some of the above (:-().
1204
// Do not add anything to this block!
1056
1205
if ( __pgLayout.ptWidth == 0.0 )
1057
getPointBasedAttribute( __pgLayout, Width, paper, "ptWidth", 0.0 );
1206
__pgLayout.ptWidth = getAttribute( paper, "ptWidth", 0.0 );
1058
1207
if ( __pgLayout.ptHeight == 0.0 )
1059
getPointBasedAttribute( __pgLayout, Height, paper, "ptHeight", 0.0 );
1208
__pgLayout.ptHeight = getAttribute( paper, "ptHeight", 0.0 );
1060
1209
if ( __hf.ptHeaderBodySpacing == 0.0 )
1061
getPointBasedAttribute( __hf, HeaderBodySpacing, paper, "ptHeadBody", 0.0 );
1210
__hf.ptHeaderBodySpacing = getAttribute( paper, "ptHeadBody", 0.0 );
1062
1211
if ( __hf.ptFooterBodySpacing == 0.0 )
1063
getPointBasedAttribute( __hf, FooterBodySpacing, paper, "ptFootBody", 0.0 );
1212
__hf.ptFooterBodySpacing = getAttribute( paper, "ptFootBody", 0.0 );
1064
1213
if ( __columns.ptColumnSpacing == 0.0 )
1065
__columns.ptColumnSpacing = KWDocument::getAttribute( paper, "ptColumnspc", 0.0 );
1214
__columns.ptColumnSpacing = getAttribute( paper, "ptColumnspc", 0.0 );
1067
1216
// <PAPERBORDERS>
1068
1217
QDomElement paperborders = paper.namedItem( "PAPERBORDERS" ).toElement();
1069
1218
if ( !paperborders.isNull() )
1071
getPointBasedAttribute( __pgLayout, Left, paperborders, "left", 0.0 );
1072
getPointBasedAttribute( __pgLayout, Top, paperborders, "top", 0.0 );
1073
getPointBasedAttribute( __pgLayout, Right, paperborders, "right", 0.0 );
1074
getPointBasedAttribute( __pgLayout, Bottom, paperborders, "bottom", 0.0 );
1220
__pgLayout.ptLeft = getAttribute( paperborders, "left", 0.0 );
1221
__pgLayout.ptTop = getAttribute( paperborders, "top", 0.0 );
1222
__pgLayout.ptRight = getAttribute( paperborders, "right", 0.0 );
1223
__pgLayout.ptBottom = getAttribute( paperborders, "bottom", 0.0 );
1076
1225
// Support the undocumented syntax actually used by KDE 2.0 for some of the above (:-().
1077
1226
if ( __pgLayout.ptLeft == 0.0 )
1078
getPointBasedAttribute( __pgLayout, Left, paperborders, "ptLeft", 0.0 );
1227
__pgLayout.ptLeft = getAttribute( paperborders, "ptLeft", 0.0 );
1079
1228
if ( __pgLayout.ptTop == 0.0 )
1080
getPointBasedAttribute( __pgLayout, Top, paperborders, "ptTop", 0.0 );
1229
__pgLayout.ptTop = getAttribute( paperborders, "ptTop", 0.0 );
1081
1230
if ( __pgLayout.ptRight == 0.0 )
1082
getPointBasedAttribute( __pgLayout, Right, paperborders, "ptRight", 0.0 );
1231
__pgLayout.ptRight = getAttribute( paperborders, "ptRight", 0.0 );
1083
1232
if ( __pgLayout.ptBottom == 0.0 )
1084
getPointBasedAttribute( __pgLayout, Bottom, paperborders, "ptBottom", 0.0 );
1233
__pgLayout.ptBottom = getAttribute( paperborders, "ptBottom", 0.0 );
1236
kdWarning() << "No <PAPERBORDERS> tag!" << endl;
1239
kdWarning() << "No <PAPER> tag! This is a mandatory tag! Expect weird page sizes..." << endl;
1088
1241
// <ATTRIBUTES>
1089
1242
QDomElement attributes = word.namedItem( "ATTRIBUTES" ).toElement();
1134
1288
if ( !stylesElem.isNull() )
1135
1289
loadStyleTemplates( stylesElem );
1291
emit sigProgress(17);
1293
QDomElement frameStylesElem = word.namedItem( "FRAMESTYLES" ).toElement();
1294
if ( !frameStylesElem.isNull() )
1295
loadFrameStyleTemplates( frameStylesElem );
1296
else // load default styles
1297
loadDefaultFrameStyleTemplates();
1299
emit sigProgress(18);
1301
QDomElement tableStylesElem = word.namedItem( "TABLESTYLES" ).toElement();
1302
if ( !tableStylesElem.isNull() )
1303
loadTableStyleTemplates( tableStylesElem );
1304
else // load default styles
1305
loadDefaultTableStyleTemplates();
1307
emit sigProgress(19);
1309
loadDefaultTableTemplates();
1137
1311
emit sigProgress(20);
1313
QDomElement bookmark = word.namedItem( "BOOKMARKS" ).toElement();
1314
if( !bookmark.isNull() )
1316
QDomElement bookmarkitem=word.namedItem("BOOKMARKS").toElement();
1317
bookmarkitem=bookmarkitem.firstChild().toElement();
1319
while ( !bookmarkitem.isNull() )
1321
if ( bookmarkitem.tagName()=="BOOKMARKITEM" )
1323
bookMark *tmp=new bookMark;
1324
tmp->bookname=bookmarkitem.attribute("name");
1325
tmp->cursorStartIndex=bookmarkitem.attribute("cursorIndexStart").toInt();
1326
tmp->frameSetName=bookmarkitem.attribute("frameset");
1327
tmp->paragStartIndex = bookmarkitem.attribute("startparag").toInt();
1328
tmp->paragEndIndex = bookmarkitem.attribute("endparag").toInt();
1329
tmp->cursorEndIndex = bookmarkitem.attribute("cursorIndexEnd").toInt();
1330
m_tmpBookMarkList.append(tmp);
1332
bookmarkitem=bookmarkitem.nextSibling().toElement();
1336
QDomElement spellCheckIgnore = word.namedItem( "SPELLCHECKIGNORELIST" ).toElement();
1337
if( !spellCheckIgnore.isNull() )
1339
QDomElement spellWord=word.namedItem("SPELLCHECKIGNORELIST").toElement();
1340
spellWord=spellWord.firstChild().toElement();
1341
while ( !spellWord.isNull() )
1343
if ( spellWord.tagName()=="SPELLCHECKIGNOREWORD" )
1344
m_spellListIgnoreAll.append(spellWord.attribute("word"));
1345
spellWord=spellWord.nextSibling().toElement();
1348
m_bgSpellCheck->addIgnoreWordAllList( m_spellListIgnoreAll );
1350
emit sigProgress(25);
1139
1353
QDomElement framesets = word.namedItem( "FRAMESETS" ).toElement();
1140
1354
if ( !framesets.isNull() )
1141
1355
loadFrameSets( framesets );
1143
1357
emit sigProgress(85);
1145
QDateTime defaultDateTime = QDateTime::currentDateTime();
1147
QDomElement pixmapsElem = word.namedItem( "PIXMAPS" ).toElement();
1148
if ( !pixmapsElem.isNull() )
1150
m_pixmapMap = new QMap<KoImageKey, QString>( m_imageCollection.readXML( pixmapsElem, defaultDateTime ) );
1154
QDomElement clipartsElem = word.namedItem( "CLIPARTS" ).toElement();
1155
if ( !clipartsElem.isNull() )
1157
m_clipartMap = new QMap<KoClipartKey, QString>( m_clipartCollection.readXML( clipartsElem, defaultDateTime ) );
1359
loadPictureMap( word );
1160
1361
emit sigProgress(90);
1163
QDomNodeList listEmbedded = word.elementsByTagName ( "EMBEDDED" );
1164
for (item = 0; item < listEmbedded.count(); item++)
1166
QDomElement embedded = listEmbedded.item( item ).toElement();
1167
loadEmbedded( embedded );
1170
emit sigProgress(95);
1172
#if 0 // Not needed anymore
1173
// <CPARAGS> (Ids of the parags that form the Table of Contents)
1174
QDomNodeList listCparags = word.elementsByTagName( "CPARAGS" );
1175
for (item = 0; item < listCparags.count(); item++)
1177
QDomElement cparag = listCparags.item( item ).toElement();
1178
QDomElement parag = cparag.namedItem( "PARAG" ).toElement();
1179
if ( !parag.isNull() )
1181
value = parag.attribute( "name", QString::null );
1182
if ( value != QString::null )
1183
contents->addParagId( value.toInt() );
1364
loadEmbeddedObjects( word );
1188
1366
emit sigProgress(100); // the rest is only processing, not loading
1190
1368
bool _first_footer = FALSE, _even_footer = FALSE, _odd_footer = FALSE;
1191
1369
bool _first_header = FALSE, _even_header = FALSE, _odd_header = FALSE;
1192
//bool _footnotes = FALSE;
1193
KWFrameSet * footNotesFS = 0L;
1195
QListIterator<KWFrameSet> fit = framesetsIterator();
1371
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1196
1372
for ( ; fit.current() ; ++fit )
1198
1374
switch( fit.current()->frameSetInfo() ) {
1199
1375
case KWFrameSet::FI_FIRST_HEADER: _first_header = TRUE; break;
1200
case KWFrameSet::FI_EVEN_HEADER: _odd_header = TRUE; break;
1201
case KWFrameSet::FI_ODD_HEADER: _even_header = TRUE; break;
1376
case KWFrameSet::FI_ODD_HEADER: _odd_header = TRUE; break;
1377
case KWFrameSet::FI_EVEN_HEADER: _even_header = TRUE; break;
1202
1378
case KWFrameSet::FI_FIRST_FOOTER: _first_footer = TRUE; break;
1203
case KWFrameSet::FI_EVEN_FOOTER: _odd_footer = TRUE; break;
1204
case KWFrameSet::FI_ODD_FOOTER: _even_footer = TRUE; break;
1205
case KWFrameSet::FI_FOOTNOTE: footNotesFS = fit.current(); /* _footnotes = TRUE; */ break;
1379
case KWFrameSet::FI_ODD_FOOTER: _odd_footer = TRUE; break;
1380
case KWFrameSet::FI_EVEN_FOOTER: _even_footer = TRUE; break;
1381
case KWFrameSet::FI_FOOTNOTE: break;
1206
1382
default: break;
1209
// Not implemented currently -> remove all frames, to avoid problems
1212
footNotesFS->deleteAllFrames();
1215
1386
// create defaults if they were not in the input file.
1217
1388
if ( !_first_header ) {
1218
1389
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "First Page Header" ) );
1219
kdDebug(32001) << "KWDocument::loadXML KWTextFrameSet created " << fs << endl;
1390
//kdDebug(32001) << "KWDocument::loadXML KWTextFrameSet created " << fs << endl;
1220
1391
fs->setFrameSetInfo( KWFrameSet::FI_FIRST_HEADER );
1221
1392
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1222
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1223
kdDebug(32001) << "KWDocument::loadXML KWFrame created " << frame << endl;
1224
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1225
frame->setNewFrameBehaviour( KWFrame::Copy );
1226
fs->addFrame( frame );
1227
frames.append( fs );
1393
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1394
//kdDebug(32001) << "KWDocument::loadXML KWFrame created " << frame << endl;
1395
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1396
frame->setNewFrameBehavior( KWFrame::Copy );
1397
fs->addFrame( frame );
1398
m_lstFrameSet.append( fs );
1401
if ( !_odd_header ) {
1402
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Header" ) );
1403
fs->setFrameSetInfo( KWFrameSet::FI_ODD_HEADER );
1404
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1405
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1406
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1407
frame->setNewFrameBehavior( KWFrame::Copy );
1408
fs->addFrame( frame );
1409
m_lstFrameSet.append( fs );
1230
1412
if ( !_even_header ) {
1231
1413
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Even Pages Header" ) );
1232
1414
fs->setFrameSetInfo( KWFrameSet::FI_EVEN_HEADER );
1233
1415
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1234
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1235
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1236
frame->setNewFrameBehaviour( KWFrame::Copy );
1237
fs->addFrame( frame );
1238
frames.append( fs );
1241
if ( !_odd_header ) {
1242
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Header" ) );
1243
fs->setFrameSetInfo( KWFrameSet::FI_ODD_HEADER );
1244
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1245
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1246
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1247
frame->setNewFrameBehaviour( KWFrame::Copy );
1248
fs->addFrame( frame );
1249
frames.append( fs );
1416
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1417
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1418
frame->setNewFrameBehavior( KWFrame::Copy );
1419
fs->addFrame( frame );
1420
m_lstFrameSet.append( fs );
1252
1423
if ( !_first_footer ) {
1253
1424
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "First Page Footer" ) );
1254
1425
fs->setFrameSetInfo( KWFrameSet::FI_FIRST_FOOTER );
1255
1426
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1256
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1257
ptRightBorder(), 20 );
1258
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1259
frame->setNewFrameBehaviour( KWFrame::Copy );
1260
fs->addFrame( frame );
1261
frames.append( fs );
1427
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1428
ptRightBorder(), 20 );
1429
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1430
frame->setNewFrameBehavior( KWFrame::Copy );
1431
fs->addFrame( frame );
1432
m_lstFrameSet.append( fs );
1435
if ( !_odd_footer ) {
1436
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Footer" ) );
1437
fs->setFrameSetInfo( KWFrameSet::FI_ODD_FOOTER );
1438
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1439
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1440
ptRightBorder(), 20 );
1441
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1442
frame->setNewFrameBehavior( KWFrame::Copy );
1443
fs->addFrame( frame );
1444
m_lstFrameSet.append( fs );
1264
1447
if ( !_even_footer ) {
1265
1448
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Even Pages Footer" ) );
1266
1449
fs->setFrameSetInfo( KWFrameSet::FI_EVEN_FOOTER );
1267
1450
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1268
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1269
ptRightBorder(), 20 );
1270
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1271
frame->setNewFrameBehaviour( KWFrame::Copy );
1272
fs->addFrame( frame );
1273
frames.append( fs );
1276
if ( !_odd_footer ) {
1277
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Footer" ) );
1278
fs->setFrameSetInfo( KWFrameSet::FI_ODD_FOOTER );
1279
KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1280
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1281
ptRightBorder(), 20 );
1282
frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1283
frame->setNewFrameBehaviour( KWFrame::Copy );
1284
fs->addFrame( frame );
1285
frames.append( fs );
1289
if ( !_footnotes ) {
1290
KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Footnotes" ) );
1291
fs->setFrameSetInfo( KWFrameSet::FI_FOOTNOTE );
1293
for ( int i = 0; i < m_pages; i++ ) {
1294
KWFrame *frame = new KWFrame(fs, ptLeftBorder(),
1295
i * ptPaperHeight() + ptPaperHeight() - ptTopBorder() - 20,
1296
ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1297
frame->setFrameBehaviour(KWFrame::AutoExtendFrame);
1298
fs->addFrame( frame );
1300
frames.append( fs );
1301
fs->setVisible( FALSE );
1305
#if 0 // already done !
1307
for ( ch = m_lstChildren.first(); ch != 0; ch = m_lstChildren.next() ) {
1308
KWPartFrameSet *frameset = new KWPartFrameSet( this, ch );
1309
QRect r = ch->geometry();
1310
KWFrame *frame = new KWFrame(frameset, r.x(), r.y(), r.width(), r.height() );
1311
frameset->addFrame( frame );
1312
frames.append( frameset );
1313
emit sig_insertObject( ch, frameset );
1451
ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1452
ptRightBorder(), 20 );
1453
frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1454
frame->setNewFrameBehavior( KWFrame::Copy );
1455
fs->addFrame( frame );
1456
m_lstFrameSet.append( fs );
1317
1459
// do some sanity checking on document.
1318
1460
for (int i = getNumFrameSets()-1; i>-1; i--) {
1319
KWFrameSet *fs = getFrameSet(i);
1461
KWFrameSet *fs = frameSet(i);
1321
1463
kdWarning() << "frameset " << i << " is NULL!!" << endl;
1464
m_lstFrameSet.remove(i);
1323
1465
} else if( fs->type()==FT_TABLE) {
1324
1466
static_cast<KWTableFrameSet *>( fs )->validate();
1325
1467
} else if(!fs->getNumFrames()) {
1326
kdWarning () << "frameset " << i << " has no frames" << endl;
1468
kdWarning () << "frameset " << i << " " << fs->getName() << " has no frames" << endl;
1327
1469
removeFrameSet(fs);
1470
if ( fs->type() == FT_PART )
1471
delete static_cast<KWPartFrameSet *>(fs)->getChild();
1329
1473
} else if (fs->type() == FT_TEXT) {
1330
1474
for (int f=fs->getNumFrames()-1; f>=0; f--) {
1331
KWFrame *frame = fs->getFrame(f);
1332
if(frame->height() < static_cast <int>(minFrameHeight)) {
1333
kdWarning() << "frame height is so small no text will fit, adjusting (was: "
1334
<< frame->height() << " is: " << minFrameHeight << ")" << endl;
1335
frame->setHeight(minFrameHeight);
1475
KWFrame *frame = fs->frame(f);
1476
if(frame->height() < s_minFrameHeight) {
1477
kdWarning() << fs->getName() << " frame " << f << " height is so small no text will fit, adjusting (was: "
1478
<< frame->height() << " is: " << s_minFrameHeight << ")" << endl;
1479
frame->setHeight(s_minFrameHeight);
1337
if(frame->width() < static_cast <int>(minFrameWidth)) {
1338
kdWarning() << "frame width is so small no text will fit, adjusting (was: "
1339
<< frame->width() << " is: " << minFrameWidth << ")" << endl;
1340
frame->setWidth(minFrameWidth);
1481
if(frame->width() < s_minFrameWidth) {
1482
kdWarning() << fs->getName() << " frame " << f << " width is so small no text will fit, adjusting (was: "
1483
<< frame->width() << " is: " << s_minFrameWidth << ")" << endl;
1484
frame->setWidth(s_minFrameWidth);
1345
1489
emit sigProgress(-1);
1347
recalcFrames(); // This computes the number of pages (from the frames)
1348
// for the first time (and adds footers/headers etc.)
1350
#if 0 // If KWCanvas calls updateViewArea right, this is not needed anymore
1351
kdDebug(32002) << "KWDocument::loadXML starting formatting" << endl;
1352
// So now we can start formatting
1353
fit = framesetsIterator();
1354
for ( ; fit.current() ; ++fit )
1356
KWTextFrameSet * frameset = dynamic_cast<KWTextFrameSet *>(fit.current());
1359
frameset->formatMore(); // creates more pages/frames if necessary
1364
emit newContentsSize();
1365
repaintAllViews( true ); // in case any view exists already
1367
1491
//kdDebug(32001) << "KWDocument::loadXML done" << endl;
1369
1493
setModified( false );
1495
// Connect to notifications from main text-frameset
1496
KWTextFrameSet *frameset = dynamic_cast<KWTextFrameSet *>( m_lstFrameSet.getFirst() );
1498
connect( frameset->textObject(), SIGNAL( chapterParagraphFormatted( KoTextParag * ) ),
1499
SLOT( slotChapterParagraphFormatted( KoTextParag * ) ) );
1500
connect( frameset, SIGNAL( mainTextHeightChanged() ),
1501
SIGNAL( mainTextHeightChanged() ) );
1371
1504
kdDebug(32001) << "Loading took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl;
1375
void KWDocument::loadEmbedded( QDomElement embedded )
1509
void KWDocument::startBackgroundSpellCheck()
1511
//don't start bg spell checking if
1512
if(backgroundSpellCheckEnabled() && isReadWrite())
1514
m_bgSpellCheck->objectForSpell(textFrameSet(0));
1515
m_bgSpellCheck->startBackgroundSpellCheck();
1520
void KWDocument::loadEmbeddedObjects( QDomElement& word )
1522
QDomNodeList listEmbedded = word.elementsByTagName ( "EMBEDDED" );
1523
for (unsigned int item = 0; item < listEmbedded.count(); item++)
1525
QDomElement embedded = listEmbedded.item( item ).toElement();
1526
loadEmbedded( embedded );
1530
void KWDocument::loadEmbedded( const QDomElement &embedded )
1377
1532
QDomElement object = embedded.namedItem( "OBJECT" ).toElement();
1378
1533
if ( !object.isNull() )
1418
1601
kdWarning () << "Found duplicate style declaration, overwriting former " << sty->name() << endl;
1421
ASSERT( followingStyles.count() == m_styleList.count() );
1604
Q_ASSERT( followingStyles.count() == m_styleColl->styleList().count() );
1423
1606
unsigned int i=0;
1424
1607
for( QValueList<QString>::Iterator it = followingStyles.begin(); it != followingStyles.end(); ++it ) {
1425
KWStyle * style = findStyle(*it);
1426
m_styleList.at(i++)->setFollowingStyle( style );
1431
KWStyle* KWDocument::addStyleTemplate( KWStyle * sty )
1433
// First check for duplicates.
1434
for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next() )
1436
if ( p->name() == sty->name() ) {
1437
// Replace existing style
1446
m_styleList.append( sty );
1450
void KWDocument::removeStyleTemplate ( KWStyle *style ) {
1451
if( m_styleList.removeRef(style)) {
1452
// Remember to delete this style when deleting the document
1453
m_deletedStyles.append(style);
1457
void KWDocument::moveDownStyleTemplate ( const QString & _styleName )
1459
unsigned int pos = 0;
1460
for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next(), ++pos )
1462
if ( p->name() == _styleName )
1464
KWStyle * next = m_styleList.at(pos+1);
1466
// We have "p" "next" and we want "next" "p"
1467
m_styleList.insert( pos, next ); // "next", "p", "next"
1468
m_styleList.take( pos+2 ); // Remove last "next"
1474
void KWDocument::moveUpStyleTemplate ( const QString & _styleName )
1476
unsigned int pos = 0;
1477
for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next(), ++pos )
1479
if ( p->name() == _styleName )
1481
// We have "prev" "p" and we want "p" "prev"
1482
m_styleList.insert( pos-1, p ); // "p" "prev" "p"
1483
m_styleList.take( pos+1 ); // Remove last "p"
1608
KWStyle * style = m_styleColl->findStyle(*it);
1609
m_styleColl->styleAt(i++)->setFollowingStyle( style );
1614
void KWDocument::loadFrameStyleTemplates( const QDomElement &stylesElem )
1616
QDomNodeList listStyles = stylesElem.elementsByTagName( "FRAMESTYLE" );
1617
if( listStyles.count() > 0) { // we are going to import at least one style.
1618
KWFrameStyle *s = m_frameStyleColl->findFrameStyle("Plain");
1619
if(s) // delete the standard style.
1620
m_frameStyleColl->removeFrameStyleTemplate(s);
1622
for (unsigned int item = 0; item < listStyles.count(); item++) {
1623
QDomElement styleElem = listStyles.item( item ).toElement();
1625
KWFrameStyle *sty = new KWFrameStyle( styleElem );
1626
m_frameStyleColl->addFrameStyleTemplate( sty );
1630
void KWDocument::loadDefaultFrameStyleTemplates()
1634
if ( ! QFile::exists(locate("appdata", "framestyles.xml")) )
1636
if (!m_frameStyleColl->findFrameStyle("Plain")) {
1637
KWFrameStyle * standardFrameStyle = new KWFrameStyle( "Plain" );
1638
standardFrameStyle->setBackgroundColor(QColor("white"));
1639
standardFrameStyle->setTopBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
1640
standardFrameStyle->setRightBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
1641
standardFrameStyle->setLeftBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
1642
standardFrameStyle->setBottomBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
1643
m_frameStyleColl->addFrameStyleTemplate( standardFrameStyle );
1648
fsfile.setPath( locate("appdata", "framestyles.xml") );
1650
// Open file and parse it
1651
QFile in( fsfile.path() );
1652
if ( !in.open( IO_ReadOnly ) )
1654
//i18n( "Couldn't open the file for reading (check read permissions)" );
1662
if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
1666
kdError (30003) << "Parsing Error! Aborting! (in KWDocument::loadDefaultFrameStyleTemplates())" << endl
1667
<< " Line: " << errorLine << " Column: " << errorColumn << endl
1668
<< " Message: " << errorMsg << endl;
1672
// Start adding framestyles
1673
QDomElement stylesElem = doc.documentElement();
1675
QDomNodeList listStyles = stylesElem.elementsByTagName( "FRAMESTYLE" );
1676
if( listStyles.count() > 0) { // we are going to import at least one style.
1677
KWFrameStyle *s = m_frameStyleColl->findFrameStyle("Plain");
1678
if(s) // delete the standard style.
1679
m_frameStyleColl->removeFrameStyleTemplate(s);
1681
for (unsigned int item = 0; item < listStyles.count(); item++) {
1682
QDomElement styleElem = listStyles.item( item ).toElement();
1684
KWFrameStyle *sty = new KWFrameStyle( styleElem );
1685
m_frameStyleColl->addFrameStyleTemplate( sty );
1689
void KWDocument::loadTableStyleTemplates( const QDomElement& stylesElem )
1691
QDomNodeList listStyles = stylesElem.elementsByTagName( "TABLESTYLE" );
1692
if( listStyles.count() > 0) { // we are going to import at least one style.
1693
KWTableStyle *s = m_tableStyleColl->findTableStyle("Plain");
1694
if(s) // delete the standard style.
1695
m_tableStyleColl->removeTableStyleTemplate(s);
1697
for (unsigned int item = 0; item < listStyles.count(); item++) {
1698
QDomElement styleElem = listStyles.item( item ).toElement();
1700
KWTableStyle *sty = new KWTableStyle( styleElem, this );
1701
m_tableStyleColl->addTableStyleTemplate( sty );
1705
void KWDocument::loadDefaultTableStyleTemplates()
1709
if ( ! QFile::exists(locate("appdata", "tablestyles.xml")) )
1711
if (!m_tableStyleColl->findTableStyle("Plain")) {
1712
m_tableStyleColl->addTableStyleTemplate( new KWTableStyle( "Plain", m_styleColl->styleAt(0), m_frameStyleColl->frameStyleAt(0) ) );
1717
fsfile.setPath( locate("appdata", "tablestyles.xml") );
1719
// Open file and parse it
1720
QFile in( fsfile.path() );
1721
if ( !in.open( IO_ReadOnly ) )
1723
//i18n( "Couldn't open the file for reading (check read permissions)" );
1731
if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
1735
kdError (30003) << "Parsing Error! Aborting! (in KWDocument::loadDefaultTableStyleTemplates())" << endl
1736
<< " Line: " << errorLine << " Column: " << errorColumn << endl
1737
<< " Message: " << errorMsg << endl;
1741
// Start adding tablestyles
1742
QDomElement stylesElem = doc.documentElement();
1744
QDomNodeList listStyles = stylesElem.elementsByTagName( "TABLESTYLE" );
1745
if( listStyles.count() > 0) { // we are going to import at least one style.
1746
KWTableStyle *s = m_tableStyleColl->findTableStyle("Plain");
1747
if(s) // delete the standard style.
1748
m_tableStyleColl->removeTableStyleTemplate(s);
1750
for (unsigned int item = 0; item < listStyles.count(); item++) {
1751
QDomElement styleElem = listStyles.item( item ).toElement();
1753
KWTableStyle *sty = new KWTableStyle( styleElem, this );
1754
m_tableStyleColl->addTableStyleTemplate( sty );
1758
void KWDocument::loadDefaultTableTemplates()
1762
if ( ! QFile::exists(locate("appdata", "tabletemplates.xml")) )
1764
if (!m_tableTemplateColl->findTableTemplate("Plain")) {
1765
KWTableTemplate * standardTableTemplate = new KWTableTemplate( "Plain" );
1766
standardTableTemplate->setFirstRow(tableStyleCollection()->findTableStyle("Plain"));
1767
standardTableTemplate->setLastRow(tableStyleCollection()->findTableStyle("Plain"));
1768
standardTableTemplate->setFirstCol(tableStyleCollection()->findTableStyle("Plain"));
1769
standardTableTemplate->setLastCol(tableStyleCollection()->findTableStyle("Plain"));
1770
standardTableTemplate->setBodyCell(tableStyleCollection()->findTableStyle("Plain"));
1771
standardTableTemplate->setTopLeftCorner(tableStyleCollection()->findTableStyle("Plain"));
1772
standardTableTemplate->setTopRightCorner(tableStyleCollection()->findTableStyle("Plain"));
1773
standardTableTemplate->setBottomLeftCorner(tableStyleCollection()->findTableStyle("Plain"));
1774
standardTableTemplate->setBottomRightCorner(tableStyleCollection()->findTableStyle("Plain"));
1775
m_tableTemplateColl->addTableTemplate( standardTableTemplate );
1780
fsfile.setPath( locate("appdata", "tabletemplates.xml") );
1782
// Open file and parse it
1783
QFile in( fsfile.path() );
1784
if ( !in.open( IO_ReadOnly ) )
1786
//i18n( "Couldn't open the file for reading (check read permissions)" );
1794
if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
1798
kdError (30003) << "Parsing Error! Aborting! (in KWDocument::readTableTemplates())" << endl
1799
<< " Line: " << errorLine << " Column: " << errorColumn << endl
1800
<< " Message: " << errorMsg << endl;
1804
// Start adding framestyles
1805
QDomElement templatesElem = doc.documentElement();
1807
QDomNodeList listTemplates = templatesElem.elementsByTagName( "TABLETEMPLATE" );
1808
if( listTemplates.count() > 0) {
1809
KWTableTemplate *s = m_tableTemplateColl->findTableTemplate("Plain");
1811
m_tableTemplateColl->removeTableTemplate(s);
1813
for (unsigned int item = 0; item < listTemplates.count(); item++) {
1814
QDomElement templateElem = listTemplates.item( item ).toElement();
1816
KWTableTemplate *temp = new KWTableTemplate( templateElem, this );
1817
m_tableTemplateColl->addTableTemplate( temp );
1489
1821
void KWDocument::progressItemLoaded()
1823
if ( !m_nrItemsToLoad ) // happens when pasting
1491
1825
m_itemsLoaded++;
1492
1826
// We progress from 20 to 85 -> 65-wide range, 20 offset.
1493
1827
unsigned int perc = 65 * m_itemsLoaded / m_nrItemsToLoad;
1784
processImageRequests();
2226
refreshDocStructure(ref);
2229
void KWDocument::completePasting()
2231
processPictureRequests();
1785
2232
processAnchorRequests();
2233
if ( processFootNoteRequests() )
2235
// We pasted footnotes. Relayout frames.
1787
2239
// Finalize afterwards - especially in case of inline frames, made them inline in processAnchorRequests
1788
for ( QListIterator<KWFrameSet> fit( frameSetsToFinalize ); fit.current(); ++fit )
2240
//for ( QPtrListIterator<KWFrameSet> fit( frameSetsToFinalize ); fit.current(); ++fit )
2242
// Do it on all of them (we'd need to store frameSetsToFinalize as member var if this is really slow)
2243
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2244
for ( ; fit.current() ; ++fit )
1789
2245
fit.current()->finalize();
1791
2246
repaintAllViews();
1792
refreshDocStructure(ref);
1793
2247
delete m_pasteFramesetsMap;
1794
2248
m_pasteFramesetsMap = 0L;
2251
void KWDocument::insertEmbedded( KoStore *store, QDomElement topElem, KMacroCommand * macroCmd, double offset )
2253
if ( !m_pasteFramesetsMap ) // may have been created by pasteFrames
2254
m_pasteFramesetsMap = new QMap<QString, QString>();
2256
QDomElement elem = topElem.firstChild().toElement();
2257
for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
2259
if ( elem.tagName() == "EMBEDDED" )
2261
kdDebug()<<"KWDocument::insertEmbedded() Embedded object"<<endl;
2262
QDomElement object = elem.namedItem( "OBJECT" ).toElement();
2263
QDomElement settings = elem.namedItem( "SETTINGS" ).toElement();
2264
if ( object.isNull() || settings.isNull() )
2266
kdError() << "No <OBJECT> or <SETTINGS> tag" << endl;
2270
KWChild *ch = new KWChild( this );
2271
kdDebug()<<"KWDocument::insertEmbedded() loading document"<<endl;
2272
if ( ch->load( object, true ) )
2274
ch->loadDocument( store );
2276
QString oldName = settings.attribute( "name" );
2277
QString newName = uniqueFramesetName( oldName );
2278
m_pasteFramesetsMap->insert( oldName, newName ); // remember the name transformation
2279
KWPartFrameSet *part = new KWPartFrameSet( this, ch, newName );
2280
m_lstFrameSet.append( part );
2281
kdDebug() << "KWDocument::insertEmbedded loading embedded object" << endl;
2282
part->load( settings );
2283
if ( offset != 0 ) {
2284
QRect r = ch->geometry();
2285
r.moveBy( (int)offset, (int)offset );
2286
ch->setGeometry( r );
2291
QPtrListIterator<KWFrame> frameIt( part->frameIterator() );
2292
for ( ; frameIt.current(); ++frameIt )
2294
macroCmd->addCommand( new KWCreateFrameCommand( QString::null, frameIt.current() ) );
2301
refreshDocStructure( (int)Embedded );
1797
2304
QDomDocument KWDocument::saveXML()
1799
QDomDocument doc( "DOC" );
1800
doc.appendChild( doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
1801
QDomElement kwdoc = doc.createElement( "DOC" );
2306
m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime());
2307
recalcVariables( VT_DATE );
2308
recalcVariables( VT_TIME ); // for "current time"
2309
QDomDocument doc = createDomDocument( "DOC", CURRENT_DTD_VERSION );
2310
QDomElement kwdoc = doc.documentElement();
1802
2311
kwdoc.setAttribute( "editor", "KWord" );
1803
2312
kwdoc.setAttribute( "mime", "application/x-kword" );
1804
2313
m_syntaxVersion = CURRENT_SYNTAX_VERSION;
1805
2314
kwdoc.setAttribute( "syntaxVersion", m_syntaxVersion );
1806
doc.appendChild( kwdoc );
1808
2316
QDomElement paper = doc.createElement( "PAPER" );
1809
2317
kwdoc.appendChild( paper );
1810
2318
paper.setAttribute( "format", static_cast<int>( m_pageLayout.format ) );
2319
paper.setAttribute( "pages", m_pages );
1811
2320
paper.setAttribute( "width", m_pageLayout.ptWidth );
1812
2321
paper.setAttribute( "height", m_pageLayout.ptHeight );
1813
2322
paper.setAttribute( "orientation", static_cast<int>( m_pageLayout.orientation ) );
1907
out << otag << "<SERIALL>" << endl;
1908
slDataBase->save( out );
1909
out << etag << "</SERIALL>" << endl; */
1911
// Write "OBJECT" tag for every child
1912
QListIterator<KoDocumentChild> chl( children() );
2493
QDomElement mailMerge=m_slDataBase->save(doc);
2494
kwdoc.appendChild(mailMerge);
2496
if( !m_spellListIgnoreAll.isEmpty() )
2498
QDomElement spellCheckIgnore = doc.createElement( "SPELLCHECKIGNORELIST" );
2499
kwdoc.appendChild( spellCheckIgnore );
2500
for ( QStringList::Iterator it = m_spellListIgnoreAll.begin(); it != m_spellListIgnoreAll.end(); ++it )
2502
QDomElement spellElem = doc.createElement( "SPELLCHECKIGNOREWORD" );
2503
spellCheckIgnore.appendChild( spellElem );
2504
spellElem.setAttribute( "word", *it );
2508
// Save embedded objects
2509
saveEmbeddedObjects( kwdoc, children() );
2513
void KWDocument::saveEmbeddedObjects( QDomElement& parentElem, const QPtrList<KoDocumentChild>& childList )
2515
// Write "OBJECT" tag for every child, appending "EMBEDDING" tags to the main XML
2516
QPtrListIterator<KoDocumentChild> chl( childList );
2517
QDomDocument doc = parentElem.ownerDocument();
1913
2518
for( ; chl.current(); ++chl ) {
1914
QDomElement embeddedElem = doc.createElement( "EMBEDDED" );
1915
kwdoc.appendChild( embeddedElem );
1917
2519
KWChild* curr = static_cast<KWChild*>(chl.current());
1919
QDomElement objectElem = curr->save( doc, true );
1920
embeddedElem.appendChild( objectElem );
1922
QDomElement settingsElem = doc.createElement( "SETTINGS" );
1923
embeddedElem.appendChild( settingsElem );
1925
QListIterator<KWFrameSet> fit = framesetsIterator();
1926
for ( ; fit.current() ; ++fit )
2520
if ( !curr->isDeleted() )
1928
KWFrameSet * fs = fit.current();
1929
if ( fs->type() == FT_PART &&
1930
dynamic_cast<KWPartFrameSet*>( fs )->getChild() == curr )
1931
fs->save( settingsElem );
2522
QDomElement embeddedElem = doc.createElement( "EMBEDDED" );
2523
parentElem.appendChild( embeddedElem );
2525
QDomElement objectElem = curr->save( doc, true );
2526
embeddedElem.appendChild( objectElem );
2528
QDomElement settingsElem = doc.createElement( "SETTINGS" );
2529
embeddedElem.appendChild( settingsElem );
2531
curr->partFrameSet()->save( settingsElem );
2536
void KWDocument::saveStyle( KWStyle *sty, QDomElement parentElem )
2538
QDomDocument doc = parentElem.ownerDocument();
2539
QDomElement styleElem = doc.createElement( "STYLE" );
2540
parentElem.appendChild( styleElem );
2542
sty->saveStyle( styleElem );
2544
QDomElement formatElem = KWTextParag::saveFormat( doc, &sty->format(), 0L, 0, 0 );
2545
styleElem.appendChild( formatElem );
2548
void KWDocument::saveFrameStyle( KWFrameStyle *sty, QDomElement parentElem )
2550
QDomDocument doc = parentElem.ownerDocument();
2551
QDomElement frameStyleElem = doc.createElement( "FRAMESTYLE" );
2552
parentElem.appendChild( frameStyleElem );
2554
sty->saveFrameStyle( frameStyleElem );
2557
void KWDocument::saveTableStyle( KWTableStyle *sty, QDomElement parentElem )
2559
QDomDocument doc = parentElem.ownerDocument();
2560
QDomElement tableStyleElem = doc.createElement( "TABLESTYLE" );
2561
parentElem.appendChild( tableStyleElem );
2563
sty->saveTableStyle( tableStyleElem );
1938
2566
bool KWDocument::completeSaving( KoStore *_store )
2161
2802
viewPtr->updateStyleList();
2164
void KWDocument::applyStyleChange( KWStyle * changedStyle, int paragLayoutChanged, int formatChanged )
2166
QList<KWTextFrameSet> textFramesets;
2167
QListIterator<KWFrameSet> fit = framesetsIterator();
2168
for ( ; fit.current() ; ++fit ) {
2169
fit.current()->addTextFramesets(textFramesets);
2805
void KWDocument::updateStyleListOrder( const QStringList &list )
2807
styleCollection()->updateStyleListOrder( list );
2810
void KWDocument::applyStyleChange( StyleChangeDefMap changed )
2812
QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
2172
2814
KWTextFrameSet *frm;
2173
2815
for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
2174
frm->applyStyleChange( changedStyle, paragLayoutChanged, formatChanged );
2816
frm->applyStyleChange( changed );
2820
void KWDocument::updateAllFrameStyleLists()
2822
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
2823
viewPtr->updateFrameStyleList();
2826
void KWDocument::updateAllTableStyleLists()
2828
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
2829
viewPtr->updateTableStyleList();
2178
2832
void KWDocument::repaintAllViews( bool erase )
2180
//kdDebug() << "KWDocument::repaintAllViews" << endl;
2834
//kdDebug(32001) << "KWDocument::repaintAllViews" << endl;
2181
2835
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
2182
2836
viewPtr->getGUI()->canvasWidget()->repaintAll( erase );
2185
void KWDocument::appendPage( /*unsigned int _page*/ )
2839
QPtrList<KWFrame> KWDocument::framesToCopyOnNewPage( int afterPageNum ) const // can be -1 for 'before page 0'
2187
int thisPageNum = m_pages-1;
2189
kdDebug(32002) << "KWDocument::appendPage m_pages=" << m_pages << " so thisPageNum=" << thisPageNum << endl;
2193
QListIterator<KWFrameSet> fit = framesetsIterator();
2194
for ( ; fit.current() ; ++fit )
2196
KWFrameSet * frameSet = fit.current();
2841
// Look at frames on pages afterPageNum and afterPageNum-1 (for sheetside stuff)
2842
QPtrList<KWFrame> framesToLookAt;
2843
if ( afterPageNum >= 0 )
2844
framesToLookAt = framesInPage( afterPageNum, false );
2846
if ( afterPageNum >= 1 )
2848
QPtrList<KWFrame> framesToAlsoLookAt = framesInPage( afterPageNum-1, false ); // order doesn't matter
2850
// Merge into single list. Other alternative, two loops, code inside moved to another method.
2851
QPtrListIterator<KWFrame> frameAlsoIt( framesToAlsoLookAt );
2852
for ( ; frameAlsoIt.current(); ++frameAlsoIt )
2853
framesToLookAt.append( frameAlsoIt.current() );
2856
QPtrList<KWFrame> framesToCopy; // the result
2858
QPtrListIterator<KWFrame> frameIt( framesToLookAt );
2859
for ( ; frameIt.current(); ++frameIt )
2861
KWFrame * frame = frameIt.current();
2862
KWFrameSet* frameSet = frame->frameSet();
2197
2864
// don't add tables! A table cell ( frameset ) _must_ not have cells auto-added to them!
2198
2865
if ( frameSet->type() == FT_TABLE ) continue;
2867
/* copy the frame if: - it is on this page or
2868
- it is on the former page and the frame is set to double sided.
2869
- AND the frame is set to be reconnected or copied
2200
2871
#ifdef DEBUG_PAGES
2201
kdDebug(32002) << "KWDocument::appendPage looking at frameset " << frameSet->getName() << endl;
2872
kdDebug(32002) << "KWDocument::framesToCopyOnNewPage looking at frame " << frame << ", pageNum=" << frame->pageNum() << " from " << frameSet->getName() << endl;
2873
static const char * newFrameBh[] = { "Reconnect", "NoFollowup", "Copy" };
2874
kdDebug(32002) << " frame->newFrameBehavior()==" << newFrameBh[frame->newFrameBehavior()] << endl;
2203
// KWFrameSet::addFrame triggers a reshuffle in the frames list (KWTextFrameSet::updateFrames)
2204
// which destroys the iterators -> append the new frames at the end.
2205
QList<KWFrame> newFrames;
2207
QListIterator<KWFrame> frameIt( frameSet->frameIterator() );
2208
for ( ; frameIt.current(); ++frameIt )
2876
if ( (frame->pageNum() == afterPageNum ||
2877
(frame->pageNum() == afterPageNum -1 && frame->sheetSide() != KWFrame::AnySide) )
2879
( ( frame->newFrameBehavior()==KWFrame::Reconnect && frameSet->type() == FT_TEXT ) || // (*)
2880
( frame->newFrameBehavior()==KWFrame::Copy && !frameSet->isAHeader() && !frameSet->isAFooter() ) ) // (**)
2210
KWFrame * frame = frameIt.current();
2211
/* copy the frame if: - it is on this page or
2212
- it is on the former page and the frame is set to double sided.
2213
- AND the frame is set to be reconnected or copied
2216
kdDebug(32002) << " frame=" << frame << " frame->pageNum()=" << frame->pageNum() << endl;
2217
static const char * newFrameBh[] = { "Reconnect", "NoFollowup", "Copy" };
2218
kdDebug(32002) << " frame->getNewFrameBehaviour()==" << newFrameBh[frame->getNewFrameBehaviour()] << endl;
2220
if ( (frame->pageNum() == thisPageNum ||
2221
(frame->pageNum() == thisPageNum -1 && frame->getSheetSide() != KWFrame::AnySide) )
2223
( ( frame->getNewFrameBehaviour()==KWFrame::Reconnect && frameSet->type() == FT_TEXT ) || // (*)
2224
( frame->getNewFrameBehaviour()==KWFrame::Copy && !frameSet->isAHeader() && !frameSet->isAFooter() ) ) // (**)
2227
// (*) : Reconnect only makes sense for text frames
2228
// (**) : NewFrameBehaviour == Copy is handled here except for headers/footers, which
2229
// are created in recalcFrames() anyway.
2231
KWFrame *frm = frame->getCopy();
2232
frm->moveBy( 0, ptPaperHeight() );
2233
//frm->setPageNum( frame->pageNum()+1 );
2234
newFrames.append( frm );
2236
if ( frame->getNewFrameBehaviour()==KWFrame::Copy )
2237
frm->setCopy( true );
2238
//kdDebug(32002) << " => created frame " << frm << endl;
2883
// (*) : Reconnect only makes sense for text frames
2884
// (**) : NewFrameBehavior == Copy is handled here except for headers/footers, which
2885
// are created in recalcFrames() anyway.
2886
framesToCopy.append( frame );
2241
QListIterator<KWFrame> newFrameIt( newFrames );
2242
for ( ; newFrameIt.current() ; ++newFrameIt )
2243
frameSet->addFrame( newFrameIt.current() );
2889
return framesToCopy;
2892
void KWDocument::insertPage( int afterPageNum ) // can be -1 for 'before page 0'
2895
kdDebug(32002) << "insertPage: afterPageNum=" << afterPageNum << endl;
2897
if ( processingType() == WP )
2898
Q_ASSERT( afterPageNum == m_pages-1 ); // WP mode: can only append.
2900
// If not appending, move down everything after 'afterPageNum', to make room.
2901
for ( int pg = m_pages-1 ; pg > afterPageNum ; --pg )
2903
// pg is the 'src' page. Its contents must be moved to the page pg+1
2904
QPtrList<KWFrame> frames = framesInPage( pg, false );
2906
kdDebug(32002) << "insertPage: moving " << frames.count() << " frames down, from page " << pg << endl;
2908
QPtrListIterator<KWFrame> frameIt( frames );
2909
for ( ; frameIt.current(); ++frameIt )
2910
frameIt.current()->moveBy( 0, ptPaperHeight() );
2915
// Fill in the new page
2916
QPtrList<KWFrame> framesToCopy = framesToCopyOnNewPage( afterPageNum );
2917
QPtrListIterator<KWFrame> frameIt( framesToCopy );
2918
for ( ; frameIt.current(); ++frameIt )
2920
KWFrame * frame = frameIt.current();
2922
KWFrame *newFrame = frame->getCopy();
2923
newFrame->moveBy( 0, ptPaperHeight() );
2924
//newFrame->setPageNum( frame->pageNum()+1 );
2925
frame->frameSet()->addFrame( newFrame );
2927
if ( frame->newFrameBehavior()==KWFrame::Copy )
2928
newFrame->setCopy( true );
2929
//kdDebug(32002) << " => created frame " << newFrame << " " << *newFrame << endl;
2933
int KWDocument::appendPage()
2936
kdDebug(32002) << "KWDocument::appendPage m_pages=" << m_pages << " -> insertPage(" << m_pages-1 << ")" << endl;
2938
insertPage( m_pages - 1 );
2939
return m_pages - 1; // Note that insertPage changes m_pages!
2942
void KWDocument::afterAppendPage( int pageNum )
2945
kdDebug(32002) << "KWDocument::afterAppendPage " << pageNum << endl;
2245
2947
emit newContentsSize();
2247
if ( isHeaderVisible() || isFooterVisible() )
2248
recalcFrames(); // Get headers and footers on the new page
2249
// setModified(TRUE); This is called by formatMore, possibly on loading -> don't set modified
2949
if ( isHeaderVisible() || isFooterVisible() || m_bHasEndNotes )
2952
kdDebug(32002) << "KWDocument::afterAppendPage calling recalcFrames" << endl;
2954
// Get headers and footers on the new page
2955
// This shouldn't delete the newly created page because it's still empty though
2956
recalcFrames( pageNum, -1, KWFrameLayout::DontRemovePages );
2958
kdDebug(32002) << "KWDocument::afterAppendPage recalcFrames done" << endl;
2963
// Take into account the frames on the new page, and run updateFramesOnTopOrBelow (#73819)
2251
2967
recalcVariables( VT_PGNUM );
2252
2968
emit pageNumChanged();
2272
void KWDocument::removePage( int num )
2988
void KWDocument::removePage( int pageNum )
2990
if ( processingType() == WP )
2991
Q_ASSERT( pageNum == m_pages-1 ); // WP mode: can only remove last page.
2992
Q_ASSERT( m_pages > 1 );
2996
// ## This assumes that framesInPage is up-to-date.
2997
QPtrList<KWFrame> framesToDelete = framesInPage( pageNum, false );
2274
2998
#ifdef DEBUG_PAGES
2275
kdDebug() << "KWDocument::removePage " << num << endl;
2999
kdDebug(32002) << "KWDocument::removePage " << pageNum << ", " << framesToDelete.count() << " frames to delete" << endl;
2277
QListIterator<KWFrameSet> fit = framesetsIterator();
2278
for ( ; fit.current() ; ++fit )
3001
QPtrListIterator<KWFrame> frameIt( framesToDelete );
3002
for ( ; frameIt.current(); ++frameIt )
2280
KWFrameSet * frameSet = fit.current();
3004
KWFrame * frame = frameIt.current();
3005
KWFrameSet * frameSet = frame->frameSet();
2281
3006
if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY )
2283
QListIterator<KWFrame> frameIt( frameSet->frameIterator() );
2284
QList<KWFrame> toDelete;
2285
for ( ; frameIt.current(); ++frameIt )
2287
KWFrame * frm = frameIt.current();
2288
if ( frm->pageNum() == num )
3008
frameSet->delFrame( frame, true );
3011
// If not removing the last one, move up everything after the one we removed.
3012
for ( int pg = pageNum+1 ; pg < m_pages ; ++pg )
3014
// pg is the 'src' page. Its contents must be moved to the page pg-1
3015
QPtrList<KWFrame> frames = framesInPage( pg, false );
2290
3016
#ifdef DEBUG_PAGES
2291
kdDebug() << "KWDocument::removePage deleting frame " << frm << " (from frameset " << frameSet->getName() << ")" << endl;
3017
kdDebug(32002) << "removePage: moving " << frames.count() << " frames up, from page " << pg << endl;
2293
toDelete.append( frm ); // Can't remove the frame here, it screws up the iterator -> toDelete
2296
QListIterator<KWFrame> delIt( toDelete );
2297
for ( ; delIt.current(); ++delIt )
2298
frameSet->delFrame( delIt.current(), true );
3019
QPtrListIterator<KWFrame> frameIt( frames );
3020
for ( ; frameIt.current(); ++frameIt )
3021
frameIt.current()->moveBy( 0, -ptPaperHeight() );
2301
3025
#ifdef DEBUG_PAGES
2302
kdDebug() << "KWDocument::removePage -- -> " << m_pages << endl;
3026
kdDebug(32002) << "KWDocument::removePage -- -> " << m_pages << endl;
3028
// Emitting this one for each page being removed helps giving the user some feedback
2304
3029
emit pageNumChanged();
3032
void KWDocument::afterRemovePages()
3034
//### IMHO recalcFrames should take care of updateAllFrames (it already does it partially).
3036
// Do this before recalcVariables (which repaints). The removed frames must be removed from the frame caches.
3037
// We don't call updateAllFrames() directly, because it still calls
3038
// updateFramesOnTopOrBelow, which is useless (and slow) here.
3039
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
3040
for ( ; fit.current() ; ++fit )
3041
fit.current()->updateFrames();
2305
3043
recalcVariables( VT_PGNUM );
2307
3044
emit newContentsSize();
2310
KWFrameSet * KWDocument::getFrameSetByName( const QString & name )
3047
void KWDocument::tryRemovingPages()
3049
int lastPage = numPages() - 1;
3050
bool removed = false;
3051
// Last frame is empty -> try removing last page, and more if necessary
3052
while ( lastPage > 0 && canRemovePage( lastPage ) )
3054
removePage( lastPage ); // this modifies m_pages
3055
if ( lastPage <= m_pages - 1 )
3057
kdWarning() << "Didn't manage to remove page " << lastPage << " (still having " << m_pages << " pages ). Aborting" << endl;
3061
lastPage = m_pages - 1;
3063
// Do all the recalc in one go. Speeds up deleting many pages.
3069
KWFrameSet * KWDocument::frameSetByName( const QString & name )
2312
3071
// Note: this isn't recursive, so it won't find table cells.
2313
QListIterator<KWFrameSet> fit = framesetsIterator();
3072
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2314
3073
for ( ; fit.current() ; ++fit )
2315
3074
if ( fit.current()->getName() == name )
2316
3075
return fit.current();
2320
KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border )
3079
//#define DEBUG_FRAMESELECT
3082
KWFrame * KWDocument::deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool *border) {
3083
#ifdef DEBUG_FRAMESELECT
3084
kdDebug(32001) << "KWDocument::deepestInlineFrame parent=" << parent << " nPoint=" << nPoint << endl;
3086
KWFrameSet *hostFrameSet=parent->frameSet();
3087
KoPoint docPoint( unzoomPoint( nPoint ) );
3088
int page = QMIN(m_pages-1, static_cast<int>(docPoint.y() / ptPaperHeight()));
3089
QPtrList<KWFrame> frames = framesInPage(page);
3091
for (KWFrame *f = frames.last();f;f=frames.prev()) { // z-order
3092
// only consider inline frames.
3093
if (! f->frameSet()->isFloating())
3096
// only use the frames that are embedded in the parent
3097
if (hostFrameSet != f->frameSet()->anchorFrameset())
3100
if(f->frameAtPos(nPoint, true)) {
3101
if ( border ) *border = true;
3104
if(f->frameAtPos(nPoint)) {
3105
return deepestInlineFrame(f,nPoint,border);
3108
if (border != 0) *border=false;
3112
KWFrame * KWDocument::frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool *border) {
3114
#ifdef DEBUG_FRAMESELECT
3115
kdDebug(32001) << "KWDocument::frameBelowFrame frame=" << frame << " nPoint=" << nPoint << endl;
3118
KWFrameSet *fs = frame->frameSet();
3119
KoPoint docPoint( unzoomPoint( nPoint ) );
3120
if (fs->isFloating()) {
3121
// now lets be smart here; we know that a frame that is floating is embedded
3122
// inside its hostFrameSet frame. This basically means that the frame directly
3123
// below is the hostFrameSet frame :)
3124
// since we know nPoint is already in frame, we don't have to check for anchorFrame here.
3125
KWFrameSet *hostFrameSet = fs->anchorFrameset();
3126
KWFrame *f = hostFrameSet->frameByBorder(nPoint);
3128
if (border) *border=true;
3131
f = hostFrameSet->frameAtPos(docPoint.x(),docPoint.y());
3133
if (border) *border=false;
3137
QPtrList<KWFrame> frames = frame->framesBelow();
3138
for (KWFrame *f = frames.last(); f;f=frames.prev()) {
3139
if (f->frameAtPos(nPoint,true)) {
3140
if(border) *border=true;
3143
if (f->frameAtPos(nPoint)) {
3144
return deepestInlineFrame(f,nPoint,border);
3148
if (border != 0) *border=false;
3152
KWFrame * KWDocument::topFrameUnderMouse( const QPoint& nPoint, bool* border) {
3153
#ifdef DEBUG_FRAMESELECT
3154
kdDebug(32001) << "KWDocument::topFrameUnderMouse nPoint=" << nPoint << endl;
3156
KoPoint docPoint( unzoomPoint( nPoint ) );
3157
int page = QMIN(m_pages-1, static_cast<int>(docPoint.y() / ptPaperHeight()));
3158
QPtrList<KWFrame> frames = framesInPage(page);
3161
for (KWFrame *f = frames.last();f;f=frames.prev()) { // z-order
3162
// only consider non-inline frames.
3163
if (f->frameSet()->isFloating())
3166
if(f->frameAtPos(nPoint, true)) {
3167
#ifdef DEBUG_FRAMESELECT
3168
kdDebug(32001) << "KWDocument::topFrameUnderMouse found frame " << f << " by border" << endl;
3170
if ( border ) *border = true;
3173
if(f->frameAtPos(nPoint)) {
3174
#ifdef DEBUG_FRAMESELECT
3175
kdDebug(32001) << "KWDocument::topFrameUnderMouse found frame " << f << ", will dig into it." << endl;
3177
return deepestInlineFrame(f,nPoint,border);
3180
if (border != 0) *border=false;
3185
KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border, bool firstNonSelected )
2322
KoPoint docPoint( unzoomPoint( nPoint ) );
2323
QListIterator<KWFrameSet> fit = framesetsIterator();
2324
for ( fit.toLast(); fit.current() ; --fit ) // z-order
3187
if ( !m_viewMode->hasFrames() )
2326
KWFrameSet *frameSet = fit.current();
2327
if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
2329
KWFrame * frame = frameSet->frameByBorder( nPoint );
2332
if ( border ) *border = true;
2335
frame = frameSet->frameAtPos( docPoint.x(), docPoint.y() );
2336
//kdDebug() << "KWDocument::frameAtPos found frameset " << frameSet
2337
// << " at position " << docPoint.x() << "," << docPoint.y() << endl;
2340
if ( border ) *border = false;
3189
KWViewModeText* vmt = dynamic_cast<KWViewModeText *>( m_viewMode );
3190
return vmt ? vmt->textFrameSet()->frame(0) : 0L;
3192
#ifdef DEBUG_FRAMESELECT
3193
kdDebug(32001) << "KWDocument::frameUnderMouse nPoint=" << nPoint << " firstNonSelected=" << firstNonSelected << endl;
3195
KWFrame *candidate = topFrameUnderMouse(nPoint, border);
3196
if (!firstNonSelected)
3198
KWFrame *goDeeper=candidate;
3199
bool foundselected=false;
3201
while (goDeeper && goDeeper->isSelected())
3203
goDeeper=frameBelowFrame(nPoint, goDeeper, border);
3206
if (foundselected) {
3212
goDeeper=frameBelowFrame(nPoint, goDeeper, border);
3218
MouseMeaning KWDocument::getMouseMeaning( const QPoint &nPoint, int keyState, KWFrame** pFrame )
3222
if (m_viewMode->hasFrames() &&
3223
positionToSelectRowcolTable(nPoint) != TABLE_POSITION_NONE)
3224
return MEANING_MOUSE_SELECT;
3227
KWFrame *frameundermouse = frameUnderMouse(nPoint, &border);
3228
if (frameundermouse) {
3229
KWFrameSet *frameSet = frameundermouse->frameSet();
3231
*pFrame = frameundermouse;
3232
if ( m_viewMode->hasFrames() )
3233
return frameSet->getMouseMeaning(nPoint, keyState);
3234
else // text view mode
3235
return MEANING_MOUSE_INSIDE_TEXT;
3237
return MEANING_NONE;
3240
QCursor KWDocument::getMouseCursor( const QPoint &nPoint, int keyState )
3242
KWFrame* frame = 0L;
3243
MouseMeaning meaning = getMouseMeaning( nPoint, keyState, &frame );
3244
KWFrameSet* frameSet = frame ? frame->frameSet() : 0L;
3245
switch ( meaning ) {
3247
return Qt::ibeamCursor; // default cursor in margins
3248
case MEANING_MOUSE_INSIDE:
3249
return QCursor(); // default cursor !?!?
3250
case MEANING_MOUSE_INSIDE_TEXT:
3251
return Qt::ibeamCursor;
3252
case MEANING_MOUSE_MOVE:
3253
return Qt::sizeAllCursor;
3254
case MEANING_MOUSE_SELECT:
3255
return KCursor::handCursor();
3256
case MEANING_ACTIVATE_PART:
3257
return KCursor::handCursor();
3258
case MEANING_TOPLEFT:
3259
case MEANING_BOTTOMRIGHT:
3260
if ( frameSet->isProtectSize() )
3261
return Qt::forbiddenCursor;
3262
return Qt::sizeFDiagCursor;
3265
if ( frameSet->isProtectSize() )
3266
return Qt::forbiddenCursor;
3267
return Qt::sizeHorCursor;
3268
case MEANING_BOTTOMLEFT:
3269
case MEANING_TOPRIGHT:
3270
if ( frameSet->isProtectSize() )
3271
return Qt::forbiddenCursor;
3272
return Qt::sizeBDiagCursor;
3274
case MEANING_BOTTOM:
3275
if ( frameSet->isProtectSize() )
3276
return Qt::forbiddenCursor;
3277
return Qt::sizeVerCursor;
3278
case MEANING_RESIZE_COLUMN:
3279
// Bug in Qt up to Qt-3.1.1 : Qt::splitVCursor and Qt::splitHCursor are swapped!
3280
#if QT_VERSION <= 0x030101
3281
return Qt::splitVCursor;
3283
return Qt::splitHCursor;
3285
case MEANING_RESIZE_ROW:
3286
#if QT_VERSION <= 0x030101
3287
return Qt::splitHCursor;
3289
return Qt::splitVCursor;
3292
return QCursor(); // default cursor !?!?
2348
3295
QString KWDocument::generateFramesetName( const QString & templateName )
2416
3470
void KWDocument::updateAllFrames()
2418
kdDebug(32002) << "KWDocument::updateAllFrames " << frames.count() << " framesets." << endl;
2419
QListIterator<KWFrameSet> fit = framesetsIterator();
3476
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2420
3477
for ( ; fit.current() ; ++fit )
2421
3478
fit.current()->updateFrames();
3481
kdDebug(32001) << "updateAllFrames took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl;
3484
// TODO: check all calls to updateAllFrames, and fix them.
3485
// E.g., if one frame moved, updateAllFrames isn't necessary,
3486
// only fs->updateFrames() and doc->updateFramesOnTopOrBelow() are necessary.
3488
// Update frames ontop and below _afterwards_,
3489
// it needs the 'frames in page' array (in other framesets)
3490
updateFramesOnTopOrBelow();
3493
void KWDocument::updateFramesOnTopOrBelow( int _pageNum /* -1 == all */ )
3495
if ( viewMode() && !viewMode()->hasFrames() )
3499
kdDebug() << "KWDocument::updateFramesOnTopOrBelow pageNum=" << _pageNum << endl;
3502
int numberAdded = 0;
3505
// Look at all pages if _pageNum == -1, otherwise look at _pageNum only.
3506
int fromPage = _pageNum == -1 ? 0 : _pageNum;
3507
int toPage = _pageNum == -1 ? m_pages - 1 : _pageNum;
3508
for ( int pageNum = fromPage ; pageNum <= toPage ; ++pageNum )
3510
// For all frames in that page: clear ontop/below lists.
3511
// TODO we need to fix the case of multipage frames... somehow.
3512
QPtrList<KWFrame> framesInThisPage = framesInPage( pageNum );
3513
QPtrListIterator<KWFrame> frameIt( framesInThisPage );
3514
for ( ; frameIt.current(); ++frameIt )
3516
frameIt.current()->clearFramesOnTop();
3517
frameIt.current()->clearFramesBelow();
3521
for ( ; frameIt.current(); ++frameIt )
3523
// currentFrame is the frame we're taking care of now
3524
// (the one whose ontop/below caches we're modifying)
3525
KWFrame* currentFrame = frameIt.current();
3526
KWFrameSet* currentFrameSet = currentFrame->frameSet();
3527
KWTableFrameSet* table = currentFrameSet->getGroupManager();
3528
bool isInline = currentFrameSet->isFloating();
3530
// Frank's code for going up to the right frame/frameset, if currentFrame is
3531
// floating, in order to use the right z order.
3532
// ### Maybe this logic could be in KWFrame::zOrder() ?
3533
// ### or at least we could have a 'first non-floating parent frame' method
3534
KWFrame *parentFrame = currentFrame;
3535
KWFrameSet *parentFrameset = currentFrameSet;
3536
while (parentFrameset->isFloating()) {
3537
parentFrameset=parentFrameset->anchorFrameset();
3538
KWFrame *oldParentFrame = parentFrame;
3539
parentFrame=parentFrameset->frameAtPos(parentFrame->x(), parentFrame->y());
3541
parentFrame = oldParentFrame;
3544
// We now look at all other frames (in the same page)
3545
// to check for intersections. This is o(n^2), but with n small.
3546
QPtrListIterator<KWFrame> it( framesInThisPage );
3547
for ( ; it.current() ; ++it )
3549
KWFrame* frameMaybeOnTop = it.current();
3550
if ( currentFrame == frameMaybeOnTop ) // Skip identity case ;)
3552
KWFrameSet* frameSet = frameMaybeOnTop->frameSet();
3554
// Skip all cells from 'currentFrameSet' if 'currentFrameSet' is a table.
3555
// We trust that KWTableFrameSet will not make cells overlap ;)
3556
if ( table && frameSet->getGroupManager() == table )
3558
// Skip all frames from the parent frameset, if 'currentFrameSet' is inline
3559
// ## might need a for loop for the case of inline-inside-inline,
3560
// or maybe calling isPaintedBy instead [depending on what should happen for tables]
3561
if ( isInline && frameSet == parentFrameset )
3563
// Floating frames are not "on top", they are "inside".
3564
// They are not "below" anything either - the parent frameset is.
3565
if ( frameSet->isFloating() )
3568
//kdDebug(32001) << " comparing our frame " << parentFrame << " (z:" << parentFrame->zOrder() << ") with frame " << frameMaybeOnTop << " (z:" << frameMaybeOnTop->zOrder() << ") from frameset " << frameSet << endl;
3569
KoRect intersect = currentFrame->intersect( frameMaybeOnTop->outerKoRect() );
3570
if( !intersect.isEmpty() )
3573
if ( parentFrame->zOrder() < frameMaybeOnTop->zOrder() )
3575
// Floating frames are not "on top", they are "inside".
3576
if ( !frameSet->isPaintedBy( currentFrameSet ) ) {
3578
currentFrame->addFrameOnTop( frameMaybeOnTop );
3582
// Don't treat a frameset as 'below' its inline framesets.
3583
// Same problem with table cells. In general we want to forbid that, if
3584
// painting A leads to painting B, A is stored as 'below B'.
3585
// This is where the infinite loop comes from, if B is transparent.
3586
// (Note: we only forbid this for 'below', not for 'on top', to get
3587
// proper clipping).
3588
if ( !currentFrameSet->isPaintedBy( frameSet ) && parentFrame->zOrder() > frameMaybeOnTop->zOrder() )
3591
currentFrame->addFrameBelow( frameMaybeOnTop );
3604
<< frameMaybeOnTop << "("<<frameSet->getName()<<")"
3605
<< " (zorder: " << frameMaybeOnTop->zOrder() << ")"
3606
<< ( parentFrame->zOrder() < frameMaybeOnTop->zOrder() ? " on top of" : " below" )
3607
<< " frame " << currentFrame << "("<<currentFrameSet->getName()<<")"
3608
<< " parentFrame " << parentFrame << " (zorder: " << parentFrame->zOrder() << ")" << endl;
3609
//kdDebug(32002) << " intersect: " << intersect
3610
//<< " (zoomed: " << zoomRect( intersect ) << ")" << endl;
3615
} // 'frameIt' for loop
3618
for ( ; frameIt.current(); ++frameIt )
3619
frameIt.current()->sortFramesBelow();
3624
kdDebug(32001) << "updateFramesOnTopOrBelow("<<_pageNum<<") took " << (float)(dt.elapsed()) / 1000 << " seconds, added " << numberAdded << " frames" << endl;
2424
3628
// Tell this method when a frame is moved / resized / created / deleted
2425
3629
// and everything will be update / repainted accordingly
2426
3630
void KWDocument::frameChanged( KWFrame * frame, KWView * view )
2428
//kdDebug() << "KWDocument::frameChanged" << endl;
3632
if ( !frame ) // TODO call another method for 'deleted frame', which passes the frameset
3633
updateAllFrames(); // ... in order to get rid of that call, and use the 'else' case instead
3635
frame->frameSet()->updateFrames();
3636
updateFramesOnTopOrBelow();
3639
//kdDebug(32002) << "KWDocument::frameChanged" << endl;
2430
3640
// If frame with text flowing around it -> re-layout all frames
2431
3641
if ( !frame || frame->runAround() != KWFrame::RA_NO )
3058
4311
void KWDocument::updateRulerFrameStartEnd()
3060
QListIterator<KWView> it( m_lstViews );
4313
QPtrListIterator<KWView> it( m_lstViews );
3061
4314
for ( ; it.current() ; ++it )
3062
4315
it.current()->slotUpdateRuler();
4318
void KWDocument::updateFrameStatusBarItem()
4320
QPtrListIterator<KWView> it( m_lstViews );
4321
for ( ; it.current() ; ++it )
4322
it.current()->updateFrameStatusBarItem();
4325
int KWDocument::undoRedoLimit() const
4327
return m_commandHistory->undoLimit();
4330
void KWDocument::setUndoRedoLimit(int val)
4332
m_commandHistory->setUndoLimit(val);
4333
m_commandHistory->setRedoLimit(val);
4336
void KWDocument::setGridX(double _gridx) {
4338
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4339
viewPtr->getGUI()->getHorzRuler()->setGridSize(_gridx);
4342
QValueList<KoTextObject *> KWDocument::visibleTextObjects(KWViewMode *viewmode) const
4344
QValueList<KoTextObject *> lst;
4345
QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
4347
KWTextFrameSet *frm;
4348
for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ) {
4349
if ( frm && frm->isVisible(viewmode) && !frm->textObject()->protectContent() )
4351
lst.append( frm->textObject() );
4358
void KWDocument::refreshGUIButton()
4360
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4361
viewPtr->initGUIButton();
4364
void KWDocument::enableBackgroundSpellCheck( bool b )
4366
m_bgSpellCheck->enableBackgroundSpellCheck(b);
4367
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4368
viewPtr->updateBgSpellCheckingState();
4371
bool KWDocument::backgroundSpellCheckEnabled() const
4373
return m_bgSpellCheck->backgroundSpellCheckEnabled();
4376
void KWDocument::reactivateBgSpellChecking()
4378
QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
4380
KWTextFrameSet *frm;
4381
for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
4382
frm->textObject()->setNeedSpellCheck(true);
4385
startBackgroundSpellCheck();
4389
KWTextFrameSet* KWDocument::nextTextFrameSet(KWTextFrameSet *obj)
4392
if ( bgFrameSpellChecked )
4393
pos=m_lstFrameSet.findNextRef(bgFrameSpellChecked);
4397
for ( frm=m_lstFrameSet.at(pos); frm != 0; frm=m_lstFrameSet.next() ){
4398
KWTextFrameSet *newFrm = frm->nextTextObject( obj );
4399
if(newFrm && !newFrm->isDeleted() && newFrm->textObject()->needSpellCheck())
4401
//kdDebug() << "KWDocument::nextTextFrameSet checking " << bgFrameSpellChecked << endl;
4402
bgFrameSpellChecked = frm;
4410
for ( frm=m_lstFrameSet.first(); frm != 0; frm=m_lstFrameSet.next() ){
4411
KWTextFrameSet *newFrm = frm->nextTextObject( obj );
4412
if(newFrm && !newFrm->isDeleted() && newFrm->textObject()->needSpellCheck())
4414
//kdDebug() << "KWDocument::nextTextFrameSet checking " << bgFrameSpellChecked << endl;
4415
bgFrameSpellChecked = frm;
4420
//kdDebug() << "KWDocument::nextTextFrameSet returning 0L" << endl;
4421
bgFrameSpellChecked = 0L;
4425
void KWDocument::slotChapterParagraphFormatted( KoTextParag* /*parag*/ )
4427
// Attempt at invalidating from the parag's page only
4428
// But that's not good enough - if a header gets moved down,
4429
// we also need to invalidate the previous page, from where the paragraph disappeared.
4432
KWFrame* frame = internalToDocument( parag->rect().topLeft(), p );
4435
// Remove any information from this page and further pages.
4436
m_sectionTitles.resize( frame->pageNum() );
4439
m_sectionTitles.resize( 0 ); // clear up the entire cache
4441
// Don't store info from parag into m_sectionTitles here.
4442
// It breaks when having two headings in the same page
4443
// (or if it keeps existing info then it can't update properly)
4446
QString KWDocument::checkSectionTitleInParag( KoTextParag* parag, KWTextFrameSet* frameset, int pageNum ) const
4448
if ( parag->counter() && parag->counter()->numbering() == KoParagCounter::NUM_CHAPTER
4449
&& parag->counter()->depth() == 0 )
4451
QString txt = parag->string()->toString();
4452
txt = txt.left( txt.length() - 1 ); // remove trailing space
4453
#ifndef NDEBUG // not needed, just checking
4455
KWFrame* frame = frameset->internalToDocument( parag->rect().topLeft(), p );
4458
int pgNum = frame->pageNum();
4459
if( pgNum != pageNum )
4460
kdWarning() << "sectionTitle: was looking for pageNum " << pageNum << ", got frame " << frame << " page " << pgNum << endl;
4462
kdDebug(32001) << "KWDocument::sectionTitle for " << pageNum << ":" << txt << endl;
4464
// Ensure array is big enough
4465
if ( pageNum > (int)m_sectionTitles.size()-1 )
4466
const_cast<KWDocument*>(this)->m_sectionTitles.resize( pageNum + 1 );
4467
const_cast<KWDocument*>(this)->m_sectionTitles[ pageNum ] = txt;
4470
return QString::null;
4473
QString KWDocument::sectionTitle( int pageNum ) const
4475
//kdDebug(32001) << "KWDocument::sectionTitle(pageNum=" << pageNum << ") m_sectionTitles.size()=" << m_sectionTitles.size() << endl;
4476
// First look in the cache. If info is present, it's uptodate (see slotChapterParagraphFormatted)
4477
if ( (int)m_sectionTitles.size() > pageNum )
4479
// Look whether this page has a section title, and if not, go back pages, one by one
4480
for ( int i = pageNum; i >= 0 ; --i )
4482
const QString& s = m_sectionTitles[i];
4485
// Update cache, to make this faster next time
4486
if ( pageNum > (int)m_sectionTitles.size()-1 )
4487
const_cast<KWDocument*>(this)->m_sectionTitles.resize( pageNum + 1 );
4488
const_cast<KWDocument*>(this)->m_sectionTitles[ pageNum ] = s;
4494
// If not in the cache, determine from the paragraphs in the page.
4496
if ( m_lstFrameSet.isEmpty() )
4497
return QString::null;
4498
// We use the "main" frameset to determine section titles.
4499
KWTextFrameSet *frameset = dynamic_cast<KWTextFrameSet *>( m_lstFrameSet.getFirst() );
4501
return QString::null;
4503
int topLUpix, bottomLUpix;
4504
if ( !frameset->minMaxInternalOnPage( pageNum, topLUpix, bottomLUpix ) )
4505
return QString::null;
4507
KoTextParag* parag = frameset->textDocument()->firstParag();
4508
//kdDebug(32001) << "KWDocument::sectionTitle " << pageNum
4509
// << " topLUpix=" << topLUpix << " bottomLUpix=" << bottomLUpix << endl;
4511
KoTextParag* lastParagOfPageAbove = parag;
4512
for ( ; parag ; parag = parag->next() )
4514
if ( parag->rect().bottom() < topLUpix ) // too early
4516
lastParagOfPageAbove = parag;
4519
if ( parag->rect().top() > bottomLUpix ) // done
4521
QString txt = checkSectionTitleInParag( parag, frameset, pageNum );
4522
if ( !txt.isEmpty() )
4526
// No heading found in page.
4527
// Go back up until the first section parag
4528
parag = lastParagOfPageAbove;
4529
for ( ; parag ; parag = parag->prev() )
4531
QString txt = checkSectionTitleInParag( parag, frameset, pageNum );
4532
if ( !txt.isEmpty() )
4536
// First page, no heading found
4537
return QString::null;
4540
void KWDocument::addIgnoreWordAll( const QString & word)
4542
if( m_spellListIgnoreAll.findIndex( word )==-1)
4543
m_spellListIgnoreAll.append( word );
4544
m_bgSpellCheck->addIgnoreWordAll( word );
4548
void KWDocument::clearIgnoreWordAll( )
4550
m_spellListIgnoreAll.clear();
4551
m_bgSpellCheck->clearIgnoreWordAll();
4555
int KWDocument::maxZOrder( int pageNum) const
4558
int maxZOrder = 0; //this value is only used if there's no frame on the page
4559
QPtrList<KWFrame> frames = framesInPage( pageNum );
4560
QPtrListIterator<KWFrame> frameIt( frames );
4561
for ( ; frameIt.current(); ++frameIt ) {
4562
if ( first || frameIt.current()->zOrder() > maxZOrder ) {
4563
maxZOrder = frameIt.current()->zOrder();
4570
QPtrList<KWTextFrameSet> KWDocument::allTextFramesets(bool onlyReadWrite) const
4572
QPtrList<KWTextFrameSet> textFramesets;
4573
QPtrListIterator<KWFrameSet> fit = framesetsIterator();
4574
for ( ; fit.current() ; ++fit ) {
4575
if(fit.current()->isDeleted()) continue;
4576
fit.current()->addTextFrameSets(textFramesets, onlyReadWrite);
4578
return textFramesets;
4581
int KWDocument::numberOfTextFrameSet( KWFrameSet* fs, bool onlyReadWrite )
4583
QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( onlyReadWrite );
4584
return textFramesets.findRef( static_cast<KWTextFrameSet*>(fs) );
4587
KWFrameSet * KWDocument::textFrameSetFromIndex( unsigned int _num, bool onlyReadWrite )
4589
return allTextFramesets( onlyReadWrite ).at( _num );
4592
void KWDocument::updateTextFrameSetEdit()
4594
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4595
viewPtr->slotFrameSetEditChanged();
4599
void KWDocument::displayFootNoteFieldCode()
4601
QPtrListIterator<KoVariable> it( m_varColl->getVariables() );
4602
for ( ; it.current() ; ++it )
4604
if ( it.current()->type() == VT_FOOTNOTE )
4606
static_cast<KWFootNoteVariable *>(it.current())->resize();
4607
static_cast<KWFootNoteVariable *>(it.current())->frameSet()->setCounterText( static_cast<KWFootNoteVariable *>(it.current())->text() );
4609
KoTextParag * parag = it.current()->paragraph();
4612
parag->invalidate( 0 );
4613
parag->setChanged( true );
4619
void KWDocument::changeFootNoteConfig()
4621
QPtrListIterator<KoVariable> it( m_varColl->getVariables() );
4622
for ( ; it.current() ; ++it )
4624
if ( it.current()->type() == VT_FOOTNOTE )
4626
static_cast<KWFootNoteVariable *>(it.current())->formatedNote();
4627
static_cast<KWFootNoteVariable *>(it.current())->resize();
4628
static_cast<KWFootNoteVariable *>(it.current())->frameSet()->setCounterText( static_cast<KWFootNoteVariable *>(it.current())->text() );
4630
KoTextParag * parag = it.current()->paragraph();
4633
parag->invalidate( 0 );
4634
parag->setChanged( true );
4638
slotRepaintVariable();
4642
void KWDocument::setTabStopValue ( double _tabStop )
4644
m_tabStop = _tabStop;
4645
QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
4647
KWTextFrameSet *frm;
4648
for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
4649
frm->textDocument()->setTabStops( ptToLayoutUnitPixX( _tabStop ));
4655
void KWDocument::switchViewMode( KWViewMode * newViewMode )
4657
// Don't compare m_viewMode and newViewMode here, it would break
4658
// changing the number of pages per row for the preview mode, in kwconfig.
4660
m_viewMode = newViewMode;
4661
m_lastViewMode = m_viewMode->type(); // remember for saving config
4663
//necessary to switchmode view in all canvas in first.
4664
//otherwise in multiview kword crash !
4665
//perhaps it's not a good idea to store m_modeView into kwcanvas.
4666
//but it's necessary for the futur when kword will support
4667
//different view mode in different view.
4668
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4669
viewPtr->getGUI()->canvasWidget()->switchViewMode( m_viewMode );
4671
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4672
viewPtr->switchModeView();
4673
emit newContentsSize();
4674
updateResizeHandles();
4676
// Since the text layout depends on the view mode, we need to redo it
4677
// But after telling the canvas about the new viewmode, otherwise stuff like
4678
// slotNewContentsSize will crash.
4682
repaintAllViews( true );
4683
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4684
viewPtr->getGUI()->canvasWidget()->ensureCursorVisible();
4687
void KWDocument::changeBgSpellCheckingState( bool b )
4689
enableBackgroundSpellCheck( b );
4690
reactivateBgSpellChecking();
4691
KConfig *config = KWFactory::global()->config();
4692
config->setGroup("KSpell kword" );
4693
config->writeEntry( "SpellCheck", (int)b );
4696
QString KWDocument::initialFrameSet() const
4698
return m_initialEditing ? m_initialEditing->m_initialFrameSet : QString::null;
4701
int KWDocument::initialCursorParag() const
4703
return m_initialEditing ? m_initialEditing->m_initialCursorParag : 0;
4706
int KWDocument::initialCursorIndex() const
4708
return m_initialEditing ? m_initialEditing->m_initialCursorIndex : 0;
4711
void KWDocument::deleteInitialEditingInfo()
4713
delete m_initialEditing;
4714
m_initialEditing = 0L;
4717
bool KWDocument::cursorInProtectedArea()const
4719
return m_cursorInProtectectedArea;
4722
void KWDocument::setCursorInProtectedArea( bool b )
4724
m_cursorInProtectectedArea=b;
4725
testAndCloseAllFrameSetProtectedContent();
4729
void KWDocument::testAndCloseAllFrameSetProtectedContent()
4731
if ( !m_cursorInProtectectedArea )
4733
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4734
viewPtr->testAndCloseAllFrameSetProtectedContent();
4738
void KWDocument::updateRulerInProtectContentMode()
4740
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4741
viewPtr->updateRulerInProtectContentMode();
4745
void KWDocument::insertBookMark(const QString &_name, KWTextParag *_startparag,KWTextParag *_endparag, KWFrameSet *_frameSet, int _start, int _end)
4747
KWBookMark *book = new KWBookMark( _name, _startparag, _endparag, _frameSet, _start, _end );
4748
m_bookmarkList.append( book );
4751
void KWDocument::deleteBookMark(const QString &_name)
4753
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4754
for ( ; book.current() ; ++book )
4756
if ( book.current()->bookMarkName()==_name)
4758
m_bookmarkList.remove(book.current());
4765
void KWDocument::renameBookMark(const QString &_oldName, const QString &_newName)
4767
if ( _oldName==_newName)
4769
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4770
for ( ; book.current() ; ++book )
4772
if ( book.current()->bookMarkName()==_oldName)
4774
book.current()->setBookMarkName(_newName );
4781
KWBookMark * KWDocument::bookMarkByName( const QString & name )
4783
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4784
for ( ; book.current() ; ++book )
4786
if ( book.current()->bookMarkName()==name)
4787
return book.current();
4792
QStringList KWDocument::listOfBookmarkName(KWViewMode * viewMode)const
4795
if ( viewMode && viewMode->type()!="ModeText")
4797
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4798
for ( ; book.current() ; ++book )
4800
if ( !book.current()->frameSet()->isDeleted())
4801
list.append( book.current()->bookMarkName());
4806
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4807
for ( ; book.current() ; ++book )
4809
if ( book.current()->frameSet()->isVisible( viewMode )&& !book.current()->frameSet()->isDeleted())
4810
list.append( book.current()->bookMarkName());
4816
void KWDocument::paragraphModified(KoTextParag* /*_parag*/, int /*KoTextParag::ParagModifyType*/ /*_type*/, int /*start*/, int /*lenght*/)
4818
//kdDebug()<<" _parag :"<<_parag<<" start :"<<start<<" lenght :"<<lenght<<endl;
4822
void KWDocument::spellCheckParagraphDeleted( KoTextParag *_parag, KWTextFrameSet *frm)
4824
m_bgSpellCheck->spellCheckParagraphDeleted( _parag, frm->textObject());
4827
void KWDocument::paragraphDeleted( KoTextParag *_parag, KWFrameSet *frm )
4829
if ( m_bookmarkList.isEmpty() )
4831
QPtrListIterator<KWBookMark> book(m_bookmarkList);
4832
for ( ; book.current() ; ++book ) {
4833
KWBookMark* bk = book.current();
4834
if ( bk->frameSet()==frm ) {
4835
// Adjust bookmark to point to a valid paragraph, below or above the deleted one.
4836
// The old implementation turned the bookmark into a useless one. OOo simply deletes the bookmark...
4837
if ( bk->startParag() == _parag )
4838
bk->setStartParag( _parag->next() ? _parag->next() : _parag->prev() );
4839
if ( bk->endParag() == _parag )
4840
bk->setEndParag( _parag->next() ? _parag->next() : _parag->prev() );
4845
void KWDocument::initBookmarkList()
4847
QPtrListIterator<bookMark> book(m_tmpBookMarkList);
4848
for ( ; book.current() ; ++book )
4850
KWFrameSet * fs = 0L;
4851
QString fsName = book.current()->frameSetName;
4852
if ( !fsName.isEmpty() )
4853
fs = frameSetByName( fsName );
4856
KWTextFrameSet *frm = dynamic_cast<KWTextFrameSet *>(fs);
4859
KWBookMark *tmp =new KWBookMark( book.current()->bookname);
4860
tmp->setFrameSet(frm);
4861
KWTextParag* startparag = dynamic_cast<KWTextParag*>(frm->textDocument()->paragAt( book.current()->paragStartIndex ));
4862
KWTextParag* endparag = dynamic_cast<KWTextParag*>(frm->textDocument()->paragAt( book.current()->paragEndIndex ));
4864
if ( !startparag || !endparag)
4870
tmp->setStartParag( startparag );
4871
tmp->setEndParag( endparag );
4872
tmp->setBookmarkStartIndex( book.current()->cursorStartIndex);
4873
tmp->setBookmarkEndIndex( book.current()->cursorEndIndex);
4874
m_bookmarkList.append( tmp );
4879
m_tmpBookMarkList.setAutoDelete( true );
4880
m_tmpBookMarkList.clear();
4883
QPixmap* KWDocument::doubleBufferPixmap( const QSize& s )
4885
if ( !m_bufPixmap ) {
4886
int w = QABS( s.width() );
4887
int h = QABS( s.height() );
4888
m_bufPixmap = new QPixmap( w, h );
4890
if ( m_bufPixmap->width() < s.width() ||
4891
m_bufPixmap->height() < s.height() ) {
4892
m_bufPixmap->resize( QMAX( s.width(), m_bufPixmap->width() ),
4893
QMAX( s.height(), m_bufPixmap->height() ) );
4900
void KWDocument::maybeDeleteDoubleBufferPixmap()
4902
if ( m_bufPixmap && m_bufPixmap->height() * m_bufPixmap->width() > 400*400 )
4909
void KWDocument::configureSpellChecker()
4911
KWView * view = static_cast<KWView*>(views().getFirst());
4912
if ( view ) // no view if embedded document
4914
view->configureSpellChecker();
4918
void KWDocument::setPersonalExpressionPath( const QStringList & lst)
4920
m_personalExpressionPath = lst;
4921
refreshMenuExpression();
4924
void KWDocument::updateDirectCursorButton()
4926
for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
4927
viewPtr->updateDirectCursorButton();
4930
void KWDocument::setInsertDirectCursor(bool _b)
4932
m_bInsertDirectCursor=_b;
4933
KConfig *config = KWFactory::global()->config();
4934
config->setGroup( "Interface" );
4935
config->writeEntry( "InsertDirectCursor", _b );
4936
updateDirectCursorButton();
4939
#if 0 // KWORD_HORIZONTAL_LINE
4940
void KWDocument::setHorizontalLinePath( const QStringList & lst)
4942
m_horizontalLinePath = lst;
4946
void KWDocument::addWordToDictionary( const QString & word)
4948
if ( m_bgSpellCheck )
4950
m_bgSpellCheck->addPersonalDictonary( word );
4954
void KWDocument::setEmpty()
4956
KoDocument::setEmpty();
4957
// Whether loaded from template or from empty doc: this is a new one -> set creation date
4958
m_varColl->variableSetting()->setCreationDate(QDateTime::currentDateTime());
3065
4961
#include "kwdoc.moc"