22#include "KWDocument.h"
24#include "KWordDocIface.h"
25#include "KWBgSpellCheck.h"
26#include "KoTextBookmark.h"
29#include "KWFormulaFrameSet.h"
30#include "KWFrameLayout.h"
31#include "KWPictureFrameSet.h"
32#include "KWPartFrameSet.h"
33#include "KWTableFrameSet.h"
34#include "KWTableStyle.h"
35#include "KWTableTemplate.h"
36#include "KWTextImage.h"
37#include "KWVariable.h"
39#include "KWViewMode.h"
40#include "KWMailMergeDataBase.h"
41#include "KWLoadingInfo.h"
42#include "KWCollectFramesetsVisitor.h"
43#include "KWOasisLoader.h"
44#include "KWOasisSaver.h"
45#include "KWFrameList.h"
46#include "KWPageManager.h"
48#include "KWFrameView.h"
49#include "KWFrameViewManager.h"
50#include "KWStartupWidget.h"
52#include <KoPictureCollection.h>
53#include <KoTemplateChooseDia.h>
54#include <KoMainWindow.h>
55#include <KoDocumentInfo.h>
57#include <KoParagCounter.h>
58#include <KoTextObject.h>
59#include <KoAutoFormat.h>
60#include <KoVariable.h>
61#include <kformuladocument.h>
62#include <KoApplication.h>
63#include <KoOasisContext.h>
64#include <KoCommandHistory.h>
65#include <KoGenStyles.h>
67#include <KoStoreDrag.h>
68#include <KoStoreDevice.h>
69#include <KoXmlWriter.h>
70#include <KoOasisStore.h>
71#include <KoOasisStyles.h>
77#include <tdeglobalsettings.h>
78#include <klibloader.h>
79#include <tdemultipledrag.h>
81#include <tdemessagebox.h>
83#include <kstandarddirs.h>
85#include <tdespell2/settings.h>
87#include <tqfileinfo.h>
99static const char * CURRENT_DTD_VERSION =
"1.2";
104class KWCommandHistory :
public KoCommandHistory
107 KWCommandHistory( KWDocument * doc ) : KoCommandHistory( doc->actionCollection(), true ), m_pDoc( doc ) {}
115void KWCommandHistory::undo()
117 m_pDoc->clearUndoRedoInfos();
118 KoCommandHistory::undo();
121void KWCommandHistory::redo()
123 m_pDoc->clearUndoRedoInfos();
124 KoCommandHistory::redo();
130void KWDocument::clearUndoRedoInfos()
132 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
133 for ( ; fit.current() ; ++fit )
135 KWTextFrameSet *fs =
dynamic_cast<KWTextFrameSet *
>( fit.current() );
137 fs->clearUndoRedoInfo();
145class KWDocument::InitialEditing {
147 TQString m_initialFrameSet;
148 int m_initialCursorParag;
149 int m_initialCursorIndex;
152const int KWDocument::CURRENT_SYNTAX_VERSION = 3;
154KWDocument::KWDocument(TQWidget *parentWidget,
const char *widname, TQObject* parent,
const char* name,
bool singleViewMode )
155 : KoDocument( parentWidget, widname, parent, name, singleViewMode ),
158 KWStatisticVariable::setExtendedType(
true );
160 m_framesChangedHandler = 0;
162 m_pageManager->appendPage();
164 m_tabStop = MM_TO_POINT( 15.0 );
165 m_processingType = WP;
168 m_lstFrameSet.setAutoDelete(
true );
170 m_textImageRequests.setAutoDelete(
false);
172 m_styleColl =
new KoStyleCollection();
175 m_tableTemplateColl =
new KWTableTemplateCollection();
176 m_pictureCollection =
new KoPictureCollection();
178 m_personalExpressionPath = KWFactory::instance()->dirs()->resourceDirs(
"expression");
181 m_bSnapToGrid =
false;
184 setInstance( KWFactory::instance(),
false );
185 setTemplateType(
"kword_template" );
187 m_gridX = m_gridY = MM_TO_POINT(5.0 );
188 m_indent = MM_TO_POINT( 10.0 );
191 m_maxRecentFiles = 10;
194 m_footNoteSeparatorLinePos=SLP_LEFT;
196 m_viewFormattingChars =
false;
198 m_viewFormattingEndParag =
true;
199 m_viewFormattingSpace =
true;
200 m_viewFormattingTabs =
true;
201 m_viewFormattingBreak =
true;
203 m_viewFrameBorders =
true;
204 m_repaintAllViewsPending =
false;
205 m_recalcFramesPending = -1;
206 m_bShowDocStruct =
true;
208 m_bShowStatusBar =
true;
209 m_bAllowAutoFormat =
true;
210 m_pgUpDownMovesCaret =
true;
211 m_bShowScrollBar =
true;
212 m_cursorInProtectectedArea =
true;
213 m_bHasEndNotes =
false;
215 m_bInsertDirectCursor=
false;
216 m_globalLanguage = TDEGlobal::locale()->language();
217 m_bGlobalHyphenation =
false;
218 m_bGeneratingPreview =
false;
219 m_viewModeType=
"ModeNormal";
220 m_layoutViewMode = 0;
222 m_commandHistory =
new KWCommandHistory(
this );
223 connect( m_commandHistory, TQ_SIGNAL( documentRestored() ),
this, TQ_SLOT( slotDocumentRestored() ) );
224 connect( m_commandHistory, TQ_SIGNAL( commandExecuted() ),
this, TQ_SLOT( slotCommandExecuted() ) );
228 m_headerVisible =
false;
229 m_footerVisible =
false;
231 m_pasteFramesetsMap = 0L;
232 m_initialEditing = 0L;
234 m_varFormatCollection =
new KoVariableFormatCollection;
235 m_varColl =
new KWVariableCollection(
new KWVariableSettings(), m_varFormatCollection );
237 m_autoFormat =
new KoAutoFormat(
this,m_varColl,m_varFormatCollection );
238 m_bgSpellCheck =
new KWBgSpellCheck(
this);
239 m_slDataBase =
new KWMailMergeDataBase(
this );
240 m_bookmarkList =
new KoTextBookmarkList;
243 m_syntaxVersion = CURRENT_SYNTAX_VERSION;
249 m_formulaDocumentWrapper =
250 new KFormula::DocumentWrapper( instance()->config(),
260 TDEConfig *config = KWFactory::instance()->config();
261 config->setGroup(
"Document defaults" );
262 TQString defaultFontname=config->readEntry(
"DefaultFont");
263 if ( !defaultFontname.isEmpty() )
264 m_defaultFont.fromString( defaultFontname );
268 m_defaultFont.setStyleStrategy( TQFont::ForceOutline );
270 int ptSize = m_defaultFont.pointSize();
272 ptSize = TQFontInfo(m_defaultFont).pointSize();
281DCOPObject* KWDocument::dcopObject()
284 dcop =
new KWordDocIface(
this );
288KWDocument::~KWDocument()
294 m_lstFrameSet.clear();
295 delete m_loadingInfo;
297 delete m_formulaDocumentWrapper;
298 delete m_commandHistory;
300 delete m_varFormatCollection;
303 delete m_bgSpellCheck;
305 delete m_frameStyleColl;
306 delete m_tableStyleColl;
307 delete m_tableTemplateColl;
308 delete m_layoutViewMode;
310 delete m_pictureCollection;
311 delete m_pageManager;
312 delete m_bookmarkList;
315void KWDocument::initConfig()
317 TDEConfig *config = KWFactory::instance()->config();
318 if( config->hasGroup(
"KSpell kword" ) )
320 config->setGroup(
"KSpell kword" );
325 m_bgSpellCheck->setEnabled(config->readBoolEntry(
"SpellCheck",
false ));
327 m_bgSpellCheck->setEnabled(
false );
330 if(config->hasGroup(
"Interface" ) )
332 config->setGroup(
"Interface" );
333 setGridY(TQMAX( config->readDoubleNumEntry(
"GridY",MM_TO_POINT(5.0) ), 0.1));
334 setGridX(TQMAX( config->readDoubleNumEntry(
"GridX",MM_TO_POINT(5.0) ), 0.1));
335 setCursorInProtectedArea( config->readBoolEntry(
"cursorInProtectArea",
true ));
337 double indent = config->readDoubleNumEntry(
"Indent", MM_TO_POINT(10.0) ) ;
338 setIndentValue(indent);
339 setShowRuler(config->readBoolEntry(
"Rulers",
true));
340 int defaultAutoSave = KoDocument::defaultAutoSave()/60;
341 setAutoSave(config->readNumEntry(
"AutoSave",defaultAutoSave)*60);
342 setBackupFile( config->readBoolEntry(
"BackupFile",
true) );
344 setNbPagePerRow(config->readNumEntry(
"nbPagePerRow",4));
345 m_maxRecentFiles = config->readNumEntry(
"NbRecentFile", 10 );
347 m_viewFormattingChars = config->readBoolEntry(
"ViewFormattingChars",
false );
348 m_viewFormattingBreak = config->readBoolEntry(
"ViewFormattingBreaks",
true );
349 m_viewFormattingSpace = config->readBoolEntry(
"ViewFormattingSpace",
true );
350 m_viewFormattingEndParag = config->readBoolEntry(
"ViewFormattingEndParag",
true );
351 m_viewFormattingTabs = config->readBoolEntry(
"ViewFormattingTabs",
true );
353 m_viewFrameBorders = config->readBoolEntry(
"ViewFrameBorders",
true );
355 m_zoom = config->readNumEntry(
"Zoom", 100 );
356 m_zoomMode =
static_cast<KoZoomMode::Mode
> (
357 config->readNumEntry(
"ZoomMode", KoZoomMode::ZOOM_CONSTANT )
360 m_bShowDocStruct = config->readBoolEntry(
"showDocStruct",
true );
361 m_viewModeType = config->readEntry(
"viewmode",
"ModeNormal" );
362 setShowStatusBar( config->readBoolEntry(
"ShowStatusBar" ,
true ) );
363 setAllowAutoFormat( config->readBoolEntry(
"AllowAutoFormat" ,
true ) );
364 setShowScrollBar( config->readBoolEntry(
"ShowScrollBar",
true ) );
366 m_bShowDocStruct =
false;
367 m_pgUpDownMovesCaret = config->readBoolEntry(
"PgUpDownMovesCaret",
true );
368 m_bInsertDirectCursor= config->readBoolEntry(
"InsertDirectCursor",
false );
369 m_globalLanguage=config->readEntry(
"language", TDEGlobal::locale()->language());
370 m_bGlobalHyphenation=config->readBoolEntry(
"hyphenation",
false);
372 setShowGrid( config->readBoolEntry(
"ShowGrid" ,
false ));
373 setSnapToGrid( config->readBoolEntry(
"SnapToGrid",
false ));
374 setGridX( config->readDoubleNumEntry(
"ResolutionX", MM_TO_POINT( 5.0 ) ));
375 setGridY( config->readDoubleNumEntry(
"ResolutionY", MM_TO_POINT( 5.0 ) ));
380 m_zoomMode = KoZoomMode::ZOOM_WIDTH;
383 if(config->hasGroup(
"Misc" ) )
385 config->setGroup(
"Misc" );
386 undo=config->readNumEntry(
"UndoRedo",-1);
389 if ( config->hasKey(
"Units" ) )
390 setUnit( KoUnit::unit( config->readEntry(
"Units") ) );
391 m_defaultColumnSpacing = config->readDoubleNumEntry(
"ColumnSpacing", 3.0 );
395 setUndoRedoLimit(undo);
397 setZoomAndResolution( m_zoom, KoGlobal::dpiX(), KoGlobal::dpiY() );
400 if ( !isReadWrite() && m_viewModeType ==
"ModeText" )
401 m_viewModeType=
"ModeNormal";
403 m_layoutViewMode = KWViewMode::create( m_viewModeType,
this, 0 );
405 if(config->hasGroup(
"Kword Path" ) )
407 config->setGroup(
"Kword Path" );
408 if ( config->hasKey(
"expression path" ) )
409 m_personalExpressionPath = config->readPathListEntry(
"expression path" );
410 setBackupPath(config->readPathEntry(
"backup path" ));
414 TDEConfigGroup group( KoGlobal::kofficeConfig(),
"Spelling" );
415 m_spellCheckPersonalDict = group.readListEntry(
"PersonalDict" );
418void KWDocument::saveConfig()
420 if ( !isReadWrite() )
422 TDEConfigGroup group( KoGlobal::kofficeConfig(),
"Spelling" );
423 group.writeEntry(
"PersonalDict", m_spellCheckPersonalDict );
429 TDEConfig *config = KWFactory::instance()->config();
430 config->setGroup(
"Interface" );
431 config->writeEntry(
"ViewFormattingChars", m_viewFormattingChars );
432 config->writeEntry(
"ViewFormattingBreaks", m_viewFormattingBreak );
433 config->writeEntry(
"ViewFormattingEndParag", m_viewFormattingEndParag );
434 config->writeEntry(
"ViewFormattingTabs", m_viewFormattingTabs );
435 config->writeEntry(
"ViewFormattingSpace", m_viewFormattingSpace );
436 config->writeEntry(
"ViewFrameBorders", m_viewFrameBorders );
437 config->writeEntry(
"Zoom", m_zoom );
438 config->writeEntry(
"ZoomMode", m_zoomMode );
439 config->writeEntry(
"showDocStruct", m_bShowDocStruct );
440 config->writeEntry(
"Rulers", m_bShowRuler );
441 config->writeEntry(
"viewmode", m_viewModeType) ;
442 config->writeEntry(
"AllowAutoFormat", m_bAllowAutoFormat );
443 config->writeEntry(
"ShowGrid" , m_bShowGrid );
444 config->writeEntry(
"SnapToGrid" , m_bSnapToGrid );
445 config->writeEntry(
"ResolutionX", m_gridX );
446 config->writeEntry(
"ResolutionY", m_gridY );
450void KWDocument::setZoomAndResolution(
int zoom,
int dpiX,
int dpiY )
452 KoTextZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY );
453 if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
454 formulaDocument->setZoomAndResolution( zoom, dpiX, dpiY );
457KWTextFrameSet * KWDocument::textFrameSet (
unsigned int num )
const
460 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
461 for ( ; fit.current() ; ++fit )
463 if(fit.current()->isDeleted())
continue;
464 if(fit.current()->type()==FT_TEXT)
467 return static_cast<KWTextFrameSet*
>(fit.current());
471 return static_cast<KWTextFrameSet*
>(m_lstFrameSet.getFirst());
474void KWDocument::newZoomAndResolution(
bool updateViews,
bool forPrint )
476 if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
477 formulaDocument->newZoomAndResolution( updateViews,forPrint );
479 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
480 for ( ; fit.current() ; ++fit )
481 fit.current()->zoom( forPrint );
490 emit newContentsSize();
491 repaintAllViews(
true );
495bool KWDocument::initDoc(InitDocFlags flags, TQWidget* parentWidget)
497 m_pageColumns.columns = 1;
498 m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
500 m_pageHeaderFooter.header = HF_SAME;
501 m_pageHeaderFooter.footer = HF_SAME;
502 m_pageHeaderFooter.ptHeaderBodySpacing = 10;
503 m_pageHeaderFooter.ptFooterBodySpacing = 10;
504 m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
510 TQString fileName( locate(
"kword_template",
"Normal/.source/Embedded.kwt" , KWFactory::instance() ) );
512 ok = loadNativeFormat( fileName );
514 showLoadingErrorDialog();
516 setModified(
false );
519 else if (flags==KoDocument::InitDocEmpty)
521 TQString fileName( locate(
"kword_template",
"Normal/.source/PlainText.kwt" , KWFactory::instance() ) );
523 ok = loadNativeFormat( fileName );
525 showLoadingErrorDialog();
527 setModified(
false );
531 KoTemplateChooseDia::DialogType dlgtype;
533 if (flags != KoDocument::InitDocFileNew)
534 dlgtype = KoTemplateChooseDia::Everything;
536 dlgtype = KoTemplateChooseDia::OnlyTemplates;
540 KoTemplateChooseDia::ReturnType ret = KoTemplateChooseDia::choose(
541 KWFactory::instance(), file,
542 dlgtype,
"kword_template", parentWidget );
543 if ( ret == KoTemplateChooseDia::Template ) {
545 ok = loadNativeFormat( file );
547 showLoadingErrorDialog();
549 }
else if ( ret == KoTemplateChooseDia::File ) {
553 }
else if ( ret == KoTemplateChooseDia::Empty ) {
554 TQString fileName( locate(
"kword_template",
"Normal/.source/PlainText.kwt" , KWFactory::instance() ) );
556 ok = loadNativeFormat( fileName );
558 showLoadingErrorDialog();
561 setModified(
false );
565void KWDocument::openExistingFile(
const TQString& file )
567 m_pageColumns.columns = 1;
568 m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
570 m_pageHeaderFooter.header = HF_SAME;
571 m_pageHeaderFooter.footer = HF_SAME;
572 m_pageHeaderFooter.ptHeaderBodySpacing = 10;
573 m_pageHeaderFooter.ptFooterBodySpacing = 10;
574 m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
576 KoDocument::openExistingFile( file );
579void KWDocument::openTemplate(
const TQString& file )
581 m_pageColumns.columns = 1;
582 m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
584 m_pageHeaderFooter.header = HF_SAME;
585 m_pageHeaderFooter.footer = HF_SAME;
586 m_pageHeaderFooter.ptHeaderBodySpacing = 10;
587 m_pageHeaderFooter.ptFooterBodySpacing = 10;
588 m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
590 KoDocument::openTemplate( file );
593void KWDocument::initEmpty()
595 m_pageColumns.columns = 1;
596 m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
598 m_pageHeaderFooter.header = HF_SAME;
599 m_pageHeaderFooter.footer = HF_SAME;
600 m_pageHeaderFooter.ptHeaderBodySpacing = 10;
601 m_pageHeaderFooter.ptFooterBodySpacing = 10;
602 m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
604 TQString fileName( locate(
"kword_template",
"Normal/.source/PlainText.kwt" , KWFactory::instance() ) );
605 bool ok = loadNativeFormat( fileName );
607 showLoadingErrorDialog();
609 setModified(
false );
613KoPageLayout KWDocument::pageLayout(
int pageNumber )
const
615 if( pageNumber < startPage())
616 pageNumber = startPage();
617 return pageManager()->pageLayout(pageNumber);
620void KWDocument::setPageLayout(
const KoPageLayout& layout,
const KoColumns& cl,
const KoKWHeaderFooter& hf,
bool updateViews )
622 m_pageLayout = layout;
623 if ( m_processingType == WP ) {
626 if ( m_processingType == DTP || isEmbedded() ) {
627 m_pageLayout.ptLeft = 0;
628 m_pageLayout.ptRight = 0;
629 m_pageLayout.ptTop = 0;
630 m_pageLayout.ptBottom = 0;
632 pageManager()->setDefaultPage(m_pageLayout);
633 m_pageHeaderFooter = hf;
638 updateAllFrames( KWFrameSet::UpdateFramesInPage );
648 emit pageLayoutChanged( m_pageLayout );
649 updateContentsSize();
654double KWDocument::ptColumnWidth()
const
656 KWPage *page = pageManager()->page(pageManager()->startPage());
658 ptColumnSpacing() * ( m_pageColumns.columns - 1 ) )
659 / m_pageColumns.columns;
662class KWFootNoteFrameSetList :
public TQPtrList<KWFootNoteFrameSet>
665 KWFootNoteFrameSetList(
bool reversed ) : m_reversed( reversed ) {}
668 virtual int compareItems(TQPtrCollection::Item a, TQPtrCollection::Item b)
670 KWFootNoteFrameSet* fsa = ((KWFootNoteFrameSet *)a);
671 KWFootNoteFrameSet* fsb = ((KWFootNoteFrameSet *)b);
672 Q_ASSERT( fsa->footNoteVariable() );
673 Q_ASSERT( fsb->footNoteVariable() );
674 if ( fsa->footNoteVariable() && fsb->footNoteVariable() )
676 int numa = fsa->footNoteVariable()->num();
677 int numb = fsb->footNoteVariable()->num();
678 if (numa == numb)
return 0;
679 if (numa > numb)
return m_reversed ? -1 : 1;
680 return m_reversed ? 1 : -1;
689void KWDocument::recalcFrames(
int fromPage,
int toPage , uint flags )
691 fromPage = TQMAX(pageManager()->startPage(), fromPage);
692 if ( m_lstFrameSet.isEmpty() )
695 kdDebug(32002) <<
"KWDocument::recalcFrames from=" << fromPage <<
" to=" << toPage << endl;
697 KWFrameSet *frameset = m_lstFrameSet.getFirst();
699 if ( m_processingType == WP ) {
701 KWTextFrameSet *firstHeader = 0L, *evenHeader = 0L, *oddHeader = 0L;
702 KWTextFrameSet *firstFooter = 0L, *evenFooter = 0L, *oddFooter = 0L;
703 m_bHasEndNotes =
false;
708 KWFootNoteFrameSetList footnotesList(
true );
709 KWFootNoteFrameSetList endnotesList(
false );
710 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
711 for ( ; fit.current() ; ++fit )
713 KWFrameSet * fs = fit.current();
715 case KWFrameSet::FI_FIRST_HEADER:
716 if ( isHeaderVisible() ) {
717 firstHeader =
dynamic_cast<KWTextFrameSet*
>( fs );
718 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
720 case KWFrameSet::FI_ODD_HEADER:
721 if ( isHeaderVisible() ) {
722 oddHeader =
dynamic_cast<KWTextFrameSet*
>( fs );
723 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
725 case KWFrameSet::FI_EVEN_HEADER:
726 if ( isHeaderVisible() ) {
727 evenHeader =
dynamic_cast<KWTextFrameSet*
>( fs );
728 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
730 case KWFrameSet::FI_FIRST_FOOTER:
731 if ( isFooterVisible() ) {
732 firstFooter =
dynamic_cast<KWTextFrameSet*
>( fs );
733 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
735 case KWFrameSet::FI_ODD_FOOTER:
736 if ( isFooterVisible() ) {
737 oddFooter =
dynamic_cast<KWTextFrameSet*
>( fs );
738 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
740 case KWFrameSet::FI_EVEN_FOOTER:
741 if ( isFooterVisible() ) {
742 evenFooter =
dynamic_cast<KWTextFrameSet*
>( fs );
743 }
else { fs->
setVisible(
false ); fs->deleteAllCopies(); }
745 case KWFrameSet::FI_FOOTNOTE: {
746 KWFootNoteFrameSet* fnfs =
dynamic_cast<KWFootNoteFrameSet *
>(fs);
749 if ( fnfs->isFootNote() )
750 footnotesList.append( fnfs );
751 else if ( fnfs->isEndNote() ) {
752 endnotesList.append( fnfs );
753 m_bHasEndNotes =
true;
765 TQPtrList<KWFrameLayout::HeaderFooterFrameset> headerFooterList;
766 headerFooterList.setAutoDelete(
true );
767 const int firstPageNum = startPage();
770 if ( isHeaderVisible() ) {
771 Q_ASSERT( firstHeader );
772 Q_ASSERT( oddHeader );
773 Q_ASSERT( evenHeader );
774 switch ( headerType() ) {
776 oddHeader->setVisible(
true );
777 evenHeader->setVisible(
false );
778 evenHeader->deleteAllCopies();
780 firstHeader->deleteAllCopies();
782 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
783 oddHeader, firstPageNum, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
785 case HF_FIRST_EO_DIFF:
787 oddHeader->setVisible(
true );
788 evenHeader->setVisible(
true );
790 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
791 firstHeader, firstPageNum, firstPageNum, m_pageHeaderFooter.ptHeaderBodySpacing ) );
792 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
793 oddHeader, firstPageNum + 2, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
794 KWFrameLayout::HeaderFooterFrameset::Odd ) );
795 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
796 evenHeader, firstPageNum + 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
797 KWFrameLayout::HeaderFooterFrameset::Even ) );
800 oddHeader->setVisible(
true );
801 evenHeader->setVisible(
false );
802 evenHeader->deleteAllCopies();
805 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
806 firstHeader, firstPageNum, firstPageNum, m_pageHeaderFooter.ptHeaderBodySpacing ) );
807 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
808 oddHeader, firstPageNum + 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
811 oddHeader->setVisible(
true );
812 evenHeader->setVisible(
true );
814 firstHeader->deleteAllCopies();
816 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
817 oddHeader, firstPageNum, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
818 KWFrameLayout::HeaderFooterFrameset::Odd ) );
819 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
820 evenHeader, firstPageNum + 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
821 KWFrameLayout::HeaderFooterFrameset::Even ) );
825 if ( isFooterVisible() ) {
826 Q_ASSERT( firstFooter );
827 Q_ASSERT( oddFooter );
828 Q_ASSERT( evenFooter );
829 switch ( footerType() ) {
831 oddFooter->setVisible(
true );
832 evenFooter->setVisible(
false );
833 evenFooter->deleteAllCopies();
835 firstFooter->deleteAllCopies();
837 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
838 oddFooter, firstPageNum, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
840 case HF_FIRST_EO_DIFF:
842 oddFooter->setVisible(
true );
843 evenFooter->setVisible(
true );
845 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
846 firstFooter, firstPageNum, firstPageNum, m_pageHeaderFooter.ptFooterBodySpacing ) );
847 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
848 oddFooter, firstPageNum + 2, -1, m_pageHeaderFooter.ptFooterBodySpacing,
849 KWFrameLayout::HeaderFooterFrameset::Odd ) );
850 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
851 evenFooter, firstPageNum + 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
852 KWFrameLayout::HeaderFooterFrameset::Even ) );
855 oddFooter->setVisible(
true );
856 evenFooter->setVisible(
false );
857 evenFooter->deleteAllCopies();
860 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
861 firstFooter, firstPageNum, firstPageNum, m_pageHeaderFooter.ptFooterBodySpacing ) );
862 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
863 oddFooter, firstPageNum + 1, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
866 oddFooter->setVisible(
true );
867 evenFooter->setVisible(
true );
869 firstFooter->deleteAllCopies();
871 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
872 oddFooter, firstPageNum, -1, m_pageHeaderFooter.ptFooterBodySpacing,
873 KWFrameLayout::HeaderFooterFrameset::Odd ) );
874 headerFooterList.append(
new KWFrameLayout::HeaderFooterFrameset(
875 evenFooter, firstPageNum + 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
876 KWFrameLayout::HeaderFooterFrameset::Even ) );
888 TQPtrList<KWFrameLayout::HeaderFooterFrameset> footnotesHFList;
889 footnotesHFList.setAutoDelete(
true );
891 footnotesList.sort();
892 TQPtrListIterator<KWFootNoteFrameSet> fnfsIt( footnotesList );
893 for ( ; fnfsIt.current() ; ++fnfsIt )
895 KWFootNoteFrameSet* fnfs = fnfsIt.current();
897 KWFrameLayout::HeaderFooterFrameset* hff =
new KWFrameLayout::HeaderFooterFrameset(
898 fnfs, pageNum, pageNum,
899 m_pageHeaderFooter.ptFootNoteBodySpacing,
900 KWFrameLayout::HeaderFooterFrameset::All );
905 for (TQPtrListIterator<KWFrame> f = fnfs->
frameIterator(); f.current() ; ++f )
906 hff->m_height += f.current()->height();
908 footnotesHFList.append( hff );
912 TQPtrList<KWFrameLayout::HeaderFooterFrameset> endnotesHFList;
913 endnotesHFList.setAutoDelete(
true );
916 TQPtrListIterator<KWFootNoteFrameSet> enfsIt( endnotesList );
917 for ( ; enfsIt.current() ; ++enfsIt )
919 KWFootNoteFrameSet* enfs = enfsIt.current();
920 KWFrameLayout::HeaderFooterFrameset* hff =
new KWFrameLayout::HeaderFooterFrameset(
922 m_pageHeaderFooter.ptFootNoteBodySpacing,
923 KWFrameLayout::HeaderFooterFrameset::All );
927 for (TQPtrListIterator<KWFrame> f = enfs->
frameIterator(); f.current() ; ++f )
928 hff->m_height += f.current()->height();
930 endnotesHFList.append( hff );
934 double maxBottom = 0;
935 for (TQPtrListIterator<KWFrameSet> fsit = framesetsIterator(); fsit.current() ; ++fsit ) {
936 KWFrameSet *fs = fsit.current();
937 if ( !fs->
isVisible() || fs->isAHeader() || !fs->isAFooter() ||
940 for (TQPtrListIterator<KWFrame> fit = fs->
frameIterator(); fit.current() ; ++fit )
941 maxBottom = TQMAX(maxBottom, fit.current()->bottom());
943 KWPage *last = pageManager()->page(lastPage());
945 while(docHeight <= maxBottom) {
946 last = pageManager()->appendPage();
947 docHeight += last->
height();
949 int oldPages = pageCount();
953 if ( fromPage > toPage )
955 KWFrameLayout frameLayout(
this, headerFooterList, footnotesHFList, endnotesHFList );
956 frameLayout.layout( frameset, m_pageColumns.columns, fromPage, toPage, flags );
960 if ( pageCount() != oldPages && !m_bGeneratingPreview )
963 emit newContentsSize();
964 emit numPagesChanged();
965 recalcVariables( VT_PGNUM );
972 for (TQPtrListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
973 if(fit.current()->isDeleted())
continue;
974 if(fit.current()->frameSetInfo()==KWFrameSet::FI_BODY && !fit.current()->isFloating()) {
975 KWFrameSet * fs = fit.current();
976 for (TQPtrListIterator<KWFrame> f = fs->
frameIterator(); f.current() ; ++f )
977 maxBottom=TQMAX(maxBottom, f.current()->bottom());
980 KWPage *last = pageManager()->page(lastPage());
984 while(docHeight <= maxBottom) {
985 last = pageManager()->appendPage();
986 docHeight += last->
height();
990 toPage = pageCount() - 1;
993 kdDebug(32002) <<
" ~recalcFrames" << endl;
996bool KWDocument::loadChildren( KoStore *store )
999 TQPtrListIterator<KoDocumentChild> it( children() );
1000 for( ; it.current(); ++it ) {
1001 if ( !it.current()->loadDocument( store ) )
1008void KWDocument::loadPictureMap ( TQDomElement& domElement )
1010 m_pictureMap.clear();
1013 TQDomElement picturesElem = domElement.namedItem(
"PICTURES" ).toElement();
1014 if ( !picturesElem.isNull() )
1016 m_pictureCollection->readXML( picturesElem, m_pictureMap );
1020 TQDomElement pixmapsElem = domElement.namedItem(
"PIXMAPS" ).toElement();
1021 if ( !pixmapsElem.isNull() )
1023 m_pictureCollection->readXML( pixmapsElem, m_pictureMap );
1027 TQDomElement clipartsElem = domElement.namedItem(
"CLIPARTS" ).toElement();
1028 if ( !clipartsElem.isNull() )
1030 m_pictureCollection->readXML( pixmapsElem, m_pictureMap );
1035bool KWDocument::loadOasis(
const TQDomDocument& doc, KoOasisStyles& oasisStyles,
const TQDomDocument& settings, KoStore* store )
1039 emit sigProgress( 0 );
1041 kdDebug(32001) <<
"KWDocument::loadOasis" << endl;
1043 TQDomElement content = doc.documentElement();
1044 TQDomElement realBody ( KoDom::namedItemNS( content, KoXmlNS::office,
"body" ) );
1045 if ( realBody.isNull() )
1047 kdError(32001) <<
"No office:body found!" << endl;
1048 setErrorMessage( i18n(
"Invalid OASIS OpenDocument file. No office:body tag found." ) );
1051 TQDomElement body = KoDom::namedItemNS( realBody, KoXmlNS::office,
"text" );
1052 if ( body.isNull() )
1054 kdError(32001) <<
"No office:text found!" << endl;
1055 TQDomElement childElem;
1057 forEachElement( childElem, realBody ) {
1058 localName = childElem.localName();
1060 if ( localName.isEmpty() )
1061 setErrorMessage( i18n(
"Invalid OASIS OpenDocument file. No tag found inside office:body." ) );
1063 setErrorMessage( i18n(
"This is not a word processing document, but %1. Please try opening it with the appropriate application." ).arg( KoDocument::tagNameToDocumentType( localName ) ) );
1069 KoOasisContext context(
this, *m_varColl, oasisStyles, store );
1071 createLoadingInfo();
1077 m_loadingInfo->m_currentMasterPage =
"Standard";
1078 if ( !loadOasisPageLayout( m_loadingInfo->m_currentMasterPage, context ) )
1081 KWOasisLoader oasisLoader(
this );
1084 m_processingType = ( !KoDom::namedItemNS( body, KoXmlNS::text,
"page-sequence" ).isNull() )
1088 m_tabStop = MM_TO_POINT(15);
1089 const TQDomElement* defaultParagStyle = oasisStyles.defaultStyle(
"paragraph" );
1090 if ( defaultParagStyle ) {
1092 stack.push( *defaultParagStyle );
1093 stack.setTypeProperties(
"paragraph" );
1094 TQString tabStopVal = stack.attributeNS( KoXmlNS::style,
"tab-stop-distance" );
1095 if ( !tabStopVal.isEmpty() )
1096 m_tabStop = KoUnit::parseValue( tabStopVal );
1098 m_initialEditing = 0;
1104 if ( !isReadWrite())
1105 m_varColl->variableSetting()->setDisplayFieldCode(
false);
1108 m_styleColl->loadOasisStyles( context );
1109 if ( m_frameStyleColl->loadOasisStyles( context ) == 0 ) {
1111 loadDefaultFrameStyleTemplates();
1114 if ( m_tableStyleColl->loadOasisStyles( context, *m_styleColl, *m_frameStyleColl ) == 0 ) {
1116 loadDefaultTableStyleTemplates();
1119 static_cast<KWVariableSettings *
>( m_varColl->variableSetting() )
1120 ->loadNoteConfiguration( oasisStyles.officeStyle() );
1122 loadDefaultTableTemplates();
1124 if ( m_processingType == WP ) {
1126 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"Main Text Frameset" ) );
1127 m_lstFrameSet.append( fs );
1129 KWFrame* frame =
new KWFrame( fs, 29, 42, 566-29, 798-42 );
1130 frame->setFrameBehavior( KWFrame::AutoCreateNewFrame );
1131 frame->setNewFrameBehavior( KWFrame::Reconnect );
1132 fs->addFrame( frame );
1135 const TQDomElement* masterPage = context.oasisStyles().masterPages()[ m_loadingInfo->m_currentMasterPage ];
1136 const TQDomElement *masterPageStyle = masterPage ? context.oasisStyles().findStyle(masterPage->attributeNS( KoXmlNS::style,
"page-layout-name", TQString() ) ) : 0;
1137 if ( masterPageStyle )
1139 KoStyleStack styleStack;
1140 styleStack.push( *masterPageStyle );
1141 styleStack.setTypeProperties(
"page-layout" );
1142 frame->loadBorderProperties( styleStack );
1149 forEachElement( tag, body )
1151 context.styleStack().save();
1152 const TQString localName = tag.localName();
1153 if ( localName ==
"page-sequence" && tag.namespaceURI() == KoXmlNS::text )
1159 forEachElement( page, tag )
1161 kdDebug() <<
"DTP mode: found " << pages <<
"pages" << endl;
1164 else if ( localName ==
"frame" && tag.namespaceURI() == KoXmlNS::draw )
1165 oasisLoader.loadFrame( tag, context, KoPoint() );
1167 kdWarning(32001) <<
"Unsupported tag in DTP loading:" << tag.tagName() << endl;
1171 if ( !loadMasterPageStyle( m_loadingInfo->m_currentMasterPage, context ) )
1174 if ( context.cursorTextParagraph() ) {
1178 m_initialEditing =
new InitialEditing();
1179 KWTextFrameSet* fs =
static_cast<KWTextDocument *
>( context.cursorTextParagraph()->textDocument() )->textFrameSet();
1180 m_initialEditing->m_initialFrameSet = fs->
name();
1181 m_initialEditing->m_initialCursorParag = context.cursorTextParagraph()->paragId();
1182 m_initialEditing->m_initialCursorIndex = context.cursorTextIndex();
1185 if ( !settings.isNull() )
1187 oasisLoader.loadOasisSettings( settings );
1190 kdDebug(32001) <<
"Loading took " << (float)(dt.elapsed()) / 1000 <<
" seconds" << endl;
1195 setPageLayout( m_pageLayout, m_loadingInfo->columns, m_loadingInfo->hf,
false );
1201bool KWDocument::loadOasisPageLayout(
const TQString& masterPageName, KoOasisContext& context )
1203 KoColumns& columns = m_loadingInfo->columns;
1205 const KoOasisStyles& oasisStyles = context.oasisStyles();
1206 const TQDomElement* masterPage = oasisStyles.masterPages()[ masterPageName ];
1207 Q_ASSERT( masterPage );
1208 const TQDomElement *masterPageStyle = masterPage ? oasisStyles.findStyle( masterPage->attributeNS( KoXmlNS::style,
"page-layout-name", TQString() ) ) : 0;
1209 Q_ASSERT( masterPageStyle );
1210 if ( masterPageStyle )
1212 m_pageLayout.loadOasis( *masterPageStyle );
1213 pageManager()->setDefaultPage(m_pageLayout);
1215 const TQDomElement properties( KoDom::namedItemNS( *masterPageStyle, KoXmlNS::style,
"page-layout-properties" ) );
1216 const TQDomElement footnoteSep = KoDom::namedItemNS( properties, KoXmlNS::style,
"footnote-sep" );
1217 if ( !footnoteSep.isNull() ) {
1221 const TQString width = footnoteSep.attributeNS( KoXmlNS::style,
"width", TQString() );
1222 if ( !width.isEmpty() ) {
1223 m_footNoteSeparatorLineWidth = KoUnit::parseValue( width );
1226 TQString pageWidth = footnoteSep.attributeNS( KoXmlNS::style,
"rel-width", TQString() );
1227 if ( pageWidth.endsWith(
"%" ) ) {
1228 pageWidth.truncate( pageWidth.length() - 1 );
1229 m_iFootNoteSeparatorLineLength = tqRound( pageWidth.toDouble() );
1233 const TQString style = footnoteSep.attributeNS( KoXmlNS::style,
"line-style", TQString() );
1234 if ( style ==
"solid" || style.isEmpty() )
1235 m_footNoteSeparatorLineType = SLT_SOLID;
1236 else if ( style ==
"dash" )
1237 m_footNoteSeparatorLineType = SLT_DASH;
1238 else if ( style ==
"dotted" )
1239 m_footNoteSeparatorLineType = SLT_DOT;
1240 else if ( style ==
"dot-dash" )
1241 m_footNoteSeparatorLineType = SLT_DASH_DOT;
1242 else if ( style ==
"dot-dot-dash" )
1243 m_footNoteSeparatorLineType = SLT_DASH_DOT_DOT;
1245 kdDebug() <<
"Unknown value for m_footNoteSeparatorLineType: " << style << endl;
1247 const TQString pos = footnoteSep.attributeNS( KoXmlNS::style,
"adjustment", TQString() );
1248 if ( pos ==
"centered" )
1249 m_footNoteSeparatorLinePos = SLP_CENTERED;
1250 else if ( pos ==
"right")
1251 m_footNoteSeparatorLinePos = SLP_RIGHT;
1253 m_footNoteSeparatorLinePos = SLP_LEFT;
1256 const TQDomElement columnsElem = KoDom::namedItemNS( properties, KoXmlNS::style,
"columns" );
1257 if ( !columnsElem.isNull() )
1259 columns.columns = columnsElem.attributeNS( KoXmlNS::fo,
"column-count", TQString() ).toInt();
1260 if ( columns.columns == 0 )
1261 columns.columns = 1;
1265 if ( columnsElem.hasAttributeNS( KoXmlNS::fo,
"column-gap" ) )
1266 columns.ptColumnSpacing = KoUnit::parseValue( columnsElem.attributeNS( KoXmlNS::fo,
"column-gap", TQString() ) );
1270 m_headerVisible =
false;
1271 m_footerVisible =
false;
1280 columns.columns = 1;
1281 columns.ptColumnSpacing = 2;
1282 m_headerVisible =
false;
1283 m_footerVisible =
false;
1284 m_pageLayout = KoPageLayout::standardLayout();
1285 pageManager()->setDefaultPage(m_pageLayout);
1290bool KWDocument::loadMasterPageStyle(
const TQString& masterPageName, KoOasisContext& context )
1292 const KoOasisStyles& oasisStyles = context.oasisStyles();
1293 const TQDomElement* masterPage = oasisStyles.masterPages()[ masterPageName ];
1294 Q_ASSERT( masterPage );
1295 const TQDomElement *masterPageStyle = masterPage ? oasisStyles.findStyle( masterPage->attributeNS( KoXmlNS::style,
"page-layout-name", TQString() ) ) : 0;
1296 Q_ASSERT( masterPageStyle );
1300 if ( m_pageLayout.ptWidth <= 1e-13 || m_pageLayout.ptHeight <= 1e-13 )
1303 TQDomElement properties( KoDom::namedItemNS( *masterPageStyle, KoXmlNS::style,
"page-layout-properties" ) );
1309 if ( properties.hasAttributeNS(
"http://www.w3.org/1999/XSL/Format",
"page-width" ) )
1310 setErrorMessage( i18n(
"Invalid document. 'fo' has the wrong namespace. The application which produced this document is not OASIS-compliant." ) );
1312 setErrorMessage( i18n(
"Invalid document. Paper size: %1x%2" ).arg( m_pageLayout.ptWidth ).arg( m_pageLayout.ptHeight ) );
1317 KoKWHeaderFooter& hf = m_loadingInfo->hf;
1319 bool hasEvenOddHeader =
false;
1320 bool hasEvenOddFooter =
false;
1321 if ( masterPageStyle )
1323 KWOasisLoader oasisLoader(
this );
1325 TQDomElement headerStyle = KoDom::namedItemNS( *masterPageStyle, KoXmlNS::style,
"header-style" );
1326 TQDomElement footerStyle = KoDom::namedItemNS( *masterPageStyle, KoXmlNS::style,
"footer-style" );
1327 TQDomElement headerLeftElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"header-left" );
1328 TQDomElement headerFirstElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"header-first" );
1329 const bool hasFirstHeader = !headerFirstElem.isNull();
1330 if ( !headerLeftElem.isNull() )
1332 hasEvenOddHeader =
true;
1333 hf.header = hasFirstHeader ? HF_FIRST_EO_DIFF : HF_EO_DIFF;
1334 oasisLoader.loadOasisHeaderFooter( headerLeftElem, hasEvenOddHeader, headerStyle, context );
1338 hf.header = hasFirstHeader ? HF_FIRST_DIFF : HF_SAME;
1340 if ( hasFirstHeader )
1342 oasisLoader.loadOasisHeaderFooter( headerFirstElem, hasEvenOddHeader, headerStyle, context );
1345 TQDomElement headerElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"header" );
1346 if ( !headerElem.isNull() )
1348 oasisLoader.loadOasisHeaderFooter( headerElem, hasEvenOddHeader, headerStyle, context );
1353 TQDomElement footerLeftElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"footer-left" );
1354 TQDomElement footerFirstElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"footer-first" );
1355 const bool hasFirstFooter = !footerFirstElem.isNull();
1356 if ( !footerLeftElem.isNull() )
1358 hasEvenOddFooter =
true;
1359 hf.footer = hasFirstFooter ? HF_FIRST_EO_DIFF : HF_EO_DIFF;
1360 oasisLoader.loadOasisHeaderFooter( footerLeftElem, hasEvenOddFooter, footerStyle, context );
1364 hf.footer = hasFirstFooter ? HF_FIRST_DIFF : HF_SAME;
1366 if ( hasFirstFooter )
1368 oasisLoader.loadOasisHeaderFooter( footerFirstElem, hasEvenOddFooter, footerStyle, context );
1370 TQDomElement footerElem = KoDom::namedItemNS( *masterPage, KoXmlNS::style,
"footer" );
1371 if ( !footerElem.isNull() )
1373 oasisLoader.loadOasisHeaderFooter( footerElem, hasEvenOddFooter, footerStyle, context );
1378 if ( !headerStyle.isNull() ) {
1379 context.styleStack().push( headerStyle );
1380 context.styleStack().setTypeProperties(
"header-footer" );
1381 hf.ptHeaderBodySpacing = KoUnit::parseValue( context.styleStack().attributeNS( KoXmlNS::fo,
"margin-bottom" ) );
1382 context.styleStack().pop();
1386 if ( !footerStyle.isNull() ) {
1387 context.styleStack().push( footerStyle );
1388 context.styleStack().setTypeProperties(
"header-footer" );
1389 hf.ptFooterBodySpacing = KoUnit::parseValue( context.styleStack().attributeNS( KoXmlNS::fo,
"margin-top" ) );
1390 context.styleStack().pop();
1401void KWDocument::clear()
1403 m_pictureMap.clear();
1404 m_textImageRequests.clear();
1405 m_pictureRequests.clear();
1406 m_anchorRequests.clear();
1407 m_footnoteVarRequests.clear();
1408 m_spellCheckIgnoreList.clear();
1410 m_pageHeaderFooter.header = HF_SAME;
1411 m_pageHeaderFooter.footer = HF_SAME;
1412 m_pageHeaderFooter.ptHeaderBodySpacing = 10;
1413 m_pageHeaderFooter.ptFooterBodySpacing = 10;
1414 m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
1415 m_pageColumns.columns = 1;
1416 m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
1417 m_bHasEndNotes =
false;
1419 m_iFootNoteSeparatorLineLength = 20;
1420 m_footNoteSeparatorLineWidth = 0.5;
1421 m_footNoteSeparatorLineType = SLT_SOLID;
1423 m_lstFrameSet.clear();
1426 m_pictureCollection->clear();
1427 m_varFormatCollection->clear();
1429 m_styleColl->clear();
1430 m_frameStyleColl->clear();
1431 m_tableStyleColl->clear();
1432 m_tableTemplateColl->clear();
1436 KoParagStyle * standardStyle =
new KoParagStyle(
"Standard" );
1438 standardStyle->format().setFont( m_defaultFont );
1439 m_styleColl->addStyle( standardStyle );
1442 KWFrameStyle * standardFrameStyle =
new KWFrameStyle(
"Plain" );
1443 standardFrameStyle->setBackgroundColor(TQt::white);
1444 standardFrameStyle->setTopBorder(KoBorder(TQt::black,KoBorder::SOLID,0));
1445 standardFrameStyle->setRightBorder(KoBorder(TQt::black,KoBorder::SOLID,0));
1446 standardFrameStyle->setLeftBorder(KoBorder(TQt::black,KoBorder::SOLID,0));
1447 standardFrameStyle->setBottomBorder(KoBorder(TQt::black,KoBorder::SOLID,0));
1448 m_frameStyleColl->addStyle( standardFrameStyle );
1451 KWTableStyle *standardTableStyle =
new KWTableStyle(
"Plain", standardStyle, standardFrameStyle );
1452 m_tableStyleColl->addStyle( standardTableStyle );
1455bool KWDocument::loadXML( TQIODevice *,
const TQDomDocument & doc )
1459 emit sigProgress( 0 );
1460 kdDebug(32001) <<
"KWDocument::loadXML" << endl;
1463 KoPageLayout pgLayout;
1465 columns.columns = 1;
1466 columns.ptColumnSpacing = m_defaultColumnSpacing;
1467 KoKWHeaderFooter hf;
1468 hf.header = HF_SAME;
1469 hf.footer = HF_SAME;
1470 hf.ptHeaderBodySpacing = 10.0;
1471 hf.ptFooterBodySpacing = 10.0;
1472 hf.ptFootNoteBodySpacing = 10.0;
1475 TQDomElement word = doc.documentElement();
1477 value = KWDocument::getAttribute( word,
"mime", TQString() );
1478 if ( value.isEmpty() )
1480 kdError(32001) <<
"No mime type specified!" << endl;
1481 setErrorMessage( i18n(
"Invalid document. No mimetype specified." ) );
1484 else if ( value !=
"application/x-kword" && value !=
"application/vnd.kde.kword" )
1486 kdError(32001) <<
"Unknown mime type " << value << endl;
1487 setErrorMessage( i18n(
"Invalid document. Expected mimetype application/x-kword or application/vnd.kde.kword, got %1" ).arg( value ) );
1490 m_syntaxVersion = KWDocument::getAttribute( word,
"syntaxVersion", 0 );
1491 if ( m_syntaxVersion > CURRENT_SYNTAX_VERSION )
1493 int ret = KMessageBox::warningContinueCancel(
1494 0, i18n(
"This document was created with a newer version of KWord (syntax version: %1)\n"
1495 "Opening it in this version of KWord will lose some information.").arg(m_syntaxVersion),
1496 i18n(
"File Format Mismatch"), KStdGuiItem::cont() );
1497 if ( ret == KMessageBox::Cancel )
1499 setErrorMessage(
"USER_CANCELED" );
1504 createLoadingInfo();
1508 value = KWDocument::getAttribute( word,
"url", TQString() );
1509 if ( !value.isNull() )
1511 m_urlIntern = KURL( value ).path();
1514 emit sigProgress(5);
1517 TQDomElement paper = word.namedItem(
"PAPER" ).toElement();
1518 if ( !paper.isNull() )
1520 pgLayout.format =
static_cast<KoFormat
>( KWDocument::getAttribute( paper,
"format", 0 ) );
1521 pgLayout.orientation =
static_cast<KoOrientation
>( KWDocument::getAttribute( paper,
"orientation", 0 ) );
1522 pgLayout.ptWidth = getAttribute( paper,
"width", 0.0 );
1523 pgLayout.ptHeight = getAttribute( paper,
"height", 0.0 );
1524 kdDebug() <<
" ptWidth=" << pgLayout.ptWidth << endl;
1525 kdDebug() <<
" ptHeight=" << pgLayout.ptHeight << endl;
1526 if ( pgLayout.ptWidth <= 0 || pgLayout.ptHeight <= 0 )
1529 pgLayout.ptWidth = getAttribute( paper,
"ptWidth", 0.0 );
1530 pgLayout.ptHeight = getAttribute( paper,
"ptHeight", 0.0 );
1531 kdDebug() <<
" ptWidth=" << pgLayout.ptWidth << endl;
1532 kdDebug() <<
" ptHeight=" << pgLayout.ptHeight << endl;
1535 if ( pgLayout.ptWidth <= 0 || pgLayout.ptHeight <= 0 )
1537 setErrorMessage( i18n(
"Invalid document. Paper size: %1x%2" )
1538 .arg( pgLayout.ptWidth ).arg( pgLayout.ptHeight ) );
1543 hf.header =
static_cast<KoHFType
>( KWDocument::getAttribute( paper,
"hType", 0 ) );
1544 hf.footer =
static_cast<KoHFType
>( KWDocument::getAttribute( paper,
"fType", 0 ) );
1545 hf.ptHeaderBodySpacing = getAttribute( paper,
"spHeadBody", 0.0 );
1546 hf.ptFooterBodySpacing = getAttribute( paper,
"spFootBody", 0.0 );
1547 hf.ptFootNoteBodySpacing = getAttribute( paper,
"spFootNoteBody", 10.0 );
1548 m_iFootNoteSeparatorLineLength = getAttribute( paper,
"slFootNoteLength", 20);
1549 if ( paper.hasAttribute(
"slFootNoteWidth" ) )
1550 m_footNoteSeparatorLineWidth = paper.attribute(
"slFootNoteWidth" ).toDouble();
1551 m_footNoteSeparatorLineType =
static_cast<SeparatorLineLineType
>(getAttribute( paper,
"slFootNoteType",0));
1553 if ( paper.hasAttribute(
"slFootNotePosition"))
1555 TQString tmp =paper.attribute(
"slFootNotePosition");
1556 if ( tmp ==
"centered" )
1557 m_footNoteSeparatorLinePos = SLP_CENTERED;
1558 else if ( tmp ==
"right")
1559 m_footNoteSeparatorLinePos = SLP_RIGHT;
1560 else if ( tmp ==
"left" )
1561 m_footNoteSeparatorLinePos = SLP_LEFT;
1563 columns.columns = KWDocument::getAttribute( paper,
"columns", 1 );
1564 columns.ptColumnSpacing = KWDocument::getAttribute( paper,
"columnspacing", 0.0 );
1573 if ( pgLayout.ptWidth == 0.0 )
1574 pgLayout.ptWidth = getAttribute( paper,
"ptWidth", 0.0 );
1575 if ( pgLayout.ptHeight == 0.0 )
1576 pgLayout.ptHeight = getAttribute( paper,
"ptHeight", 0.0 );
1577 if ( hf.ptHeaderBodySpacing == 0.0 )
1578 hf.ptHeaderBodySpacing = getAttribute( paper,
"ptHeadBody", 0.0 );
1579 if ( hf.ptFooterBodySpacing == 0.0 )
1580 hf.ptFooterBodySpacing = getAttribute( paper,
"ptFootBody", 0.0 );
1581 if ( columns.ptColumnSpacing == 0.0 )
1582 columns.ptColumnSpacing = getAttribute( paper,
"ptColumnspc", 0.0 );
1585 TQDomElement paperborders = paper.namedItem(
"PAPERBORDERS" ).toElement();
1586 if ( !paperborders.isNull() )
1588 pgLayout.ptLeft = getAttribute( paperborders,
"left", 0.0 );
1589 pgLayout.ptTop = getAttribute( paperborders,
"top", 0.0 );
1590 pgLayout.ptRight = getAttribute( paperborders,
"right", 0.0 );
1591 pgLayout.ptBottom = getAttribute( paperborders,
"bottom", 0.0 );
1594 if ( pgLayout.ptLeft == 0.0 )
1595 pgLayout.ptLeft = getAttribute( paperborders,
"ptLeft", 0.0 );
1596 if ( pgLayout.ptTop == 0.0 )
1597 pgLayout.ptTop = getAttribute( paperborders,
"ptTop", 0.0 );
1598 if ( pgLayout.ptRight == 0.0 )
1599 pgLayout.ptRight = getAttribute( paperborders,
"ptRight", 0.0 );
1600 if ( pgLayout.ptBottom == 0.0 )
1601 pgLayout.ptBottom = getAttribute( paperborders,
"ptBottom", 0.0 );
1604 kdWarning() <<
"No <PAPERBORDERS> tag!" << endl;
1607 kdWarning() <<
"No <PAPER> tag! This is a mandatory tag! Expect weird page sizes..." << endl;
1610 TQDomElement attributes = word.namedItem(
"ATTRIBUTES" ).toElement();
1611 if ( !attributes.isNull() )
1613 m_processingType =
static_cast<ProcessingType
>( KWDocument::getAttribute( attributes,
"processing", 0 ) );
1615 m_headerVisible =
static_cast<bool>( KWDocument::getAttribute( attributes,
"hasHeader", 0 ) );
1616 m_footerVisible =
static_cast<bool>( KWDocument::getAttribute( attributes,
"hasFooter", 0 ) );
1617 if ( attributes.hasAttribute(
"unit" ) )
1618 setUnit( KoUnit::unit( attributes.attribute(
"unit" ) ) );
1619 m_hasTOC =
static_cast<bool>(KWDocument::getAttribute( attributes,
"hasTOC", 0 ) );
1620 m_tabStop = KWDocument::getAttribute( attributes,
"tabStopValue", MM_TO_POINT(15) );
1621 m_initialEditing =
new InitialEditing();
1622 m_initialEditing->m_initialFrameSet = attributes.attribute(
"activeFrameset" );
1623 m_initialEditing->m_initialCursorParag = attributes.attribute(
"cursorParagraph" ).toInt();
1624 m_initialEditing->m_initialCursorIndex = attributes.attribute(
"cursorIndex" ).toInt();
1626 m_processingType = WP;
1627 m_headerVisible =
false;
1628 m_footerVisible =
false;
1630 m_tabStop = MM_TO_POINT(15);
1631 delete m_initialEditing;
1632 m_initialEditing = 0L;
1635 setPageLayout( pgLayout, columns, hf,
false );
1637 variableCollection()->variableSetting()->load(word );
1639 if ( !isReadWrite())
1640 variableCollection()->variableSetting()->setDisplayFieldCode(
false);
1642 emit sigProgress(10);
1644 TQDomElement mailmerge = word.namedItem(
"MAILMERGE" ).toElement();
1645 if (mailmerge!=TQDomElement())
1647 m_slDataBase->load(mailmerge);
1650 emit sigProgress(15);
1653 TQDomElement stylesElem = word.namedItem(
"STYLES" ).toElement();
1654 if ( !stylesElem.isNull() )
1655 loadStyleTemplates( stylesElem );
1657 emit sigProgress(17);
1659 TQDomElement frameStylesElem = word.namedItem(
"FRAMESTYLES" ).toElement();
1660 if ( !frameStylesElem.isNull() )
1661 loadFrameStyleTemplates( frameStylesElem );
1663 loadDefaultFrameStyleTemplates();
1665 emit sigProgress(18);
1667 TQDomElement tableStylesElem = word.namedItem(
"TABLESTYLES" ).toElement();
1668 if ( !tableStylesElem.isNull() )
1669 loadTableStyleTemplates( tableStylesElem );
1671 loadDefaultTableStyleTemplates();
1673 emit sigProgress(19);
1675 loadDefaultTableTemplates();
1677 emit sigProgress(20);
1679 TQDomElement bookmark = word.namedItem(
"BOOKMARKS" ).toElement();
1680 if( !bookmark.isNull() )
1682 TQDomElement bookmarkitem = word.namedItem(
"BOOKMARKS").toElement();
1683 bookmarkitem = bookmarkitem.firstChild().toElement();
1685 while ( !bookmarkitem.isNull() )
1687 if ( bookmarkitem.tagName() ==
"BOOKMARKITEM" )
1689 KWLoadingInfo::BookMark bk;
1690 bk.bookname=bookmarkitem.attribute(
"name");
1691 bk.cursorStartIndex=bookmarkitem.attribute(
"cursorIndexStart").toInt();
1692 bk.frameSetName=bookmarkitem.attribute(
"frameset");
1693 bk.paragStartIndex = bookmarkitem.attribute(
"startparag").toInt();
1694 bk.paragEndIndex = bookmarkitem.attribute(
"endparag").toInt();
1695 bk.cursorEndIndex = bookmarkitem.attribute(
"cursorIndexEnd").toInt();
1696 Q_ASSERT( m_loadingInfo );
1697 m_loadingInfo->bookMarkList.append( bk );
1699 bookmarkitem = bookmarkitem.nextSibling().toElement();
1704 TQDomElement spellCheckIgnore = word.namedItem(
"SPELLCHECKIGNORELIST" ).toElement();
1705 if( !spellCheckIgnore.isNull() )
1707 TQDomElement spellWord=word.namedItem(
"SPELLCHECKIGNORELIST").toElement();
1708 spellWord=spellWord.firstChild().toElement();
1709 while ( !spellWord.isNull() )
1711 if ( spellWord.tagName()==
"SPELLCHECKIGNOREWORD" )
1712 lst.append(spellWord.attribute(
"word"));
1713 spellWord=spellWord.nextSibling().toElement();
1716 setSpellCheckIgnoreList( lst );
1718 emit sigProgress(25);
1721 TQDomElement framesets = word.namedItem(
"FRAMESETS" ).toElement();
1722 if ( !framesets.isNull() )
1723 loadFrameSets( framesets );
1725 emit sigProgress(85);
1727 loadPictureMap( word );
1729 emit sigProgress(90);
1732 loadEmbeddedObjects( word );
1734 emit sigProgress(100);
1736 kdDebug(32001) <<
"Loading took " << (float)(dt.elapsed()) / 1000 <<
" seconds" << endl;
1742void KWDocument::endOfLoading()
1745 double maxBottom = 0;
1746 for (TQPtrListIterator<KWFrameSet> fsit = framesetsIterator(); fsit.current() ; ++fsit ) {
1747 KWFrameSet *fs = fsit.current();
1748 for (TQPtrListIterator<KWFrame> fit = fs->
frameIterator(); fit.current() ; ++fit ) {
1749 KWFrame *frame = fit.current();
1750 maxBottom = TQMAX(maxBottom, frame->bottom());
1753 KWPage *last = pageManager()->page(lastPage());
1755 while(docHeight <= maxBottom) {
1756 kdDebug(32001) <<
"KWDocument::loadXML appends a page\n";
1757 last = pageManager()->appendPage();
1758 docHeight += last->
height();
1761 bool first_footer =
false, even_footer =
false, odd_footer =
false;
1762 bool first_header =
false, even_header =
false, odd_header =
false;
1764 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
1765 for ( ; fit.current() ; ++fit )
1767 switch( fit.current()->frameSetInfo() ) {
1768 case KWFrameSet::FI_FIRST_HEADER: first_header =
true;
break;
1769 case KWFrameSet::FI_ODD_HEADER: odd_header =
true;
break;
1770 case KWFrameSet::FI_EVEN_HEADER: even_header =
true;
break;
1771 case KWFrameSet::FI_FIRST_FOOTER: first_footer =
true;
break;
1772 case KWFrameSet::FI_ODD_FOOTER: odd_footer =
true;
break;
1773 case KWFrameSet::FI_EVEN_FOOTER: even_footer =
true;
break;
1774 case KWFrameSet::FI_FOOTNOTE:
break;
1782 uint newFramesetsIndex = m_lstFrameSet.isEmpty() ? 0 : 1;
1784 if ( !first_header ) {
1785 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"First Page Header" ) );
1788 KWPage *page = pageManager()->page(startPage());
1792 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1793 frame->setNewFrameBehavior( KWFrame::Copy );
1794 fs->addFrame( frame );
1795 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1798 if ( !odd_header ) {
1799 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"Odd Pages Header" ) );
1802 KWPage *page = pageManager()->page(TQMIN(startPage()+2, lastPage()));
1806 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1807 frame->setNewFrameBehavior( KWFrame::Copy );
1808 fs->addFrame( frame );
1809 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1812 if ( !even_header ) {
1813 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"Even Pages Header" ) );
1816 KWPage *page = pageManager()->page(TQMIN(startPage()+1, lastPage()));
1820 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1821 frame->setNewFrameBehavior( KWFrame::Copy );
1822 fs->addFrame( frame );
1823 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1826 if ( !first_footer ) {
1827 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"First Page Footer" ) );
1830 KWPage *page = pageManager()->page(pageManager()->startPage());
1834 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1835 frame->setNewFrameBehavior( KWFrame::Copy );
1836 fs->addFrame( frame );
1837 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1840 if ( !odd_footer ) {
1841 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"Odd Pages Footer" ) );
1844 KWPage *page = pageManager()->page(TQMIN(startPage()+2, lastPage()));
1848 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1849 frame->setNewFrameBehavior( KWFrame::Copy );
1850 fs->addFrame( frame );
1851 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1854 if ( !even_footer ) {
1855 KWTextFrameSet *fs =
new KWTextFrameSet(
this, i18n(
"Even Pages Footer" ) );
1858 KWPage *page = pageManager()->page(TQMIN(startPage()+1, lastPage()));
1862 frame->setFrameBehavior( KWFrame::AutoExtendFrame );
1863 frame->setNewFrameBehavior( KWFrame::Copy );
1864 fs->addFrame( frame );
1865 m_lstFrameSet.insert( newFramesetsIndex++, fs );
1869 for (
int i = frameSetCount()-1; i>-1; i--) {
1870 KWFrameSet *fs = frameSet(i);
1872 kdWarning() <<
"frameset " << i <<
" is NULL!!" << endl;
1873 m_lstFrameSet.remove(i);
1876 if( fs->
type()==FT_TABLE) {
1877 static_cast<KWTableFrameSet *
>( fs )->validate();
1878 }
else if (fs->
type() == FT_TEXT) {
1880 KWFrame *frame = fs->
frame(f);
1881 if(frame->left() < 0) {
1882 kdWarning() << fs->
name() <<
" frame " << f <<
" pos.x is < 0, moving frame" << endl;
1883 frame->moveBy( 0- frame->left(), 0);
1885 if(frame->right() > m_pageLayout.ptWidth) {
1886 kdWarning() << fs->
name() <<
" frame " << f <<
" rightborder outside page ("
1887 << frame->right() <<
">" << m_pageLayout.ptWidth <<
"), shrinking" << endl;
1888 frame->setRight(m_pageLayout.ptWidth);
1890 if(fs->isProtectSize())
1892 if(frame->height() < s_minFrameHeight) {
1893 kdWarning() << fs->
name() <<
" frame " << f <<
" height is so small no text will fit, adjusting (was: "
1894 << frame->height() <<
" is: " << s_minFrameHeight <<
")" << endl;
1895 frame->setHeight(s_minFrameHeight);
1897 if(frame->width() < s_minFrameWidth) {
1898 kdWarning() << fs->
name() <<
" frame " << f <<
" width is so small no text will fit, adjusting (was: "
1899 << frame->width() <<
" is: " << s_minFrameWidth <<
")" << endl;
1900 frame->setWidth(s_minFrameWidth);
1904 KWPage *page = pageManager()->page(startPage());
1909 fs->addFrame( frame );
1912 kdWarning () <<
"frameset " << i <<
" " << fs->
name() <<
" has no frames" << endl;
1914 if ( fs->
type() == FT_PART )
1915 delete static_cast<KWPartFrameSet *
>(fs)->getChild();
1920 KWFrame *frame = fs->
frame(0);
1922 kdWarning() <<
"First frame in a frameset[" << fs->
name() <<
"] was set to be a copy; resetting\n";
1923 frame->setCopy(
false);
1929 KWTextFrameSet *frameset =
dynamic_cast<KWTextFrameSet *
>( m_lstFrameSet.getFirst() );
1933 emit sigProgress(-1);
1939 connect( frameset->
textObject(), TQ_SIGNAL( chapterParagraphFormatted( KoTextParag * ) ),
1940 TQ_SLOT( slotChapterParagraphFormatted( KoTextParag * ) ) );
1941 connect( frameset, TQ_SIGNAL( mainTextHeightChanged() ),
1942 TQ_SIGNAL( mainTextHeightChanged() ) );
1948void KWDocument::startBackgroundSpellCheck()
1950 if ( backgroundSpellCheckEnabled() && isReadWrite() )
1952 m_bgSpellCheck->start();
1956void KWDocument::loadEmbeddedObjects( TQDomElement& word )
1958 TQDomNodeList listEmbedded = word.elementsByTagName (
"EMBEDDED" );
1959 for (
unsigned int item = 0; item < listEmbedded.count(); item++)
1961 TQDomElement embedded = listEmbedded.item( item ).toElement();
1962 loadEmbedded( embedded );
1966void KWDocument::loadEmbedded(
const TQDomElement &embedded )
1968 TQDomElement
object = embedded.namedItem(
"OBJECT" ).toElement();
1969 if ( !
object.isNull() )
1971 KWDocumentChild *ch =
new KWDocumentChild(
this );
1972 ch->load(
object,
true );
1974 TQDomElement settings = embedded.namedItem(
"SETTINGS" ).toElement();
1976 if ( !settings.isNull() )
1977 name = settings.attribute(
"name" );
1978 KWPartFrameSet *fs =
new KWPartFrameSet(
this, ch, name );
1979 m_lstFrameSet.append( fs );
1980 if ( !settings.isNull() )
1982 kdDebug(32001) <<
"KWDocument::loadXML loading embedded object" << endl;
1983 fs->
load( settings );
1986 kdError(32001) <<
"No <SETTINGS> tag in EMBEDDED" << endl;
1989 kdError(32001) <<
"No <OBJECT> tag in EMBEDDED" << endl;
1993void KWDocument::loadStyleTemplates(
const TQDomElement &stylesElem )
1995 TQValueList<TQString> followingStyles;
1996 TQDomNodeList listStyles = stylesElem.elementsByTagName(
"STYLE" );
1997 if( listStyles.count() > 0) {
1998 KoParagStyle *s = m_styleColl->findStyle(
"Standard");
2001 m_styleColl->removeStyle(s);
2003 for (
unsigned int item = 0; item < listStyles.count(); item++) {
2004 TQDomElement styleElem = listStyles.item( item ).toElement();
2006 KoParagStyle *sty =
new KoParagStyle( TQString() );
2008 sty->loadStyle( styleElem, m_syntaxVersion );
2012 if ( m_syntaxVersion < 3 )
2016 if ( sty->paragLayout().counter && sty->paragLayout().counter->numbering() == KoParagCounter::NUM_CHAPTER )
2017 sty->setOutline(
true );
2021 sty->setFollowingStyle( sty );
2023 TQDomElement formatElem = styleElem.namedItem(
"FORMAT" ).toElement();
2024 if ( !formatElem.isNull() )
2025 sty->format() =
KWTextParag::loadFormat( formatElem, 0L, defaultFont(), globalLanguage(), globalHyphenation() );
2027 kdWarning(32001) <<
"No FORMAT tag in <STYLE>" << endl;
2030 sty = m_styleColl->addStyle( sty );
2032 if(m_styleColl->styleList().count() > followingStyles.count() )
2034 TQString following = styleElem.namedItem(
"FOLLOWING").toElement().attribute(
"name");
2035 followingStyles.append( following );
2038 kdWarning () <<
"Found duplicate style declaration, overwriting former " << sty->name() << endl;
2041 Q_ASSERT( followingStyles.count() == m_styleColl->styleList().count() );
2044 for( TQValueList<TQString>::Iterator it = followingStyles.begin(); it != followingStyles.end(); ++it ) {
2045 KoParagStyle * style = m_styleColl->findStyle(*it);
2046 m_styleColl->styleAt(i++)->setFollowingStyle( style );
2051void KWDocument::loadFrameStyleTemplates(
const TQDomElement &stylesElem )
2053 TQDomNodeList listStyles = stylesElem.elementsByTagName(
"FRAMESTYLE" );
2054 if( listStyles.count() > 0) {
2055 KWFrameStyle *s = m_frameStyleColl->findStyle(
"Plain");
2057 m_frameStyleColl->removeStyle(s);
2059 for (
unsigned int item = 0; item < listStyles.count(); item++) {
2060 TQDomElement styleElem = listStyles.item( item ).toElement();
2062 KWFrameStyle *sty =
new KWFrameStyle( styleElem );
2063 m_frameStyleColl->addStyle( sty );
2067void KWDocument::loadDefaultFrameStyleTemplates()
2069 const TQString fsfileName( locate(
"data",
"kword/framestyles.xml") );
2071 kdDebug(30003) <<
"Data directory: " << TDEGlobal::dirs()->resourceDirs(
"data" ) << endl;
2072 kdDebug(30003) <<
"Directory searched: " << TDEGlobal::dirs()->resourceDirs(
"data" ) << endl;
2073 kdDebug(30003) <<
"File framestyles.xml searched at: " << fsfileName << endl;
2075 m_frameStyleColl->setDefault(
true );
2077 if ( ! TQFile::exists( fsfileName ) )
2079 kdWarning(30003) <<
"Cannot find any framestyles.xml" << endl;
2080 if (!m_frameStyleColl->findStyle(
"Plain")) {
2081 KWFrameStyle * standardFrameStyle =
new KWFrameStyle(
"Plain" );
2082 standardFrameStyle->setBackgroundColor(TQColor(
"white"));
2083 standardFrameStyle->setTopBorder(KoBorder(TQColor(
"black"),KoBorder::SOLID,0));
2084 standardFrameStyle->setRightBorder(KoBorder(TQColor(
"black"),KoBorder::SOLID,0));
2085 standardFrameStyle->setLeftBorder(KoBorder(TQColor(
"black"),KoBorder::SOLID,0));
2086 standardFrameStyle->setBottomBorder(KoBorder(TQColor(
"black"),KoBorder::SOLID,0));
2087 m_frameStyleColl->addStyle( standardFrameStyle );
2092 kdDebug(30003) <<
"File framestyles.xml found!" << endl;
2095 TQFile in( fsfileName );
2096 if ( !in.open( IO_ReadOnly ) )
2099 kdWarning(30003) <<
"Couldn't open the file for reading (check read permissions)" << endl;
2106 if ( ! doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) )
2108 kdError (30003) <<
"Parsing Error! Aborting! (in KWDocument::loadDefaultFrameStyleTemplates())" << endl
2109 <<
" Line: " << errorLine <<
" Column: " << errorColumn << endl
2110 <<
" Message: " << errorMsg << endl;
2115 TQDomElement stylesElem = doc.documentElement();
2117 TQDomNodeList listStyles = stylesElem.elementsByTagName(
"FRAMESTYLE" );
2118 if( listStyles.count() > 0) {
2119 KWFrameStyle *s = m_frameStyleColl->findStyle(
"Plain");
2121 m_frameStyleColl->removeStyle(s);
2123 for (
unsigned int item = 0; item < listStyles.count(); item++) {
2124 TQDomElement styleElem = listStyles.item( item ).toElement();
2126 KWFrameStyle *sty =
new KWFrameStyle( styleElem );
2127 m_frameStyleColl->addStyle( sty );
2131void KWDocument::loadTableStyleTemplates(
const TQDomElement& stylesElem )
2133 TQDomNodeList listStyles = stylesElem.elementsByTagName(
"TABLESTYLE" );
2134 if( listStyles.count() > 0) {
2135 KWTableStyle *s = m_tableStyleColl->findStyle(
"Plain");
2137 m_tableStyleColl->removeStyle(s);
2139 for (
unsigned int item = 0; item < listStyles.count(); item++) {
2140 TQDomElement styleElem = listStyles.item( item ).toElement();
2142 KWTableStyle *sty =
new KWTableStyle( styleElem,
this );
2143 m_tableStyleColl->addStyle( sty );
2147void KWDocument::loadDefaultTableStyleTemplates()
2151 m_tableStyleColl->setDefault(
true );
2153 if ( ! TQFile::exists(locate(
"data",
"kword/tablestyles.xml")) )
2155 if (!m_tableStyleColl->findStyle(
"Plain")) {
2156 m_tableStyleColl->addStyle(
new KWTableStyle(
"Plain", m_styleColl->styleAt(0), m_frameStyleColl->frameStyleAt(0) ) );
2161 fsfile.setPath( locate(
"data",
"kword/tablestyles.xml") );
2164 TQFile in( fsfile.path() );
2165 if ( !in.open( IO_ReadOnly ) )
2175 if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
2179 kdError (30003) <<
"Parsing Error! Aborting! (in KWDocument::loadDefaultTableStyleTemplates())" << endl
2180 <<
" Line: " << errorLine <<
" Column: " << errorColumn << endl
2181 <<
" Message: " << errorMsg << endl;
2186 TQDomElement stylesElem = doc.documentElement();
2188 TQDomNodeList listStyles = stylesElem.elementsByTagName(
"TABLESTYLE" );
2189 if( listStyles.count() > 0) {
2190 KWTableStyle *s = m_tableStyleColl->findStyle(
"Plain");
2192 m_tableStyleColl->removeStyle(s);
2194 for (
unsigned int item = 0; item < listStyles.count(); item++) {
2195 TQDomElement styleElem = listStyles.item( item ).toElement();
2197 KWTableStyle *sty =
new KWTableStyle( styleElem,
this );
2198 m_tableStyleColl->addStyle( sty );
2202void KWDocument::loadDefaultTableTemplates()
2206 if ( ! TQFile::exists(locate(
"data",
"kword/tabletemplates.xml")) )
2208 if (!m_tableTemplateColl->findTableTemplate(
"Plain")) {
2209 KWTableTemplate * standardTableTemplate =
new KWTableTemplate(
"Plain" );
2210 KWTableStyle* defaultTableStyle = tableStyleCollection()->findStyle(
"Plain");
2211 standardTableTemplate->setFirstRow( defaultTableStyle );
2212 standardTableTemplate->setLastRow( defaultTableStyle );
2213 standardTableTemplate->setFirstCol( defaultTableStyle );
2214 standardTableTemplate->setLastCol( defaultTableStyle );
2215 standardTableTemplate->setBodyCell( defaultTableStyle );
2216 standardTableTemplate->setTopLeftCorner( defaultTableStyle );
2217 standardTableTemplate->setTopRightCorner( defaultTableStyle );
2218 standardTableTemplate->setBottomLeftCorner( defaultTableStyle );
2219 standardTableTemplate->setBottomRightCorner( defaultTableStyle );
2220 m_tableTemplateColl->addTableTemplate( standardTableTemplate );
2225 fsfile.setPath( locate(
"data",
"kword/tabletemplates.xml") );
2228 TQFile in( fsfile.path() );
2229 if ( !in.open( IO_ReadOnly ) )
2239 if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
2243 kdError (30003) <<
"Parsing Error! Aborting! (in KWDocument::readTableTemplates())" << endl
2244 <<
" Line: " << errorLine <<
" Column: " << errorColumn << endl
2245 <<
" Message: " << errorMsg << endl;
2250 TQDomElement templatesElem = doc.documentElement();
2252 TQDomNodeList listTemplates = templatesElem.elementsByTagName(
"TABLETEMPLATE" );
2253 if( listTemplates.count() > 0) {
2254 KWTableTemplate *s = m_tableTemplateColl->findTableTemplate(
"Plain");
2256 m_tableTemplateColl->removeTableTemplate(s);
2258 for (
unsigned int item = 0; item < listTemplates.count(); item++) {
2259 TQDomElement templateElem = listTemplates.item( item ).toElement();
2261 KWTableTemplate *temp =
new KWTableTemplate( templateElem,
this );
2262 m_tableTemplateColl->addTableTemplate( temp );
2266void KWDocument::progressItemLoaded()
2268 if ( !m_nrItemsToLoad )
2272 unsigned int perc = 65 * m_itemsLoaded / m_nrItemsToLoad;
2273 if ( perc != 65 * (m_itemsLoaded-1) / m_nrItemsToLoad )
2276 emit sigProgress( perc + 20 );
2280void KWDocument::loadFrameSets(
const TQDomElement &framesetsElem )
2284 m_nrItemsToLoad = 0;
2285 TQDomElement framesetElem = framesetsElem.firstChild().toElement();
2287 TQValueList<TQDomElement> framesets;
2288 for ( ; !framesetElem.isNull() ; framesetElem = framesetElem.nextSibling().toElement() )
2290 if ( framesetElem.tagName() ==
"FRAMESET" )
2292 framesets.append( framesetElem );
2293 m_nrItemsToLoad += framesetElem.childNodes().count();
2299 TQValueList<TQDomElement>::Iterator it = framesets.begin();
2300 TQValueList<TQDomElement>::Iterator end = framesets.end();
2301 for ( ; it != end ; ++it )
2303 (void) loadFrameSet( *it );
2307KWFrameSet * KWDocument::loadFrameSet( TQDomElement framesetElem,
bool loadFrames,
bool loadFootnote )
2309 FrameSetType frameSetType =
static_cast<FrameSetType
>( KWDocument::getAttribute( framesetElem,
"frameType", FT_BASE ) );
2310 TQString fsname = KWDocument::getAttribute( framesetElem,
"name",
"" );
2312 switch ( frameSetType ) {
2314 TQString tableName = KWDocument::getAttribute( framesetElem,
"grpMgr",
"" );
2315 if ( !tableName.isEmpty() ) {
2317 KWTableFrameSet *table = 0L;
2318 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
2319 for ( ; fit.current() ; ++fit ) {
2320 KWFrameSet *f = fit.current();
2321 if( f->
type() == FT_TABLE &&
2323 f->
name() == tableName ) {
2324 table =
static_cast<KWTableFrameSet *
> (f);
2330 table =
new KWTableFrameSet(
this, tableName );
2331 addFrameSet(table,
false);
2334 return table->
loadCell( framesetElem );
2339 if ( info == KWFrameSet::FI_FOOTNOTE )
2341 if ( !loadFootnote )
2344 KWFootNoteFrameSet *fs =
new KWFootNoteFrameSet(
this, fsname );
2345 fs->
load( framesetElem, loadFrames );
2346 addFrameSet(fs,
false);
2351 KWTextFrameSet *fs =
new KWTextFrameSet(
this, fsname );
2352 fs->
load( framesetElem, loadFrames );
2353 addFrameSet(fs,
false);
2356 if ( framesetElem.hasAttribute(
"autoCreateNewFrame" ) )
2360 for ( ; frameIt.current() ; ++frameIt )
2361 frameIt.current()->setFrameBehavior( behav );
2369 kdError(32001) <<
"FT_CLIPART used! (in KWDocument::loadFrameSet)" << endl;
2374 KWPictureFrameSet *fs =
new KWPictureFrameSet(
this, fsname );
2375 fs->load( framesetElem, loadFrames );
2376 addFrameSet(fs,
false);
2380 KWFormulaFrameSet *fs =
new KWFormulaFrameSet(
this, fsname );
2381 fs->load( framesetElem, loadFrames );
2382 addFrameSet(fs,
false);
2388 kdWarning(32001) <<
"loadFrameSet: FT_PART: impossible case" << endl;
2391 kdWarning(32001) <<
"loadFrameSet: FT_TABLE: impossible case" << endl;
2394 kdWarning(32001) <<
"loadFrameSet: FT_BASE !?!?" << endl;
2400void KWDocument::loadImagesFromStore( KoStore *store )
2402 if ( store && !m_pictureMap.isEmpty() ) {
2403 m_pictureCollection->readFromStore( store, m_pictureMap );
2404 m_pictureMap.clear();
2408bool KWDocument::completeLoading( KoStore *store )
2410 kdDebug() << k_funcinfo << endl;
2412 loadImagesFromStore( store );
2413 processPictureRequests();
2414 processAnchorRequests();
2415 processFootNoteRequests();
2418 m_urlIntern = TQString();
2421 recalcVariables( VT_FIELD );
2422 recalcVariables( VT_DATE );
2423 recalcVariables( VT_STATISTIC );
2426 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
2427 for ( ; fit.current() ; ++fit )
2428 fit.current()->finalize();
2439 emit newContentsSize();
2440 repaintAllViews(
true );
2441 reactivateBgSpellChecking();
2442 connect( documentInfo(), TQ_SIGNAL( sigDocumentInfoModifed()),
this,TQ_SLOT(slotDocumentInfoModifed() ) );
2446 if ( !isReadWrite())
2447 enableBackgroundSpellCheck(
false );
2452 deleteLoadingInfo();
2454 setModified(
false );
2461 Q_ASSERT( !m_loadingInfo );
2462 m_loadingInfo =
new KWLoadingInfo();
2463 m_loadingInfo->columns.ptColumnSpacing = m_defaultColumnSpacing;
2464 return m_loadingInfo;
2467void KWDocument::deleteLoadingInfo()
2469 Q_ASSERT( m_loadingInfo );
2470 delete m_loadingInfo;
2474void KWDocument::processPictureRequests()
2476 TQPtrListIterator<KWTextImage> it2 ( m_textImageRequests );
2477 for ( ; it2.current() ; ++it2 )
2479 it2.current()->setImage( *m_pictureCollection );
2481 m_textImageRequests.clear();
2484 TQPtrListIterator<KWPictureFrameSet> it3( m_pictureRequests );
2485 for ( ; it3.current() ; ++it3 )
2486 it3.current()->setPicture( m_pictureCollection->findPicture( it3.current()->key() ) );
2487 m_pictureRequests.clear();
2490void KWDocument::processAnchorRequests()
2492 TQMapIterator<TQString, KWAnchorPosition> itanch = m_anchorRequests.begin();
2493 for ( ; itanch != m_anchorRequests.end(); ++itanch )
2495 TQString fsname = itanch.key();
2496 if ( m_pasteFramesetsMap && m_pasteFramesetsMap->contains( fsname ) )
2497 fsname = (*m_pasteFramesetsMap)[ fsname ];
2498 kdDebug(32001) <<
"KWDocument::processAnchorRequests anchoring frameset " << fsname << endl;
2499 KWFrameSet * fs = frameSetByName( fsname );
2502 fs->
setAnchored( itanch.data().textfs, itanch.data().paragId, itanch.data().index,
true,
false );
2504 m_anchorRequests.clear();
2507bool KWDocument::processFootNoteRequests()
2510 TQMapIterator<TQString, KWFootNoteVariable *> itvar = m_footnoteVarRequests.begin();
2511 for ( ; itvar != m_footnoteVarRequests.end(); ++itvar )
2513 TQString fsname = itvar.key();
2514 if ( m_pasteFramesetsMap && m_pasteFramesetsMap->contains( fsname ) )
2515 fsname = (*m_pasteFramesetsMap)[ fsname ];
2517 KWFrameSet * fs = frameSetByName( fsname );
2521 Q_ASSERT( fs->
type() == FT_TEXT );
2522 Q_ASSERT( fs->
frameSetInfo() == KWFrameSet::FI_FOOTNOTE );
2523 KWFootNoteFrameSet* fnfs =
dynamic_cast<KWFootNoteFrameSet *
>(fs);
2526 fnfs->setFootNoteVariable( itvar.data() );
2527 itvar.data()->setFrameSet( fnfs );
2531 m_footnoteVarRequests.clear();
2534 KWFrameSet *frameset = m_lstFrameSet.getFirst();
2535 if ( frameset && frameset->
type() == FT_TEXT )
2536 static_cast<KWTextFrameSet *
>(frameset)->renumberFootNotes(
false );
2541TQString KWDocument::uniqueFramesetName(
const TQString& oldName )
2543 TQString newName = oldName;
2544 if (frameSetByName( oldName ))
2548 TQString searchString(
"^(" + i18n(
"Copy%1-%2").arg(
"\\d*").arg(
"){0,1}") );
2549 searchString = searchString.replace(TQRegExp(
"\\-"),
"\\-");
2550 TQRegExp searcher(searchString);
2554 newName.replace(searcher,i18n(
"Copy%1-%2").arg(count > 0? TQString(
"%1").arg(count):
"").arg(
""));
2556 }
while ( frameSetByName( newName ) );
2561void KWDocument::pasteFrames( TQDomElement topElem, KMacroCommand * macroCmd,
bool copyFootNote,
bool loadFootNote,
bool selectFrames )
2563 m_pasteFramesetsMap =
new TQMap<TQString, TQString>();
2567 TQDomElement elem = topElem.firstChild().toElement();
2568 for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
2571 TQDomElement frameElem;
2572 KWFrameSet * fs = 0L;
2573 if ( elem.tagName() ==
"FRAME" )
2575 TQString frameSetName = frameElem.attribute(
"parentFrameset" );
2576 fs = frameSetByName( frameSetName );
2579 kdWarning(32001) <<
"pasteFrames: Frameset '" << frameSetName <<
"' not found" << endl;
2584 else if ( elem.tagName() ==
"FRAMESET" )
2587 TQString oldName = elem.attribute(
"name" );
2588 TQString newName = uniqueFramesetName( oldName );
2590 m_pasteFramesetsMap->insert( oldName, newName );
2591 if(oldName != newName)
2592 kdDebug(32001) <<
"KWDocument::pasteFrames new frameset: " << oldName <<
"->" << newName << endl;
2593 FrameSetType frameSetType =
static_cast<FrameSetType
>( KWDocument::getAttribute( elem,
"frameType", FT_BASE ) );
2594 switch ( frameSetType ) {
2596 KWTableFrameSet *table =
new KWTableFrameSet(
this, newName );
2597 table->
fromXML( elem,
true,
false );
2598 table->
moveBy( 20.0, 20.0 );
2599 m_lstFrameSet.append( table );
2602 macroCmd->addCommand(
new KWCreateTableCommand( TQString(), table ) );
2610 KWPartFrameSet *part =
new KWPartFrameSet(
this, newName );
2611 part->
fromXML( elem,
true,
false );
2612 part->moveBy( 20.0, 20.0 );
2613 m_lstFrameSet.append( part );
2620 fs = loadFrameSet( elem,
false, loadFootNote );
2623 kdDebug() <<
"KWDocument::pasteFrames created frameset: '" << newName <<
"'\n";
2624 fs->setName( newName );
2625 frameElem = elem.namedItem(
"FRAME" ).toElement();
2629 if(fs && (fs->isHeaderOrFooter() || ( !copyFootNote && fs->isFootEndNote())))
2642 if ( !frameElem.isNull() )
2646 rect.setLeft( KWDocument::getAttribute( frameElem,
"left", 0.0 ) + offs );
2647 rect.setTop( KWDocument::getAttribute( frameElem,
"top", 0.0 ) + offs );
2648 rect.setRight( KWDocument::getAttribute( frameElem,
"right", 0.0 ) + offs );
2649 rect.setBottom( KWDocument::getAttribute( frameElem,
"bottom", 0.0 ) + offs );
2650 KWFrame * frame =
new KWFrame( fs, rect.x(), rect.y(), rect.width(), rect.height() );
2651 frame->
load( frameElem, fs, KWDocument::CURRENT_SYNTAX_VERSION );
2654 fs->addFrame( frame,
false );
2655 if ( selectFrames ) {
2656 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin();
2657 it != m_lstViews.end(); ++it ) {
2658 KWFrameView *fv = (*it)->frameViewManager()->view(frame);
2665 KWCreateFrameCommand *cmd =
new KWCreateFrameCommand( TQString(), frame );
2666 macroCmd->addCommand(cmd);
2674 type=(int)TextFrames;
2678 kdError(32001) <<
"FT_CLIPART used! (in KWDocument::loadFrameSet)" << endl;
2688 type=(int)FormulaFrames;
2694 type=(int)TextFrames;
2699 refreshDocStructure(ref);
2702void KWDocument::completePasting()
2704 processPictureRequests();
2705 processAnchorRequests();
2706 if ( processFootNoteRequests() )
2716 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
2717 for ( ; fit.current() ; ++fit )
2718 fit.current()->finalize();
2720 delete m_pasteFramesetsMap;
2721 m_pasteFramesetsMap = 0L;
2724void KWDocument::completeOasisPasting()
2726 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
2727 for ( ; fit.current() ; ++fit )
2728 fit.current()->finalize();
2732void KWDocument::insertEmbedded( KoStore *store, TQDomElement topElem, KMacroCommand * macroCmd,
double offset )
2734 if ( !m_pasteFramesetsMap )
2735 m_pasteFramesetsMap =
new TQMap<TQString, TQString>();
2737 TQDomElement elem = topElem.firstChild().toElement();
2738 for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
2740 if ( elem.tagName() ==
"EMBEDDED" )
2742 kdDebug()<<
"KWDocument::insertEmbedded() Embedded object"<<endl;
2743 TQDomElement
object = elem.namedItem(
"OBJECT" ).toElement();
2744 TQDomElement settings = elem.namedItem(
"SETTINGS" ).toElement();
2745 if (
object.isNull() || settings.isNull() )
2747 kdError() <<
"No <OBJECT> or <SETTINGS> tag" << endl;
2751 KWDocumentChild *ch =
new KWDocumentChild(
this );
2752 kdDebug()<<
"KWDocument::insertEmbedded() loading document"<<endl;
2753 if ( ch->load(
object,
true ) )
2755 ch->loadDocument( store );
2757 TQString oldName = settings.attribute(
"name" );
2758 TQString newName = uniqueFramesetName( oldName );
2759 m_pasteFramesetsMap->insert( oldName, newName );
2760 KWPartFrameSet *part =
new KWPartFrameSet(
this, ch, newName );
2761 m_lstFrameSet.append( part );
2762 kdDebug() <<
"KWDocument::insertEmbedded loading embedded object" << endl;
2763 part->
load( settings );
2764 if ( offset != 0 ) {
2765 TQRect r = ch->geometry();
2766 r.moveBy( (
int)offset, (
int)offset );
2767 ch->setGeometry( r );
2772 TQPtrListIterator<KWFrame> frameIt( part->
frameIterator() );
2773 for ( ; frameIt.current(); ++frameIt )
2775 macroCmd->addCommand(
new KWCreateFrameCommand( TQString(), frameIt.current() ) );
2782 refreshDocStructure( (
int)Embedded );
2785bool KWDocument::saveOasis( KoStore* store, KoXmlWriter* manifestWriter )
2787 TQValueList<KWFrameView*> noFrames;
2788 return saveOasisHelper( store, manifestWriter, SaveAll, noFrames);
2792bool KWDocument::saveOasisHelper( KoStore* store, KoXmlWriter* manifestWriter, SaveFlag saveFlag,
const TQValueList<KWFrameView*> &selectedFrames, TQString* plainText, KoPicture* picture,
KWTextFrameSet* fs) {
2793 m_pictureCollection->assignUniqueIds();
2796 manifestWriter->addManifestEntry(
"content.xml",
"text/xml" );
2797 KoOasisStore oasisStore( store );
2799 KoXmlWriter* contentWriter = oasisStore.contentWriter();
2800 if ( !contentWriter )
2803 TQValueList<KoPictureKey> pictureList;
2804 if ( saveFlag == SaveAll )
2805 pictureList = savePictureList();
2807 m_varColl->variableSetting()->setModificationDate(TQDateTime::currentDateTime());
2808 recalcVariables( VT_DATE );
2809 recalcVariables( VT_TIME );
2810 recalcVariables( VT_STATISTIC );
2811 m_syntaxVersion = CURRENT_SYNTAX_VERSION;
2813 KoGenStyles mainStyles;
2814 KoSavingContext savingContext( mainStyles, m_varColl->variableSetting(), m_pageColumns.columns > 1, KoSavingContext::Store );
2817 m_styleColl->saveOasis( mainStyles, KoGenStyle::STYLE_USER, savingContext );
2819 TQByteArray headerFooterContent;
2820 if ( saveFlag == SaveAll )
2824 KWView * view =
static_cast<KWView*
>(views().getFirst());
2827 KWFrameSetEdit* edit = view->getGUI()->canvasWidget()->currentFrameSetEdit();
2830 KWTextFrameSetEdit* textedit =
dynamic_cast<KWTextFrameSetEdit *
>(edit);
2831 if ( textedit && textedit->cursor() ) {
2832 KoTextCursor* cursor = textedit->cursor();
2833 savingContext.setCursorPosition( cursor->parag(),
2844 TQBuffer buffer( headerFooterContent );
2845 buffer.open( IO_WriteOnly );
2846 KoXmlWriter headerFooterTmpWriter( &buffer );
2850 TQMap<KWFrameSet::Info,const KWFrameSet*> tempmap;
2853 for (TQPtrListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
2854 const KWFrameSet* fs = fit.current();
2858 fs->
type() == FT_TEXT &&
2859 fs->isHeaderOrFooter() )
2865 TQValueList<KWFrameSet::Info> order;
2866 order << KWFrameSet::FI_FIRST_HEADER << KWFrameSet::FI_ODD_HEADER << KWFrameSet::FI_EVEN_HEADER
2867 << KWFrameSet::FI_FIRST_FOOTER << KWFrameSet::FI_ODD_FOOTER << KWFrameSet::FI_EVEN_FOOTER;
2868 for (uint i=0; i<order.count(); ++i) {
2870 if (tempmap.contains(info)) {
2871 const KWFrameSet* fs = tempmap[info];
2874 headerFooterTmpWriter.startElement( fs->headerFooterTag() );
2875 static_cast<const KWTextFrameSet *
>(fs)->saveOasisContent( headerFooterTmpWriter, savingContext );
2876 headerFooterTmpWriter.endElement();
2881 headerFooterContent.resize( headerFooterContent.size() + 1 );
2882 headerFooterContent[headerFooterContent.size()-1] =
'\0';
2885 TQValueList<KoGenStyles::NamedStyle> autoStyles = mainStyles.styles( KoGenStyle::STYLE_AUTO );
2886 for ( TQValueList<KoGenStyles::NamedStyle>::const_iterator it = autoStyles.begin();
2887 it != autoStyles.end(); ++it ) {
2888 mainStyles.markStyleForStylesXml( (*it).name );
2892 KoXmlWriter* bodyWriter = oasisStore.bodyWriter();
2893 bodyWriter->startElement(
"office:body" );
2894 bodyWriter->startElement(
"office:text" );
2896 if ( saveFlag == SaveAll )
2899 saveOasisBody( *bodyWriter, savingContext );
2907 *plainText = fs->textDocument()->copySelection( *bodyWriter, savingContext, KoTextDocument::Standard );
2909 KWCollectFramesetsVisitor visitor;
2910 fs->textDocument()->visitSelection( KoTextDocument::Standard, &visitor );
2911 const TQValueList<KWFrameSet *>& frameset = visitor.frameSets();
2912 kdDebug(32001) << frameset.count() <<
" inline framesets" << endl;
2913 for ( TQValueList<KWFrameSet *>::ConstIterator it = frameset.begin(); it != frameset.end(); ++it )
2915 switch ( (*it)->type() ) {
2918 const KoPictureKey key =
static_cast<KWPictureFrameSet *
>( *it )->key();
2919 if ( !pictureList.contains( key ) )
2920 pictureList.append( key );
2933 saveSelectedFrames( *bodyWriter, savingContext, pictureList,
2934 selectedFrames, &newText );
2935 *plainText += newText;
2937 if ( picture && pictureList.count() == 1 )
2939 *picture = m_pictureCollection->findPicture( pictureList.first() );
2943 bodyWriter->endElement();
2944 bodyWriter->endElement();
2946 savingContext.writeFontFaces( *contentWriter );
2947 contentWriter->startElement(
"office:automatic-styles" );
2949 contentWriter->endElement();
2951 oasisStore.closeContentWriter();
2955 if ( !store->open(
"styles.xml" ) )
2957 manifestWriter->addManifestEntry(
"styles.xml",
"text/xml" );
2958 saveOasisDocumentStyles( store, mainStyles, savingContext, saveFlag, headerFooterContent );
2959 if ( !store->close() )
2963 m_pictureCollection->saveOasisToStore( store, pictureList, manifestWriter );
2965 if ( saveFlag == SaveSelected ) {
2973 TQValueList<KoDocumentChild*> embeddedObjects;
2974 TQValueListConstIterator<KWFrameView*> framesIterator = selectedFrames.begin();
2975 for(; framesIterator != selectedFrames.end(); ++framesIterator) {
2976 KWFrame *frame = (*framesIterator)->frame();
2977 KWFrameSet *fs = frame->
frameSet();
2979 embeddedObjects.append(
static_cast<KWPartFrameSet *
>(fs)->getChild() );
2983 TQValueList<KoDocumentChild *>::const_iterator chl = embeddedObjects.begin();
2984 for( ; chl != embeddedObjects.end(); ++chl ) {
2985 if ( !(*chl)->saveOasis( store, manifestWriter ) )
2990 if ( saveFlag == SaveAll )
2993 if(!store->open(
"settings.xml"))
2996 KoStoreDevice contentDev( store );
2997 KoXmlWriter* settingsWriter = createOasisXmlWriter(&contentDev,
"office:document-settings");
2998 saveOasisSettings( *settingsWriter );
2999 delete settingsWriter;
3004 manifestWriter->addManifestEntry(
"settings.xml",
"text/xml");
3010TQDragObject* KWDocument::dragSelected(
const TQValueList<KWFrameView*> &selectedFrames) {
3011 return dragSelectedPrivate(0, selectedFrames, 0);
3014TQDragObject* KWDocument::dragSelected( TQWidget *parent,
KWTextFrameSet* fs) {
3015 TQValueList<KWFrameView*> noFrames;
3016 return dragSelectedPrivate(parent, noFrames, fs);
3019TQDragObject* KWDocument::dragSelectedPrivate( TQWidget *parent,
const TQValueList<KWFrameView*> &selectedFrames,
KWTextFrameSet* fs)
3023 TQCString mimeType = KWOasisSaver::selectionMimeType();
3024 KoStore* store = KoStore::createStore( &buffer, KoStore::Write, mimeType );
3026 Q_ASSERT( !store->bad() );
3027 KoOasisStore oasisStore( store );
3029 KoXmlWriter* manifestWriter = oasisStore.manifestWriter( mimeType );
3033 if ( !saveOasisHelper( store, manifestWriter, KWDocument::SaveSelected, selectedFrames, &plainText, &picture, fs )
3034 || !oasisStore.closeManifestWriter() )
3042 KMultipleDrag* multiDrag =
new KMultipleDrag( parent );
3043 if ( !plainText.isEmpty() )
3044 multiDrag->addDragObject(
new TQTextDrag( plainText, 0 ) );
3045 if ( !picture.isNull() )
3046 multiDrag->addDragObject( picture.dragObject( 0 ) );
3047 KoStoreDrag* storeDrag =
new KoStoreDrag( KWOasisSaver::selectionMimeType(), 0 );
3048 kdDebug() << k_funcinfo <<
"setting zip data: " << buffer.buffer().size() <<
" bytes." << endl;
3049 storeDrag->setEncodedData( buffer.buffer() );
3050 multiDrag->addDragObject( storeDrag );
3054void KWDocument::saveSelectedFrames( KoXmlWriter& bodyWriter, KoSavingContext& savingContext, TQValueList<KoPictureKey>& pictureList,
const TQValueList<KWFrameView*> &selectedFrames, TQString* plainText )
const {
3055 TQPtrList<KoDocumentChild> embeddedObjects;
3056 TQValueListConstIterator<KWFrameView*> framesIterator = selectedFrames.begin();
3057 for(; framesIterator != selectedFrames.end(); ++framesIterator) {
3058 KWFrame *frame = (*framesIterator)->frame();
3059 KWFrameSet *fs = frame->
frameSet();
3061 embeddedObjects.append(
static_cast<KWPartFrameSet *
>(fs)->getChild() );
3063 bool isTable = fs->
type() == FT_TABLE;
3068 if ( frame == fs->
frame(0) || isTable ) {
3069 fs->
saveOasis( bodyWriter, savingContext,
false );
3071 *plainText += fs->toPlainText();
3073 else if ( !isTable ) {
3076 TQDomElement frameElem = parentElem.ownerDocument().createElement(
"FRAME" );
3077 parentElem.appendChild( frameElem );
3078 frame->
save( frameElem );
3079 if ( frame != firstFrame )
3082 frameElem.setAttribute(
"parentFrameset", fs->
name() );
3086 if ( fs->
type() == FT_PICTURE ) {
3087 kdDebug(32001) <<
"found non-inline picture framesets" << endl;
3089 const KoPictureKey key =
static_cast<KWPictureFrameSet *
>( fs )->key();
3090 if ( !pictureList.contains( key ) )
3091 pictureList.append( key );
3098void KWDocument::saveOasisSettings( KoXmlWriter& settingsWriter )
const
3100 settingsWriter.startElement(
"office:settings");
3101 settingsWriter.startElement(
"config:config-item-set");
3103 settingsWriter.addAttribute(
"config:name",
"view-settings");
3105 KoUnit::saveOasis(&settingsWriter, unit());
3107 settingsWriter.endElement();
3109 settingsWriter.startElement(
"config:config-item-set");
3110 settingsWriter.addAttribute(
"config:name",
"configuration-settings");
3111 settingsWriter.addConfigItem(
"SpellCheckerIgnoreList", m_spellCheckIgnoreList.join(
"," ) );
3112 settingsWriter.endElement();
3114 m_varColl->variableSetting()->saveOasis( settingsWriter );
3116 settingsWriter.endElement();
3117 settingsWriter.endElement();
3118 settingsWriter.endDocument();
3121void KWDocument::saveOasisDocumentStyles( KoStore* store, KoGenStyles& mainStyles, KoSavingContext& savingContext, SaveFlag saveFlag,
const TQByteArray& headerFooterContent )
const
3123 if ( saveFlag == SaveAll )
3125 m_frameStyleColl->saveOasis( mainStyles, savingContext );
3126 m_tableStyleColl->saveOasis( mainStyles, savingContext );
3129 KoStoreDevice stylesDev( store );
3130 KoXmlWriter* stylesWriter = createOasisXmlWriter( &stylesDev,
"office:document-styles" );
3133 savingContext.writeFontFaces( *stylesWriter );
3135 stylesWriter->startElement(
"office:styles" );
3137 if ( saveFlag == SaveAll )
3139 stylesWriter->startElement(
"style:default-style" );
3140 stylesWriter->addAttribute(
"style:family",
"paragraph" );
3141 stylesWriter->startElement(
"style:paragraph-properties" );
3142 stylesWriter->addAttributePt(
"style:tab-stop-distance", m_tabStop );
3143 stylesWriter->endElement();
3144 stylesWriter->endElement();
3147 TQValueList<KoGenStyles::NamedStyle> styles = mainStyles.styles( KoGenStyle::STYLE_USER );
3148 TQValueList<KoGenStyles::NamedStyle>::const_iterator it = styles.begin();
3149 for ( ; it != styles.end() ; ++it ) {
3150 (*it).style->writeStyle( stylesWriter, mainStyles,
"style:style", (*it).name,
"style:paragraph-properties" );
3152 styles = mainStyles.styles( KWDocument::STYLE_FRAME_USER );
3153 it = styles.begin();
3154 for ( ; it != styles.end() ; ++it ) {
3155 (*it).style->writeStyle( stylesWriter, mainStyles,
"style:style", (*it).name ,
"style:graphic-properties" );
3157 styles = mainStyles.styles( KWDocument::STYLE_TABLE_CELL_USER );
3158 it = styles.begin();
3159 for ( ; it != styles.end() ; ++it ) {
3160 (*it).style->writeStyle( stylesWriter, mainStyles,
"style:style", (*it).name ,
"style:table-cell-properties" );
3162 styles = mainStyles.styles( KoGenStyle::STYLE_LIST );
3163 it = styles.begin();
3164 for ( ; it != styles.end() ; ++it ) {
3165 (*it).style->writeStyle( stylesWriter, mainStyles,
"text:list-style", (*it).name, 0 );
3167 m_styleColl->saveOasisOutlineStyles( *stylesWriter );
3168 if ( saveFlag == SaveAll )
3169 static_cast<KWVariableSettings *
>( m_varColl->variableSetting() )->saveNoteConfiguration( *stylesWriter );
3170 stylesWriter->endElement();
3172 TQString pageLayoutName;
3173 if ( saveFlag == SaveAll )
3175 stylesWriter->startElement(
"office:automatic-styles" );
3177 KoGenStyle pageLayout = m_pageLayout.saveOasis();
3178 pageLayout.addAttribute(
"style:page-usage",
"all" );
3182 if ( m_processingType == WP )
3184 KWTextFrameSet *frameset =
dynamic_cast<KWTextFrameSet *
>( m_lstFrameSet.getFirst() );
3186 frameset->
frame(0)->saveBorderProperties( pageLayout );
3191 buffer.open( IO_WriteOnly );
3192 KoXmlWriter footnoteSepTmpWriter( &buffer );
3193 footnoteSepTmpWriter.startElement(
"style:footnote-sep" );
3195 switch( m_footNoteSeparatorLinePos )
3208 footnoteSepTmpWriter.addAttribute(
"style:adjustment", tmp );
3209 footnoteSepTmpWriter.addAttributePt(
"style:width", m_footNoteSeparatorLineWidth );
3210 footnoteSepTmpWriter.addAttribute(
"style:rel-width", TQString::number( footNoteSeparatorLineLength() ) +
"%" );
3211 switch( m_footNoteSeparatorLineType )
3225 case SLT_DASH_DOT_DOT:
3226 tmp =
"dot-dot-dash";
3230 footnoteSepTmpWriter.addAttribute(
"style:line-style", tmp );
3232 footnoteSepTmpWriter.endElement();
3233 const TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
3234 pageLayout.addChildElement(
"separator", elementContents );
3237 if ( m_pageColumns.columns > 1 ) {
3238 buffer.setBuffer(TQByteArray());
3239 buffer.open( IO_WriteOnly );
3240 KoXmlWriter columnsTmpWriter( &buffer );
3241 columnsTmpWriter.startElement(
"style:columns" );
3242 columnsTmpWriter.addAttribute(
"fo:column-count", m_pageColumns.columns );
3243 columnsTmpWriter.addAttributePt(
"fo:column-gap", m_pageColumns.ptColumnSpacing );
3244 columnsTmpWriter.endElement();
3246 const TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
3247 pageLayout.addChildElement(
"columns", elementContents );
3253 pageLayoutName = mainStyles.lookup( pageLayout,
"pm" );
3254 pageLayout.writeStyle( stylesWriter, mainStyles,
"style:page-layout", pageLayoutName,
3255 "style:page-layout-properties",
false );
3259 bool headerStyleSaved =
false;
3260 bool footerStyleSaved =
false;
3262 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3263 for ( ; fit.current() ; ++fit ) {
3264 const KWFrameSet* fs = fit.current();
3268 fs->
type() == FT_TEXT &&
3269 fs->isHeaderOrFooter() )
3272 KWFrame* frame = fs->
frame(0);
3273 if ( fs->isAHeader() ) {
3274 if ( headerStyleSaved )
3276 headerStyleSaved =
true;
3277 stylesWriter->startElement(
"style:header-style" );
3279 if ( footerStyleSaved )
3281 footerStyleSaved =
true;
3282 stylesWriter->startElement(
"style:footer-style" );
3287 frame->saveBorderProperties( hfStyle );
3288 frame->saveMarginProperties( hfStyle );
3291 stylesWriter->startElement(
"style:header-footer-properties" );
3293 if ( fs->isAHeader() )
3294 stylesWriter->addAttributePt(
"fo:margin-bottom", m_pageHeaderFooter.ptHeaderBodySpacing );
3296 stylesWriter->addAttributePt(
"fo:margin-top", m_pageHeaderFooter.ptFooterBodySpacing );
3300 stylesWriter->endElement();
3301 stylesWriter->endElement();
3304 stylesWriter->endElement();
3309 stylesWriter->endElement();
3313 stylesWriter->startElement(
"office:master-styles" );
3314 stylesWriter->startElement(
"style:master-page" );
3315 stylesWriter->addAttribute(
"style:name",
"Standard" );
3316 stylesWriter->addAttribute(
"style:page-layout-name", pageLayoutName );
3318 if ( isHeaderVisible() || isFooterVisible() ) {
3319 stylesWriter->addCompleteElement( headerFooterContent.data() );
3322 stylesWriter->endElement();
3323 stylesWriter->endElement();
3325 stylesWriter->endElement();
3326 stylesWriter->endDocument();
3327 delete stylesWriter;
3330void KWDocument::saveOasisCustomFied( KoXmlWriter &writer )
const
3332 bool customVariableFound =
false;
3333 TQPtrListIterator<KoVariable> it( m_varColl->getVariables() );
3334 for ( ; it.current() ; ++it )
3336 if ( it.current()->type() == VT_CUSTOM )
3338 if ( !customVariableFound )
3340 writer.startElement(
"text:user-field-decls" );
3341 customVariableFound =
true;
3344 writer.startElement(
"text:user-field-decl" );
3345 writer.addAttribute(
"office:value-type",
"string" );
3346 writer.addAttribute(
"office:string-value",
static_cast<KoCustomVariable *
>( it.current() )->value() );
3347 writer.addAttribute(
"text:name",
static_cast<KoCustomVariable*
>( it.current() )->name() );
3348 writer.endElement();
3351 if ( customVariableFound )
3352 writer.endElement();
3355void KWDocument::saveOasisBody( KoXmlWriter& writer, KoSavingContext& context )
const
3357 saveOasisCustomFied( writer );
3358 if ( m_processingType == WP ) {
3361 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3363 for ( ; fit.current() ; ++fit ) {
3364 KWFrameSet* fs = fit.current();
3375 KWTextFrameSet *frameset =
dynamic_cast<KWTextFrameSet *
>( m_lstFrameSet.getFirst() );
3382 writer.startElement(
"text:page-sequence" );
3383 for (
int page = 0; page < pageCount(); ++page )
3385 writer.startElement(
"text:page" );
3388 writer.addAttribute(
"text:master-page-name",
"pm" );
3389 writer.endElement();
3391 writer.endElement() ;
3393 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3394 for ( ; fit.current() ; ++fit ) {
3395 KWFrameSet* fs = fit.current();
3406TQDomDocument KWDocument::saveXML()
3408 m_varColl->variableSetting()->setModificationDate(TQDateTime::currentDateTime());
3409 recalcVariables( VT_DATE );
3410 recalcVariables( VT_TIME );
3411 recalcVariables( VT_STATISTIC );
3412 TQDomDocument doc = createDomDocument(
"DOC", CURRENT_DTD_VERSION );
3413 TQDomElement kwdoc = doc.documentElement();
3414 kwdoc.setAttribute(
"editor",
"KWord" );
3415 kwdoc.setAttribute(
"mime",
"application/x-kword" );
3416 m_syntaxVersion = CURRENT_SYNTAX_VERSION;
3417 kwdoc.setAttribute(
"syntaxVersion", m_syntaxVersion );
3419 TQDomElement paper = doc.createElement(
"PAPER" );
3420 kwdoc.appendChild( paper );
3421 paper.setAttribute(
"format",
static_cast<int>( m_pageLayout.format ) );
3422 paper.setAttribute(
"pages", pageCount() );
3423 paper.setAttribute(
"width", m_pageLayout.ptWidth );
3424 paper.setAttribute(
"height", m_pageLayout.ptHeight );
3425 paper.setAttribute(
"orientation",
static_cast<int>( m_pageLayout.orientation ) );
3426 paper.setAttribute(
"columns", m_pageColumns.columns );
3427 paper.setAttribute(
"columnspacing", m_pageColumns.ptColumnSpacing );
3428 paper.setAttribute(
"hType",
static_cast<int>( m_pageHeaderFooter.header ) );
3429 paper.setAttribute(
"fType",
static_cast<int>( m_pageHeaderFooter.footer ) );
3430 paper.setAttribute(
"spHeadBody", m_pageHeaderFooter.ptHeaderBodySpacing );
3431 paper.setAttribute(
"spFootBody", m_pageHeaderFooter.ptFooterBodySpacing );
3432 paper.setAttribute(
"spFootNoteBody", m_pageHeaderFooter.ptFootNoteBodySpacing );
3433 if ( m_footNoteSeparatorLinePos!=SLP_LEFT )
3435 if (m_footNoteSeparatorLinePos==SLP_CENTERED )
3436 paper.setAttribute(
"slFootNotePosition",
"centered" );
3437 else if ( m_footNoteSeparatorLinePos==SLP_RIGHT )
3438 paper.setAttribute(
"slFootNotePosition",
"right" );
3439 else if ( m_footNoteSeparatorLinePos==SLP_LEFT )
3440 paper.setAttribute(
"slFootNotePosition",
"left" );
3442 if ( m_footNoteSeparatorLineType != SLT_SOLID )
3443 paper.setAttribute(
"slFootNoteType",
static_cast<int>(m_footNoteSeparatorLineType) );
3446 paper.setAttribute(
"slFootNoteLength", m_iFootNoteSeparatorLineLength);
3447 paper.setAttribute(
"slFootNoteWidth", m_footNoteSeparatorLineWidth);
3452 TQDomElement borders = doc.createElement(
"PAPERBORDERS" );
3453 paper.appendChild( borders );
3454 borders.setAttribute(
"left", m_pageLayout.ptLeft );
3455 borders.setAttribute(
"top", m_pageLayout.ptTop );
3456 borders.setAttribute(
"right", m_pageLayout.ptRight );
3457 borders.setAttribute(
"bottom", m_pageLayout.ptBottom );
3459 TQDomElement docattrs = doc.createElement(
"ATTRIBUTES" );
3460 kwdoc.appendChild( docattrs );
3461 docattrs.setAttribute(
"processing",
static_cast<int>( m_processingType ) );
3462 docattrs.setAttribute(
"standardpage", 1 );
3463 docattrs.setAttribute(
"hasHeader",
static_cast<int>(isHeaderVisible()) );
3464 docattrs.setAttribute(
"hasFooter",
static_cast<int>(isFooterVisible()) );
3465 docattrs.setAttribute(
"unit", KoUnit::unitName(unit()) );
3466 docattrs.setAttribute(
"hasTOC",
static_cast<int>(m_hasTOC));
3467 docattrs.setAttribute(
"tabStopValue", m_tabStop );
3471 KWView * view =
static_cast<KWView*
>(views().getFirst());
3474 KWFrameSetEdit* edit = view->getGUI()->canvasWidget()->currentFrameSetEdit();
3477 docattrs.setAttribute(
"activeFrameset", edit->frameSet()->
name() );
3478 KWTextFrameSetEdit* textedit =
dynamic_cast<KWTextFrameSetEdit *
>(edit);
3479 if ( textedit && textedit->cursor() ) {
3480 KoTextCursor* cursor = textedit->cursor();
3481 docattrs.setAttribute(
"cursorParagraph", cursor->parag()->paragId() );
3482 docattrs.setAttribute(
"cursorIndex", cursor->index() );
3487 if( !m_bookmarkList->isEmpty() )
3489 TQDomElement bookmark = doc.createElement(
"BOOKMARKS" );
3490 kwdoc.appendChild( bookmark );
3492 for ( KoTextBookmarkList::const_iterator it = m_bookmarkList->begin();
3493 it != m_bookmarkList->end() ; ++it )
3495 const KoTextBookmark& book = *it;
3496 KWTextFrameSet* fs =
static_cast<KWTextDocument*
>(book.textDocument())->textFrameSet();
3497 if ( book.startParag() &&
3501 TQDomElement bookElem = doc.createElement(
"BOOKMARKITEM" );
3502 bookmark.appendChild( bookElem );
3503 bookElem.setAttribute(
"name", book.bookmarkName() );
3504 bookElem.setAttribute(
"frameset", fs->
name() );
3505 bookElem.setAttribute(
"startparag", book.startParag()->paragId() );
3506 bookElem.setAttribute(
"endparag", book.endParag()->paragId() );
3508 bookElem.setAttribute(
"cursorIndexStart", book.bookmarkStartIndex() );
3509 bookElem.setAttribute(
"cursorIndexEnd", book.bookmarkEndIndex() );
3513 variableCollection()->variableSetting()->save(kwdoc );
3515 TQDomElement framesets = doc.createElement(
"FRAMESETS" );
3516 kwdoc.appendChild( framesets );
3518 m_textImageRequests.clear();
3519 TQValueList<KoPictureKey> savePictures;
3521 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3522 for ( ; fit.current() ; ++fit )
3524 KWFrameSet *frameSet = fit.current();
3526 if ( frameSet->type() != FT_PART )
3527 frameSet->save( framesets );
3530 if ( !frameSet->isDeleted() && ( frameSet->type() == FT_PICTURE ) )
3532 KoPictureKey key =
static_cast<KWPictureFrameSet *
>( frameSet )->key();
3533 if ( !savePictures.contains( key ) )
3534 savePictures.append( key );
3539 TQPtrListIterator<KWTextImage> textIt ( m_textImageRequests );
3540 for ( ; textIt.current() ; ++textIt )
3542 KoPictureKey key = textIt.current()->getKey();
3543 kdDebug(32001) <<
"KWDocument::saveXML registering text image " << key.toString() << endl;
3544 if ( !savePictures.contains( key ) )
3545 savePictures.append( key );
3548 TQDomElement styles = doc.createElement(
"STYLES" );
3549 kwdoc.appendChild( styles );
3550 TQValueList<KoUserStyle *> styleList(m_styleColl->styleList());
3551 for ( TQValueList<KoUserStyle *>::const_iterator it = styleList.begin(), end = styleList.end();
3553 saveStyle(
static_cast<KoParagStyle *
>( *it ), styles );
3555 TQDomElement frameStyles = doc.createElement(
"FRAMESTYLES" );
3556 kwdoc.appendChild( frameStyles );
3557 TQValueList<KoUserStyle *> frameStyleList(m_frameStyleColl->styleList());
3558 for ( TQValueList<KoUserStyle *>::const_iterator it = frameStyleList.begin(), end = frameStyleList.end();
3560 saveFrameStyle(
static_cast<KWFrameStyle *
>(*it), frameStyles );
3562 TQDomElement tableStyles = doc.createElement(
"TABLESTYLES" );
3563 kwdoc.appendChild( tableStyles );
3564 TQValueList<KoUserStyle *> tableStyleList(m_tableStyleColl->styleList());
3565 for ( TQValueList<KoUserStyle *>::const_iterator it = tableStyleList.begin(), end = tableStyleList.end();
3567 saveTableStyle(
static_cast<KWTableStyle *
>(*it), tableStyles );
3569 TQDomElement pictures = m_pictureCollection->saveXML( KoPictureCollection::CollectionPicture, doc, savePictures );
3570 kwdoc.appendChild( pictures );
3575 if ( contents->hasContents() ) {
3576 TQDomElement cParags = doc.createElement(
"CPARAGS" );
3577 kwdoc.appendChild( cParags );
3578 TQValueList<int>::Iterator it = contents->begin();
3579 for ( ; it != contents->end(); ++it )
3581 TQDomElement paragElem = doc.createElement(
"PARAG" );
3582 cParags.appendChild( paragElem );
3583 paragElem.setAttribute(
"name", TQString::number( *it ) );
3588 TQDomElement mailMerge=m_slDataBase->save(doc);
3589 kwdoc.appendChild(mailMerge);
3591 if( !m_spellCheckIgnoreList.isEmpty() )
3593 TQDomElement spellCheckIgnore = doc.createElement(
"SPELLCHECKIGNORELIST" );
3594 kwdoc.appendChild( spellCheckIgnore );
3595 for ( TQStringList::ConstIterator it = m_spellCheckIgnoreList.begin(); it != m_spellCheckIgnoreList.end(); ++it )
3597 TQDomElement spellElem = doc.createElement(
"SPELLCHECKIGNOREWORD" );
3598 spellCheckIgnore.appendChild( spellElem );
3599 spellElem.setAttribute(
"word", *it );
3604 saveEmbeddedObjects( kwdoc, children() );
3609void KWDocument::saveEmbeddedObjects( TQDomElement& parentElem,
const TQPtrList<KoDocumentChild>& childList )
3612 TQPtrListIterator<KoDocumentChild> chl( childList );
3613 TQDomDocument doc = parentElem.ownerDocument();
3614 for( ; chl.current(); ++chl ) {
3615 KWDocumentChild* curr =
static_cast<KWDocumentChild*
>(chl.current());
3616 if ( !curr->isDeleted() )
3618 TQDomElement embeddedElem = doc.createElement(
"EMBEDDED" );
3619 parentElem.appendChild( embeddedElem );
3621 TQDomElement objectElem = curr->save( doc,
true );
3622 embeddedElem.appendChild( objectElem );
3624 TQDomElement settingsElem = doc.createElement(
"SETTINGS" );
3625 embeddedElem.appendChild( settingsElem );
3627 curr->partFrameSet()->
save( settingsElem );
3633void KWDocument::saveStyle( KoParagStyle *sty, TQDomElement parentElem )
3635 TQDomDocument doc = parentElem.ownerDocument();
3636 TQDomElement styleElem = doc.createElement(
"STYLE" );
3637 parentElem.appendChild( styleElem );
3639 sty->saveStyle( styleElem );
3642 styleElem.appendChild( formatElem );
3646void KWDocument::saveFrameStyle(
KWFrameStyle *sty, TQDomElement parentElem )
3648 TQDomDocument doc = parentElem.ownerDocument();
3649 TQDomElement frameStyleElem = doc.createElement(
"FRAMESTYLE" );
3650 parentElem.appendChild( frameStyleElem );
3656void KWDocument::saveTableStyle(
KWTableStyle *sty, TQDomElement parentElem )
3658 TQDomDocument doc = parentElem.ownerDocument();
3659 TQDomElement tableStyleElem = doc.createElement(
"TABLESTYLE" );
3660 parentElem.appendChild( tableStyleElem );
3666TQValueList<KoPictureKey> KWDocument::savePictureList()
3668 TQValueList<KoPictureKey> savePictures;
3672 TQPtrListIterator<KWTextImage> textIt ( m_textImageRequests );
3673 for ( ; textIt.current() ; ++textIt )
3675 KoPictureKey key = textIt.current()->getKey();
3676 kdDebug(32001) <<
"KWDocument::saveXML registering text image " << key.toString() << endl;
3677 if ( !savePictures.contains( key ) )
3678 savePictures.append( key );
3680 m_textImageRequests.clear();
3683 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3684 for ( ; fit.current() ; ++fit )
3686 KWFrameSet *frameSet = fit.current();
3688 if ( !frameSet->isDeleted() && ( frameSet->type() == FT_PICTURE ) )
3690 KoPictureKey key =
static_cast<KWPictureFrameSet *
>( frameSet )->key();
3691 if ( !savePictures.contains( key ) )
3692 savePictures.append( key );
3695 return savePictures;
3699bool KWDocument::completeSaving( KoStore *store )
3704 TQString u = KURL( url() ).path();
3706 TQValueList<KoPictureKey> savePictures( savePictureList() );
3708 return m_pictureCollection->saveToStore( KoPictureCollection::CollectionPicture, store, savePictures );
3711int KWDocument::supportedSpecialFormats()
const
3713 return KoDocument::supportedSpecialFormats();
3716void KWDocument::addView( KoView *view )
3718 m_lstViews.append( (KWView*)view );
3719 KoDocument::addView( view );
3720 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
3721 (*it)->deselectAllFrames();
3725void KWDocument::removeView( KoView *view )
3727 m_lstViews.remove(
static_cast<KWView*
>(view) );
3728 KoDocument::removeView( view );
3731void KWDocument::addShell( KoMainWindow *shell )
3733 connect( shell, TQ_SIGNAL( documentSaved() ), m_commandHistory, TQ_SLOT( documentSaved() ) );
3734 connect( shell, TQ_SIGNAL( saveDialogShown() ),
this, TQ_SLOT( saveDialogShown() ) );
3735 KoDocument::addShell( shell );
3738KoView* KWDocument::createViewInstance( TQWidget* parent,
const char* name )
3741 return new KWView(
"ModeEmbedded", parent, name,
this );
3743 return new KWView( m_viewModeType, parent, name,
this );
3748void KWDocument::paintContent( TQPainter& painter,
const TQRect& rectangle,
bool transparent,
double zoomX,
double zoomY )
3751 Q_ASSERT( zoomX != 0 );
3752 Q_ASSERT( zoomY != 0 );
3755 m_zoomMode = KoZoomMode::ZOOM_CONSTANT;
3758 zoomX *= POINT_TO_INCH(
static_cast<double>( KoGlobal::dpiX() ) );
3759 zoomY *= POINT_TO_INCH(
static_cast<double>( KoGlobal::dpiY() ) );
3761 if ( m_zoomedResolutionX != zoomX || m_zoomedResolutionY != zoomY )
3764 int zoomLevel = tqRound( 100 * zoomY / m_zoomedResolutionY );
3765 setZoom( zoomLevel );
3766 bool forPrint = painter.device() && painter.device()->devType() == TQInternal::Printer;
3767 newZoomAndResolution(
false, forPrint );
3768 if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
3769 formulaDocument->setZoomAndResolution( zoomLevel, zoomX, zoomY,
false, forPrint );
3773 TQRect rect( rectangle );
3775 painter.translate( rect.x(), rect.y() );
3776 TQRect clipRect( 0, 0, rect.width(), rect.height() );
3778 KWViewModeEmbedded * viewMode =
new KWViewModeEmbedded(
this, 0 );
3779 viewMode->setDrawFrameBackground( !transparent );
3780 viewMode->setDrawSelections(
false );
3782 TQColorGroup cg = TQApplication::palette().active();
3786 TQRegion emptyRegion( rect );
3787 createEmptyRegion( rect, emptyRegion, viewMode );
3788 eraseEmptySpace( &painter, emptyRegion, cg.brush( TQColorGroup::Base ) );
3791 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3792 for ( ; fit.current() ; ++fit )
3794 KWFrameSet * frameset = fit.current();
3805TQPixmap KWDocument::generatePreview(
const TQSize& size )
3807 int oldZoom = m_zoom;
3808 double oldResolutionX = resolutionX();
3809 double oldResolutionY = resolutionY();
3810 double oldZoomX = zoomedResolutionX();
3811 double oldZoomY = zoomedResolutionY();
3818 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
3819 (*it)->getGUI()->canvasWidget()->setUpdatesEnabled(
false );
3821 Q_ASSERT( !m_bGeneratingPreview );
3822 m_bGeneratingPreview =
true;
3823 TQPixmap pix = KoDocument::generatePreview(size);
3826 setResolution( oldResolutionX, oldResolutionY );
3829 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
3830 (*it)->getGUI()->canvasWidget()->setUpdatesEnabled(
true );
3832 newZoomAndResolution(
true ,
false );
3833 m_bGeneratingPreview =
false;
3834 if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() ) {
3835 formulaDocument->setZoomAndResolution( oldZoom, oldZoomX, oldZoomY );
3840void KWDocument::createEmptyRegion(
const TQRect & crect, TQRegion & emptyRegion,
KWViewMode * viewMode )
3842 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
3843 for ( ; fit.current() ; ++fit )
3845 KWFrameSet *frameset = fit.current();
3851void KWDocument::eraseEmptySpace( TQPainter * painter,
const TQRegion & emptySpaceRegion,
const TQBrush & brush )
3854 painter->setClipRegion( emptySpaceRegion, TQPainter::CoordPainter );
3855 painter->setPen( TQt::NoPen );
3859 painter->fillRect( emptySpaceRegion.boundingRect(), brush );
3863KWDocumentChild* KWDocument::createChildDoc(
const KoRect& rect, KoDocument* childDoc )
3865 KWDocumentChild* ch =
new KWDocumentChild(
this, rect.toTQRect(), childDoc );
3870KWPartFrameSet* KWDocument::insertObject(
const KoRect& rect, KoDocumentEntry& e, TQWidget* parentWidget )
3872 KoDocument* doc = e.createDoc(
this );
3875 if ( !doc->showEmbedInitDialog( parentWidget ) )
3878 KWDocumentChild* ch = createChildDoc( rect, doc );
3879 setModified(
true );
3881 KWPartFrameSet *frameset =
new KWPartFrameSet(
this, ch, TQString() );
3882 KWFrame *frame =
new KWFrame(frameset, rect.x(), rect.y(), rect.width(), rect.height() );
3884 frameset->addFrame( frame );
3885 addFrameSet( frameset );
3887 KWCreateFrameCommand *cmd =
new KWCreateFrameCommand( i18n(
"Create Part Frame"), frame);
3890 frameChanged( frame );
3896void KWDocument::delayedRepaintAllViews() {
3897 if (!m_repaintAllViewsPending) {
3898 TQTimer::singleShot( 0,
this, TQ_SLOT( slotRepaintAllViews() ) );
3899 m_repaintAllViewsPending=
true;
3903void KWDocument::slotRepaintAllViews() {
3904 m_repaintAllViewsPending=
false;
3905 repaintAllViews(
false );
3908void KWDocument::delayedRecalcFrames(
int fromPage ) {
3910 if ( m_recalcFramesPending == -1 || fromPage < m_recalcFramesPending )
3912 m_recalcFramesPending = fromPage;
3913 TQTimer::singleShot( 0,
this, TQ_SLOT( slotRecalcFrames() ) );
3917void KWDocument::slotRecalcFrames() {
3918 int from = m_recalcFramesPending;
3919 kdDebug() << k_funcinfo <<
"from=" << from << endl;
3920 m_recalcFramesPending = -1;
3922 recalcFrames( from );
3925void KWDocument::repaintAllViewsExcept( KWView *view,
bool erase )
3928 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
3929 KWView* viewPtr = *it;
3930 if ( viewPtr != view ) {
3931 viewPtr->getGUI()->canvasWidget()->repaintAll( erase );
3936void KWDocument::updateAllStyleLists()
3938 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
3939 (*it)->updateStyleList();
3942void KWDocument::updateStyleListOrder(
const TQStringList &list )
3944 styleCollection()->updateStyleListOrder( list );
3947void KWDocument::applyStyleChange( KoStyleChangeDefMap changed )
3949 TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets(
true );
3951 KWTextFrameSet *frm;
3952 for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
3957void KWDocument::updateAllFrameStyleLists()
3959 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
3960 (*it)->updateFrameStyleList();
3963void KWDocument::updateAllTableStyleLists()
3965 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
3966 (*it)->updateTableStyleList();
3969void KWDocument::repaintAllViews(
bool erase )
3972 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
3973 (*it)->getGUI()->canvasWidget()->repaintAll( erase );
3976TQPtrList<KWFrame> KWDocument::framesToCopyOnNewPage(
int afterPageNum )
const {
3980 TQPtrList<KWFrame> framesToLookAt;
3981 if ( afterPageNum >= startPage() )
3982 framesToLookAt = framesInPage( afterPageNum,
false );
3984 if ( afterPageNum >= startPage() + 1 )
3986 TQPtrList<KWFrame> framesToAlsoLookAt = framesInPage( afterPageNum-1,
false );
3989 TQPtrListIterator<KWFrame> frameAlsoIt( framesToAlsoLookAt );
3990 for ( ; frameAlsoIt.current(); ++frameAlsoIt )
3991 framesToLookAt.append( frameAlsoIt.current() );
3994 TQPtrList<KWFrame> framesToCopy;
3996 TQPtrListIterator<KWFrame> frameIt( framesToLookAt );
3997 for ( ; frameIt.current(); ++frameIt )
3999 KWFrame * frame = frameIt.current();
4000 KWFrameSet* frameSet = frame->
frameSet();
4003 if ( frameSet->type() == FT_TABLE )
continue;
4007 if(frameSet->isAHeader() || frameSet->isAFooter())
continue;
4010 kdDebug(32002) <<
"KWDocument::framesToCopyOnNewPage looking at frame " << frame <<
", pageNum=" << frame->
pageNumber() <<
" from " << frameSet->name() << endl;
4011 static const char * newFrameBh[] = {
"Reconnect",
"NoFollowup",
"Copy" };
4012 kdDebug(32002) <<
" frame->newFrameBehavior()==" << newFrameBh[frame->newFrameBehavior()] << endl;
4014 const int frameIsOnPage = frame->
pageNumber();
4015 if (frame->newFrameBehavior() == KWFrame::Copy &&
4016 (frameIsOnPage == afterPageNum && frame->sheetSide() == KWFrame::AnySide ||
4017 frameIsOnPage == afterPageNum -1 && frame->sheetSide() != KWFrame::AnySide))
4018 framesToCopy.append( frame );
4020 return framesToCopy;
4023KWPage* KWDocument::insertPage(
int afterPageNum )
4026 kdDebug(32002) <<
"insertPage: afterPageNum=" << afterPageNum << endl;
4028 if ( processingType() == WP )
4029 Q_ASSERT( afterPageNum == lastPage() );
4031 double pageHeight = pageManager()->page( afterPageNum )->height();
4033 for (
int pg = pageCount () -1 ; pg > afterPageNum ; --pg )
4036 TQPtrList<KWFrame> frames = framesInPage( pg,
false );
4038 kdDebug(32002) <<
"insertPage: moving " << frames.count() <<
" frames down, from page " << pg << endl;
4040 TQPtrListIterator<KWFrame> frameIt( frames );
4041 for ( ; frameIt.current(); ++frameIt )
4042 frameIt.current()->moveBy( 0, pageHeight );
4045 KWPage *page = pageManager()->insertPage(afterPageNum+1);
4048 TQPtrList<KWFrame> framesToCopy = framesToCopyOnNewPage( afterPageNum );
4049 TQPtrListIterator<KWFrame> frameIt( framesToCopy );
4050 for ( ; frameIt.current(); ++frameIt )
4052 KWFrame * frame = frameIt.current();
4054 KWFrame *newFrame = frame->
getCopy();
4055 newFrame->moveBy( 0, pageHeight );
4056 frame->
frameSet()->addFrame( newFrame );
4058 if ( frame->newFrameBehavior()==KWFrame::Copy )
4059 newFrame->setCopy(
true );
4065KWPage* KWDocument::appendPage()
4068 kdDebug(32002) <<
"KWDocument::appendPage pageCount()=" << pageCount() <<
" -> insertPage(" << lastPage() <<
")" << endl;
4070 return insertPage( lastPage() );
4073void KWDocument::afterInsertPage(
int pageNum )
4076 kdDebug(32002) <<
"KWDocument::afterInsertPage " << pageNum << endl;
4078 if ( !m_bGeneratingPreview )
4079 emit newContentsSize();
4083 recalcFrames( pageNum, -1, KWFrameLayout::DontRemovePages );
4087 recalcVariables( VT_PGNUM );
4088 emit numPagesChanged();
4089 if ( m_viewModeType ==
"ModePreview" )
4093bool KWDocument::canRemovePage(
int num )
4095kdDebug() <<
"KWDocument::canRemovePage " << num<< endl;
4096 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4097 for ( ; fit.current() ; ++fit )
4099 KWFrameSet * frameSet = fit.current();
4100 if ( frameSet->isHeaderOrFooter() )
4102 if ( frameSet->isVisible() && !frameSet->canRemovePage( num ) )
4106 kdDebug(32002) <<
"KWDocument::canRemovePage " << num <<
"-> true" << endl;
4111void KWDocument::removePage(
int pageNum )
4113 if ( processingType() == WP )
4114 Q_ASSERT( pageNum == lastPage() );
4115 Q_ASSERT( pageCount() > 1 );
4116 if ( pageCount() == 1 )
4120 TQPtrList<KWFrame> framesToDelete = framesInPage( pageNum,
false );
4122 kdDebug(32002) <<
"KWDocument::removePage " << pageNum <<
", " << framesToDelete.count() <<
" frames to delete" << endl;
4124 TQPtrListIterator<KWFrame> frameIt( framesToDelete );
4125 for ( ; frameIt.current(); ++frameIt )
4127 KWFrame * frame = frameIt.current();
4128 KWFrameSet * frameSet = frame->
frameSet();
4129 if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY )
4135 for (
int pg = pageNum+1 ; pg < pageCount() ; ++pg )
4138 TQPtrList<KWFrame> frames = framesInPage( pg,
false );
4140 kdDebug(32002) <<
"removePage: moving " << frames.count() <<
" frames up, from page " << pg << endl;
4142 TQPtrListIterator<KWFrame> frameIt( frames );
4143 for ( ; frameIt.current(); ++frameIt )
4144 frameIt.current()->moveBy( 0, pageManager()->page(0)->height() );
4147 pageManager()->removePage(pageNum);
4149 kdDebug(32002) <<
"KWDocument::removePage -- -> " << pageCount() << endl;
4152 emit numPagesChanged();
4155void KWDocument::afterRemovePages()
4162 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4163 for ( ; fit.current() ; ++fit )
4164 fit.current()->updateFrames();
4166 recalcVariables( VT_PGNUM );
4167 if ( !m_bGeneratingPreview )
4168 emit newContentsSize();
4169 if ( m_viewModeType ==
"ModePreview" )
4173bool KWDocument::tryRemovingPages()
4175 int last = lastPage();
4176 bool removed =
false;
4178 while ( last > startPage() && canRemovePage( last ) )
4181 if ( last <= lastPage() )
4183 kdWarning() <<
"Didn't manage to remove page " << last <<
" (still having " << pageCount() <<
" pages ). Aborting" << endl;
4195KWFrameSet * KWDocument::frameSetByName(
const TQString & name )
4198 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4199 for ( ; fit.current() ; ++fit )
4200 if ( fit.current()->name() == name )
4201 return fit.current();
4207TQString KWDocument::generateFramesetName(
const TQString & templateName )
4213 name = templateName.arg( num );
4214 exists = frameSetByName( name );
4220void KWDocument::fixZOrders() {
4222 for (
int pgnum = startPage() ; pgnum <= lastPage() ; pgnum++) {
4223 TQPtrList<KWFrame> frames = framesInPage(pgnum);
4227 bool need_fixup =
false;
4228 KWFrame *f = frames.last();
4231 int lastZOrder = f->zOrder();
4233 for ( ; f ; f=frames.prev() ) {
4235 ( f->zOrder() == lastZOrder || f->zOrder() < 0 ) ) {
4239 lastZOrder = f->zOrder();
4242 int current_zorder=0;
4243 kdDebug() <<
"fixing page " << pgnum <<
" z-orders " << endl;
4244 for (KWFrame *fr = frames.first();fr;fr=frames.next()) {
4246 if (fr->frameSet()->isFloating())
4249 fr->setZOrder(current_zorder);
4254 if ( m_processingType == KWDocument::WP )
4258 lowerMainFrames( pgnum );
4266void KWDocument::lowerMainFrames(
int pageNum )
4268 TQPtrList<KWFrame> framesInPage = this->framesInPage(pageNum);
4269 int lowestZOrder=10000;
4270 for ( TQPtrListIterator<KWFrame> frameIt( framesInPage ); frameIt.current(); ++frameIt )
4271 lowestZOrder=TQMIN(lowestZOrder, frameIt.current()->zOrder());
4272 lowerMainFrames( pageNum, lowestZOrder );
4276void KWDocument::lowerMainFrames(
int pageNum,
int lowestZOrder )
4279 TQPtrList<KWFrame> framesInPage = this->framesInPage(pageNum);
4280 for ( TQPtrListIterator<KWFrame> frameIt( framesInPage ); frameIt.current(); ++frameIt ) {
4281 if(frameIt.current()->frameSet()->isMainFrameset()) {
4282 if(lowestZOrder <= frameIt.current()->zOrder())
4283 frameIt.current()->setZOrder(lowestZOrder-1);
4289TQPtrList<KWFrame> KWDocument::framesInPage(
int pageNum,
bool sorted )
const {
4291 ZOrderedFrameList frames;
4292 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4293 for ( ; fit.current() ; ++fit )
4295 KWFrameSet *frameSet = fit.current();
4296 if ( !frameSet->isVisible() )
4299 TQPtrListIterator<KWFrame> it( frameSet->framesInPage( pageNum ) );
4300 for ( ; it.current() ; ++it )
4301 frames.append( it.current() );
4303 if (sorted) frames.sort();
4307void KWDocument::updateAllFrames(
int flags )
4313 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4314 for ( ; fit.current() ; ++fit )
4315 fit.current()->updateFrames( flags );
4318 kdDebug(32001) <<
"updateAllFrames(" << flags <<
") took " << (float)(dt.elapsed()) / 1000 <<
" seconds" << endl;
4332void KWDocument::frameChanged(
KWFrame * frame )
4334 if(! m_framesChangedHandler) {
4335 m_framesChangedHandler =
new FramesChangedHandler(
this);
4336 TQTimer::singleShot( 0,
this, TQ_SLOT( updateFramesChanged() ) );
4338 m_framesChangedHandler->addFrame(frame);
4341void KWDocument::framesChanged(
const TQPtrList<KWFrame> & frames, KWView * view )
4344 TQPtrListIterator<KWFrame> it( frames );
4345 for ( ; it.current() ; ++it )
4346 frameChanged(it.current());
4349void KWDocument::updateFramesChanged() {
4350 if(!m_framesChangedHandler)
return;
4351 m_framesChangedHandler->execute();
4352 delete m_framesChangedHandler;
4353 m_framesChangedHandler = 0;
4356void KWDocument::framesChanged(
const TQValueList<KWFrame*> &frames) {
4357 TQValueListConstIterator<KWFrame*> framesIterator = frames.begin();
4358 for(;framesIterator != frames.end(); ++framesIterator)
4359 frameChanged(*framesIterator);
4362void KWDocument::setHeaderVisible(
bool h )
4364 m_headerVisible = h;
4369 repaintAllViews(
true );
4372void KWDocument::setFooterVisible(
bool f )
4374 m_footerVisible = f;
4379 repaintAllViews(
true );
4382bool KWDocument::hasEndNotes()
const
4384 return m_bHasEndNotes;
4387void KWDocument::updateHeaderButton()
4389 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4391 (*it)->updateHeaderFooterButton();
4392 (*it)->updateHeader();
4396void KWDocument::updateFooterButton()
4398 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4400 (*it)->updateHeaderFooterButton();
4401 (*it)->updateFooter();
4405void KWDocument::addTextImageRequest(
KWTextImage *img )
4407 m_textImageRequests.append( img );
4410void KWDocument::addPictureRequest( KWPictureFrameSet *fs )
4412 m_pictureRequests.append( fs );
4415void KWDocument::addAnchorRequest(
const TQString &framesetName,
const KWAnchorPosition &anchorPos )
4417 m_anchorRequests.insert( framesetName, anchorPos );
4420void KWDocument::addFootNoteRequest(
const TQString &framesetName,
KWFootNoteVariable* var )
4422 if ( var->noteType() == EndNote )
4423 m_bHasEndNotes =
true;
4424 m_footnoteVarRequests.insert( framesetName, var );
4427void KWDocument::refreshMenuCustomVariable()
4429 emit sig_refreshMenuCustomVariable();
4432void KWDocument::recalcVariables(
int type )
4434 const TQValueList<KoVariable *> modifiedVariables = m_varColl->recalcVariables(type);
4435 if ( m_bGeneratingPreview )
4438 TQMap<KoTextDocument *, bool> modifiedTextDocuments;
4439 for ( TQValueList<KoVariable *>::const_iterator it = modifiedVariables.begin(), end = modifiedVariables.end() ; it != end ; ++it ) {
4440 KoTextDocument* textdoc = (*it)->textDocument();
4441 if ( modifiedTextDocuments.find( textdoc ) != modifiedTextDocuments.end() )
4443 modifiedTextDocuments.insert( textdoc,
true );
4444 KWTextFrameSet * textfs =
static_cast<KWTextDocument *
>(textdoc)->textFrameSet();
4445 slotRepaintChanged( textfs );
4450int KWDocument::mailMergeRecord()
const
4455void KWDocument::setMailMergeRecord(
int r )
4460void KWDocument::getPageLayout( KoPageLayout& layout, KoColumns& cl, KoKWHeaderFooter& hf )
4462 layout = m_pageLayout;
4464 hf = m_pageHeaderFooter;
4467void KWDocument::addFrameSet(
KWFrameSet *f,
bool finalize )
4469 if(m_lstFrameSet.contains(f) > 0) {
4470 kdWarning(32001) <<
"Frameset " << f <<
" " << f->
name() <<
" already in list!" << endl;
4473 m_lstFrameSet.append(f);
4479 setModified(
true );
4480 emit sigFrameSetAdded(f);
4483void KWDocument::removeFrameSet(
KWFrameSet *f )
4485 emit sig_terminateEditing( f );
4486 m_lstFrameSet.take( m_lstFrameSet.find(f) );
4487 setModified(
true );
4488 emit sigFrameSetRemoved(f);
4491void KWDocument::addCommand( KCommand * cmd )
4495 m_commandHistory->addCommand( cmd,
false );
4496 setModified(
true );
4499void KWDocument::slotDocumentRestored()
4501 setModified(
false );
4504void KWDocument::slotCommandExecuted()
4506 setModified(
true );
4510void KWDocument::printStyleDebug()
4512 kdDebug() <<
"----------------------------------------"<<endl;
4513 m_styleColl->printDebug();
4514 kdDebug() << m_frameStyleColl->count() <<
" frame styles" << endl;
4515 kdDebug() << m_tableStyleColl->count() <<
" table-cell styles" << endl;
4518void KWDocument::printDebug()
4520 kdDebug() <<
"----------------------------------------"<<endl;
4521 kdDebug() <<
" Debug info"<<endl;
4522 kdDebug() <<
"Document:" <<
this <<endl;
4523 kdDebug() <<
"Type of document: (0=WP, 1=DTP) " << processingType() <<endl;
4524 kdDebug() <<
"Header visible: " << isHeaderVisible() << endl;
4525 kdDebug() <<
"Footer visible: " << isFooterVisible() << endl;
4526 kdDebug() <<
"Units: " << unit() <<endl;
4527 kdDebug() <<
"# Framesets: " << frameSetCount() <<endl;
4528 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4529 for (
unsigned int iFrameset = 0; fit.current() ; ++fit, iFrameset++ )
4531 KWFrameSet * frameset = fit.current();
4532 kdDebug() <<
"Frameset " << iFrameset <<
": '" <<
4533 frameset->
name() <<
"' (" << frameset <<
")" << (frameset->
isDeleted()?
" Deleted":
"")<<endl;
4535 frameset->printDebug();
4537 kdDebug() <<
" [hidden] #" << frameset->
frameCount() <<
" frames" << endl;
4540 for ( uint pgNum = 0 ; pgNum < m_sectionTitles.size() ; ++pgNum ) {
4541 kdDebug() <<
"Page " << pgNum <<
" Section: '" << m_sectionTitles[ pgNum ] <<
"'"<< endl;
4552 kdDebug() <<
"PageManager holds "<< pageCount() <<
" pages in the range: " << startPage() <<
4553 "-" << lastPage() << endl;
4554 for (
int pgnum = startPage() ; pgnum <= lastPage() ; pgnum++) {
4555 KWPage *page = pageManager()->page(pgnum);
4556 kdDebug() <<
"Page " << pgnum <<
" width=" << page->
width() <<
" height=" << page->
height() << endl;
4558 kdDebug() <<
" The height of the doc (in pt) is: " << pageManager()->
4559 bottomOfPage(lastPage()) << endl;
4563void KWDocument::layout()
4565 TQPtrListIterator<KWFrameSet> it = framesetsIterator();
4566 for (; it.current(); ++it )
4567 if ( it.current()->isVisible() )
4568 it.current()->layout();
4571void KWDocument::invalidate(
const KWFrameSet *skipThisFrameSet)
4573 TQPtrListIterator<KWFrameSet> it = framesetsIterator();
4574 for (; it.current(); ++it )
4575 if(it.current()!=skipThisFrameSet)
4576 it.current()->invalidate();
4579KFormula::Document* KWDocument::formulaDocument(
bool init )
4581 KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document();
4582 if (!formulaDocument) {
4583 kdDebug() << k_funcinfo << endl;
4584 formulaDocument =
new KFormula::Document;
4585 m_formulaDocumentWrapper->document( formulaDocument, init );
4586 if ( formulaDocument != 0 ) {
4588 formulaDocument->setZoomAndResolution( m_zoom,
4589 tqRound(INCH_TO_POINT( m_resolutionX )),
4590 tqRound(INCH_TO_POINT( m_resolutionY )) );
4591 formulaDocument->newZoomAndResolution(
false,
false);
4594 return formulaDocument;
4598void KWDocument::slotRepaintChanged(
KWFrameSet * frameset )
4602 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
4603 (*it)->getGUI()->canvasWidget()->repaintChanged( frameset, it == m_lstViews.fromLast() );
4613 emit sig_terminateEditing( table );
4615 addCommand( table->
anchorFrameset()->deleteAnchoredFrame( anchor ) );
4619 KWDeleteTableCommand *cmd =
new KWDeleteTableCommand( i18n(
"Delete Table"), table );
4625void KWDocument::deleteFrame(
KWFrame * frame )
4627 KWFrameSet * fs = frame->
frameSet();
4628 kdDebug(32002) <<
"KWDocument::deleteFrame frame=" << frame <<
" fs=" << fs << endl;
4630 TypeStructDocItem docItem = (TypeStructDocItem) 0;
4631 switch (fs->
type() ) {
4633 cmdName=i18n(
"Delete Text Frame");
4637 cmdName=i18n(
"Delete Formula Frame");
4638 docItem=FormulaFrames;
4641 kdError(32001) <<
"FT_CLIPART used! (in KWDocument::deleteFrame)" << endl;
4644 cmdName=i18n(
"Delete Picture Frame");
4648 cmdName=i18n(
"Delete Object Frame");
4659 addCommand( fs->
anchorFrameset()->deleteAnchoredFrame( anchor ) );
4663 KWDeleteFrameCommand *cmd =
new KWDeleteFrameCommand( cmdName, frame );
4667 emit docStructureChanged(docItem);
4670void KWDocument::reorganizeGUI()
4672 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4673 (*it)->getGUI()->reorganize();
4676void KWDocument::slotDocumentInfoModifed()
4678 if (!variableCollection()->variableSetting()->displayFieldCode())
4679 recalcVariables( VT_FIELD );
4682void KWDocument::refreshDocStructure(
int type)
4684 emit docStructureChanged(type);
4687int KWDocument::typeItemDocStructure(FrameSetType type)
4693 typeItem=(int)TextFrames;
4696 typeItem=(int)Pictures;
4699 typeItem=(int)Embedded;
4702 typeItem=(int)FormulaFrames;
4705 typeItem=(int)Tables;
4708 typeItem=(int)TextFrames;
4713void KWDocument::refreshDocStructure(FrameSetType type)
4715 emit docStructureChanged(typeItemDocStructure(type));
4718TQBrush KWDocument::resolveBgBrush(
const TQBrush & brush, TQPainter * painter )
4720 if ( brush.color().isValid() )
4722 TQBrush ret( brush );
4723 ret.setColor( defaultBgColor( painter ) );
4727TQColor KWDocument::resolveBgColor(
const TQColor & col, TQPainter * painter )
4732 return defaultBgColor( painter );
4735TQColor KWDocument::defaultBgColor( TQPainter * painter )
4737 if ( painter && painter->device()->devType() == TQInternal::Printer )
4739 return TQApplication::palette().color( TQPalette::Active, TQColorGroup::Base );
4743void KWDocument::setTocPresent(
bool hasToc)
4746 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4747 (*it)->updateTocActionText(hasToc);
4750void KWDocument::refreshMenuExpression()
4752 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4753 (*it)->refreshMenuExpression();
4756void KWDocument::updateZoomRuler()
4758 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it ) {
4759 (*it)->getGUI()->getHorzRuler()->setZoom( zoomedResolutionX() );
4760 (*it)->getGUI()->getVertRuler()->setZoom( zoomedResolutionY() );
4761 (*it)->slotUpdateRuler();
4765void KWDocument::updateRulerFrameStartEnd()
4767 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4768 (*it)->slotUpdateRuler();
4771int KWDocument::undoRedoLimit()
const
4773 return m_commandHistory->undoLimit();
4776void KWDocument::setUndoRedoLimit(
int val)
4778 m_commandHistory->setUndoLimit(val);
4779 m_commandHistory->setRedoLimit(val);
4782void KWDocument::setGridX(
double gridx) {
4784 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4785 (*it)->getGUI()->getHorzRuler()->setGridSize(gridx);
4788TQValueList<KoTextObject *> KWDocument::visibleTextObjects(
KWViewMode *viewmode)
const
4790 TQValueList<KoTextObject *> lst;
4791 TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets(
true );
4793 KWTextFrameSet *frm;
4794 for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ) {
4804void KWDocument::refreshGUIButton()
4806 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4807 (*it)->initGUIButton();
4810void KWDocument::enableBackgroundSpellCheck(
bool b )
4812 m_bgSpellCheck->setEnabled(b);
4813 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
4814 (*it)->updateBgSpellCheckingState();
4817bool KWDocument::backgroundSpellCheckEnabled()
const
4819 return m_bgSpellCheck->enabled();
4822void KWDocument::reactivateBgSpellChecking()
4824 TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets(
true );
4826 KWTextFrameSet *frm;
4827 for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
4831 startBackgroundSpellCheck();
4834void KWDocument::slotChapterParagraphFormatted( KoTextParag* )
4848 m_sectionTitles.resize( 0 );
4855TQString KWDocument::checkSectionTitleInParag( KoTextParag* parag,
KWTextFrameSet* frameset,
int pageNum )
const
4857 if ( parag->counter() && parag->counter()->numbering() == KoParagCounter::NUM_CHAPTER
4858 && parag->counter()->depth() == 0 )
4860 TQString txt = parag->string()->toString();
4861 txt = txt.left( txt.length() - 1 );
4868 if( pgNum != pageNum )
4869 kdWarning() <<
"sectionTitle: was looking for pageNum " << pageNum <<
", got frame " << frame <<
" page " << pgNum << endl;
4871 kdDebug(32001) <<
"KWDocument::sectionTitle for " << pageNum <<
":" << txt << endl;
4874 if ( pageNum > (
int)m_sectionTitles.size()-1 )
4875 const_cast<KWDocument*
>(
this)->m_sectionTitles.resize( pageNum + 1 );
4876 const_cast<KWDocument*
>(
this)->m_sectionTitles[ pageNum ] = txt;
4882TQString KWDocument::sectionTitle(
int pageNum )
const
4886 if ( (
int)m_sectionTitles.size() > pageNum )
4889 for (
int i = pageNum; i >= 0 ; --i )
4891 const TQString& s = m_sectionTitles[i];
4895 if ( pageNum > (
int)m_sectionTitles.size()-1 )
4896 const_cast<KWDocument*
>(
this)->m_sectionTitles.resize( pageNum + 1 );
4897 const_cast<KWDocument*
>(
this)->m_sectionTitles[ pageNum ] = s;
4905 if ( m_lstFrameSet.isEmpty() )
4908 KWTextFrameSet *frameset =
dynamic_cast<KWTextFrameSet *
>( m_lstFrameSet.getFirst() );
4912 int topLUpix, bottomLUpix;
4916 KoTextParag* parag = frameset->textDocument()->firstParag();
4920 KoTextParag* lastParagOfPageAbove = parag;
4921 for ( ; parag ; parag = parag->next() )
4923 if ( parag->rect().bottom() < topLUpix )
4925 lastParagOfPageAbove = parag;
4928 if ( parag->rect().top() > bottomLUpix )
4930 TQString txt = checkSectionTitleInParag( parag, frameset, pageNum );
4931 if ( !txt.isEmpty() )
4937 parag = lastParagOfPageAbove;
4938 for ( ; parag ; parag = parag->prev() )
4940 TQString txt = checkSectionTitleInParag( parag, frameset, pageNum );
4941 if ( !txt.isEmpty() )
4950void KWDocument::setSpellCheckIgnoreList(
const TQStringList& lst )
4952 m_spellCheckIgnoreList = lst;
4953 m_bgSpellCheck->settings()->setCurrentIgnoreList( m_spellCheckIgnoreList + m_spellCheckPersonalDict );
4954 setModified(
true );
4957void KWDocument::addSpellCheckIgnoreWord(
const TQString & word )
4960 if( m_spellCheckIgnoreList.findIndex( word ) == -1 )
4961 m_spellCheckIgnoreList.append( word );
4962 setSpellCheckIgnoreList( m_spellCheckIgnoreList );
4963 if ( backgroundSpellCheckEnabled() )
4965 reactivateBgSpellChecking();
4968int KWDocument::maxZOrder(
int pageNum)
const
4972 TQPtrList<KWFrame> frames = framesInPage( pageNum );
4973 TQPtrListIterator<KWFrame> frameIt( frames );
4974 for ( ; frameIt.current(); ++frameIt ) {
4975 if ( first || frameIt.current()->zOrder() > maxZOrder ) {
4976 maxZOrder = frameIt.current()->zOrder();
4983TQPtrList<KWTextFrameSet> KWDocument::allTextFramesets(
bool onlyReadWrite)
const
4985 TQPtrList<KWTextFrameSet> textFramesets;
4986 TQPtrListIterator<KWFrameSet> fit = framesetsIterator();
4987 for ( ; fit.current() ; ++fit ) {
4988 if(fit.current()->isDeleted())
continue;
4989 fit.current()->addTextFrameSets(textFramesets, onlyReadWrite);
4991 return textFramesets;
4994TQValueList<KoTextDocument *> KWDocument::allTextDocuments()
const
4996 TQValueList<KoTextDocument *> lst;
4997 const TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets(
false);
4998 TQPtrListIterator<KWTextFrameSet> fit( textFramesets );
4999 for ( ; fit.current() ; ++fit ) {
5000 lst.append( fit.current()->textObject()->textDocument() );
5005int KWDocument::numberOfTextFrameSet(
KWFrameSet* fs,
bool onlyReadWrite )
5007 TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets( onlyReadWrite );
5008 return textFramesets.findRef(
static_cast<KWTextFrameSet*
>(fs) );
5011KWFrameSet * KWDocument::textFrameSetFromIndex(
unsigned int num,
bool onlyReadWrite )
5013 return allTextFramesets( onlyReadWrite ).at( num );
5016void KWDocument::updateTextFrameSetEdit()
5018 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5019 (*it)->slotFrameSetEditChanged();
5023void KWDocument::displayFootNoteFieldCode()
5025 TQPtrListIterator<KoVariable> it( m_varColl->getVariables() );
5026 for ( ; it.current() ; ++it )
5028 if ( it.current()->type() == VT_FOOTNOTE )
5030 static_cast<KWFootNoteVariable *
>(it.current())->resize();
5031 static_cast<KWFootNoteVariable *
>(it.current())->frameSet()->setCounterText(
static_cast<KWFootNoteVariable *
>(it.current())->text() );
5033 KoTextParag * parag = it.current()->paragraph();
5036 parag->invalidate( 0 );
5037 parag->setChanged(
true );
5043void KWDocument::changeFootNoteConfig()
5045 TQMap<KoTextDocument *, bool> modifiedTextDocuments;
5046 TQPtrListIterator<KoVariable> it( m_varColl->getVariables() );
5047 for ( ; it.current() ; ++it )
5049 if ( it.current()->type() == VT_FOOTNOTE )
5051 KWFootNoteVariable* footNoteVar =
static_cast<KWFootNoteVariable *
>(it.current());
5052 footNoteVar->formatedNote();
5055 footNoteVar->resize();
5056 footNoteVar->
frameSet()->setCounterText( footNoteVar->text() );
5058 KoTextParag * parag = footNoteVar->paragraph();
5061 parag->invalidate( 0 );
5062 parag->setChanged(
true );
5064 KoTextDocument* textdoc = parag->textDocument();
5065 if ( modifiedTextDocuments.find( textdoc ) != modifiedTextDocuments.end() )
5066 modifiedTextDocuments.insert( textdoc,
true );
5069 for( TQMap<KoTextDocument *,bool>::const_iterator it = modifiedTextDocuments.begin();
5070 it != modifiedTextDocuments.end(); ++it ) {
5071 KoTextDocument* textdoc = it.key();
5072 KWTextFrameSet * textfs =
static_cast<KWTextDocument *
>(textdoc)->textFrameSet();
5073 slotRepaintChanged( textfs );
5078void KWDocument::setTabStopValue (
double tabStop )
5080 m_tabStop = tabStop;
5081 TQPtrList<KWTextFrameSet> textFramesets = allTextFramesets(
true );
5083 KWTextFrameSet *frm;
5084 for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
5085 frm->textDocument()->setTabStops( ptToLayoutUnitPixX( tabStop ));
5091void KWDocument::setGlobalHyphenation(
bool hyphen )
5093 m_bGlobalHyphenation = hyphen;
5098void KWDocument::setViewFrameBorders(
bool b )
5100 m_viewFrameBorders = b;
5101 m_layoutViewMode->setDrawFrameBorders( b );
5102 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5103 (*it)->getGUI()->canvasWidget()->viewMode()->setDrawFrameBorders( b );
5106void KWDocument::switchViewMode(
const TQString& newViewModeType )
5110 m_viewModeType = newViewModeType;
5111 delete m_layoutViewMode;
5112 m_layoutViewMode = KWViewMode::create( m_viewModeType,
this, 0 );
5116 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5117 (*it)->getGUI()->canvasWidget()->switchViewMode( m_viewModeType );
5119 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5120 (*it)->switchModeView();
5121 emit newContentsSize();
5129 repaintAllViews(
true );
5130 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5131 (*it)->getGUI()->canvasWidget()->ensureCursorVisible();
5134void KWDocument::changeBgSpellCheckingState(
bool b )
5136 enableBackgroundSpellCheck( b );
5137 reactivateBgSpellChecking();
5138 TDEConfig *config = KWFactory::instance()->config();
5139 config->setGroup(
"KSpell kword" );
5140 config->writeEntry(
"SpellCheck", (
int)b );
5143TQString KWDocument::initialFrameSet()
const
5145 return m_initialEditing ? m_initialEditing->m_initialFrameSet : TQString();
5148int KWDocument::initialCursorParag()
const
5150 return m_initialEditing ? m_initialEditing->m_initialCursorParag : 0;
5153int KWDocument::initialCursorIndex()
const
5155 return m_initialEditing ? m_initialEditing->m_initialCursorIndex : 0;
5158void KWDocument::deleteInitialEditingInfo()
5160 delete m_initialEditing;
5161 m_initialEditing = 0L;
5164bool KWDocument::cursorInProtectedArea()
const
5166 return m_cursorInProtectectedArea;
5169void KWDocument::setCursorInProtectedArea(
bool b )
5171 m_cursorInProtectectedArea=b;
5172 testAndCloseAllFrameSetProtectedContent();
5176void KWDocument::testAndCloseAllFrameSetProtectedContent()
5178 if ( !m_cursorInProtectectedArea )
5180 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5181 (*it)->testAndCloseAllFrameSetProtectedContent();
5185void KWDocument::updateRulerInProtectContentMode()
5187 for( TQValueList<KWView *>::const_iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5188 (*it)->updateRulerInProtectContentMode();
5192void KWDocument::insertBookmark(
const TQString &name, KoTextParag *startparag, KoTextParag *endparag,
int start,
int end )
5194 m_bookmarkList->append( KoTextBookmark( name, startparag, endparag, start, end ) );
5197void KWDocument::deleteBookmark(
const TQString &name )
5199 if ( m_bookmarkList->removeByName( name ) )
5203void KWDocument::renameBookmark(
const TQString &oldName,
const TQString &newName )
5205 if ( oldName == newName )
5208 KoTextBookmarkList::iterator it = m_bookmarkList->findByName( oldName );
5209 if ( it != m_bookmarkList->end() )
5211 (*it).setBookmarkName( newName );
5216const KoTextBookmark * KWDocument::bookmarkByName(
const TQString & name )
const
5218 KoTextBookmarkList::const_iterator it = m_bookmarkList->findByName( name );
5219 if ( it != m_bookmarkList->end() )
5224TQStringList KWDocument::listOfBookmarkName(
KWViewMode * viewMode )
const
5227 KoTextBookmarkList::const_iterator it = m_bookmarkList->begin();
5228 const KoTextBookmarkList::const_iterator end = m_bookmarkList->end();
5229 for ( ; it != end ; ++it )
5231 const KoTextBookmark& book = *it;
5232 KWFrameSet* fs =
static_cast<KWTextDocument *
>(book.textDocument())->textFrameSet();
5234 list.append( book.bookmarkName() );
5239void KWDocument::paragraphModified(KoTextParag* ,
int ,
int ,
int )
5242 emit docStructureChanged( Tables | TextFrames );
5246void KWDocument::paragraphDeleted( KoTextParag *parag,
KWFrameSet *frm )
5248 KWTextFrameSet* textfs =
dynamic_cast<KWTextFrameSet *
>( frm );
5254 KoTextBookmarkList::iterator it = m_bookmarkList->begin();
5255 const KoTextBookmarkList::iterator end = m_bookmarkList->end();
5256 for ( ; it != end ; ++it )
5258 KoTextBookmark& book = *it;
5262 if ( book.startParag() == parag )
5263 book.setStartParag( parag->next() ? parag->next() : parag->prev() );
5264 if ( book.endParag() == parag )
5265 book.setEndParag( parag->next() ? parag->next() : parag->prev() );
5270void KWDocument::initBookmarkList()
5272 Q_ASSERT( m_loadingInfo );
5273 if ( !m_loadingInfo )
5275 KWLoadingInfo::BookMarkList::Iterator it = m_loadingInfo->bookMarkList.begin();
5276 KWLoadingInfo::BookMarkList::Iterator end = m_loadingInfo->bookMarkList.end();
5277 for( ; it != end; ++it )
5279 KWFrameSet * fs = 0L;
5280 TQString fsName = (*it).frameSetName;
5281 if ( !fsName.isEmpty() )
5282 fs = frameSetByName( fsName );
5285 KWTextFrameSet *frm =
dynamic_cast<KWTextFrameSet *
>(fs);
5288 KoTextDocument* textdoc = frm->textDocument();
5289 KoTextParag* startparag = textdoc->paragAt( (*it).paragStartIndex );
5290 KoTextParag* endparag = textdoc->paragAt( (*it).paragEndIndex );
5291 if ( startparag && endparag )
5293 m_bookmarkList->append( KoTextBookmark( (*it).bookname,
5294 startparag, endparag,
5295 (*it).cursorStartIndex, (*it).cursorEndIndex ) );
5302TQPixmap* KWDocument::doubleBufferPixmap(
const TQSize& s )
5304 if ( !m_bufPixmap ) {
5305 int w = TQABS( s.width() );
5306 int h = TQABS( s.height() );
5307 m_bufPixmap =
new TQPixmap( w, h );
5309 if ( m_bufPixmap->width() < s.width() ||
5310 m_bufPixmap->height() < s.height() ) {
5311 m_bufPixmap->resize( TQMAX( s.width(), m_bufPixmap->width() ),
5312 TQMAX( s.height(), m_bufPixmap->height() ) );
5319void KWDocument::maybeDeleteDoubleBufferPixmap()
5321 if ( m_bufPixmap && m_bufPixmap->height() * m_bufPixmap->width() > 400*400 )
5328void KWDocument::setPersonalExpressionPath(
const TQStringList & lst)
5330 m_personalExpressionPath = lst;
5331 refreshMenuExpression();
5334void KWDocument::updateDirectCursorButton()
5336 for( TQValueList<KWView *>::Iterator it = m_lstViews.begin(); it != m_lstViews.end(); ++it )
5337 (*it)->updateDirectCursorButton();
5340void KWDocument::setInsertDirectCursor(
bool b)
5342 m_bInsertDirectCursor=b;
5343 TDEConfig *config = KWFactory::instance()->config();
5344 config->setGroup(
"Interface" );
5345 config->writeEntry(
"InsertDirectCursor", b );
5346 updateDirectCursorButton();
5349void KWDocument::saveDialogShown()
5351 if ( !textFrameSet(0) )
5356 TQString first_row = textFrameSet(0)->textDocument()->plainText().left(50);
5357 bool truncate =
false;
5359 for (
int i=0; i < (int)first_row.length(); i++)
5361 ch = first_row.at(i);
5363 if (ch.isPunct() || ch.isSpace() || ch ==
'.' )
5365 first_row.remove(i,1);
5370 else if ( truncate && (ch.isPunct() || ch ==
'.' || ch ==
'\n' ) )
5372 first_row.truncate(i);
5376 first_row = first_row.stripWhiteSpace();
5377 kdDebug() <<
"Suggested filename:" << first_row << endl;
5381void KWDocument::addWordToDictionary(
const TQString& word )
5383 if ( m_bgSpellCheck )
5385 if( m_spellCheckPersonalDict.findIndex( word ) == -1 )
5386 m_spellCheckPersonalDict.append( word );
5387 m_bgSpellCheck->settings()->setCurrentIgnoreList( m_spellCheckIgnoreList + m_spellCheckPersonalDict );
5388 if ( backgroundSpellCheckEnabled() )
5390 reactivateBgSpellChecking();
5394void KWDocument::setEmpty()
5396 KoDocument::setEmpty();
5398 m_varColl->variableSetting()->setCreationDate(TQDateTime::currentDateTime());
5399 recalcVariables( VT_DATE );
5403void KWDocument::updateGridButton()
5405 TQPtrListIterator<KoView> it( views() );
5406 for (; it.current(); ++it )
5407 ((KWView*)it.current())->updateGridButton();
5411unsigned int KWDocument::paperHeight(
int pageNum)
const {
5412 return static_cast<unsigned int>(zoomItY( pageManager()->pageLayout(pageNum).ptHeight ));
5415unsigned int KWDocument::paperWidth(
int pageNum)
const {
5416 return static_cast<unsigned int>(zoomItX( pageManager()->pageLayout(pageNum).ptWidth ));
5419unsigned int KWDocument::pageTop(
int pgNum )
const {
5420 return zoomItY( pageManager()->topOfPage( pgNum ) );
5423int KWDocument::pageCount()
const {
5424 return pageManager()->pageCount();
5427int KWDocument::startPage()
const {
5428 return pageManager()->startPage();
5430int KWDocument::lastPage()
const {
5431 return pageManager()->lastPageNumber();
5434TQWidget* KWDocument::createCustomDocumentWidget(TQWidget *parent) {
5436 columns.columns = 1;
5437 columns.ptColumnSpacing = m_defaultColumnSpacing;
5438 return new KWStartupWidget(parent,
this, columns);
5441KWDocument::FramesChangedHandler::FramesChangedHandler(KWDocument *parent) {
5443 m_needLayout =
false;
5446void KWDocument::FramesChangedHandler::addFrame(KWFrame *frame) {
5447 if(frame == 0)
return;
5448 if(m_frameSets.contains(frame->
frameSet()))
return;
5449 m_frameSets.append(frame->
frameSet());
5450 if( frame->runAround() != KWFrame::RA_NO )
5451 m_needLayout =
true;
5454void KWDocument::FramesChangedHandler::addFrameSet(KWFrameSet *fs) {
5455 if(m_frameSets.contains(fs))
return;
5456 m_frameSets.append(fs);
5457 m_needLayout =
true;
5460void KWDocument::FramesChangedHandler::execute() {
5461 if(m_frameSets.count() == 0)
5462 m_parent->updateAllFrames();
5464 TQValueListIterator<KWFrameSet*> iter = m_frameSets.begin();
5465 for(;iter != m_frameSets.end(); ++iter) {
5466 KWFrameSet *fs = *iter;
5479 m_parent->repaintAllViews();
5480 m_parent->updateRulerFrameStartEnd();
5483#include "KWDocument.moc"
static void recalcAllFrames(KWDocument *doc)
Update the z-ordering for all frames of the whole document.
static void recalcFrames(KWDocument *doc, int pageFrom, int pageTo)
Update the z-ordering for all frames in the page section of the whole document.
static void createFrameList(KWFrame *f, KWDocument *doc)
Factory method to create and attach a new instance of a framelist.
Class: KWFrameSet Base type, a frameset holds content as well as frames to show that content.
KWAnchor * findAnchor(int frameNum)
Return the anchor object for this frame number.
virtual void setVisible(bool v)
set the visibility of the frameset.
virtual void layout()
relayout text in frames, so that it flows correctly around other frames
virtual void deleteFrame(unsigned int num, bool remove=true, bool recalc=true)
Delete a frame from the set of frames this frameSet has.
virtual FrameSetType type() const
The type of frameset.
Info
The different types of textFramesets (that TEXT is important here!) FI_BODY = normal text frames.
const TQPtrList< KWFrame > & frameIterator() const
Iterator over the child frames.
virtual void finalize()
Called once the frameset has been completely loaded or constructed.
virtual void drawContents(TQPainter *painter, const TQRect &crect, const TQColorGroup &cg, bool onlyChanged, bool resetChanged, KWFrameSetEdit *edit, KWViewMode *viewMode, KWFrameViewManager *frameViewManager)
Paint this frameset.
void setAnchored(KWTextFrameSet *textfs, KoTextParag *parag, int index, bool placeHolderExists=false, bool repaint=true)
Make this frameset anchored, with the anchor at paragId,index in the text frameset textfs.
virtual void createEmptyRegion(const TQRect &crect, TQRegion &emptyRegion, KWViewMode *viewMode)
Let the caller know which parts of emptyRegion we do not claim, and thus the caller is free to paint ...
bool isDeleted() const
True if the frameset was deleted (but not destroyed, since it's in the undo/redo).
unsigned int frameCount() const
Get number of child frames.
bool isFloating() const
Return true if this frameset is floating (inline), false if it's fixed.
virtual void updateFrames(int flags=0xff)
Called when our frames change, or when another frameset's frames change.
virtual void setZOrder()
set z-order for all frames
virtual void fromXML(TQDomElement &framesetElem, bool loadFrames=true, bool=true)
load from XML - when pasting from clipboard
KWTextFrameSet * anchorFrameset() const
Return the frameset in which our anchor is - assuming isFloating().
KWFrame * frame(unsigned int _num) const
get a frame by number
TQString name() const
get/set frameset name. For tables in particular, this must be unique
Info frameSetInfo() const
Returns the type of TextFrameSet this is.
virtual void saveOasis(KoXmlWriter &writer, KoSavingContext &context, bool saveFrames) const =0
Save to OASIS format.
void setFrameSetInfo(Info fi)
Set the type of TextFrameSet this is.
bool isVisible(KWViewMode *viewMode=0L) const
Returns true if the frameset is visible.
Collection of frame styles.
The user-visible style for frames (borders and background).
void saveFrameStyle(TQDomElement &parentElem)
save (old xml format)
void setSelected(bool selected, MouseMeaning selectPolicy=MEANING_MOUSE_SELECT)
Set the selected state of this frameView.
This class represents a single frame.
double minimumFrameHeight(void) const
KWFrameSet * frameSet() const
Data stucture methods.
FrameBehavior
what should happen when the frame is full
void setZOrder(int z)
The z-order of the frame, relative to the other frames on the same page.
void save(TQDomElement &frameElem)
create XML to describe yourself
bool isCopy() const
Drawing property: if isCopy, this frame is a copy of the previous frame in the frameset.
int pageNumber() const
The page on which this frame is.
void load(TQDomElement &frameElem, KWFrameSet *frameSet, int syntaxVersion)
read attributes from XML.
KWFrame * getCopy()
returns a copy of self
Temporary information used only during loading.
static void writeAutomaticStyles(KoXmlWriter &contentWriter, KoGenStyles &mainStyles, bool stylesDotXml)
Helper function, also used by KWDocument.
The Page Manager manages all the pages a document contains and separates all the frames the document ...
This class represents a printed page of the document.
double height() const
return the height of this page (in pt)
double leftMargin() const
return the width of the margin at left (in pt);
double topMargin() const
return the height of the margin at top (in pt);
double bottomMargin() const
return the height of the margin at bottom (in pt);
double width() const
return the width of this page (in pt)
double rightMargin() const
return the width of the margin at left (in pt);
double offsetInDocument() const
All Pages are in a document-wide coordinate system that simply puts every page under the next page an...
A frameset that contains an embedded object (a KWDocumentChild).
virtual void load(TQDomElement &attributes, bool loadFrames=true)
load from XML - when loading
virtual TQDomElement save(TQDomElement &parentElem, bool saveFrames=true)
save to XML - when saving
This class implements tables by acting as the manager for the frame(set)s which make up the table cel...
Cell * loadCell(TQDomElement &frameElem, bool loadFrames=true, bool useNames=true)
load one cell
void moveBy(double dx, double dy)
move the whole of the table, this is mainly for anchored frames.
void setZOrder()
Sets zOrder for all cells in this table.
virtual void fromXML(TQDomElement &framesetElem, bool loadFrames=true, bool useNames=true)
load from XML - when pasting from clipboard
Collection of user-defined table styles.
Table style (can created/modified/deleted by the user) A table style is simply a paragraph style and ...
void saveTableStyle(TQDomElement &parentElem)
save (old xml format)
Class: KWTextFrameSet Contains text (KoTextObject) and frames to display that text.
KoTextObject * textObject() const
Return the contained text object.
KWFrame * internalToDocument(const KoPoint &relPoint, KoPoint &dPoint) const
Convert the in the internal qtextdoc coordinates (in layout units) into a point in the document coord...
virtual void layout()
Invalidate all paragraphs and start re-formatting.
virtual void load(TQDomElement &attributes, bool loadFrames=true)
load from XML - when loading
void loadOasisContent(const TQDomElement &bodyElem, KoOasisContext &context)
Load the contents of a frame (i.e. the text).
void saveOasisContent(KoXmlWriter &writer, KoSavingContext &context) const
Save the contents of a frame (i.e. the text).
bool minMaxInternalOnPage(int pageNum, int &topLU, int &bottomLU) const
Return the min and max LU coordinates for the text in the given page, if the frameset has any frames ...
virtual void setVisible(bool v)
set the visibility of the frameset.
void renumberFootNotes(bool repaint=true)
(Assuming this==main frameset), recalc the foot note numbers
void applyStyleChange(KoStyleChangeDefMap changed)
Update the paragraph that use the given style, after this style was changed.
This class is used by "Insert Picture", i.e.
static KoTextFormat loadFormat(TQDomElement &formatElem, KoTextFormat *refFormat, const TQFont &defaultFont, const TQString &defaultLanguage, bool hyphanation)
Public for loading a style (KWord-1.3 XML).
static TQDomElement saveFormat(TQDomDocument &doc, KoTextFormat *curFormat, KoTextFormat *refFormat, int pos, int len)
Public for saving a style (KWord-1.3 XML).
Abstract base class for KWCanvas's view modes.
Definition of an anchor's position: