~ubuntu-branches/ubuntu/breezy/koffice/breezy

« back to all changes in this revision

Viewing changes to kword/kwdoc.cc

  • Committer: Bazaar Package Importer
  • Author(s): Ben Burton
  • Date: 2004-05-09 11:33:00 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040509113300-vfrdadqsvjfuhn3b
Tags: 1:1.3.1-1
* New upstream bugfix release.
* Built against newer imagemagick (closes: #246623).
* Made koffice-libs/kformula recommend/depend on latex-xft-fonts, which
  provides mathematical fonts that the formula editor can use.  Also
  patched the kformula part to make these fonts the default.
* Changed kword menu hint from "WordProcessors" to "Word processors"
  (closes: #246209).
* Spellchecker configuration is now fixed (closes: #221256, #227568).

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
   Boston, MA 02111-1307, USA.
18
18
*/
19
19
 
20
 
#include <qcolor.h>
21
 
#include <koprinter.h>
22
 
#include <qevent.h>
23
 
#include <qregion.h>
 
20
#include <qfileinfo.h>
 
21
#include <qregexp.h>
 
22
#include <qtimer.h>
 
23
 
 
24
#include <kapplication.h> // for KDE_VERSION
 
25
#include <kdebug.h>
 
26
#if ! KDE_IS_VERSION(3,1,90)
 
27
#include <kdebugclasses.h>
 
28
#endif
 
29
#include <klibloader.h>
 
30
#include <klocale.h>
 
31
#include <kstandarddirs.h>
24
32
#include <kmessagebox.h>
25
 
#include <qdict.h>
26
 
#include <qpixmap.h>
27
 
#include <qfileinfo.h>
 
33
#include <kspell.h>
 
34
#include <kcursor.h>
28
35
 
29
36
#include <koTemplateChooseDia.h>
30
 
#include <koStore.h>
31
 
#include <koStoreDevice.h>
32
37
#include <koMainWindow.h>
33
 
#include <koQueryTrader.h>
34
 
 
35
 
#include <kapp.h> // for KDE_VERSION
36
 
#include <kurl.h>
37
 
#include <klocale.h>
38
 
#include <kstddirs.h>
39
 
#include <kiconloader.h>
40
 
#include <kglobal.h>
41
 
#include <kglobalsettings.h>
42
 
#include <kcharsets.h>
43
 
 
 
38
#include <koDocumentInfo.h>
 
39
#include <koGlobal.h>
 
40
#include <koparagcounter.h>
 
41
#include <kotextobject.h>
 
42
#include <koAutoFormat.h>
 
43
#include <kovariable.h>
44
44
#include <kformuladocument.h>
45
 
#include <koDocumentInfo.h>
46
45
#include <unistd.h>
47
46
#include <math.h>
48
47
 
49
 
#include "kwframe.h"
50
 
#include "kwtextframeset.h"
 
48
#include "KWordDocIface.h"
 
49
#include "defs.h"
 
50
#include "kwbgspellcheck.h"
 
51
#include "kwcanvas.h"
 
52
#include "kwcommand.h"
 
53
#include "kwdoc.h"
 
54
#include "kwformulaframe.h"
 
55
#include "kwframelayout.h"
 
56
#include "kwpartframeset.h"
51
57
#include "kwtableframeset.h"
52
 
#include "kwdoc.h"
53
 
#include "kwcanvas.h"
54
 
#include "defs.h"
55
 
#include "kwutils.h"
56
 
#include "kwstyle.h"
57
 
#include "autoformat.h"
58
 
#include "variable.h"
59
 
#include "serialletter.h"
 
58
#include "kwtablestyle.h"
 
59
#include "kwtabletemplate.h"
 
60
#include "kwtextimage.h"
 
61
#include "kwvariable.h"
60
62
#include "kwview.h"
61
63
#include "kwviewmode.h"
62
 
#include "kwfactory.h"
63
 
#include "kwcommand.h"
64
 
#include "kwtextimage.h"
65
 
#include <kdebug.h>
66
 
#include <kfontdialog.h>
67
 
#include <kconfig.h>
68
 
 
69
 
#include <kspell.h>
 
64
#include "mailmerge.h"
 
65
 
 
66
#include <X11/Xlib.h>
 
67
#include <kglobalsettings.h>
 
68
#include "kocommandhistory.h"
 
69
 
 
70
#include <koSconfig.h>
 
71
 
 
72
#include "koApplication.h"
70
73
 
71
74
//#define DEBUG_PAGES
 
75
//#define DEBUG_SPEED
72
76
 
73
 
#undef getPointBasedAttribute
74
 
#define getPointBasedAttribute(structure, attribute, element, attributeName, defaultValue) \
75
 
do \
76
 
{ \
77
 
    structure.pt##attribute = getAttribute( element, attributeName, defaultValue ); \
78
 
    structure.mm##attribute = POINT_TO_MM( structure.pt##attribute ); \
79
 
    structure.inch##attribute = POINT_TO_INCH( structure.pt##attribute ); \
80
 
} while (0)
 
77
// Make sure an appropriate DTD is available in www/koffice/DTD if changing this value
 
78
static const char * CURRENT_DTD_VERSION = "1.2";
81
79
 
82
80
/******************************************************************/
83
81
/* Class: KWChild                                              */
84
82
/******************************************************************/
85
83
 
86
84
KWChild::KWChild( KWDocument *_wdoc, const QRect& _rect, KoDocument *_doc )
87
 
    : KoDocumentChild( _wdoc, _doc, _rect )
 
85
    : KoDocumentChild( _wdoc, _doc, _rect ), m_partFrameSet( 0L )
88
86
{
89
87
}
90
88
 
91
89
KWChild::KWChild( KWDocument *_wdoc )
92
 
    : KoDocumentChild( _wdoc )
 
90
    : KoDocumentChild( _wdoc ), m_partFrameSet( 0L )
93
91
{
94
92
}
95
93
 
97
95
{
98
96
}
99
97
 
100
 
KoDocument *KWChild::hitTest( const QPoint &, const QWMatrix & )
 
98
KoDocument* KWChild::hitTest( const QPoint& p, const QWMatrix& _matrix )
101
99
{
102
 
  return 0L;
 
100
    Q_ASSERT( m_partFrameSet );
 
101
    if ( isDeleted() ) {
 
102
        //kdDebug() << k_funcinfo << "is deleted!" << endl;
 
103
        return 0L;
 
104
    }
 
105
    // Only activate when it's already selected.
 
106
    if ( !m_partFrameSet->frame(0)->isSelected() ) {
 
107
        //kdDebug() << k_funcinfo << " is not selected" << endl;
 
108
        return 0L;
 
109
    }
 
110
    // And only if CTRL isn't pressed.
 
111
 
 
112
    Window root;
 
113
    Window child;
 
114
    int root_x, root_y, win_x, win_y;
 
115
    uint keybstate;
 
116
    XQueryPointer( qt_xdisplay(), qt_xrootwin(), &root, &child,
 
117
                   &root_x, &root_y, &win_x, &win_y, &keybstate );
 
118
    if ( keybstate & ControlMask )
 
119
        return 0L;
 
120
 
 
121
    return KoDocumentChild::hitTest( p, _matrix );
103
122
}
104
123
 
 
124
 
105
125
/******************************************************************/
106
126
/* Class: KWCommandHistory                                        */
107
127
/******************************************************************/
108
 
class KWCommandHistory : public KCommandHistory
 
128
class KWCommandHistory : public KoCommandHistory
109
129
{
110
130
public:
111
 
    KWCommandHistory( KWDocument * doc ) : KCommandHistory( doc->actionCollection(),  false ), m_pDoc( doc ) {}
 
131
    KWCommandHistory( KWDocument * doc ) : KoCommandHistory( doc->actionCollection(),  true ), m_pDoc( doc ) {}
112
132
public /*slots*/: // They are already slots in the parent. Running moc on the inherited class shouldn't be necessary AFAICS.
113
133
    virtual void undo();
114
134
    virtual void redo();
119
139
void KWCommandHistory::undo()
120
140
{
121
141
    m_pDoc->clearUndoRedoInfos();
122
 
    KCommandHistory::undo();
 
142
    KoCommandHistory::undo();
123
143
}
124
144
 
125
145
void KWCommandHistory::redo()
126
146
{
127
147
    m_pDoc->clearUndoRedoInfos();
128
 
    KCommandHistory::redo();
 
148
    KoCommandHistory::redo();
129
149
}
130
150
 
131
151
void KWDocument::clearUndoRedoInfos()
132
152
{
133
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
153
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
134
154
    for ( ; fit.current() ; ++fit )
135
155
    {
136
156
        KWTextFrameSet *fs = dynamic_cast<KWTextFrameSet *>( fit.current() );
139
159
    }
140
160
}
141
161
 
 
162
/**
 
163
 * Temporary storage for the initial edition info
 
164
 * (activeFrameset, cursorParagraph and cursorIndex attributes of the XML
 
165
 */
 
166
class KWDocument::InitialEditing {
 
167
public:
 
168
    QString m_initialFrameSet;
 
169
    int m_initialCursorParag;
 
170
    int m_initialCursorIndex;
 
171
};
 
172
 
 
173
KWBookMark::KWBookMark(const QString &_name)
 
174
    : m_name(_name),
 
175
      m_startParag(0L),
 
176
      m_endParag(0L),
 
177
      m_frameSet(0L),
 
178
      m_startIndex( 0 ),
 
179
      m_endIndex( 0)
 
180
{
 
181
}
 
182
 
 
183
KWBookMark::KWBookMark(const QString &_name, KoTextParag *_startParag, KoTextParag *_endParag,KWFrameSet *_frameSet, int _pos, int _end)
 
184
    : m_name(_name),
 
185
      m_startParag(_startParag),
 
186
      m_endParag(_endParag),
 
187
      m_frameSet(_frameSet),
 
188
      m_startIndex( _pos ),
 
189
      m_endIndex( _end )
 
190
{
 
191
}
 
192
 
 
193
KWBookMark::~KWBookMark()
 
194
{
 
195
    m_startParag=0L;
 
196
    m_endParag=0L;
 
197
    m_frameSet=0L;
 
198
}
 
199
 
142
200
/******************************************************************/
143
201
/* Class: KWDocument                                              */
144
202
/******************************************************************/
 
203
const int KWDocument::CURRENT_SYNTAX_VERSION = 3;
145
204
 
146
205
KWDocument::KWDocument(QWidget *parentWidget, const char *widgetName, QObject* parent, const char* name, bool singleViewMode )
147
206
    : KoDocument( parentWidget, widgetName, parent, name, singleViewMode ),
148
 
      m_unit( KWUnit::U_MM ), // footNoteManager( this ),
149
 
      urlIntern()
 
207
      m_unit( KoUnit::U_MM ),
 
208
      m_urlIntern()
150
209
{
 
210
    dcop = 0;
 
211
    m_pages = 1;
 
212
    m_tabStop = MM_TO_POINT( 15.0 );
 
213
    bgFrameSpellChecked = 0L;
 
214
    m_processingType = WP;
 
215
 
151
216
    m_lstViews.setAutoDelete( false );
152
217
    m_lstChildren.setAutoDelete( true );
153
 
    m_styleList.setAutoDelete( false );
154
 
    m_deletedStyles.setAutoDelete( true );
155
218
//    varFormats.setAutoDelete(true);
156
 
    frames.setAutoDelete( true );
 
219
    m_lstFrameSet.setAutoDelete( true );
 
220
    // m_textImageRequests does not create or delete the KWTextImage classes
 
221
    m_textImageRequests.setAutoDelete(false);
 
222
    m_bookmarkList.setAutoDelete( true );
 
223
 
 
224
    m_styleColl=new KoStyleCollection();
 
225
    m_frameStyleColl = new KWFrameStyleCollection();
 
226
    m_tableStyleColl = new KWTableStyleCollection();
 
227
    m_tableTemplateColl = new KWTableTemplateCollection();
 
228
 
 
229
    m_personalExpressionPath = KWFactory::global()->dirs()->resourceDirs("expression");
 
230
    m_picturePath= KGlobalSettings::documentPath();
 
231
 
 
232
#if 0 // KWORD_HORIZONTAL_LINE
 
233
    m_horizontalLinePath = KWFactory::global()->dirs()->resourceDirs("horizontalLine");
 
234
#endif
157
235
 
158
236
    setInstance( KWFactory::global(), false );
159
237
 
160
 
    m_gridX = m_gridY = 10;
 
238
    m_gridX = m_gridY = 10.0;
161
239
    m_indent = MM_TO_POINT( 10.0 );
162
240
 
163
241
    m_iNbPagePerRow = 4;
164
242
    m_maxRecentFiles = 10;
165
 
 
 
243
    m_defaultColumnSpacing=3;
166
244
    m_bShowRuler = true;
167
245
 
 
246
    m_footNoteSeparatorLinePos=SLP_LEFT;
 
247
 
 
248
    //by default it's 1/5
 
249
    m_iFootNoteSeparatorLineLength = 20;
 
250
    m_footNoteSeparatorLineWidth = 2.0;
 
251
    m_footNoteSeparatorLineType = SLT_SOLID;
 
252
 
168
253
    m_viewFormattingChars = false;
 
254
 
 
255
    m_viewFormattingEndParag = true;
 
256
    m_viewFormattingSpace = true;
 
257
    m_viewFormattingTabs = true;
 
258
    m_viewFormattingBreak = true;
 
259
 
169
260
    m_viewFrameBorders = true;
170
 
 
171
 
    m_bDontCheckUpperWord = false;
172
 
    m_bDontCheckTitleCase = false;
173
 
    //m_onlineSpellCheck = false;
174
 
 
175
 
    m_autoFormat = new KWAutoFormat(this);
 
261
    m_repaintAllViewsPending = false;
 
262
    m_recalcFramesPending = -1;
 
263
    m_bShowDocStruct = true;
 
264
    m_bShowRuler = true;
 
265
    m_bShowStatusBar = true;
 
266
    m_bAllowAutoFormat = true;
 
267
    m_pgUpDownMovesCaret = false;
 
268
    m_bShowScrollBar = true;
 
269
    m_cursorInProtectectedArea = true;
 
270
    m_bHasEndNotes = false;
 
271
 
 
272
    m_bInsertDirectCursor=false;
 
273
    m_globalLanguage = KGlobal::locale()->language();
 
274
    m_bGlobalHyphenation = false;
 
275
    m_lastViewMode="ModeNormal";
 
276
    m_viewMode = 0;
176
277
 
177
278
    m_commandHistory = new KWCommandHistory( this );
178
 
#if KDE_VERSION >= 220 // kdelibs >= 2.2 only
179
279
    connect( m_commandHistory, SIGNAL( documentRestored() ), this, SLOT( slotDocumentRestored() ) );
180
 
#endif
181
280
    connect( m_commandHistory, SIGNAL( commandExecuted() ), this, SLOT( slotCommandExecuted() ) );
182
281
 
183
 
    connect( documentInfo(), SIGNAL( sigDocumentInfoModifed()),this,SLOT(slotDocumentInfoModifed() ) );
184
 
 
185
 
    m_formulaDocument = new KFormula::KFormulaDocument(actionCollection(), m_commandHistory);
186
 
 
187
 
    setEmpty();
188
 
    setModified(false);
189
 
 
190
282
    //styleMask = U_FONT_FAMILY_ALL_SIZE | U_COLOR | U_BORDER | U_INDENT |
191
283
    //                     U_NUMBERING | U_ALIGN | U_TABS | U_SMART;
192
284
    m_headerVisible = false;
193
285
    m_footerVisible = false;
194
286
 
195
 
    m_lastStyle = 0L;
196
 
    m_pixmapMap = 0L;
197
 
    m_clipartMap = 0L;
198
287
    m_pasteFramesetsMap = 0L;
199
 
 
200
 
    slDataBase = new KWSerialLetterDataBase( this );
 
288
    m_initialEditing = 0L;
 
289
    m_bufPixmap = 0L;
 
290
    m_varFormatCollection = new KoVariableFormatCollection;
 
291
    m_varColl = new KWVariableCollection( new KWVariableSettings(), m_varFormatCollection );
 
292
 
 
293
    m_autoFormat = new KoAutoFormat(this,m_varColl,m_varFormatCollection );
 
294
 
 
295
    m_bgSpellCheck = new KWBgSpellCheck(this);
 
296
 
 
297
    m_slDataBase = new KWMailMergeDataBase( this );
201
298
    slRecordNum = -1;
202
299
 
203
 
    // Get default font from KDE
204
 
    m_defaultFont = KGlobalSettings::generalFont();
205
 
    KGlobal::charsets()->setQFont(m_defaultFont, KGlobal::locale()->charset());
206
 
 
207
300
    m_syntaxVersion = CURRENT_SYNTAX_VERSION;
208
 
    m_pKSpellConfig=0;
 
301
 
 
302
    m_pKOSpellConfig = 0;
 
303
 
209
304
    m_hasTOC=false;
210
305
 
 
306
    // It's important to call this to have the kformula actions
 
307
    // created. The real document is still to be created if needed.
 
308
    m_formulaDocumentWrapper =
 
309
        new KFormula::DocumentWrapper( instance()->config(),
 
310
                                       actionCollection(),
 
311
                                       m_commandHistory );
 
312
 
 
313
    setEmpty();
 
314
    setModified(false);
 
315
 
211
316
    initConfig();
212
 
    getFormulaDocument()->setResolution( m_zoomedResolutionX, m_zoomedResolutionY );
 
317
 
 
318
    // Get default font from the KWord config file
 
319
    KConfig *config = KWFactory::global()->config();
 
320
    config->setGroup("Document defaults" );
 
321
    QString defaultFontname=config->readEntry("DefaultFont");
 
322
    if ( !defaultFontname.isEmpty() )
 
323
        m_defaultFont.fromString( defaultFontname );
 
324
    // If not found, we automatically fallback to the application font (the one from KControl's font module)
 
325
 
 
326
    // Try to force a scalable font.
 
327
    m_defaultFont.setStyleStrategy( QFont::ForceOutline );
 
328
 
 
329
    int ptSize = m_defaultFont.pointSize();
 
330
    if ( ptSize == -1 ) // specified with a pixel size ?
 
331
        ptSize = QFontInfo(m_defaultFont).pointSize();
 
332
 
 
333
    //kdDebug() << "Default font: requested family: " << m_defaultFont.family() << endl;
 
334
    //kdDebug() << "Default font: real family: " << QFontInfo(m_defaultFont).family() << endl;
213
335
 
214
336
    // Some simple import filters don't define any style,
215
337
    // so let's have a Standard style at least
216
338
    KWStyle * standardStyle = new KWStyle( "Standard" ); // This gets translated later on
217
 
    addStyleTemplate( standardStyle );
218
 
}
 
339
    //kdDebug() << "KWDocument::KWDocument creating standardStyle " << standardStyle << endl;
 
340
    standardStyle->format().setFont( m_defaultFont );
 
341
    m_styleColl->addStyleTemplate( standardStyle );
 
342
 
 
343
    // And let's do the same for framestyles
 
344
    KWFrameStyle * standardFrameStyle = new KWFrameStyle( "Plain" );
 
345
    standardFrameStyle->setBackgroundColor(QColor("white"));
 
346
    standardFrameStyle->setTopBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
347
    standardFrameStyle->setRightBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
348
    standardFrameStyle->setLeftBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
349
    standardFrameStyle->setBottomBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
350
    m_frameStyleColl->addFrameStyleTemplate( standardFrameStyle );
 
351
 
 
352
    // And let's do the same for tablestyles
 
353
    KWTableStyle *standardTableStyle = new KWTableStyle( "Plain", standardStyle, standardFrameStyle );
 
354
    m_tableStyleColl->addTableStyleTemplate( standardTableStyle );
 
355
 
 
356
    if ( name )
 
357
        dcopObject();
 
358
    connect(m_varColl,SIGNAL(repaintVariable()),this,SLOT(slotRepaintVariable()));
 
359
}
 
360
 
 
361
/*==============================================================*/
 
362
DCOPObject* KWDocument::dcopObject()
 
363
{
 
364
    if ( !dcop )
 
365
        dcop = new KWordDocIface( this );
 
366
    return dcop;
 
367
}
 
368
 
 
369
 
219
370
 
220
371
KWDocument::~KWDocument()
221
372
{
222
 
    saveConfig();
 
373
    //don't save config when kword is embedded into konqueror
 
374
    if(isReadWrite())
 
375
        saveConfig();
 
376
    // formula frames have to be deleted before m_formulaDocumentWrapper
 
377
    m_lstFrameSet.clear();
 
378
    m_bookmarkList.clear();
 
379
    m_tmpBookMarkList.clear();
223
380
    delete m_autoFormat;
224
 
    delete m_formulaDocument;
 
381
    delete m_formulaDocumentWrapper;
225
382
    delete m_commandHistory;
 
383
    delete m_varColl;
 
384
    delete m_varFormatCollection;
 
385
    delete m_slDataBase;
 
386
    delete dcop;
 
387
    delete m_bgSpellCheck;
 
388
    delete m_styleColl;
 
389
    delete m_frameStyleColl;
 
390
    delete m_tableStyleColl;
 
391
    delete m_tableTemplateColl;
 
392
    delete m_pKOSpellConfig;
 
393
    delete m_viewMode;
 
394
    delete m_bufPixmap;
226
395
}
227
396
 
228
397
void KWDocument::initConfig()
229
398
{
230
399
  KConfig *config = KWFactory::global()->config();
231
 
  KSpellConfig ksconfig;
 
400
  KOSpellConfig kosconfig;
232
401
  if( config->hasGroup("KSpell kword" ) )
233
402
  {
234
403
      config->setGroup( "KSpell kword" );
235
 
      ksconfig.setNoRootAffix(config->readNumEntry ("KSpell_NoRootAffix", 0));
236
 
      ksconfig.setRunTogether(config->readNumEntry ("KSpell_RunTogether", 0));
237
 
      ksconfig.setDictionary(config->readEntry ("KSpell_Dictionary", ""));
238
 
      ksconfig.setDictFromList(config->readNumEntry ("KSpell_DictFromList", FALSE));
239
 
      ksconfig.setEncoding(config->readNumEntry ("KSpell_Encoding", KS_E_ASCII));
240
 
      ksconfig.setClient(config->readNumEntry ("KSpell_Client", KS_CLIENT_ISPELL));
241
 
      setKSpellConfig(ksconfig);
242
 
      setDontCheckUpperWord(config->readBoolEntry("KSpell_dont_check_upper_word",false));
243
 
      setDontCheckTitleCase(config->readBoolEntry("KSpell_dont_check_title_case",false));
 
404
      kosconfig.setNoRootAffix(config->readNumEntry ("KSpell_NoRootAffix", 0));
 
405
      kosconfig.setRunTogether(config->readNumEntry ("KSpell_RunTogether", 0));
 
406
      kosconfig.setDictionary(config->readEntry ("KSpell_Dictionary", ""));
 
407
      kosconfig.setDictFromList(config->readNumEntry ("KSpell_DictFromList", FALSE));
 
408
      kosconfig.setEncoding(config->readNumEntry ("KSpell_Encoding", KOS_E_ASCII));
 
409
      kosconfig.setClient(config->readNumEntry ("KSpell_Client", KOS_CLIENT_ISPELL));
 
410
 
 
411
      kosconfig.setIgnoreCase( config->readNumEntry( "KSpell_IgnoreCase", 0));
 
412
      kosconfig.setIgnoreAccent( config->readNumEntry( "KSpell_IgnoreAccent", 0));
 
413
      kosconfig.setDontCheckUpperWord(config->readBoolEntry("KSpell_dont_check_upper_word",false));
 
414
      kosconfig.setDontCheckTitleCase(config->readBoolEntry("KSpell_dont_check_title_case",false));
 
415
      kosconfig.setSpellWordWithNumber( config->readNumEntry("KSpell_SpellWordWithNumber", false));
 
416
 
 
417
      setKOSpellConfig( kosconfig );
 
418
 
 
419
      // Default is false for spellcheck, but the spell-check config dialog
 
420
      // should write out "true" when the user configures spell checking.
 
421
      if ( isReadWrite() )
 
422
          m_bgSpellCheck->enableBackgroundSpellCheck(config->readBoolEntry( "SpellCheck", false ));
 
423
      else
 
424
          m_bgSpellCheck->enableBackgroundSpellCheck( false );
 
425
 
244
426
  }
245
427
 
246
428
  if(config->hasGroup("Interface" ) )
247
429
  {
248
430
      config->setGroup( "Interface" );
249
 
      setGridY(config->readNumEntry("GridY",10));
250
 
      setGridX(config->readNumEntry("GridX",10));
 
431
      setGridY(QMAX( config->readDoubleNumEntry("GridY",10.0), 0.1));
 
432
      setGridX(QMAX( config->readDoubleNumEntry("GridX",10.0), 0.1));
 
433
      setCursorInProtectedArea( config->readBoolEntry( "cursorInProtectArea", true ));
251
434
      // Config-file value in mm, default 10 pt
252
 
      double indent = MM_TO_POINT( config->readDoubleNumEntry("Indent", POINT_TO_MM(10.0) ) );
 
435
      double indent = config->readDoubleNumEntry("Indent", MM_TO_POINT(10.0) ) ;
253
436
      setIndentValue(indent);
254
437
      setShowRuler(config->readBoolEntry("Rulers",true));
255
 
      setAutoSave((config->readNumEntry("AutoSave",KoDocument::defaultAutoSave()))*60);
 
438
      int defaultAutoSave = KoDocument::defaultAutoSave()/60; // in minutes
 
439
      setAutoSave(config->readNumEntry("AutoSave",defaultAutoSave)*60); // read key in minutes, call setAutoSave(seconds)
 
440
      setBackupFile( config->readNumEntry("BackupFile", true));
 
441
 
256
442
      setNbPagePerRow(config->readNumEntry("nbPagePerRow",4));
257
443
      m_maxRecentFiles = config->readNumEntry( "NbRecentFile", 10 );
258
444
 
259
445
      m_viewFormattingChars = config->readBoolEntry( "ViewFormattingChars", false );
 
446
      m_viewFormattingBreak = config->readBoolEntry( "ViewFormattingBreaks", true );
 
447
      m_viewFormattingSpace = config->readBoolEntry( "ViewFormattingSpace", true );
 
448
      m_viewFormattingEndParag = config->readBoolEntry( "ViewFormattingEndParag", true );
 
449
      m_viewFormattingTabs = config->readBoolEntry( "ViewFormattingTabs", true );
 
450
 
260
451
      m_viewFrameBorders = config->readBoolEntry( "ViewFrameBorders", true );
261
452
 
262
453
      m_zoom = config->readNumEntry( "Zoom", 100 );
 
454
      m_bShowDocStruct = config->readBoolEntry( "showDocStruct", true );
 
455
      m_lastViewMode = config->readEntry( "viewmode", "ModeNormal" );
 
456
      setShowStatusBar( config->readBoolEntry( "ShowStatusBar" , true ) );
 
457
      setAllowAutoFormat( config->readBoolEntry( "AllowAutoFormat" , true ) );
 
458
      setShowScrollBar( config->readBoolEntry( "ShowScrollBar", true ) );
 
459
      if ( isEmbedded() )
 
460
          m_bShowDocStruct = false; // off by default for embedded docs, but still toggleable
 
461
      m_pgUpDownMovesCaret = config->readBoolEntry( "PgUpDownMovesCaret", false );
 
462
      m_bInsertDirectCursor= config->readBoolEntry( "InsertDirectCursor", false );
 
463
      m_globalLanguage=config->readEntry("language", KGlobal::locale()->language());
 
464
      m_bGlobalHyphenation=config->readBoolEntry("hyphenation", false);
263
465
  }
264
466
  else
265
467
      m_zoom = 100;
266
 
 
267
 
  setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY(), false, false );
 
468
  int undo=30;
 
469
  if(config->hasGroup("Misc" ) )
 
470
  {
 
471
      config->setGroup( "Misc" );
 
472
      undo=config->readNumEntry("UndoRedo",-1);
 
473
  }
 
474
  if(undo!=-1)
 
475
      setUndoRedoLimit(undo);
 
476
 
 
477
  setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY() );
 
478
 
 
479
  //text mode view is not a good default for a readonly document...
 
480
  if ( !isReadWrite() && m_lastViewMode =="ModeText" )
 
481
      m_lastViewMode= "ModeNormal";
 
482
 
 
483
  m_viewMode = KWViewMode::create( m_lastViewMode, this );
 
484
 
 
485
  if(config->hasGroup("Kword Path" ) )
 
486
  {
 
487
      config->setGroup( "Kword Path" );
 
488
      if ( config->hasKey( "expression path" ) )
 
489
          m_personalExpressionPath = config->readListEntry( "expression path" );
 
490
#if 0 // KWORD_HORIZONTAL_LINE
 
491
      if ( config->hasKey( "horizontal line path" ) )
 
492
          m_horizontalLinePath = config->readListEntry( "horizontal line path" );
 
493
#endif
 
494
      if ( config->hasKey( "picture path" ) )
 
495
          m_picturePath = config->readPathEntry( "picture path" );
 
496
      setBackupPath(config->readPathEntry( "backup path" ));
 
497
  }
268
498
}
269
499
 
270
500
void KWDocument::saveConfig()
271
501
{
 
502
    if ( isEmbedded() || !isReadWrite() )
 
503
        return;
272
504
    // Only save the config that is manipulated by the UI directly.
273
505
    // The config from the config dialog is saved by the dialog itself.
274
506
    KConfig *config = KWFactory::global()->config();
275
507
    config->setGroup( "Interface" );
276
508
    config->writeEntry( "ViewFormattingChars", m_viewFormattingChars );
 
509
    config->writeEntry( "ViewFormattingBreaks", m_viewFormattingBreak );
 
510
    config->writeEntry( "ViewFormattingEndParag", m_viewFormattingEndParag );
 
511
    config->writeEntry( "ViewFormattingTabs", m_viewFormattingTabs );
 
512
    config->writeEntry( "ViewFormattingSpace", m_viewFormattingSpace );
277
513
    config->writeEntry( "ViewFrameBorders", m_viewFrameBorders );
278
514
    config->writeEntry( "Zoom", m_zoom );
279
 
}
280
 
 
281
 
void KWDocument::setZoomAndResolution( int zoom, int dpiX, int dpiY, bool updateViews, bool forPrint )
282
 
{
283
 
    KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY, updateViews, forPrint );
284
 
    newZoomAndResolution( updateViews, forPrint );
 
515
    config->writeEntry( "showDocStruct", m_bShowDocStruct);
 
516
    config->writeEntry( "Rulers", m_bShowRuler);
 
517
    config->writeEntry( "viewmode", m_lastViewMode);
 
518
    config->writeEntry( "AllowAutoFormat", m_bAllowAutoFormat );
 
519
}
 
520
 
 
521
void KWDocument::setZoomAndResolution( int zoom, int dpiX, int dpiY )
 
522
{
 
523
    KoZoomHandler::setZoomAndResolution( zoom, dpiX, dpiY );
 
524
    if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
 
525
        formulaDocument->setZoomAndResolution( zoom, dpiX, dpiY );
 
526
}
 
527
 
 
528
KWTextFrameSet * KWDocument::textFrameSet ( unsigned int _num ) const
 
529
{
 
530
    unsigned int i=0;
 
531
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
532
    for ( ; fit.current() ; ++fit )
 
533
    {
 
534
        if(fit.current()->isDeleted()) continue;
 
535
        if(fit.current()->type()==FT_TEXT)
 
536
        {
 
537
            if(i==_num)
 
538
                return static_cast<KWTextFrameSet*>(fit.current());
 
539
            i++;
 
540
        }
 
541
    }
 
542
    return static_cast<KWTextFrameSet*>(m_lstFrameSet.getFirst());
285
543
}
286
544
 
287
545
void KWDocument::newZoomAndResolution( bool updateViews, bool forPrint )
288
546
{
289
 
    getFormulaDocument()->setResolution( m_zoomedResolutionX, m_zoomedResolutionY );
290
 
 
291
 
    // Update all fonts
292
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
547
    if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
 
548
        formulaDocument->newZoomAndResolution( updateViews,forPrint );
 
549
#if 0
 
550
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
293
551
    for ( ; fit.current() ; ++fit )
294
552
        fit.current()->zoom( forPrint );
 
553
#endif
295
554
 
296
555
    layout();
297
556
    updateAllFrames();
304
563
 
305
564
bool KWDocument::initDoc()
306
565
{
307
 
    m_pageLayout.unit = PG_MM;
308
566
    m_pages = 1;
309
567
 
310
568
    m_pageColumns.columns = 1;
311
 
    m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
 
569
    m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
312
570
 
313
571
    m_pageHeaderFooter.header = HF_SAME;
314
572
    m_pageHeaderFooter.footer = HF_SAME;
315
573
    m_pageHeaderFooter.ptHeaderBodySpacing = 10;
316
574
    m_pageHeaderFooter.ptFooterBodySpacing = 10;
317
 
    m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
318
 
    m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
319
 
    m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
320
 
    m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
 
575
    m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
321
576
 
322
577
    QString _template;
323
578
 
324
579
    bool ok = FALSE;
 
580
 
 
581
    KoTemplateChooseDia::DialogType dlgtype;
 
582
    if (initDocFlags() != KoDocument::InitDocFileNew)
 
583
            dlgtype = KoTemplateChooseDia::Everything;
 
584
    else
 
585
            dlgtype = KoTemplateChooseDia::OnlyTemplates;
 
586
 
 
587
 
325
588
    KoTemplateChooseDia::ReturnType ret = KoTemplateChooseDia::choose(
326
589
        KWFactory::global(), _template, "application/x-kword", "*.kwd", i18n("KWord"),
327
 
        KoTemplateChooseDia::Everything, "kword_template");
 
590
        dlgtype, "kword_template");
328
591
    if ( ret == KoTemplateChooseDia::Template ) {
329
592
        QFileInfo fileInfo( _template );
330
593
        QString fileName( fileInfo.dirPath( TRUE ) + "/" + fileInfo.baseName() + ".kwt" );
331
594
        resetURL();
332
595
        ok = loadNativeFormat( fileName );
 
596
        initUnit();
333
597
        setEmpty();
334
598
    } else if ( ret == KoTemplateChooseDia::File ) {
335
599
        KURL url( _template);
336
 
        kdDebug() << "KWDocument::initDoc opening URL " << url.prettyURL() << endl;
 
600
        //kdDebug() << "KWDocument::initDoc opening URL " << url.prettyURL() << endl;
337
601
        ok = openURL( url );
338
602
    } else if ( ret == KoTemplateChooseDia::Empty ) {
339
603
        QString fileName( locate( "kword_template", "Normal/.source/PlainText.kwt" , KWFactory::global() ) );
340
604
        resetURL();
341
605
        ok = loadNativeFormat( fileName );
 
606
        initUnit();
342
607
        setEmpty();
343
608
    }
344
609
    setModified( FALSE );
345
610
    return ok;
346
611
}
347
612
 
 
613
void KWDocument::initUnit()
 
614
{
 
615
    //load unit config after we load file.
 
616
    //load it for new file or empty file
 
617
    KConfig *config = KWFactory::global()->config();
 
618
    if(config->hasGroup("Misc") )
 
619
    {
 
620
        config->setGroup( "Misc" );
 
621
        setUnit(KoUnit::unit( config->readEntry("Units",KoUnit::unitName(KoUnit::U_MM  ))));
 
622
        setDefaultColumnSpacing( config->readDoubleNumEntry("ColumnSpacing", 3.0) );
 
623
    }
 
624
    m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
 
625
}
 
626
 
348
627
void KWDocument::initEmpty()
349
628
{
350
 
    m_pageLayout.unit = PG_MM;
351
629
    m_pages = 1;
352
630
 
353
631
    m_pageColumns.columns = 1;
354
 
    m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
 
632
    m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
355
633
 
356
634
    m_pageHeaderFooter.header = HF_SAME;
357
635
    m_pageHeaderFooter.footer = HF_SAME;
358
636
    m_pageHeaderFooter.ptHeaderBodySpacing = 10;
359
637
    m_pageHeaderFooter.ptFooterBodySpacing = 10;
360
 
    m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
361
 
    m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
362
 
    m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
363
 
    m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
 
638
    m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
364
639
 
365
640
    QString fileName( locate( "kword_template", "Normal/.source/PlainText.kwt" , KWFactory::global() ) );
366
641
    /*bool ok = */loadNativeFormat( fileName );
369
644
    setEmpty();
370
645
}
371
646
 
 
647
KoPageLayout KWDocument::pageLayout() const
 
648
{
 
649
    return m_pageLayout;
 
650
}
372
651
 
373
 
void KWDocument::setPageLayout( KoPageLayout _layout, KoColumns _cl, KoKWHeaderFooter _hf )
 
652
void KWDocument::setPageLayout( const KoPageLayout& _layout, const KoColumns& _cl, const KoKWHeaderFooter& _hf, bool updateViews )
374
653
{
375
654
    if ( m_processingType == WP ) {
376
 
        kdDebug() << "KWDocument::setPageLayout WP" << endl;
 
655
        int numPages = m_pages;
 
656
        //kdDebug() << "KWDocument::setPageLayout WP" << endl;
377
657
        m_pageLayout = _layout;
378
658
        m_pageColumns = _cl;
379
659
        m_pageHeaderFooter = _hf;
 
660
 
 
661
        if ( updateViews ) {
 
662
            // Fix things up, when we change the orientation we might accidentally change the number of pages
 
663
            // (and frames of the main textframeset might just remain un-moved...)
 
664
            KWFrameSet *frameset = m_lstFrameSet.getFirst();
 
665
            KWFrame* lastFrame = frameset->frame( frameset->getNumFrames() - 1 );
 
666
            if ( lastFrame && lastFrame->pageNum() + 1 < numPages ) {
 
667
                kdDebug(32002) << "KWDocument::setPageLayout ensuring that recalcFrames will consider " << numPages << " pages." << endl;
 
668
                // All that matters is that it's on numPages so that all pages will be recalc-ed.
 
669
                // If the text layout then wants to remove some pages, no problem.
 
670
                lastFrame->setY( numPages * ptPaperHeight() + ptTopBorder() );
 
671
            }
 
672
        }
 
673
 
380
674
    } else {
381
675
        //kdDebug() << "KWDocument::setPageLayout NON-WP" << endl;
382
676
        m_pageLayout = _layout;
384
678
        m_pageLayout.ptRight = 0;
385
679
        m_pageLayout.ptTop = 0;
386
680
        m_pageLayout.ptBottom = 0;
387
 
        m_pageLayout.mmLeft = 0;
388
 
        m_pageLayout.mmRight = 0;
389
 
        m_pageLayout.mmTop = 0;
390
 
        m_pageLayout.mmBottom = 0;
391
 
        m_pageLayout.inchLeft = 0;
392
 
        m_pageLayout.inchRight = 0;
393
 
        m_pageLayout.inchTop = 0;
394
 
        m_pageLayout.inchBottom = 0;
395
681
        m_pageHeaderFooter = _hf;
396
682
    }
397
683
 
398
684
    recalcFrames();
399
685
 
400
686
    updateAllFrames();
401
 
}
402
687
 
403
 
void KWDocument::updateRuler()
404
 
{
405
 
    kdDebug() << "KWDocument::updateRuler" << endl;
406
 
    // Invalidate document layout
407
 
    layout();
408
 
    //refresh koRuler in each view
409
 
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
688
    if ( updateViews )
410
689
    {
411
 
        viewPtr->getGUI()->getHorzRuler()->setPageLayout( m_pageLayout);
412
 
        viewPtr->getGUI()->getVertRuler()->setPageLayout( m_pageLayout );
413
 
        viewPtr->getGUI()->canvasWidget()->repaintAll( true );
 
690
        // Invalidate document layout, for proper repaint
 
691
        layout();
 
692
        emit pageLayoutChanged( m_pageLayout );
 
693
        updateResizeHandles();
 
694
        updateContentsSize();
414
695
    }
415
696
}
416
697
 
 
698
 
417
699
double KWDocument::ptColumnWidth() const
418
700
{
419
701
    return ( ptPaperWidth() - ptLeftBorder() - ptRightBorder() -
421
703
        / m_pageColumns.columns;
422
704
}
423
705
 
 
706
class KWFootNoteFrameSetList : public QPtrList<KWFootNoteFrameSet>
 
707
{
 
708
public:
 
709
    KWFootNoteFrameSetList( bool reversed ) : m_reversed( reversed ) {}
 
710
protected:
 
711
    // Compare the order of the associated variables
 
712
    virtual int compareItems(QPtrCollection::Item a, QPtrCollection::Item b)
 
713
    {
 
714
        KWFootNoteFrameSet* fsa = ((KWFootNoteFrameSet *)a);
 
715
        KWFootNoteFrameSet* fsb = ((KWFootNoteFrameSet *)b);
 
716
        Q_ASSERT( fsa->footNoteVariable() );
 
717
        Q_ASSERT( fsb->footNoteVariable() );
 
718
        if ( fsa->footNoteVariable() && fsb->footNoteVariable() )
 
719
        {
 
720
            int numa = fsa->footNoteVariable()->num();
 
721
            int numb = fsb->footNoteVariable()->num();
 
722
            if (numa == numb) return 0;
 
723
            if (numa > numb) return m_reversed ? -1 : 1;
 
724
            return m_reversed ? 1 : -1;
 
725
        }
 
726
        return -1; // whatever
 
727
    }
 
728
private:
 
729
    bool m_reversed;
 
730
};
 
731
 
424
732
/* append headers and footers if needed, and create enough pages for all the existing frames */
425
 
void KWDocument::recalcFrames()
 
733
void KWDocument::recalcFrames( int fromPage, int toPage /*-1 for all*/, uint flags )
426
734
{
427
 
    kdDebug(32002) << "KWDocument::recalcFrames" << endl;
428
 
    if ( frames.isEmpty() )
 
735
    if ( m_lstFrameSet.isEmpty() )
429
736
        return;
430
 
 
431
 
    KWFrameSet *frameset = frames.at( 0 );
432
 
 
433
 
    double ptColumnWidth = this->ptColumnWidth();
434
 
 
435
 
    int firstHeadOffset = 0, evenHeadOffset = 0, oddHeadOffset = 0;
436
 
    int firstFootOffset = 0, evenFootOffset = 0, oddFootOffset = 0;
437
 
    KWTextFrameSet *firstHeader = 0L, *evenHeader = 0L, *oddHeader = 0L;
438
 
    KWTextFrameSet *firstFooter = 0L, *evenFooter = 0L, *oddFooter = 0L;
439
 
 
440
 
    // Lookup the various header / footer framesets into the variables above
441
 
    // [Done in all cases, in order to hide unused framesets]
442
 
 
443
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
444
 
    for ( ; fit.current() ; ++fit )
445
 
    {
446
 
        KWFrameSet * fs = fit.current();
447
 
        switch ( fs->frameSetInfo() ) {
 
737
    //printDebug();
 
738
    kdDebug(32002) << "KWDocument::recalcFrames from=" << fromPage << " to=" << toPage << endl;
 
739
 
 
740
    KWFrameSet *frameset = m_lstFrameSet.getFirst();
 
741
 
 
742
    if ( m_processingType == WP ) { // In WP mode the pages are created automatically. In DTP not...
 
743
 
 
744
        KWTextFrameSet *firstHeader = 0L, *evenHeader = 0L, *oddHeader = 0L;
 
745
        KWTextFrameSet *firstFooter = 0L, *evenFooter = 0L, *oddFooter = 0L;
 
746
        m_bHasEndNotes = false; // will be set to true if we find any endnote
 
747
 
 
748
        // Lookup the various header / footer framesets into the variables above
 
749
        // [Done in all cases, in order to hide unused framesets]
 
750
 
 
751
        KWFootNoteFrameSetList footnotesList( true ); // Reversed, we want footnotes from bottom to top
 
752
        KWFootNoteFrameSetList endnotesList( false ); // Endnotes are in top to bottom order
 
753
        QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
754
        for ( ; fit.current() ; ++fit )
 
755
        {
 
756
            KWFrameSet * fs = fit.current();
 
757
            switch ( fs->frameSetInfo() ) {
448
758
            case KWFrameSet::FI_FIRST_HEADER:
449
759
                if ( isHeaderVisible() ) {
450
760
                    firstHeader = dynamic_cast<KWTextFrameSet*>( fs );
451
 
                    firstHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
452
 
                                                       fs->getFrame( 0 )->height());
 
761
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
 
762
                break;
 
763
            case KWFrameSet::FI_ODD_HEADER:
 
764
                if ( isHeaderVisible() ) {
 
765
                    oddHeader = dynamic_cast<KWTextFrameSet*>( fs );
453
766
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
454
767
                break;
455
768
            case KWFrameSet::FI_EVEN_HEADER:
456
769
                if ( isHeaderVisible() ) {
457
770
                    evenHeader = dynamic_cast<KWTextFrameSet*>( fs );
458
 
                    evenHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
459
 
                                                      fs->getFrame( 0 )->height());
460
 
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
461
 
                break;
462
 
            case KWFrameSet::FI_ODD_HEADER:
463
 
                if ( isHeaderVisible() ) {
464
 
                    oddHeader = dynamic_cast<KWTextFrameSet*>( fs );
465
 
                    oddHeadOffset = static_cast<int>(m_pageHeaderFooter.ptHeaderBodySpacing +
466
 
                                                     fs->getFrame( 0 )->height());
467
771
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
468
772
                break;
469
773
            case KWFrameSet::FI_FIRST_FOOTER:
470
774
                if ( isFooterVisible() ) {
471
775
                    firstFooter = dynamic_cast<KWTextFrameSet*>( fs );
472
 
                    firstFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
473
 
                                                       fs->getFrame( 0 )->height());
 
776
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
 
777
                break;
 
778
            case KWFrameSet::FI_ODD_FOOTER:
 
779
                if ( isFooterVisible() ) {
 
780
                    oddFooter = dynamic_cast<KWTextFrameSet*>( fs );
474
781
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
475
782
                break;
476
783
            case KWFrameSet::FI_EVEN_FOOTER:
477
784
                if ( isFooterVisible() ) {
478
785
                    evenFooter = dynamic_cast<KWTextFrameSet*>( fs );
479
 
                    evenFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
480
 
                                                      fs->getFrame( 0 )->height());
481
786
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
 
787
            case KWFrameSet::FI_FOOTNOTE: {
 
788
                KWFootNoteFrameSet* fnfs = dynamic_cast<KWFootNoteFrameSet *>(fs);
 
789
                if ( fnfs && fnfs->isVisible() ) // not visible is when the footnote has been deleted
 
790
                {
 
791
                    if ( fnfs->isFootNote() )
 
792
                        footnotesList.append( fnfs );
 
793
                    else if ( fnfs->isEndNote() ) {
 
794
                        endnotesList.append( fnfs );
 
795
                        m_bHasEndNotes = true;
 
796
                    }
 
797
                }
 
798
            }
482
799
                break;
483
 
            case KWFrameSet::FI_ODD_FOOTER:
484
 
                if ( isFooterVisible() ) {
485
 
                    oddFooter = dynamic_cast<KWTextFrameSet*>( fs );
486
 
                    oddFootOffset = static_cast<int>(m_pageHeaderFooter.ptFooterBodySpacing +
487
 
                                                     fs->getFrame( 0 )->height());
488
 
                } else { fs->setVisible( false ); fs->deleteAllCopies(); }
489
800
            default: break;
490
 
        }
491
 
    }
492
 
    // Now hide & forget the unused header/footer framesets (e.g. 'odd pages' if we are in 'all the same' mode etc.)
493
 
    if ( isHeaderVisible() ) {
494
 
        switch ( getHeaderType() ) {
495
 
            case HF_SAME:
496
 
                evenHeader->setVisible( true );
497
 
                oddHeader->setVisible( false );
498
 
                oddHeader->deleteAllCopies();
499
 
                firstHeader->setVisible( false );
500
 
                firstHeader->deleteAllCopies();
501
 
 
502
 
                oddHeader = evenHeader;
503
 
                firstHeader = evenHeader;
504
 
                oddHeadOffset = evenHeadOffset;
505
 
                firstHeadOffset = evenHeadOffset;
506
 
                break;
507
 
            case HF_FIRST_DIFF:
508
 
                evenHeader->setVisible( true );
509
 
                oddHeader->setVisible( false );
510
 
                oddHeader->deleteAllCopies();
511
 
                firstHeader->setVisible( true );
512
 
 
513
 
                oddHeader = evenHeader;
514
 
                oddHeadOffset = evenHeadOffset;
515
 
                break;
516
 
            case HF_EO_DIFF:
517
 
                evenHeader->setVisible( true );
518
 
                oddHeader->setVisible( true );
519
 
                firstHeader->setVisible( false );
520
 
                firstHeader->deleteAllCopies();
521
 
 
522
 
                firstHeader = oddHeader;
523
 
                firstHeadOffset = oddHeadOffset;
524
 
                break;
525
 
        }
526
 
    }
527
 
    if ( isFooterVisible() ) {
528
 
        switch ( getFooterType() ) {
529
 
            case HF_SAME:
530
 
                evenFooter->setVisible( true );
531
 
                oddFooter->setVisible( false );
532
 
                oddFooter->deleteAllCopies();
533
 
                firstFooter->setVisible( false );
534
 
                firstFooter->deleteAllCopies();
535
 
 
536
 
                oddFooter = evenFooter;
537
 
                firstFooter = evenFooter;
538
 
                oddFootOffset = evenFootOffset;
539
 
                firstFootOffset = evenFootOffset;
540
 
                break;
541
 
            case HF_FIRST_DIFF:
542
 
                evenFooter->setVisible( true );
543
 
                oddFooter->setVisible( false );
544
 
                oddFooter->deleteAllCopies();
545
 
                firstFooter->setVisible( true );
546
 
 
547
 
                oddFooter = evenFooter;
548
 
                oddFootOffset = evenFootOffset;
549
 
                break;
550
 
            case HF_EO_DIFF:
551
 
                evenFooter->setVisible( true );
552
 
                oddFooter->setVisible( true );
553
 
                firstFooter->setVisible( false );
554
 
                firstFooter->deleteAllCopies();
555
 
 
556
 
                firstFooter = oddFooter;
557
 
                firstFootOffset = oddFootOffset;
558
 
                break;
559
 
        }
560
 
    }
561
 
 
562
 
    if ( m_processingType == WP ) { // In WP mode the pages are created automatically. In DTP not...
563
 
 
564
 
        int headOffset = 0, footOffset = 0;
 
801
            }
 
802
        }
 
803
 
 
804
        // This allocation each time might slow things down a bit.
 
805
        // TODO KWHeaderFooterFrameSet : public KWTextFrameSet, and store the HeaderFooterFrameset data into there.
 
806
        // ... hmm, and then KWFootNoteFrameSet needs to inherit KWHeaderFooterFrameSet
 
807
        QPtrList<KWFrameLayout::HeaderFooterFrameset> headerFooterList;
 
808
        headerFooterList.setAutoDelete( true );
 
809
 
 
810
        // Now hide & forget the unused header/footer framesets (e.g. 'odd pages' if we are in 'all the same' mode etc.)
 
811
        if ( isHeaderVisible() ) {
 
812
            Q_ASSERT( firstHeader );
 
813
            Q_ASSERT( oddHeader );
 
814
            Q_ASSERT( evenHeader );
 
815
            switch ( getHeaderType() ) {
 
816
            case HF_SAME:
 
817
                oddHeader->setVisible( true );
 
818
                evenHeader->setVisible( false );
 
819
                evenHeader->deleteAllCopies();
 
820
                firstHeader->setVisible( false );
 
821
                firstHeader->deleteAllCopies();
 
822
 
 
823
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
824
                                             oddHeader, 0, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
 
825
                break;
 
826
            case HF_FIRST_EO_DIFF: // added for koffice-1.2-beta2
 
827
                firstHeader->setVisible( true );
 
828
                oddHeader->setVisible( true );
 
829
                evenHeader->setVisible( true );
 
830
 
 
831
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
832
                                             firstHeader, 0, 0, m_pageHeaderFooter.ptHeaderBodySpacing ) );
 
833
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
834
                                             oddHeader, 2, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
 
835
                                             KWFrameLayout::HeaderFooterFrameset::Odd ) );
 
836
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
837
                                             evenHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
 
838
                                             KWFrameLayout::HeaderFooterFrameset::Even ) );
 
839
                break;
 
840
            case HF_FIRST_DIFF:
 
841
                oddHeader->setVisible( true );
 
842
                evenHeader->setVisible( false );
 
843
                evenHeader->deleteAllCopies();
 
844
                firstHeader->setVisible( true );
 
845
 
 
846
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
847
                                             firstHeader, 0, 0, m_pageHeaderFooter.ptHeaderBodySpacing ) );
 
848
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
849
                                             oddHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing ) );
 
850
                break;
 
851
            case HF_EO_DIFF:
 
852
                oddHeader->setVisible( true );
 
853
                evenHeader->setVisible( true );
 
854
                firstHeader->setVisible( false );
 
855
                firstHeader->deleteAllCopies();
 
856
 
 
857
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
858
                                             oddHeader, 0, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
 
859
                                             KWFrameLayout::HeaderFooterFrameset::Odd ) );
 
860
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
861
                                             evenHeader, 1, -1, m_pageHeaderFooter.ptHeaderBodySpacing,
 
862
                                             KWFrameLayout::HeaderFooterFrameset::Even ) );
 
863
                break;
 
864
            }
 
865
        }
 
866
        if ( isFooterVisible() ) {
 
867
            Q_ASSERT( firstFooter );
 
868
            Q_ASSERT( oddFooter );
 
869
            Q_ASSERT( evenFooter );
 
870
            switch ( getFooterType() ) {
 
871
            case HF_SAME:
 
872
                oddFooter->setVisible( true );
 
873
                evenFooter->setVisible( false );
 
874
                evenFooter->deleteAllCopies();
 
875
                firstFooter->setVisible( false );
 
876
                firstFooter->deleteAllCopies();
 
877
 
 
878
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
879
                                             oddFooter, 0, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
 
880
                break;
 
881
            case HF_FIRST_EO_DIFF: // added for koffice-1.2-beta2
 
882
                firstFooter->setVisible( true );
 
883
                oddFooter->setVisible( true );
 
884
                evenFooter->setVisible( true );
 
885
 
 
886
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
887
                                             firstFooter, 0, 0, m_pageHeaderFooter.ptFooterBodySpacing ) );
 
888
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
889
                                             oddFooter, 2, -1, m_pageHeaderFooter.ptFooterBodySpacing,
 
890
                                             KWFrameLayout::HeaderFooterFrameset::Odd ) );
 
891
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
892
                                             evenFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
 
893
                                             KWFrameLayout::HeaderFooterFrameset::Even ) );
 
894
                break;
 
895
            case HF_FIRST_DIFF:
 
896
                oddFooter->setVisible( true );
 
897
                evenFooter->setVisible( false );
 
898
                evenFooter->deleteAllCopies();
 
899
                firstFooter->setVisible( true );
 
900
 
 
901
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
902
                                             firstFooter, 0, 0, m_pageHeaderFooter.ptFooterBodySpacing ) );
 
903
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
904
                                             oddFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing ) );
 
905
                break;
 
906
            case HF_EO_DIFF:
 
907
                oddFooter->setVisible( true );
 
908
                evenFooter->setVisible( true );
 
909
                firstFooter->setVisible( false );
 
910
                firstFooter->deleteAllCopies();
 
911
 
 
912
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
913
                                             oddFooter, 0, -1, m_pageHeaderFooter.ptFooterBodySpacing,
 
914
                                             KWFrameLayout::HeaderFooterFrameset::Odd ) );
 
915
                headerFooterList.append( new KWFrameLayout::HeaderFooterFrameset(
 
916
                                             evenFooter, 1, -1, m_pageHeaderFooter.ptFooterBodySpacing,
 
917
                                             KWFrameLayout::HeaderFooterFrameset::Even ) );
 
918
                break;
 
919
            }
 
920
        }
 
921
 
 
922
        // The frameset order _on screen_ is:
 
923
        // Header
 
924
        // Main text frame (if WP)
 
925
        // Footnote_s_
 
926
        // Footer
 
927
        // In the list it will have to be from top and from bottom:
 
928
        // Header, Footer, Footnote from bottom to top
 
929
        QPtrList<KWFrameLayout::HeaderFooterFrameset> footnotesHFList;
 
930
        footnotesHFList.setAutoDelete( true );
 
931
 
 
932
        footnotesList.sort();
 
933
        QPtrListIterator<KWFootNoteFrameSet> fnfsIt( footnotesList );  // fnfs == "footnote frameset"
 
934
        for ( ; fnfsIt.current() ; ++fnfsIt )
 
935
        {
 
936
            KWFootNoteFrameSet* fnfs = fnfsIt.current();
 
937
            int pageNum = -42; //fnfs->footNoteVariable()->pageNum(); // determined by KWFrameLayout
 
938
            KWFrameLayout::HeaderFooterFrameset* hff = new KWFrameLayout::HeaderFooterFrameset(
 
939
                fnfs, pageNum, pageNum,
 
940
                m_pageHeaderFooter.ptFootNoteBodySpacing,
 
941
                KWFrameLayout::HeaderFooterFrameset::All );
 
942
 
 
943
            // With other kind of framesets, the height is simply frame->height.
 
944
            // But for footnotes, the height to pass to KWFrameLayout is the sum of the frame heights.
 
945
            hff->m_height = 0;
 
946
            for (QPtrListIterator<KWFrame> f = fnfs->frameIterator(); f.current() ; ++f )
 
947
                hff->m_height += f.current()->height();
 
948
 
 
949
            footnotesHFList.append( hff );
 
950
        }
 
951
 
 
952
        // Endnotes, however are laid out from top to bottom.
 
953
        QPtrList<KWFrameLayout::HeaderFooterFrameset> endnotesHFList;
 
954
        endnotesHFList.setAutoDelete( true );
 
955
 
 
956
        endnotesList.sort();
 
957
        QPtrListIterator<KWFootNoteFrameSet> enfsIt( endnotesList );  // enfs == "endnote frameset"
 
958
        for ( ; enfsIt.current() ; ++enfsIt )
 
959
        {
 
960
            KWFootNoteFrameSet* enfs = enfsIt.current();
 
961
            KWFrameLayout::HeaderFooterFrameset* hff = new KWFrameLayout::HeaderFooterFrameset(
 
962
                enfs, -42, -42, // determined by KWFrameLayout
 
963
                m_pageHeaderFooter.ptFootNoteBodySpacing,
 
964
                KWFrameLayout::HeaderFooterFrameset::All );
 
965
 
 
966
            // The height to pass to KWFrameLayout is the sum of the frame heights.
 
967
            hff->m_height = 0;
 
968
            for (QPtrListIterator<KWFrame> f = enfs->frameIterator(); f.current() ; ++f )
 
969
                hff->m_height += f.current()->height();
 
970
 
 
971
            endnotesHFList.append( hff );
 
972
        }
 
973
 
565
974
        int oldPages = m_pages;
566
975
        unsigned int frms = frameset->getNumFrames();
567
976
 
568
977
        // Determine number of pages - first from the text frames
569
 
        m_pages = static_cast<int>( ceil( static_cast<double>( frms ) / static_cast<double>( m_pageColumns.columns ) ) );
 
978
        // - BUT NOT from the number of frames. Some people manage to end up with
 
979
        // multiple frames of textframeset1 on the same page(!)
 
980
        //m_pages = static_cast<int>( ceil( static_cast<double>( frms ) / static_cast<double>( m_pageColumns.columns ) ) );
570
981
#ifdef DEBUG_PAGES
571
 
        kdDebug(32002) << "KWDocument::recalcFrames frms(" << frms << ") / columns(" << m_pageColumns.columns << ") = " << m_pages << endl;
 
982
        //kdDebug(32002) << "KWDocument::recalcFrames frms(" << frms << ") / columns(" << m_pageColumns.columns << ") = " << m_pages << endl;
572
983
#endif
573
 
        // Then from the other frames ( frameset-num > 0 )
 
984
        m_pages = frameset->frame( frms - 1 )->pageNum() + 1;
 
985
 
 
986
        // Then from the other frames ( framesetNum > 0 )
574
987
        double maxBottom = 0;
575
988
        for (int m = getNumFrameSets() - 1; m > 0; m-- )
576
989
        {
577
 
            KWFrameSet *fs=getFrameSet(m);
578
 
            if ( fs->isVisible() && !fs->isAHeader() && !fs->isAFooter() )
 
990
            KWFrameSet *fs=frameSet(m);
 
991
            if ( fs->isVisible() && !fs->isAHeader() && !fs->isAFooter() && !fs->isFloating() && !fs->isFootEndNote() )
579
992
            {
580
993
                for (int n = fs->getNumFrames()-1; n >= 0 ; n--) {
581
994
                    //if ( n == fs->getNumFrames()-1 )
582
995
#ifdef DEBUG_PAGES
583
 
                    kdDebug(32002) << "KWDocument::recalcFrames frameset " << m << " " << fs->getName()
584
 
                                   << " frame " << n << " bottom=" << fs->getFrame(n)->bottom() << endl;
 
996
                    kdDebug(32002) << "KWDocument::recalcFrames frameset number " << m << " '" << fs->getName()
 
997
                                   << "' frame " << n << " bottom=" << fs->frame(n)->bottom() << endl;
585
998
#endif
586
 
                    maxBottom = QMAX(maxBottom, fs->getFrame(n)->bottom());
 
999
                    maxBottom = QMAX(maxBottom, fs->frame(n)->bottom());
587
1000
                }
588
1001
            }
589
1002
        }
595
1008
#endif
596
1009
 
597
1010
        m_pages = QMAX( pages2, m_pages );
 
1011
 
 
1012
        if ( toPage == -1 )
 
1013
            toPage = m_pages - 1;
 
1014
        if ( fromPage > toPage ) // this can happen with "endnotes only" pages :)
 
1015
            fromPage = toPage; // ie. start at the last real page
 
1016
        KWFrameLayout frameLayout( this, headerFooterList, footnotesHFList, endnotesHFList );
 
1017
        frameLayout.layout( frameset, m_pageColumns.columns, fromPage, toPage, flags );
 
1018
 
 
1019
        // If the number of pages changed, update views and variables etc.
 
1020
        // (now that the frame layout has been done)
598
1021
        if ( m_pages != oldPages )
599
1022
        {
 
1023
            // Very much like the end of appendPage, but we don't want to call recalcFrames ;)
 
1024
            emit newContentsSize();
600
1025
            emit pageNumChanged();
601
1026
            recalcVariables( VT_PGNUM );
602
1027
        }
603
1028
 
604
 
        // Create new frames in the main text frameset
605
 
        // ( taking into account the header/footer sizes )
606
 
        for ( uint j = 0; j < (uint) m_pages; j++ ) {
607
 
            if ( j == 0 ) {
608
 
                headOffset = firstHeadOffset;
609
 
                footOffset = firstFootOffset;
610
 
            } else if ( ( ( j + 1 ) / 2 ) * 2 == j + 1 ) {
611
 
                headOffset = evenHeadOffset;
612
 
                footOffset = evenFootOffset;
613
 
            } else {
614
 
                headOffset = oddHeadOffset;
615
 
                footOffset = oddFootOffset;
616
 
            }
617
 
 
618
 
            for ( int i = 0; i < m_pageColumns.columns; i++ ) {
619
 
                if ( j * m_pageColumns.columns + i < frameset->getNumFrames() ) {
620
 
                    frameset->getFrame( j * m_pageColumns.columns + i )->setRect(
621
 
                        ptLeftBorder() + i * ( ptColumnWidth + ptColumnSpacing() ),
622
 
                        j * ptPaperHeight() + ptTopBorder() + headOffset,
623
 
                        ptColumnWidth,
624
 
                        ptPaperHeight() - ptTopBorder() - ptBottomBorder() -
625
 
                         headOffset - footOffset );
626
 
                } else {
627
 
                    KWFrame * frame = new KWFrame(frameset, ptLeftBorder() +
628
 
                                                  i * ( ptColumnWidth + ptColumnSpacing() ),
629
 
                                                  j * ptPaperHeight() + ptTopBorder() + headOffset,
630
 
                                                  ptColumnWidth, ptPaperHeight() -
631
 
                                                  ptTopBorder() - ptBottomBorder() -
632
 
                                                  headOffset - footOffset );
633
 
                    frameset->addFrame( frame );
634
 
                }
635
 
            }
636
 
        }
637
1029
    } else {
638
 
        double height=0;
639
 
        for (QListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
640
 
            if(fit.current()->frameSetInfo()==KWFrameSet::FI_BODY) {
 
1030
        // DTP mode: calculate the number of pages from the frames.
 
1031
        double maxBottom=0;
 
1032
        for (QPtrListIterator<KWFrameSet> fit = framesetsIterator(); fit.current() ; ++fit ) {
 
1033
            if(fit.current()->isDeleted()) continue;
 
1034
            if(fit.current()->frameSetInfo()==KWFrameSet::FI_BODY && !fit.current()->isFloating()) {
641
1035
                KWFrameSet * fs = fit.current();
642
 
                for (QListIterator<KWFrame> f = fs->frameIterator(); f.current() ; ++f ) {
643
 
                    height=QMAX(height, f.current()->bottom());
644
 
                }
645
 
            }
646
 
        }
647
 
        while(height > ptPaperHeight() * getPages()) {
648
 
            m_pages++;
649
 
        }
650
 
    }
651
 
 
652
 
    if ( isHeaderVisible() ) {
653
 
        switch ( getHeaderType() ) {
654
 
        case HF_SAME: {
655
 
            double h = evenHeader->getFrame( 0 )->height();
656
 
            for ( int l = 0; l < m_pages; l++ ) {
657
 
                if ( l < static_cast<int>( evenHeader->getNumFrames() ) )
658
 
                    evenHeader->getFrame( l )->setRect( ptLeftBorder(),
659
 
                                                        l * ptPaperHeight() + ptTopBorder(),
660
 
                                                        ptPaperWidth() -
661
 
                                                        ptLeftBorder() - ptRightBorder(), h );
662
 
                else
663
 
                {
664
 
                    KWFrame *frame = new KWFrame( evenHeader,ptLeftBorder(), l * ptPaperHeight() + ptTopBorder(),
665
 
                                                  ptPaperWidth() - ptLeftBorder() -
666
 
                                                  ptRightBorder(), h );
667
 
                    frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
668
 
                    frame->setNewFrameBehaviour( KWFrame::Copy );
669
 
                    frame->setCopy( true );
670
 
                    evenHeader->addFrame( frame );
671
 
                }
672
 
            }
673
 
            if ( m_pages < static_cast<int>( evenHeader->getNumFrames() ) ) {
674
 
                int diff = evenHeader->getNumFrames() - m_pages;
675
 
                for ( ; diff > 0; diff-- )
676
 
                    evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
677
 
            }
678
 
        } break;
679
 
        case HF_EO_DIFF: {
680
 
            double h1 = evenHeader->getFrame( 0 )->height();
681
 
            double h2 = oddHeader->getFrame( 0 )->height();
682
 
            evenHeader->setCurrent( 0 );
683
 
            oddHeader->setCurrent( 0 );
684
 
            int even = 0, odd = 0;
685
 
            for ( int l = 0; l < m_pages; l++ ) {
686
 
                if ( ( ( l + 1 ) / 2 ) * 2 != l + 1 ) {
687
 
                    //kdDebug() << "KWDocument::recalcFrames considering page " << l << "(odd)" << endl;
688
 
                    odd++;
689
 
                    if ( static_cast<int>( oddHeader->getCurrent() ) <
690
 
                         static_cast<int>( oddHeader->getNumFrames() ) ) {
691
 
                        oddHeader->getFrame( oddHeader->getCurrent() )->setRect( ptLeftBorder(),
692
 
                                                                                 l * ptPaperHeight() +
693
 
                                                                                 ptTopBorder(),
694
 
                                                                                 ptPaperWidth() -
695
 
                                                                                 ptLeftBorder() -
696
 
                                                                                 ptRightBorder(), h2 );
697
 
                        oddHeader->setCurrent( oddHeader->getCurrent() + 1 );
698
 
                    } else {
699
 
#ifdef DEBUG_PAGES
700
 
                        kdDebug() << "KWDocument::recalcFrames creating new odd header" << endl;
701
 
#endif
702
 
                        KWFrame *frame = new KWFrame( oddHeader, ptLeftBorder(), l * ptPaperHeight() +
703
 
                                                      ptTopBorder(),
704
 
                                                      ptPaperWidth() - ptLeftBorder() -
705
 
                                                      ptRightBorder(), h2 );
706
 
                        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
707
 
                        frame->setNewFrameBehaviour( KWFrame::Copy );
708
 
                        frame->setCopy( true );
709
 
                        oddHeader->addFrame( frame );
710
 
                    }
711
 
                } else {
712
 
                    //kdDebug() << "KWDocument::recalcFrames considering page " << l << "(even)" << endl;
713
 
                    even++;
714
 
                    if ( static_cast<int>( evenHeader->getCurrent() ) <
715
 
                         static_cast<int>( evenHeader->getNumFrames() ) ) {
716
 
                        evenHeader->getFrame( evenHeader->getCurrent() )->setRect( ptLeftBorder(),
717
 
                                                                                   l * ptPaperHeight() +
718
 
                                                                                   ptTopBorder(),
719
 
                                                                                   ptPaperWidth() -
720
 
                                                                                   ptLeftBorder() -
721
 
                                                                                   ptRightBorder(), h1 );
722
 
                        evenHeader->setCurrent( evenHeader->getCurrent() + 1 );
723
 
                    } else {
724
 
#ifdef DEBUG_PAGES
725
 
                        kdDebug() << "KWDocument::recalcFrames creating new even header" << endl;
726
 
#endif
727
 
                        KWFrame *frame = new KWFrame( evenHeader,ptLeftBorder(), l * ptPaperHeight() +
728
 
                                                      ptTopBorder(),
729
 
                                                      ptPaperWidth() - ptLeftBorder() -
730
 
                                                      ptRightBorder(), h1 );
731
 
                        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
732
 
                        frame->setNewFrameBehaviour( KWFrame::Copy );
733
 
                        frame->setCopy( true );
734
 
                        evenHeader->addFrame( frame );
735
 
                    }
736
 
                }
737
 
            }
738
 
            if ( even + 1 < static_cast<int>( evenHeader->getNumFrames() ) ) {
739
 
                int diff = evenHeader->getNumFrames() - even;
740
 
#ifdef DEBUG_PAGES
741
 
                kdDebug() << "KWDocument::recalcFrames deleting " << diff << " even headers" << endl;
742
 
#endif
743
 
                for ( ; diff > 0; diff-- )
744
 
                    evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
745
 
            }
746
 
            if ( odd + 1 < static_cast<int>( oddHeader->getNumFrames() ) ) {
747
 
                int diff = oddHeader->getNumFrames() - odd;
748
 
#ifdef DEBUG_PAGES
749
 
                kdDebug() << "KWDocument::recalcFrames deleting " << diff << " odd headers" << endl;
750
 
#endif
751
 
                for ( ; diff > 0; diff-- )
752
 
                    oddHeader->delFrame( oddHeader->getNumFrames() - 1 );
753
 
            }
754
 
            if ( m_pages == 1 && evenHeader->getNumFrames() > 0 ) {
755
 
#ifdef DEBUG_PAGES
756
 
                kdDebug() << "KWDocument::recalcFrames 1 page, " << evenHeader->getNumFrames() << " frames" << endl;
757
 
#endif
758
 
                // ???
759
 
                for ( unsigned int m = 0; m < evenHeader->getNumFrames(); m++ )
760
 
                    evenHeader->getFrame( m )->setRect( 0, ptPaperHeight() + h1,
761
 
                                                        ptPaperWidth() - ptLeftBorder() -
762
 
                                                        ptRightBorder(), h1 );
763
 
            }
764
 
        } break;
765
 
        case HF_FIRST_DIFF: {
766
 
            double h = firstHeader->getFrame( 0 )->height();
767
 
            firstHeader->getFrame( 0 )->setRect( ptLeftBorder(), ptTopBorder(),
768
 
                                                 ptPaperWidth() - ptLeftBorder() -
769
 
                                                 ptRightBorder(), h );
770
 
            if ( firstHeader->getNumFrames() > 1 ) {
771
 
                int diff = firstHeader->getNumFrames() - 1;
772
 
                for ( ; diff > 0; diff-- )
773
 
                    firstHeader->delFrame( firstHeader->getNumFrames() - 1 );
774
 
            }
775
 
            h = evenHeader->getFrame( 0 )->height();
776
 
            for ( int l = 1; l < m_pages; l++ ) {
777
 
                if ( l - 1 < static_cast<int>( evenHeader->getNumFrames() ) )
778
 
                    evenHeader->getFrame( l - 1 )->setRect( ptLeftBorder(), l * ptPaperHeight() +
779
 
                                                            ptTopBorder(),
780
 
                                                            ptPaperWidth() - ptLeftBorder() -
781
 
                                                            ptRightBorder(), h );
782
 
                else {
783
 
                    KWFrame *frame = new KWFrame( evenHeader, ptLeftBorder(), l * ptPaperHeight() + ptTopBorder(),
784
 
                                                  ptPaperWidth() - ptLeftBorder() -
785
 
                                                  ptRightBorder(), h );
786
 
                    frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
787
 
                    frame->setNewFrameBehaviour( KWFrame::Copy );
788
 
                    frame->setCopy( true );
789
 
                    evenHeader->addFrame( frame );
790
 
                }
791
 
            }
792
 
            if ( m_pages < static_cast<int>( evenHeader->getNumFrames() ) ) {
793
 
                int diff = evenHeader->getNumFrames() - m_pages;
794
 
                for ( ; diff > 0; diff-- )
795
 
                    evenHeader->delFrame( evenHeader->getNumFrames() - 1 );
796
 
            }
797
 
            if ( m_pages == 1 && evenHeader->getNumFrames() > 0 ) {
798
 
                for ( unsigned int m = 0; m < evenHeader->getNumFrames(); m++ )
799
 
                    evenHeader->getFrame( m )->setRect( 0, ptPaperHeight() + h,
800
 
                                                        ptPaperWidth() - ptLeftBorder() -
801
 
                                                        ptRightBorder(), h );
802
 
            }
803
 
        } break;
804
 
        }
805
 
    }
806
 
 
807
 
    if ( isFooterVisible() ) {
808
 
        switch ( getFooterType() ) {
809
 
        case HF_SAME: {
810
 
            double h = evenFooter->getFrame( 0 )->height();
811
 
            for ( int l = 0; l < m_pages; l++ ) {
812
 
                if ( l < static_cast<int>( evenFooter->getNumFrames() ) )
813
 
                    evenFooter->getFrame( l )->setRect( ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
814
 
                                                        ptBottomBorder() - h,
815
 
                                                        ptPaperWidth() - ptLeftBorder() -
816
 
                                                        ptRightBorder(), h );
817
 
                else {
818
 
                    KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
819
 
                                                  ptBottomBorder() - h,
820
 
                                                  ptPaperWidth() - ptLeftBorder() -
821
 
                                                  ptRightBorder(), h );
822
 
                    frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
823
 
                    frame->setNewFrameBehaviour( KWFrame::Copy );
824
 
                    frame->setCopy( true );
825
 
                    evenFooter->addFrame( frame );
826
 
                }
827
 
            }
828
 
            if ( m_pages < static_cast<int>( evenFooter->getNumFrames() ) ) {
829
 
                int diff = evenFooter->getNumFrames() - m_pages;
830
 
                for ( ; diff > 0; diff-- )
831
 
                    evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
832
 
            }
833
 
        } break;
834
 
        case HF_EO_DIFF: {
835
 
            double h1 = evenFooter->getFrame( 0 )->height();
836
 
            double h2 = oddFooter->getFrame( 0 )->height();
837
 
            evenFooter->setCurrent( 0 );
838
 
            oddFooter->setCurrent( 0 );
839
 
            int even = 0, odd = 0;
840
 
            for ( int l = 0; l < m_pages; l++ ) {
841
 
                if ( ( ( l + 1 ) / 2 ) * 2 != l + 1 ) {
842
 
                    odd++;
843
 
                    if ( static_cast<int>( oddFooter->getCurrent() ) < static_cast<int>( oddFooter->getNumFrames() ) ) {
844
 
                        oddFooter->getFrame( oddFooter->getCurrent() )->setRect( ptLeftBorder(),
845
 
                                                                                 ( l + 1 )  *
846
 
                                                                                 ptPaperHeight() -
847
 
                                                                                 ptBottomBorder() - h2,
848
 
                                                                                 ptPaperWidth() -
849
 
                                                                                 ptLeftBorder() -
850
 
                                                                                 ptRightBorder(), h2 );
851
 
                        oddFooter->setCurrent( oddFooter->getCurrent() + 1 );
852
 
                    } else {
853
 
                        KWFrame *frame = new KWFrame(oddFooter, ptLeftBorder(),
854
 
                                                      ( l + 1 )  * ptPaperHeight() -
855
 
                                                      ptBottomBorder() - h2,
856
 
                                                      ptPaperWidth() - ptLeftBorder() -
857
 
                                                      ptRightBorder(), h2 );
858
 
                        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
859
 
                        frame->setNewFrameBehaviour( KWFrame::Copy );
860
 
                        frame->setCopy( true );
861
 
                        oddFooter->addFrame( frame );
862
 
                    }
863
 
                } else {
864
 
                    even++;
865
 
                    if ( static_cast<int>( evenFooter->getCurrent() ) <
866
 
                         static_cast<int>( evenFooter->getNumFrames() ) ) {
867
 
                        evenFooter->getFrame( evenFooter->getCurrent() )->setRect( ptLeftBorder(),
868
 
                                                                                   ( l + 1 )  *
869
 
                                                                                   ptPaperHeight() -
870
 
                                                                                   ptBottomBorder() - h1,
871
 
                                                                                   ptPaperWidth() -
872
 
                                                                                   ptLeftBorder() -
873
 
                                                                                   ptRightBorder(), h1 );
874
 
                        evenFooter->setCurrent( evenFooter->getCurrent() + 1 );
875
 
                    } else {
876
 
                        KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(),
877
 
                                                      ( l + 1 )  * ptPaperHeight() -
878
 
                                                      ptBottomBorder() - h1,
879
 
                                                      ptPaperWidth() - ptLeftBorder() -
880
 
                                                      ptRightBorder(), h1 );
881
 
                        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
882
 
                        frame->setNewFrameBehaviour( KWFrame::Copy );
883
 
                        frame->setCopy( true );
884
 
                        evenFooter->addFrame( frame );
885
 
                    }
886
 
                }
887
 
            }
888
 
            if ( even + 1 < static_cast<int>( evenFooter->getNumFrames() ) ) {
889
 
                int diff = evenFooter->getNumFrames() - even;
890
 
                for ( ; diff > 0; diff-- )
891
 
                    evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
892
 
            }
893
 
            if ( odd + 1 < static_cast<int>( oddFooter->getNumFrames() ) ) {
894
 
                int diff = oddFooter->getNumFrames() - odd;
895
 
                for ( ; diff > 0; diff-- )
896
 
                    oddFooter->delFrame( oddFooter->getNumFrames() - 1 );
897
 
            }
898
 
            if ( m_pages == 1 && evenFooter->getNumFrames() > 0 ) {
899
 
                for ( unsigned int m = 0; m < evenFooter->getNumFrames(); m++ )
900
 
                    evenFooter->getFrame( m )->setRect( 0, m_pages * ptPaperHeight() + h1,
901
 
                                                        ptPaperWidth() - ptLeftBorder() -
902
 
                                                        ptRightBorder(), h1 );
903
 
            }
904
 
        } break;
905
 
        case HF_FIRST_DIFF: {
906
 
            double h = firstFooter->getFrame( 0 )->height();
907
 
            firstFooter->getFrame( 0 )->setRect( ptLeftBorder(), ptPaperHeight() - ptBottomBorder() - h,
908
 
                                                 ptPaperWidth() - ptLeftBorder() - ptRightBorder(), h );
909
 
            if ( firstFooter->getNumFrames() > 1 ) {
910
 
                int diff = firstFooter->getNumFrames() - 1;
911
 
                for ( ; diff > 0; diff-- )
912
 
                    firstFooter->delFrame( firstFooter->getNumFrames() - 1 );
913
 
            }
914
 
            h = evenFooter->getFrame( 0 )->height();
915
 
            for ( int l = 1; l < m_pages; l++ ) {
916
 
                if ( l - 1 < static_cast<int>( evenFooter->getNumFrames() ) )
917
 
                    evenFooter->getFrame( l - 1 )->setRect( ptLeftBorder(), ( l + 1 ) *
918
 
                                                            ptPaperHeight() - ptBottomBorder() - h,
919
 
                                                            ptPaperWidth() - ptLeftBorder() -
920
 
                                                            ptRightBorder(), h );
921
 
                else {
922
 
                    KWFrame *frame = new KWFrame(evenFooter, ptLeftBorder(), ( l + 1 ) * ptPaperHeight() -
923
 
                                                  ptBottomBorder() - h,
924
 
                                                  ptPaperWidth() - ptLeftBorder() -
925
 
                                                  ptRightBorder(), h );
926
 
                    frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
927
 
                    frame->setNewFrameBehaviour( KWFrame::Copy );
928
 
                    frame->setCopy( true );
929
 
                    evenFooter->addFrame( frame );
930
 
                }
931
 
            }
932
 
            if ( m_pages < static_cast<int>( evenFooter->getNumFrames() ) ) {
933
 
                int diff = evenFooter->getNumFrames() - m_pages;
934
 
                for ( ; diff > 0; diff-- )
935
 
                    evenFooter->delFrame( evenFooter->getNumFrames() - 1 );
936
 
            }
937
 
            if ( m_pages == 1 && evenFooter->getNumFrames() > 0 ) {
938
 
                for ( unsigned int m = 0; m < evenFooter->getNumFrames(); m++ )
939
 
                    evenFooter->getFrame( m )->setRect( 0, m_pages * ptPaperHeight() + h,
940
 
                                                        ptPaperWidth() - ptLeftBorder() -
941
 
                                                        ptRightBorder(), h );
942
 
            }
943
 
        } break;
944
 
        }
 
1036
                for (QPtrListIterator<KWFrame> f = fs->frameIterator(); f.current() ; ++f ) {
 
1037
#ifdef DEBUG_PAGES
 
1038
                    kdDebug(32002) << " fs=" << fs->getName() << " bottom=" << f.current()->bottom() << endl;
 
1039
#endif
 
1040
                    maxBottom=QMAX(maxBottom, f.current()->bottom());
 
1041
                }
 
1042
            }
 
1043
        }
 
1044
        m_pages = static_cast<int>( ceil( maxBottom / ptPaperHeight() ) );
 
1045
#ifdef DEBUG_PAGES
 
1046
        kdDebug(32002) << "DTP mode: pages = maxBottom("<<maxBottom<<") / ptPaperHeight=" << ptPaperHeight() << " = " << m_pages << endl;
 
1047
#endif
 
1048
        if(m_pages < 1) m_pages=1;
945
1049
    }
946
1050
}
947
1051
 
948
1052
bool KWDocument::loadChildren( KoStore *_store )
949
1053
{
950
 
    QListIterator<KoDocumentChild> it( children() );
 
1054
    //kdDebug(32001) << "KWDocument::loadChildren" << endl;
 
1055
    QPtrListIterator<KoDocumentChild> it( children() );
951
1056
    for( ; it.current(); ++it ) {
952
 
        if ( !((KoDocumentChild*)it.current())->loadDocument( _store ) )
 
1057
        if ( !it.current()->loadDocument( _store ) )
953
1058
            return FALSE;
954
1059
    }
955
1060
 
956
1061
    return TRUE;
957
1062
}
958
1063
 
 
1064
void KWDocument::loadPictureMap ( QDomElement& domElement )
 
1065
{
 
1066
    m_pictureMap.clear();
 
1067
 
 
1068
    // <PICTURES>
 
1069
    QDomElement picturesElem = domElement.namedItem( "PICTURES" ).toElement();
 
1070
    if ( !picturesElem.isNull() )
 
1071
    {
 
1072
       m_pictureCollection.readXML( picturesElem, m_pictureMap );
 
1073
    }
 
1074
 
 
1075
    // <PIXMAPS>
 
1076
    QDomElement pixmapsElem = domElement.namedItem( "PIXMAPS" ).toElement();
 
1077
    if ( !pixmapsElem.isNull() )
 
1078
    {
 
1079
       m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
 
1080
    }
 
1081
 
 
1082
    // <CLIPARTS>
 
1083
    QDomElement clipartsElem = domElement.namedItem( "CLIPARTS" ).toElement();
 
1084
    if ( !clipartsElem.isNull() )
 
1085
    {
 
1086
       m_pictureCollection.readXML( pixmapsElem, m_pictureMap );
 
1087
    }
 
1088
}
 
1089
 
 
1090
 
959
1091
bool KWDocument::loadXML( QIODevice *, const QDomDocument & doc )
960
1092
{
961
1093
    QTime dt;
962
1094
    dt.start();
963
1095
    emit sigProgress( 0 );
964
 
    kdDebug(32001) << "KWDocument::loadXML" << endl;
965
 
    delete m_pixmapMap;
966
 
    m_pixmapMap = 0L;
967
 
    delete m_clipartMap;
968
 
    m_clipartMap = 0L;
969
 
    m_imageRequests.clear();
970
 
    m_imageRequests2.clear();
 
1096
    //kdDebug(32001) << "KWDocument::loadXML" << endl;
 
1097
    m_pictureMap.clear();
 
1098
    m_textImageRequests.clear();
 
1099
    m_pictureRequests.clear();
971
1100
    m_anchorRequests.clear();
972
 
    m_clipartRequests.clear();
973
 
 
974
 
    m_pageLayout.unit = PG_MM;
 
1101
    m_footnoteVarRequests.clear();
 
1102
    m_spellListIgnoreAll.clear();
975
1103
 
976
1104
    m_pageColumns.columns = 1;
977
 
    m_pageColumns.ptColumnSpacing = s_defaultColumnSpacing;
 
1105
    m_pageColumns.ptColumnSpacing = m_defaultColumnSpacing;
978
1106
 
979
1107
    m_pageHeaderFooter.header = HF_SAME;
980
1108
    m_pageHeaderFooter.footer = HF_SAME;
981
1109
    m_pageHeaderFooter.ptHeaderBodySpacing = 10;
982
1110
    m_pageHeaderFooter.ptFooterBodySpacing = 10;
983
 
    m_pageHeaderFooter.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
984
 
    m_pageHeaderFooter.inchFooterBodySpacing = POINT_TO_INCH( 10 );
985
 
    m_pageHeaderFooter.mmHeaderBodySpacing = POINT_TO_MM( 10 );
986
 
    m_pageHeaderFooter.mmFooterBodySpacing = POINT_TO_MM( 10 );
987
 
 
988
 
    m_mapVariableFormats.clear();
 
1111
    m_pageHeaderFooter.ptFootNoteBodySpacing = 10;
 
1112
    m_varFormatCollection->clear();
989
1113
 
990
1114
    m_pages = 1;
 
1115
    m_bHasEndNotes = false;
991
1116
 
992
1117
    KoPageLayout __pgLayout;
993
 
    __pgLayout.unit = PG_MM;
994
1118
    KoColumns __columns;
 
1119
    __columns.columns = 1;
 
1120
    __columns.ptColumnSpacing = m_defaultColumnSpacing;
995
1121
    KoKWHeaderFooter __hf;
996
1122
    __hf.header = HF_SAME;
997
1123
    __hf.footer = HF_SAME;
998
1124
    __hf.ptHeaderBodySpacing = 10.0;
999
1125
    __hf.ptFooterBodySpacing = 10.0;
1000
 
    __hf.mmHeaderBodySpacing = POINT_TO_MM( 10 );
1001
 
    __hf.mmFooterBodySpacing = POINT_TO_MM( 10 );
1002
 
    __hf.inchHeaderBodySpacing = POINT_TO_INCH( 10 );
1003
 
    __hf.inchFooterBodySpacing = POINT_TO_INCH( 10 );
1004
 
 
 
1126
    __hf.ptFootNoteBodySpacing = 10.0;
1005
1127
 
1006
1128
    QString value;
1007
1129
    QDomElement word = doc.documentElement();
1008
 
    unsigned item;
1009
1130
 
1010
1131
    value = KWDocument::getAttribute( word, "mime", QString::null );
1011
 
    if ( value != "application/x-kword" && value != "application/vnd.kde.kword" )
 
1132
    if ( value.isEmpty() )
 
1133
    {
 
1134
        kdError(32001) << "No mime type specified!" << endl;
 
1135
        setErrorMessage( i18n( "Invalid document. No mimetype specified." ) );
 
1136
        return false;
 
1137
    }
 
1138
    else if ( value != "application/x-kword" && value != "application/vnd.kde.kword" )
1012
1139
    {
1013
1140
        kdError(32001) << "Unknown mime type " << value << endl;
 
1141
        setErrorMessage( i18n( "Invalid document. Expected mimetype application/x-kword or application/vnd.kde.kword, got %1" ).arg( value ) );
1014
1142
        return false;
1015
1143
    }
1016
1144
    m_syntaxVersion = KWDocument::getAttribute( word, "syntaxVersion", 0 );
1019
1147
        int ret = KMessageBox::warningContinueCancel(
1020
1148
            0, i18n("This document was created with a newer version of KWord (syntax version: %1)\n"
1021
1149
                    "Opening it in this version of KWord will lose some information.").arg(m_syntaxVersion),
1022
 
            i18n("File format mismatch"), i18n("Continue") );
 
1150
            i18n("File Format Mismatch"), KStdGuiItem::cont() );
1023
1151
        if ( ret == KMessageBox::Cancel )
 
1152
        {
 
1153
            setErrorMessage( "USER_CANCELED" );
1024
1154
            return false;
 
1155
        }
1025
1156
    }
1026
1157
 
1027
1158
    // Looks like support for the old way of naming images internally,
1029
1160
    value = KWDocument::getAttribute( word, "url", QString::null );
1030
1161
    if ( value != QString::null )
1031
1162
    {
1032
 
        urlIntern = KURL( value ).path();
 
1163
        m_urlIntern = KURL( value ).path();
1033
1164
    }
1034
1165
 
1035
1166
    emit sigProgress(5);
1040
1171
    {
1041
1172
        __pgLayout.format = static_cast<KoFormat>( KWDocument::getAttribute( paper, "format", 0 ) );
1042
1173
        __pgLayout.orientation = static_cast<KoOrientation>( KWDocument::getAttribute( paper, "orientation", 0 ) );
1043
 
        getPointBasedAttribute( __pgLayout, Width, paper, "width", 0.0 );
1044
 
        getPointBasedAttribute( __pgLayout, Height, paper, "height", 0.0 );
 
1174
        __pgLayout.ptWidth = getAttribute( paper, "width", 0.0 );
 
1175
        __pgLayout.ptHeight = getAttribute( paper, "height", 0.0 );
1045
1176
        __hf.header = static_cast<KoHFType>( KWDocument::getAttribute( paper, "hType", 0 ) );
1046
1177
        __hf.footer = static_cast<KoHFType>( KWDocument::getAttribute( paper, "fType", 0 ) );
1047
 
        getPointBasedAttribute( __hf, HeaderBodySpacing, paper, "spHeadBody", 0.0 );
1048
 
        getPointBasedAttribute( __hf, FooterBodySpacing, paper, "spFootBody", 0.0 );
 
1178
        __hf.ptHeaderBodySpacing = getAttribute( paper, "spHeadBody", 0.0 );
 
1179
        __hf.ptFooterBodySpacing  = getAttribute( paper, "spFootBody", 0.0 );
 
1180
        __hf.ptFootNoteBodySpacing  = getAttribute( paper, "spFootNoteBody", 10.0 );
 
1181
        m_iFootNoteSeparatorLineLength = getAttribute( paper, "slFootNoteLength", 20);
 
1182
        m_footNoteSeparatorLineWidth = getAttribute( paper, "slFootNoteWidth",2.0);
 
1183
        m_footNoteSeparatorLineType = static_cast<SeparatorLineLineType>(getAttribute( paper, "slFootNoteType",0));
 
1184
 
 
1185
        if ( paper.hasAttribute("slFootNotePosition"))
 
1186
        {
 
1187
            QString tmp =paper.attribute("slFootNotePosition");
 
1188
            if ( tmp =="centered" )
 
1189
                m_footNoteSeparatorLinePos = SLP_CENTERED;
 
1190
            else if ( tmp =="right")
 
1191
                m_footNoteSeparatorLinePos = SLP_RIGHT;
 
1192
            else if ( tmp =="left" )
 
1193
                m_footNoteSeparatorLinePos = SLP_LEFT;
 
1194
        }
1049
1195
        __columns.columns = KWDocument::getAttribute( paper, "columns", 1 );
1050
1196
        __columns.ptColumnSpacing = KWDocument::getAttribute( paper, "columnspacing", 0.0 );
1051
1197
        // Now part of the app config
1052
1198
        //m_zoom = KWDocument::getAttribute( paper, "zoom", 100 );
1053
1199
        //if(m_zoom!=100)
1054
1200
        //    setZoomAndResolution( m_zoom, QPaintDevice::x11AppDpiX(), QPaintDevice::x11AppDpiY(), false, false );
 
1201
 
 
1202
 
1055
1203
        // Support the undocumented syntax actually used by KDE 2.0 for some of the above (:-().
 
1204
        // Do not add anything to this block!
1056
1205
        if ( __pgLayout.ptWidth == 0.0 )
1057
 
            getPointBasedAttribute( __pgLayout, Width, paper, "ptWidth", 0.0 );
 
1206
            __pgLayout.ptWidth = getAttribute( paper, "ptWidth", 0.0 );
1058
1207
        if ( __pgLayout.ptHeight == 0.0 )
1059
 
            getPointBasedAttribute( __pgLayout, Height, paper, "ptHeight", 0.0 );
 
1208
            __pgLayout.ptHeight = getAttribute( paper, "ptHeight", 0.0 );
1060
1209
        if ( __hf.ptHeaderBodySpacing == 0.0 )
1061
 
            getPointBasedAttribute( __hf, HeaderBodySpacing, paper, "ptHeadBody", 0.0 );
 
1210
            __hf.ptHeaderBodySpacing = getAttribute( paper, "ptHeadBody", 0.0 );
1062
1211
        if ( __hf.ptFooterBodySpacing == 0.0 )
1063
 
            getPointBasedAttribute( __hf, FooterBodySpacing, paper, "ptFootBody", 0.0 );
 
1212
            __hf.ptFooterBodySpacing = getAttribute( paper, "ptFootBody", 0.0 );
1064
1213
        if ( __columns.ptColumnSpacing == 0.0 )
1065
 
            __columns.ptColumnSpacing = KWDocument::getAttribute( paper, "ptColumnspc", 0.0 );
 
1214
            __columns.ptColumnSpacing = getAttribute( paper, "ptColumnspc", 0.0 );
1066
1215
 
1067
1216
        // <PAPERBORDERS>
1068
1217
        QDomElement paperborders = paper.namedItem( "PAPERBORDERS" ).toElement();
1069
1218
        if ( !paperborders.isNull() )
1070
1219
        {
1071
 
            getPointBasedAttribute( __pgLayout, Left, paperborders, "left", 0.0 );
1072
 
            getPointBasedAttribute( __pgLayout, Top, paperborders, "top", 0.0 );
1073
 
            getPointBasedAttribute( __pgLayout, Right, paperborders, "right", 0.0 );
1074
 
            getPointBasedAttribute( __pgLayout, Bottom, paperborders, "bottom", 0.0 );
 
1220
            __pgLayout.ptLeft = getAttribute( paperborders, "left", 0.0 );
 
1221
            __pgLayout.ptTop = getAttribute( paperborders, "top", 0.0 );
 
1222
            __pgLayout.ptRight = getAttribute( paperborders, "right", 0.0 );
 
1223
            __pgLayout.ptBottom = getAttribute( paperborders, "bottom", 0.0 );
1075
1224
 
1076
1225
            // Support the undocumented syntax actually used by KDE 2.0 for some of the above (:-().
1077
1226
            if ( __pgLayout.ptLeft == 0.0 )
1078
 
                getPointBasedAttribute( __pgLayout, Left, paperborders, "ptLeft", 0.0 );
 
1227
                __pgLayout.ptLeft = getAttribute( paperborders, "ptLeft", 0.0 );
1079
1228
            if ( __pgLayout.ptTop == 0.0 )
1080
 
                getPointBasedAttribute( __pgLayout, Top, paperborders, "ptTop", 0.0 );
 
1229
                __pgLayout.ptTop = getAttribute( paperborders, "ptTop", 0.0 );
1081
1230
            if ( __pgLayout.ptRight == 0.0 )
1082
 
                getPointBasedAttribute( __pgLayout, Right, paperborders, "ptRight", 0.0 );
 
1231
                __pgLayout.ptRight = getAttribute( paperborders, "ptRight", 0.0 );
1083
1232
            if ( __pgLayout.ptBottom == 0.0 )
1084
 
                getPointBasedAttribute( __pgLayout, Bottom, paperborders, "ptBottom", 0.0 );
 
1233
                __pgLayout.ptBottom = getAttribute( paperborders, "ptBottom", 0.0 );
1085
1234
        }
 
1235
        else
 
1236
            kdWarning() << "No <PAPERBORDERS> tag!" << endl;
1086
1237
    }
 
1238
    else
 
1239
        kdWarning() << "No <PAPER> tag! This is a mandatory tag! Expect weird page sizes..." << endl;
1087
1240
 
1088
1241
    // <ATTRIBUTES>
1089
1242
    QDomElement attributes = word.namedItem( "ATTRIBUTES" ).toElement();
1094
1247
        //KWDocument::getAttribute( attributes, "standardpage", QString::null );
1095
1248
        m_headerVisible = static_cast<bool>( KWDocument::getAttribute( attributes, "hasHeader", 0 ) );
1096
1249
        m_footerVisible = static_cast<bool>( KWDocument::getAttribute( attributes, "hasFooter", 0 ) );
1097
 
        unitName = correctQString( KWDocument::getAttribute( attributes, "unit", "pt" ) );
 
1250
        unitName = KWDocument::getAttribute( attributes, "unit", "mm" );
1098
1251
        m_hasTOC =  static_cast<bool>(KWDocument::getAttribute( attributes,"hasTOC", 0 ) );
 
1252
        m_tabStop = KWDocument::getAttribute( attributes, "tabStopValue", MM_TO_POINT(15) );
 
1253
        m_initialEditing = new InitialEditing();
 
1254
        m_initialEditing->m_initialFrameSet = attributes.attribute( "activeFrameset" );
 
1255
        m_initialEditing->m_initialCursorParag = attributes.attribute( "cursorParagraph" ).toInt();
 
1256
        m_initialEditing->m_initialCursorIndex = attributes.attribute( "cursorIndex" ).toInt();
1099
1257
    } else {
1100
1258
        m_processingType = WP;
1101
1259
        m_headerVisible = false;
1102
1260
        m_footerVisible = false;
1103
 
        unitName = "pt";
1104
 
    }
1105
 
    m_unit = KWUnit::unit( unitName );
1106
 
    switch ( m_unit ) {
1107
 
    case KWUnit::U_MM: __pgLayout.unit = PG_MM;
1108
 
        break;
1109
 
    case KWUnit::U_PT: __pgLayout.unit = PG_PT;
1110
 
        break;
1111
 
    case KWUnit::U_INCH: __pgLayout.unit = PG_INCH;
1112
 
        break;
1113
 
    }
1114
 
    setPageLayout( __pgLayout, __columns, __hf );
 
1261
        unitName = "mm";
 
1262
        m_hasTOC = false;
 
1263
        m_tabStop = MM_TO_POINT(15);
 
1264
        delete m_initialEditing;
 
1265
        m_initialEditing = 0L;
 
1266
    }
 
1267
    m_unit = KoUnit::unit( unitName );
 
1268
 
 
1269
    setPageLayout( __pgLayout, __columns, __hf, false );
 
1270
 
 
1271
    getVariableCollection()->variableSetting()->load(word );
 
1272
    //by default display real variable value
 
1273
    if ( !isReadWrite())
 
1274
        getVariableCollection()->variableSetting()->setDisplayFieldCode(false);
1115
1275
 
1116
1276
    emit sigProgress(10);
1117
1277
 
1118
 
#if 0
1119
 
        else if ( name == "FOOTNOTEMGR" ) {
1120
 
            parser.parseTag( tag, name, lst );
1121
 
            footNoteManager.load( parser, lst );
1122
 
        }
1123
 
#endif
1124
 
/*
1125
 
        else if ( name == "SERIALL" ) {
1126
 
            parser.parseTag( tag, name, lst );
1127
 
            slDataBase->load( parser, lst );
1128
 
        } */
 
1278
    QDomElement mailmerge = word.namedItem( "MAILMERGE" ).toElement();
 
1279
    if (mailmerge!=QDomElement())
 
1280
    {
 
1281
        m_slDataBase->load(mailmerge);
 
1282
    }
1129
1283
 
1130
1284
    emit sigProgress(15);
1131
1285
 
1134
1288
    if ( !stylesElem.isNull() )
1135
1289
        loadStyleTemplates( stylesElem );
1136
1290
 
 
1291
    emit sigProgress(17);
 
1292
 
 
1293
    QDomElement frameStylesElem = word.namedItem( "FRAMESTYLES" ).toElement();
 
1294
    if ( !frameStylesElem.isNull() )
 
1295
        loadFrameStyleTemplates( frameStylesElem );
 
1296
    else // load default styles
 
1297
        loadDefaultFrameStyleTemplates();
 
1298
 
 
1299
    emit sigProgress(18);
 
1300
 
 
1301
    QDomElement tableStylesElem = word.namedItem( "TABLESTYLES" ).toElement();
 
1302
    if ( !tableStylesElem.isNull() )
 
1303
        loadTableStyleTemplates( tableStylesElem );
 
1304
    else // load default styles
 
1305
        loadDefaultTableStyleTemplates();
 
1306
 
 
1307
    emit sigProgress(19);
 
1308
 
 
1309
    loadDefaultTableTemplates();
 
1310
 
1137
1311
    emit sigProgress(20);
1138
1312
 
 
1313
    QDomElement bookmark = word.namedItem( "BOOKMARKS" ).toElement();
 
1314
    if( !bookmark.isNull() )
 
1315
    {
 
1316
        QDomElement bookmarkitem=word.namedItem("BOOKMARKS").toElement();
 
1317
        bookmarkitem=bookmarkitem.firstChild().toElement();
 
1318
 
 
1319
        while ( !bookmarkitem.isNull() )
 
1320
        {
 
1321
            if ( bookmarkitem.tagName()=="BOOKMARKITEM" )
 
1322
            {
 
1323
                bookMark *tmp=new bookMark;
 
1324
                tmp->bookname=bookmarkitem.attribute("name");
 
1325
                tmp->cursorStartIndex=bookmarkitem.attribute("cursorIndexStart").toInt();
 
1326
                tmp->frameSetName=bookmarkitem.attribute("frameset");
 
1327
                tmp->paragStartIndex = bookmarkitem.attribute("startparag").toInt();
 
1328
                tmp->paragEndIndex = bookmarkitem.attribute("endparag").toInt();
 
1329
                tmp->cursorEndIndex = bookmarkitem.attribute("cursorIndexEnd").toInt();
 
1330
                m_tmpBookMarkList.append(tmp);
 
1331
            }
 
1332
            bookmarkitem=bookmarkitem.nextSibling().toElement();
 
1333
        }
 
1334
    }
 
1335
 
 
1336
    QDomElement spellCheckIgnore = word.namedItem( "SPELLCHECKIGNORELIST" ).toElement();
 
1337
    if( !spellCheckIgnore.isNull() )
 
1338
    {
 
1339
        QDomElement spellWord=word.namedItem("SPELLCHECKIGNORELIST").toElement();
 
1340
        spellWord=spellWord.firstChild().toElement();
 
1341
        while ( !spellWord.isNull() )
 
1342
        {
 
1343
            if ( spellWord.tagName()=="SPELLCHECKIGNOREWORD" )
 
1344
                m_spellListIgnoreAll.append(spellWord.attribute("word"));
 
1345
            spellWord=spellWord.nextSibling().toElement();
 
1346
        }
 
1347
    }
 
1348
    m_bgSpellCheck->addIgnoreWordAllList( m_spellListIgnoreAll );
 
1349
 
 
1350
    emit sigProgress(25);
 
1351
 
 
1352
 
1139
1353
    QDomElement framesets = word.namedItem( "FRAMESETS" ).toElement();
1140
1354
    if ( !framesets.isNull() )
1141
1355
        loadFrameSets( framesets );
1142
1356
 
1143
1357
    emit sigProgress(85);
1144
1358
 
1145
 
    QDateTime defaultDateTime = QDateTime::currentDateTime();
1146
 
    // <PIXMAPS>
1147
 
    QDomElement pixmapsElem = word.namedItem( "PIXMAPS" ).toElement();
1148
 
    if ( !pixmapsElem.isNull() )
1149
 
    {
1150
 
        m_pixmapMap = new QMap<KoImageKey, QString>( m_imageCollection.readXML( pixmapsElem, defaultDateTime ) );
1151
 
    }
1152
 
 
1153
 
    // <CLIPARTS>
1154
 
    QDomElement clipartsElem = word.namedItem( "CLIPARTS" ).toElement();
1155
 
    if ( !clipartsElem.isNull() )
1156
 
    {
1157
 
        m_clipartMap = new QMap<KoClipartKey, QString>( m_clipartCollection.readXML( clipartsElem, defaultDateTime ) );
1158
 
    }
 
1359
    loadPictureMap( word );
1159
1360
 
1160
1361
    emit sigProgress(90);
1161
1362
 
1162
1363
    // <EMBEDDED>
1163
 
    QDomNodeList listEmbedded = word.elementsByTagName ( "EMBEDDED" );
1164
 
    for (item = 0; item < listEmbedded.count(); item++)
1165
 
    {
1166
 
        QDomElement embedded = listEmbedded.item( item ).toElement();
1167
 
        loadEmbedded( embedded );
1168
 
    }
1169
 
 
1170
 
    emit sigProgress(95);
1171
 
 
1172
 
#if 0 // Not needed anymore
1173
 
    // <CPARAGS>  (Ids of the parags that form the Table of Contents)
1174
 
    QDomNodeList listCparags = word.elementsByTagName( "CPARAGS" );
1175
 
    for (item = 0; item < listCparags.count(); item++)
1176
 
    {
1177
 
        QDomElement cparag = listCparags.item( item ).toElement();
1178
 
        QDomElement parag = cparag.namedItem( "PARAG" ).toElement();
1179
 
        if ( !parag.isNull() )
1180
 
        {
1181
 
            value = parag.attribute( "name", QString::null );
1182
 
            if ( value != QString::null )
1183
 
                contents->addParagId( value.toInt() );
1184
 
        }
1185
 
    }
1186
 
#endif
 
1364
    loadEmbeddedObjects( word );
1187
1365
 
1188
1366
    emit sigProgress(100); // the rest is only processing, not loading
1189
1367
 
1190
1368
    bool _first_footer = FALSE, _even_footer = FALSE, _odd_footer = FALSE;
1191
1369
    bool _first_header = FALSE, _even_header = FALSE, _odd_header = FALSE;
1192
 
    //bool _footnotes = FALSE;
1193
 
    KWFrameSet * footNotesFS = 0L;
1194
1370
 
1195
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
1371
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1196
1372
    for ( ; fit.current() ; ++fit )
1197
1373
    {
1198
1374
        switch( fit.current()->frameSetInfo() ) {
1199
1375
        case KWFrameSet::FI_FIRST_HEADER: _first_header = TRUE; break;
1200
 
        case KWFrameSet::FI_EVEN_HEADER: _odd_header = TRUE; break;
1201
 
        case KWFrameSet::FI_ODD_HEADER: _even_header = TRUE; break;
 
1376
        case KWFrameSet::FI_ODD_HEADER: _odd_header = TRUE; break;
 
1377
        case KWFrameSet::FI_EVEN_HEADER: _even_header = TRUE; break;
1202
1378
        case KWFrameSet::FI_FIRST_FOOTER: _first_footer = TRUE; break;
1203
 
        case KWFrameSet::FI_EVEN_FOOTER: _odd_footer = TRUE; break;
1204
 
        case KWFrameSet::FI_ODD_FOOTER: _even_footer = TRUE; break;
1205
 
        case KWFrameSet::FI_FOOTNOTE: footNotesFS = fit.current(); /* _footnotes = TRUE; */ break;
 
1379
        case KWFrameSet::FI_ODD_FOOTER: _odd_footer = TRUE; break;
 
1380
        case KWFrameSet::FI_EVEN_FOOTER: _even_footer = TRUE; break;
 
1381
        case KWFrameSet::FI_FOOTNOTE: break;
1206
1382
        default: break;
1207
1383
        }
1208
1384
    }
1209
 
    // Not implemented currently -> remove all frames, to avoid problems
1210
 
    if ( footNotesFS )
1211
 
    {
1212
 
        footNotesFS->deleteAllFrames();
1213
 
    }
1214
1385
 
1215
1386
    // create defaults if they were not in the input file.
1216
1387
 
1217
1388
    if ( !_first_header ) {
1218
1389
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "First Page Header" ) );
1219
 
        kdDebug(32001) << "KWDocument::loadXML KWTextFrameSet created " << fs << endl;
 
1390
        //kdDebug(32001) << "KWDocument::loadXML KWTextFrameSet created " << fs << endl;
1220
1391
        fs->setFrameSetInfo( KWFrameSet::FI_FIRST_HEADER );
1221
1392
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1222
 
            ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1223
 
        kdDebug(32001) << "KWDocument::loadXML KWFrame created " << frame << endl;
1224
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1225
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1226
 
        fs->addFrame( frame );
1227
 
        frames.append( fs );
 
1393
                                     ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
 
1394
        //kdDebug(32001) << "KWDocument::loadXML KWFrame created " << frame << endl;
 
1395
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1396
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1397
        fs->addFrame( frame );
 
1398
        m_lstFrameSet.append( fs );
 
1399
    }
 
1400
 
 
1401
    if ( !_odd_header ) {
 
1402
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Header" ) );
 
1403
        fs->setFrameSetInfo( KWFrameSet::FI_ODD_HEADER );
 
1404
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
 
1405
                                     ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
 
1406
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1407
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1408
        fs->addFrame( frame );
 
1409
        m_lstFrameSet.append( fs );
1228
1410
    }
1229
1411
 
1230
1412
    if ( !_even_header ) {
1231
1413
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Even Pages Header" ) );
1232
1414
        fs->setFrameSetInfo( KWFrameSet::FI_EVEN_HEADER );
1233
1415
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1234
 
            ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1235
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1236
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1237
 
        fs->addFrame( frame );
1238
 
        frames.append( fs );
1239
 
    }
1240
 
 
1241
 
    if ( !_odd_header ) {
1242
 
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Header" ) );
1243
 
        fs->setFrameSetInfo( KWFrameSet::FI_ODD_HEADER );
1244
 
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptTopBorder(),
1245
 
            ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1246
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1247
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1248
 
        fs->addFrame( frame );
1249
 
        frames.append( fs );
 
1416
                                     ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
 
1417
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1418
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1419
        fs->addFrame( frame );
 
1420
        m_lstFrameSet.append( fs );
1250
1421
    }
1251
1422
 
1252
1423
    if ( !_first_footer ) {
1253
1424
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "First Page Footer" ) );
1254
1425
        fs->setFrameSetInfo( KWFrameSet::FI_FIRST_FOOTER );
1255
1426
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1256
 
            ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1257
 
            ptRightBorder(), 20 );
1258
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1259
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1260
 
        fs->addFrame( frame );
1261
 
        frames.append( fs );
 
1427
                                     ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
 
1428
                                     ptRightBorder(), 20 );
 
1429
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1430
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1431
        fs->addFrame( frame );
 
1432
        m_lstFrameSet.append( fs );
 
1433
    }
 
1434
 
 
1435
    if ( !_odd_footer ) {
 
1436
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Footer" ) );
 
1437
        fs->setFrameSetInfo( KWFrameSet::FI_ODD_FOOTER );
 
1438
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
 
1439
                                     ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
 
1440
                                     ptRightBorder(), 20 );
 
1441
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1442
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1443
        fs->addFrame( frame );
 
1444
        m_lstFrameSet.append( fs );
1262
1445
    }
1263
1446
 
1264
1447
    if ( !_even_footer ) {
1265
1448
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Even Pages Footer" ) );
1266
1449
        fs->setFrameSetInfo( KWFrameSet::FI_EVEN_FOOTER );
1267
1450
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1268
 
            ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1269
 
            ptRightBorder(), 20 );
1270
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1271
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1272
 
        fs->addFrame( frame );
1273
 
        frames.append( fs );
1274
 
    }
1275
 
 
1276
 
    if ( !_odd_footer ) {
1277
 
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Odd Pages Footer" ) );
1278
 
        fs->setFrameSetInfo( KWFrameSet::FI_ODD_FOOTER );
1279
 
        KWFrame *frame = new KWFrame(fs, ptLeftBorder(), ptPaperHeight() -
1280
 
            ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
1281
 
            ptRightBorder(), 20 );
1282
 
        frame->setFrameBehaviour( KWFrame::AutoExtendFrame );
1283
 
        frame->setNewFrameBehaviour( KWFrame::Copy );
1284
 
        fs->addFrame( frame );
1285
 
        frames.append( fs );
1286
 
    }
1287
 
 
1288
 
#if 0
1289
 
    if ( !_footnotes ) {
1290
 
        KWTextFrameSet *fs = new KWTextFrameSet( this, i18n( "Footnotes" ) );
1291
 
        fs->setFrameSetInfo( KWFrameSet::FI_FOOTNOTE );
1292
 
 
1293
 
        for ( int i = 0; i < m_pages; i++ ) {
1294
 
            KWFrame *frame = new KWFrame(fs, ptLeftBorder(),
1295
 
                i * ptPaperHeight() + ptPaperHeight() - ptTopBorder() - 20,
1296
 
                ptPaperWidth() - ptLeftBorder() - ptRightBorder(), 20 );
1297
 
            frame->setFrameBehaviour(KWFrame::AutoExtendFrame);
1298
 
            fs->addFrame( frame );
1299
 
        }
1300
 
        frames.append( fs );
1301
 
        fs->setVisible( FALSE );
1302
 
    }
1303
 
#endif
1304
 
 
1305
 
#if 0 // already done !
1306
 
    KWChild *ch = 0L;
1307
 
    for ( ch = m_lstChildren.first(); ch != 0; ch = m_lstChildren.next() ) {
1308
 
        KWPartFrameSet *frameset = new KWPartFrameSet( this, ch );
1309
 
        QRect r = ch->geometry();
1310
 
        KWFrame *frame = new KWFrame(frameset, r.x(), r.y(), r.width(), r.height() );
1311
 
        frameset->addFrame( frame );
1312
 
        frames.append( frameset );
1313
 
        emit sig_insertObject( ch, frameset );
1314
 
    }
1315
 
#endif
 
1451
                                     ptTopBorder() - 20, ptPaperWidth() - ptLeftBorder() -
 
1452
                                     ptRightBorder(), 20 );
 
1453
        frame->setFrameBehavior( KWFrame::AutoExtendFrame );
 
1454
        frame->setNewFrameBehavior( KWFrame::Copy );
 
1455
        fs->addFrame( frame );
 
1456
        m_lstFrameSet.append( fs );
 
1457
    }
1316
1458
 
1317
1459
    // do some sanity checking on document.
1318
1460
    for (int i = getNumFrameSets()-1; i>-1; i--) {
1319
 
        KWFrameSet *fs = getFrameSet(i);
 
1461
        KWFrameSet *fs = frameSet(i);
1320
1462
        if(!fs) {
1321
1463
            kdWarning() << "frameset " << i << " is NULL!!" << endl;
1322
 
            frames.remove(i);
 
1464
            m_lstFrameSet.remove(i);
1323
1465
        } else if( fs->type()==FT_TABLE) {
1324
1466
            static_cast<KWTableFrameSet *>( fs )->validate();
1325
1467
        } else if(!fs->getNumFrames()) {
1326
 
            kdWarning () << "frameset " << i << " has no frames" << endl;
 
1468
            kdWarning () << "frameset " << i << " " << fs->getName() << " has no frames" << endl;
1327
1469
            removeFrameSet(fs);
 
1470
            if ( fs->type() == FT_PART )
 
1471
                delete static_cast<KWPartFrameSet *>(fs)->getChild();
1328
1472
            delete fs;
1329
1473
        } else if (fs->type() == FT_TEXT) {
1330
1474
            for (int f=fs->getNumFrames()-1; f>=0; f--) {
1331
 
                KWFrame *frame = fs->getFrame(f);
1332
 
                if(frame->height() < static_cast <int>(minFrameHeight)) {
1333
 
                    kdWarning() << "frame height is so small no text will fit, adjusting (was: "
1334
 
                      << frame->height() << " is: " << minFrameHeight << ")" << endl;
1335
 
                    frame->setHeight(minFrameHeight);
 
1475
                KWFrame *frame = fs->frame(f);
 
1476
                if(frame->height() < s_minFrameHeight) {
 
1477
                    kdWarning() << fs->getName() << " frame " << f << " height is so small no text will fit, adjusting (was: "
 
1478
                                << frame->height() << " is: " << s_minFrameHeight << ")" << endl;
 
1479
                    frame->setHeight(s_minFrameHeight);
1336
1480
                }
1337
 
                if(frame->width() < static_cast <int>(minFrameWidth)) {
1338
 
                    kdWarning() << "frame width is so small no text will fit, adjusting (was: "
1339
 
                     << frame->width() << " is: " << minFrameWidth  << ")" << endl;
1340
 
                    frame->setWidth(minFrameWidth);
 
1481
                if(frame->width() < s_minFrameWidth) {
 
1482
                    kdWarning() << fs->getName() << " frame " << f << " width is so small no text will fit, adjusting (was: "
 
1483
                                << frame->width() << " is: " << s_minFrameWidth  << ")" << endl;
 
1484
                    frame->setWidth(s_minFrameWidth);
1341
1485
                }
1342
1486
            }
1343
1487
        }
1344
1488
    }
1345
1489
    emit sigProgress(-1);
1346
1490
 
1347
 
    recalcFrames(); // This computes the number of pages (from the frames)
1348
 
                    // for the first time (and adds footers/headers etc.)
1349
 
 
1350
 
#if 0 // If KWCanvas calls updateViewArea right, this is not needed anymore
1351
 
    kdDebug(32002) << "KWDocument::loadXML starting formatting" << endl;
1352
 
    // So now we can start formatting
1353
 
    fit = framesetsIterator();
1354
 
    for ( ; fit.current() ; ++fit )
1355
 
    {
1356
 
        KWTextFrameSet * frameset = dynamic_cast<KWTextFrameSet *>(fit.current());
1357
 
        if ( frameset )
1358
 
        {
1359
 
            frameset->formatMore(); // creates more pages/frames if necessary
1360
 
        }
1361
 
    }
1362
 
#endif
1363
 
 
1364
 
    emit newContentsSize();
1365
 
    repaintAllViews( true );     // in case any view exists already
1366
 
 
1367
1491
    //kdDebug(32001) << "KWDocument::loadXML done" << endl;
1368
1492
 
1369
1493
    setModified( false );
1370
1494
 
 
1495
    // Connect to notifications from main text-frameset
 
1496
    KWTextFrameSet *frameset = dynamic_cast<KWTextFrameSet *>( m_lstFrameSet.getFirst() );
 
1497
    if ( frameset ) {
 
1498
        connect( frameset->textObject(), SIGNAL( chapterParagraphFormatted( KoTextParag * ) ),
 
1499
                 SLOT( slotChapterParagraphFormatted( KoTextParag * ) ) );
 
1500
        connect( frameset, SIGNAL( mainTextHeightChanged() ),
 
1501
                 SIGNAL( mainTextHeightChanged() ) );
 
1502
    }
 
1503
 
1371
1504
    kdDebug(32001) << "Loading took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl;
1372
 
    return TRUE;
1373
 
}
1374
 
 
1375
 
void KWDocument::loadEmbedded( QDomElement embedded )
 
1505
 
 
1506
    return true;
 
1507
}
 
1508
 
 
1509
void KWDocument::startBackgroundSpellCheck()
 
1510
{
 
1511
    //don't start bg spell checking if
 
1512
    if(backgroundSpellCheckEnabled() && isReadWrite())
 
1513
    {
 
1514
        m_bgSpellCheck->objectForSpell(textFrameSet(0));
 
1515
        m_bgSpellCheck->startBackgroundSpellCheck();
 
1516
    }
 
1517
 
 
1518
}
 
1519
 
 
1520
void KWDocument::loadEmbeddedObjects( QDomElement& word )
 
1521
{
 
1522
    QDomNodeList listEmbedded = word.elementsByTagName ( "EMBEDDED" );
 
1523
    for (unsigned int item = 0; item < listEmbedded.count(); item++)
 
1524
    {
 
1525
        QDomElement embedded = listEmbedded.item( item ).toElement();
 
1526
        loadEmbedded( embedded );
 
1527
    }
 
1528
}
 
1529
 
 
1530
void KWDocument::loadEmbedded( const QDomElement &embedded )
1376
1531
{
1377
1532
    QDomElement object = embedded.namedItem( "OBJECT" ).toElement();
1378
1533
    if ( !object.isNull() )
1385
1540
        if ( !settings.isNull() )
1386
1541
            name = settings.attribute( "name" );
1387
1542
        KWPartFrameSet *fs = new KWPartFrameSet( this, ch, name );
1388
 
        frames.append( fs );
 
1543
        m_lstFrameSet.append( fs );
1389
1544
        if ( !settings.isNull() )
1390
1545
        {
1391
1546
            kdDebug(32001) << "KWDocument::loadXML loading embedded object" << endl;
1398
1553
        kdError(32001) << "No <OBJECT> tag in EMBEDDED" << endl;
1399
1554
}
1400
1555
 
1401
 
void KWDocument::loadStyleTemplates( QDomElement stylesElem )
 
1556
void KWDocument::loadStyleTemplates( const QDomElement &stylesElem )
1402
1557
{
1403
1558
    QValueList<QString> followingStyles;
1404
1559
    QDomNodeList listStyles = stylesElem.elementsByTagName( "STYLE" );
 
1560
    if( listStyles.count() > 0) { // we are going to import at least one style.
 
1561
        KWStyle *s = m_styleColl->findStyle("Standard");
 
1562
        //kdDebug(32001) << "KWDocument::loadStyleTemplates looking for Standard, to delete it. Found " << s << endl;
 
1563
        if(s) // delete the standard style.
 
1564
            m_styleColl->removeStyleTemplate(s);
 
1565
    }
1405
1566
    for (unsigned int item = 0; item < listStyles.count(); item++) {
1406
1567
        QDomElement styleElem = listStyles.item( item ).toElement();
1407
1568
 
1408
 
        KWStyle *sty = new KWStyle( styleElem, this, m_defaultFont );
1409
 
 
1410
 
        sty = addStyleTemplate( sty );
1411
 
 
1412
 
        if(m_styleList.count() > followingStyles.count() )
 
1569
        KWStyle *sty = new KWStyle( QString::null );
 
1570
        // Load the style from the <STYLE> element
 
1571
        sty->loadStyle( styleElem, m_syntaxVersion );
 
1572
 
 
1573
        //kdDebug(32001) << "KoStyle created name=" << sty->name() << endl;
 
1574
 
 
1575
        if ( m_syntaxVersion < 3 )
 
1576
        {
 
1577
            // Convert old style (up to 1.2.x included)
 
1578
            // "include in TOC if chapter numbering" to the new attribute
 
1579
            if ( sty->paragLayout().counter && sty->paragLayout().counter->numbering() == KoParagCounter::NUM_CHAPTER )
 
1580
                sty->setOutline( true );
 
1581
        }
 
1582
 
 
1583
        // the real value of followingStyle is set below after loading all styles
 
1584
        sty->setFollowingStyle( sty );
 
1585
 
 
1586
        QDomElement formatElem = styleElem.namedItem( "FORMAT" ).toElement();
 
1587
        if ( !formatElem.isNull() )
 
1588
            sty->format() = KWTextParag::loadFormat( formatElem, 0L, defaultFont(), globalLanguage(), globalHyphenation() );
 
1589
        else
 
1590
            kdWarning(32001) << "No FORMAT tag in <STYLE>" << endl; // This leads to problems in applyStyle().
 
1591
 
 
1592
        // Style created, now let's try to add it
 
1593
        sty = m_styleColl->addStyleTemplate( sty );
 
1594
 
 
1595
        if(m_styleColl->styleList().count() > followingStyles.count() )
1413
1596
        {
1414
1597
            QString following = styleElem.namedItem("FOLLOWING").toElement().attribute("name");
1415
1598
            followingStyles.append( following );
1418
1601
            kdWarning () << "Found duplicate style declaration, overwriting former " << sty->name() << endl;
1419
1602
    }
1420
1603
 
1421
 
    ASSERT( followingStyles.count() == m_styleList.count() );
 
1604
    Q_ASSERT( followingStyles.count() == m_styleColl->styleList().count() );
1422
1605
 
1423
1606
    unsigned int i=0;
1424
1607
    for( QValueList<QString>::Iterator it = followingStyles.begin(); it != followingStyles.end(); ++it ) {
1425
 
        KWStyle * style = findStyle(*it);
1426
 
        m_styleList.at(i++)->setFollowingStyle( style );
1427
 
    }
1428
 
 
1429
 
}
1430
 
 
1431
 
KWStyle* KWDocument::addStyleTemplate( KWStyle * sty )
1432
 
{
1433
 
    // First check for duplicates.
1434
 
    for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next() )
1435
 
    {
1436
 
        if ( p->name() == sty->name() ) {
1437
 
            // Replace existing style
1438
 
            if ( sty != p )
1439
 
            {
1440
 
                *p = *sty;
1441
 
                delete sty;
1442
 
            }
1443
 
            return p;
1444
 
        }
1445
 
    }
1446
 
    m_styleList.append( sty );
1447
 
    return sty;
1448
 
}
1449
 
 
1450
 
void KWDocument::removeStyleTemplate ( KWStyle *style ) {
1451
 
    if( m_styleList.removeRef(style)) {
1452
 
        // Remember to delete this style when deleting the document
1453
 
        m_deletedStyles.append(style);
1454
 
    }
1455
 
}
1456
 
 
1457
 
void KWDocument::moveDownStyleTemplate ( const QString & _styleName )
1458
 
{
1459
 
    unsigned int pos = 0;
1460
 
    for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next(), ++pos )
1461
 
    {
1462
 
        if ( p->name() == _styleName )
1463
 
        {
1464
 
            KWStyle * next = m_styleList.at(pos+1);
1465
 
            if (!next) return;
1466
 
            // We have "p" "next" and we want "next" "p"
1467
 
            m_styleList.insert( pos, next ); // "next", "p", "next"
1468
 
            m_styleList.take( pos+2 );       // Remove last "next"
1469
 
            return;
1470
 
        }
1471
 
    }
1472
 
}
1473
 
 
1474
 
void KWDocument::moveUpStyleTemplate ( const QString & _styleName )
1475
 
{
1476
 
    unsigned int pos = 0;
1477
 
    for ( KWStyle* p = m_styleList.first(); p != 0L; p = m_styleList.next(), ++pos )
1478
 
    {
1479
 
        if ( p->name() == _styleName )
1480
 
        {
1481
 
            // We have "prev" "p" and we want "p" "prev"
1482
 
            m_styleList.insert( pos-1, p ); // "p" "prev" "p"
1483
 
            m_styleList.take( pos+1 );      // Remove last "p"
1484
 
            return;
1485
 
        }
 
1608
        KWStyle * style = m_styleColl->findStyle(*it);
 
1609
        m_styleColl->styleAt(i++)->setFollowingStyle( style );
 
1610
    }
 
1611
 
 
1612
}
 
1613
 
 
1614
void KWDocument::loadFrameStyleTemplates( const QDomElement &stylesElem )
 
1615
{
 
1616
    QDomNodeList listStyles = stylesElem.elementsByTagName( "FRAMESTYLE" );
 
1617
    if( listStyles.count() > 0) { // we are going to import at least one style.
 
1618
        KWFrameStyle *s = m_frameStyleColl->findFrameStyle("Plain");
 
1619
        if(s) // delete the standard style.
 
1620
            m_frameStyleColl->removeFrameStyleTemplate(s);
 
1621
    }
 
1622
    for (unsigned int item = 0; item < listStyles.count(); item++) {
 
1623
        QDomElement styleElem = listStyles.item( item ).toElement();
 
1624
 
 
1625
        KWFrameStyle *sty = new KWFrameStyle( styleElem );
 
1626
        m_frameStyleColl->addFrameStyleTemplate( sty );
 
1627
    }
 
1628
}
 
1629
 
 
1630
void KWDocument::loadDefaultFrameStyleTemplates()
 
1631
{
 
1632
    KURL fsfile;
 
1633
 
 
1634
    if ( ! QFile::exists(locate("appdata", "framestyles.xml")) )
 
1635
    {
 
1636
        if (!m_frameStyleColl->findFrameStyle("Plain")) {
 
1637
            KWFrameStyle * standardFrameStyle = new KWFrameStyle( "Plain" );
 
1638
            standardFrameStyle->setBackgroundColor(QColor("white"));
 
1639
            standardFrameStyle->setTopBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
1640
            standardFrameStyle->setRightBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
1641
            standardFrameStyle->setLeftBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
1642
            standardFrameStyle->setBottomBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
 
1643
            m_frameStyleColl->addFrameStyleTemplate( standardFrameStyle );
 
1644
        }
 
1645
        return;
 
1646
    }
 
1647
 
 
1648
    fsfile.setPath( locate("appdata", "framestyles.xml") );
 
1649
 
 
1650
    // Open file and parse it
 
1651
    QFile in( fsfile.path() );
 
1652
    if ( !in.open( IO_ReadOnly ) )
 
1653
    {
 
1654
        //i18n( "Couldn't open the file for reading (check read permissions)" );
 
1655
        return;
 
1656
    }
 
1657
    in.at(0);
 
1658
    QString errorMsg;
 
1659
    int errorLine;
 
1660
    int errorColumn;
 
1661
    QDomDocument doc;
 
1662
    if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
 
1663
    }
 
1664
    else
 
1665
    {
 
1666
        kdError (30003) << "Parsing Error! Aborting! (in KWDocument::loadDefaultFrameStyleTemplates())" << endl
 
1667
                        << "  Line: " << errorLine << " Column: " << errorColumn << endl
 
1668
                        << "  Message: " << errorMsg << endl;
 
1669
    }
 
1670
    in.close();
 
1671
 
 
1672
    // Start adding framestyles
 
1673
    QDomElement stylesElem = doc.documentElement();
 
1674
 
 
1675
    QDomNodeList listStyles = stylesElem.elementsByTagName( "FRAMESTYLE" );
 
1676
    if( listStyles.count() > 0) { // we are going to import at least one style.
 
1677
        KWFrameStyle *s = m_frameStyleColl->findFrameStyle("Plain");
 
1678
        if(s) // delete the standard style.
 
1679
            m_frameStyleColl->removeFrameStyleTemplate(s);
 
1680
    }
 
1681
    for (unsigned int item = 0; item < listStyles.count(); item++) {
 
1682
        QDomElement styleElem = listStyles.item( item ).toElement();
 
1683
 
 
1684
        KWFrameStyle *sty = new KWFrameStyle( styleElem );
 
1685
        m_frameStyleColl->addFrameStyleTemplate( sty );
 
1686
    }
 
1687
}
 
1688
 
 
1689
void KWDocument::loadTableStyleTemplates( const QDomElement& stylesElem )
 
1690
{
 
1691
    QDomNodeList listStyles = stylesElem.elementsByTagName( "TABLESTYLE" );
 
1692
    if( listStyles.count() > 0) { // we are going to import at least one style.
 
1693
        KWTableStyle *s = m_tableStyleColl->findTableStyle("Plain");
 
1694
        if(s) // delete the standard style.
 
1695
            m_tableStyleColl->removeTableStyleTemplate(s);
 
1696
    }
 
1697
    for (unsigned int item = 0; item < listStyles.count(); item++) {
 
1698
        QDomElement styleElem = listStyles.item( item ).toElement();
 
1699
 
 
1700
        KWTableStyle *sty = new KWTableStyle( styleElem, this );
 
1701
        m_tableStyleColl->addTableStyleTemplate( sty );
 
1702
    }
 
1703
}
 
1704
 
 
1705
void KWDocument::loadDefaultTableStyleTemplates()
 
1706
{
 
1707
    KURL fsfile;
 
1708
 
 
1709
    if ( ! QFile::exists(locate("appdata", "tablestyles.xml")) )
 
1710
    {
 
1711
        if (!m_tableStyleColl->findTableStyle("Plain")) {
 
1712
            m_tableStyleColl->addTableStyleTemplate( new KWTableStyle( "Plain", m_styleColl->styleAt(0), m_frameStyleColl->frameStyleAt(0) ) );
 
1713
        }
 
1714
        return;
 
1715
    }
 
1716
 
 
1717
    fsfile.setPath( locate("appdata", "tablestyles.xml") );
 
1718
 
 
1719
    // Open file and parse it
 
1720
    QFile in( fsfile.path() );
 
1721
    if ( !in.open( IO_ReadOnly ) )
 
1722
    {
 
1723
        //i18n( "Couldn't open the file for reading (check read permissions)" );
 
1724
        return;
 
1725
    }
 
1726
    in.at(0);
 
1727
    QString errorMsg;
 
1728
    int errorLine;
 
1729
    int errorColumn;
 
1730
    QDomDocument doc;
 
1731
    if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
 
1732
    }
 
1733
    else
 
1734
    {
 
1735
        kdError (30003) << "Parsing Error! Aborting! (in KWDocument::loadDefaultTableStyleTemplates())" << endl
 
1736
                        << "  Line: " << errorLine << " Column: " << errorColumn << endl
 
1737
                        << "  Message: " << errorMsg << endl;
 
1738
    }
 
1739
    in.close();
 
1740
 
 
1741
    // Start adding tablestyles
 
1742
    QDomElement stylesElem = doc.documentElement();
 
1743
 
 
1744
    QDomNodeList listStyles = stylesElem.elementsByTagName( "TABLESTYLE" );
 
1745
    if( listStyles.count() > 0) { // we are going to import at least one style.
 
1746
        KWTableStyle *s = m_tableStyleColl->findTableStyle("Plain");
 
1747
        if(s) // delete the standard style.
 
1748
            m_tableStyleColl->removeTableStyleTemplate(s);
 
1749
    }
 
1750
    for (unsigned int item = 0; item < listStyles.count(); item++) {
 
1751
        QDomElement styleElem = listStyles.item( item ).toElement();
 
1752
 
 
1753
        KWTableStyle *sty = new KWTableStyle( styleElem, this );
 
1754
        m_tableStyleColl->addTableStyleTemplate( sty );
 
1755
    }
 
1756
}
 
1757
 
 
1758
void KWDocument::loadDefaultTableTemplates()
 
1759
{
 
1760
    KURL fsfile;
 
1761
 
 
1762
    if ( ! QFile::exists(locate("appdata", "tabletemplates.xml")) )
 
1763
    {
 
1764
        if (!m_tableTemplateColl->findTableTemplate("Plain")) {
 
1765
            KWTableTemplate * standardTableTemplate = new KWTableTemplate( "Plain" );
 
1766
            standardTableTemplate->setFirstRow(tableStyleCollection()->findTableStyle("Plain"));
 
1767
            standardTableTemplate->setLastRow(tableStyleCollection()->findTableStyle("Plain"));
 
1768
            standardTableTemplate->setFirstCol(tableStyleCollection()->findTableStyle("Plain"));
 
1769
            standardTableTemplate->setLastCol(tableStyleCollection()->findTableStyle("Plain"));
 
1770
            standardTableTemplate->setBodyCell(tableStyleCollection()->findTableStyle("Plain"));
 
1771
            standardTableTemplate->setTopLeftCorner(tableStyleCollection()->findTableStyle("Plain"));
 
1772
            standardTableTemplate->setTopRightCorner(tableStyleCollection()->findTableStyle("Plain"));
 
1773
            standardTableTemplate->setBottomLeftCorner(tableStyleCollection()->findTableStyle("Plain"));
 
1774
            standardTableTemplate->setBottomRightCorner(tableStyleCollection()->findTableStyle("Plain"));
 
1775
            m_tableTemplateColl->addTableTemplate( standardTableTemplate );
 
1776
        }
 
1777
        return;
 
1778
    }
 
1779
 
 
1780
    fsfile.setPath( locate("appdata", "tabletemplates.xml") );
 
1781
 
 
1782
    // Open file and parse it
 
1783
    QFile in( fsfile.path() );
 
1784
    if ( !in.open( IO_ReadOnly ) )
 
1785
    {
 
1786
        //i18n( "Couldn't open the file for reading (check read permissions)" );
 
1787
        return;
 
1788
    }
 
1789
    in.at(0);
 
1790
    QString errorMsg;
 
1791
    int errorLine;
 
1792
    int errorColumn;
 
1793
    QDomDocument doc;
 
1794
    if ( doc.setContent( &in , &errorMsg, &errorLine, &errorColumn ) ) {
 
1795
    }
 
1796
    else
 
1797
    {
 
1798
        kdError (30003) << "Parsing Error! Aborting! (in KWDocument::readTableTemplates())" << endl
 
1799
                        << "  Line: " << errorLine << " Column: " << errorColumn << endl
 
1800
                        << "  Message: " << errorMsg << endl;
 
1801
    }
 
1802
    in.close();
 
1803
 
 
1804
    // Start adding framestyles
 
1805
    QDomElement templatesElem = doc.documentElement();
 
1806
 
 
1807
    QDomNodeList listTemplates = templatesElem.elementsByTagName( "TABLETEMPLATE" );
 
1808
    if( listTemplates.count() > 0) {
 
1809
        KWTableTemplate *s = m_tableTemplateColl->findTableTemplate("Plain");
 
1810
        if(s)
 
1811
            m_tableTemplateColl->removeTableTemplate(s);
 
1812
    }
 
1813
    for (unsigned int item = 0; item < listTemplates.count(); item++) {
 
1814
        QDomElement templateElem = listTemplates.item( item ).toElement();
 
1815
 
 
1816
        KWTableTemplate *temp = new KWTableTemplate( templateElem, this );
 
1817
        m_tableTemplateColl->addTableTemplate( temp );
1486
1818
    }
1487
1819
}
1488
1820
 
1489
1821
void KWDocument::progressItemLoaded()
1490
1822
{
 
1823
    if ( !m_nrItemsToLoad ) // happens when pasting
 
1824
        return;
1491
1825
    m_itemsLoaded++;
1492
1826
    // We progress from 20 to 85 -> 65-wide range, 20 offset.
1493
1827
    unsigned int perc = 65 * m_itemsLoaded / m_nrItemsToLoad;
1498
1832
    }
1499
1833
}
1500
1834
 
1501
 
void KWDocument::loadFrameSets( QDomElement framesetsElem )
 
1835
void KWDocument::loadFrameSets( const QDomElement &framesetsElem )
1502
1836
{
1503
1837
    // <FRAMESET>
1504
1838
    // First prepare progress info
1525
1859
    }
1526
1860
}
1527
1861
 
1528
 
KWFrameSet * KWDocument::loadFrameSet( QDomElement framesetElem, bool loadFrames )
 
1862
KWFrameSet * KWDocument::loadFrameSet( QDomElement framesetElem, bool loadFrames, bool loadFootnote )
1529
1863
{
1530
1864
    FrameSetType frameSetType = static_cast<FrameSetType>( KWDocument::getAttribute( framesetElem, "frameType", FT_BASE ) );
1531
 
    QString tableName = correctQString( KWDocument::getAttribute( framesetElem, "grpMgr", "" ) );
1532
 
    QString fsname = correctQString( KWDocument::getAttribute( framesetElem, "name", "" ) );
 
1865
    QString fsname = KWDocument::getAttribute( framesetElem, "name", "" );
1533
1866
 
1534
1867
    switch ( frameSetType ) {
1535
1868
    case FT_TEXT: {
 
1869
        QString tableName = KWDocument::getAttribute( framesetElem, "grpMgr", "" );
1536
1870
        if ( !tableName.isEmpty() ) {
1537
1871
            // Text frameset belongs to a table -> find table by name
1538
1872
            KWTableFrameSet *table = 0L;
1539
 
            QListIterator<KWFrameSet> fit = framesetsIterator();
 
1873
            QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1540
1874
            for ( ; fit.current() ; ++fit ) {
1541
1875
                KWFrameSet *f = fit.current();
1542
1876
                if( f->type() == FT_TABLE &&
1549
1883
            // No such table yet -> create
1550
1884
            if ( !table ) {
1551
1885
                table = new KWTableFrameSet( this, tableName );
1552
 
                frames.append( table );
 
1886
                m_lstFrameSet.append( table );
1553
1887
            }
1554
1888
            // Load the cell
1555
1889
            return table->loadCell( framesetElem );
1556
1890
        }
1557
1891
        else
1558
1892
        {
1559
 
            KWTextFrameSet *fs = new KWTextFrameSet( this, fsname );
1560
 
            fs->load( framesetElem, loadFrames );
1561
 
            frames.append( fs ); // don't use addFrameSet here. We'll call finalize() once and for all in completeLoading
 
1893
            KWFrameSet::Info info = static_cast<KWFrameSet::Info>( framesetElem.attribute("frameInfo").toInt() );
 
1894
            if ( info == KWFrameSet::FI_FOOTNOTE )
 
1895
            {
 
1896
                if ( !loadFootnote )
 
1897
                    return 0L;
 
1898
                // Footnote -> create a KWFootNoteFrameSet
 
1899
                KWFootNoteFrameSet *fs = new KWFootNoteFrameSet( this, fsname );
 
1900
                fs->load( framesetElem, loadFrames );
 
1901
                m_lstFrameSet.append( fs );
 
1902
                return fs;
 
1903
            }
 
1904
            else // Normal text frame
 
1905
            {
 
1906
                KWTextFrameSet *fs = new KWTextFrameSet( this, fsname );
 
1907
                fs->load( framesetElem, loadFrames );
 
1908
                m_lstFrameSet.append( fs ); // don't use addFrameSet here. We'll call finalize() once and for all in completeLoading
1562
1909
 
1563
 
            // Old file format had autoCreateNewFrame as a frameset attribute
1564
 
            if ( framesetElem.hasAttribute( "autoCreateNewFrame" ) )
1565
 
            {
1566
 
                KWFrame::FrameBehaviour behav = static_cast<KWFrame::FrameBehaviour>( framesetElem.attribute( "autoCreateNewFrame" ).toInt() );
1567
 
                QListIterator<KWFrame> frameIt( fs->frameIterator() );
1568
 
                for ( ; frameIt.current() ; ++frameIt ) // Apply it to all frames
1569
 
                    frameIt.current()->setFrameBehaviour( behav );
 
1910
                // Old file format had autoCreateNewFrame as a frameset attribute
 
1911
                if ( framesetElem.hasAttribute( "autoCreateNewFrame" ) )
 
1912
                {
 
1913
                    KWFrame::FrameBehavior behav = static_cast<KWFrame::FrameBehavior>( framesetElem.attribute( "autoCreateNewFrame" ).toInt() );
 
1914
                    QPtrListIterator<KWFrame> frameIt( fs->frameIterator() );
 
1915
                    for ( ; frameIt.current() ; ++frameIt ) // Apply it to all frames
 
1916
                        frameIt.current()->setFrameBehavior( behav );
 
1917
                }
 
1918
                return fs;
1570
1919
            }
1571
 
            return fs;
1572
1920
        }
1573
1921
    } break;
1574
 
    case FT_PICTURE: {
 
1922
    case FT_CLIPART:
 
1923
    {
 
1924
        kdError(32001) << "FT_CLIPART used! (in KWDocument::loadFrameSet)" << endl;
 
1925
        // Do not break!
 
1926
    }
 
1927
    case FT_PICTURE:
 
1928
    {
1575
1929
        KWPictureFrameSet *fs = new KWPictureFrameSet( this, fsname );
1576
1930
        fs->load( framesetElem, loadFrames );
1577
 
        frames.append( fs );
 
1931
        m_lstFrameSet.append( fs );
1578
1932
        return fs;
1579
1933
    } break;
1580
 
    case FT_CLIPART: {
1581
 
        KWClipartFrameSet *fs = new KWClipartFrameSet( this, fsname );
 
1934
#if 0 // KWORD_HORIZONTAL_LINE
 
1935
    case FT_HORZLINE:
 
1936
    {
 
1937
        KWHorzLineFrameSet *fs = new KWHorzLineFrameSet( this, fsname );
1582
1938
        fs->load( framesetElem, loadFrames );
1583
 
        frames.append( fs );
 
1939
        m_lstFrameSet.append( fs );
1584
1940
        return fs;
1585
1941
    } break;
 
1942
#endif
1586
1943
    case FT_FORMULA: {
1587
1944
        KWFormulaFrameSet *fs = new KWFormulaFrameSet( this, fsname );
1588
1945
        fs->load( framesetElem, loadFrames );
1589
 
        frames.append( fs );
 
1946
        m_lstFrameSet.append( fs );
1590
1947
        return fs;
1591
1948
    } break;
1592
1949
    // Note that FT_PART cannot happen when loading from a file (part frames are saved into the SETTINGS tag)
1604
1961
    return 0L;
1605
1962
}
1606
1963
 
 
1964
void KWDocument::loadImagesFromStore( KoStore *_store )
 
1965
{
 
1966
    if ( _store ) {
 
1967
        m_pictureCollection.readFromStore( _store, m_pictureMap );
 
1968
        m_pictureMap.clear(); // Release memory
 
1969
    }
 
1970
}
 
1971
 
1607
1972
bool KWDocument::completeLoading( KoStore *_store )
1608
1973
{
1609
 
    if ( _store ) {
1610
 
        QString prefix = urlIntern.isEmpty() ? url().path() : urlIntern;
1611
 
        prefix += '/';
1612
 
        if ( m_pixmapMap ) {
1613
 
            m_imageCollection.readFromStore( _store, *m_pixmapMap, prefix );
1614
 
            delete m_pixmapMap;
1615
 
            m_pixmapMap = 0L;
1616
 
        }
1617
 
        if ( m_clipartMap ) {
1618
 
            m_clipartCollection.readFromStore( _store, *m_clipartMap, prefix );
1619
 
            delete m_clipartMap;
1620
 
            m_clipartMap = 0L;
1621
 
        }
1622
 
    }
 
1974
    loadImagesFromStore( _store );
1623
1975
 
1624
 
    processImageRequests();
 
1976
    processPictureRequests();
1625
1977
    processAnchorRequests();
 
1978
    processFootNoteRequests();
 
1979
 
 
1980
    // Save memory
 
1981
    m_urlIntern = QString::null;
1626
1982
 
1627
1983
    // The fields from documentinfo.xml just got loaded -> update vars
1628
1984
    recalcVariables( VT_FIELD );
1629
1985
 
1630
1986
    // Finalize all the existing framesets
1631
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
1987
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1632
1988
    for ( ; fit.current() ; ++fit )
1633
1989
        fit.current()->finalize();
1634
1990
 
 
1991
    // This computes the number of pages (from the frames)
 
1992
    // for the first time (and adds footers/headers/footnotes etc.)
 
1993
    recalcFrames();
 
1994
 
 
1995
    // Fix z orders on older documents
 
1996
    fixZOrders();
 
1997
 
 
1998
    emit newContentsSize();
 
1999
    repaintAllViews( true );     // in case any view exists already
 
2000
    reactivateBgSpellChecking();
 
2001
    connect( documentInfo(), SIGNAL( sigDocumentInfoModifed()),this,SLOT(slotDocumentInfoModifed() ) );
 
2002
 
 
2003
    //desactivate bgspellchecking
 
2004
    //attributes isReadWrite is not placed at the beginning !
 
2005
    if ( !isReadWrite())
 
2006
        enableBackgroundSpellCheck( false );
1635
2007
    return TRUE;
1636
2008
}
1637
2009
 
1638
 
void KWDocument::processImageRequests()
 
2010
void KWDocument::processPictureRequests()
1639
2011
{
1640
 
    QMapIterator<KoImageKey,KWTextImage *> it2 = m_imageRequests.begin();
1641
 
    for ( ; it2 != m_imageRequests.end(); ++it2 )
 
2012
    QPtrListIterator<KWTextImage> it2 ( m_textImageRequests );
 
2013
    for ( ; it2.current() ; ++it2 )
1642
2014
    {
1643
 
        kdDebug(32001) << "KWDocument::completeLoading loading image " << it2.key().toString() << endl;
1644
 
        it2.data()->setImage( m_imageCollection.findImage( it2.key() ) );
 
2015
        it2.current()->setImage( m_pictureCollection );
1645
2016
    }
1646
 
    m_imageRequests.clear();
1647
 
 
1648
 
    QListIterator<KWPictureFrameSet> it3( m_imageRequests2 );
1649
 
    for ( ; it3.current(); ++it3 )
1650
 
        it3.current()->setImage( m_imageCollection.findImage( it3.current()->key() ) );
1651
 
    m_imageRequests2.clear();
1652
 
 
1653
 
    QListIterator<KWClipartFrameSet> it4( m_clipartRequests );
1654
 
    for ( ; it4.current(); ++it4 )
1655
 
        it4.current()->setClipart( m_clipartCollection.findClipart( it4.current()->key() ) );
1656
 
    m_clipartRequests.clear();
 
2017
    m_textImageRequests.clear();
 
2018
 
 
2019
    kdDebug() << k_funcinfo << m_pictureRequests.count() << " picture requests." << endl;
 
2020
    QPtrListIterator<KWPictureFrameSet> it3( m_pictureRequests );
 
2021
    for ( ; it3.current() ; ++it3 )
 
2022
        it3.current()->setPicture( m_pictureCollection.findPicture( it3.current()->key() ) );
 
2023
    m_pictureRequests.clear();
1657
2024
}
1658
2025
 
1659
2026
void KWDocument::processAnchorRequests()
1664
2031
        QString fsname = itanch.key();
1665
2032
        if ( m_pasteFramesetsMap && m_pasteFramesetsMap->contains( fsname ) )
1666
2033
            fsname = (*m_pasteFramesetsMap)[ fsname ];
1667
 
        kdDebug(32001) << "KWDocument::completeLoading anchoring frameset " << fsname << endl;
1668
 
        KWFrameSet * fs = getFrameSetByName( fsname );
1669
 
        ASSERT( fs );
 
2034
        kdDebug(32001) << "KWDocument::processAnchorRequests anchoring frameset " << fsname << endl;
 
2035
        KWFrameSet * fs = frameSetByName( fsname );
 
2036
        Q_ASSERT( fs );
1670
2037
        if ( fs )
1671
 
            fs->setAnchored( itanch.data().textfs, itanch.data().paragId, itanch.data().index, true );
 
2038
            fs->setAnchored( itanch.data().textfs, itanch.data().paragId, itanch.data().index, true, false /*don't repaint yet*/ );
1672
2039
    }
1673
2040
    m_anchorRequests.clear();
1674
2041
}
1675
2042
 
1676
 
void KWDocument::pasteFrames( QDomElement topElem, KMacroCommand * macroCmd )
 
2043
bool KWDocument::processFootNoteRequests()
 
2044
{
 
2045
    bool ret = false;
 
2046
    QMapIterator<QString, KWFootNoteVariable *> itvar = m_footnoteVarRequests.begin();
 
2047
    for ( ; itvar != m_footnoteVarRequests.end(); ++itvar )
 
2048
    {
 
2049
        QString fsname = itvar.key();
 
2050
        if ( m_pasteFramesetsMap && m_pasteFramesetsMap->contains( fsname ) )
 
2051
            fsname = (*m_pasteFramesetsMap)[ fsname ];
 
2052
        //kdDebug(32001) << "KWDocument::processFootNoteRequests binding footnote var " << itvar.data() << " and frameset " << fsname << endl;
 
2053
        KWFrameSet * fs = frameSetByName( fsname );
 
2054
        Q_ASSERT( fs );
 
2055
        Q_ASSERT( fs->type() == FT_TEXT );
 
2056
        Q_ASSERT( fs->frameSetInfo() == KWFrameSet::FI_FOOTNOTE );
 
2057
        KWFootNoteFrameSet* fnfs = dynamic_cast<KWFootNoteFrameSet *>(fs);
 
2058
        if ( fnfs )
 
2059
        {
 
2060
            fnfs->setFootNoteVariable( itvar.data() );
 
2061
            itvar.data()->setFrameSet( fnfs );
 
2062
            ret = true;
 
2063
        }
 
2064
    }
 
2065
    m_footnoteVarRequests.clear();
 
2066
    // Renumber footnotes
 
2067
    if ( ret ) {
 
2068
        KWFrameSet *frameset = m_lstFrameSet.getFirst();
 
2069
        if ( frameset && frameset->type() == FT_TEXT )
 
2070
            static_cast<KWTextFrameSet *>(frameset)->renumberFootNotes( false /*no repaint*/ );
 
2071
    }
 
2072
    return ret;
 
2073
}
 
2074
 
 
2075
QString KWDocument::uniqueFramesetName( const QString& oldName )
 
2076
{
 
2077
    // make up a new name for the frameset, use Copy[digits]-[oldname] as template.
 
2078
    // Fully translatable naturally :)
 
2079
    int count=0;
 
2080
    QString searchString ("^("+ i18n("Copy%1-%2").arg("\\d*").arg("){0,1}"));
 
2081
    searchString=searchString.replace(QRegExp("\\-"), "\\-"); // escape the '-'
 
2082
    QString newName=oldName;
 
2083
    if (frameSetByName( oldName ))//rename it if name frameset exists
 
2084
    {
 
2085
        QRegExp searcher(searchString);
 
2086
        do {
 
2087
            newName=oldName;
 
2088
            newName.replace(searcher,i18n("Copy%1-%2").arg(count > 0? QString("%1").arg(count):"").arg(""));
 
2089
            count++;
 
2090
        } while ( frameSetByName( newName ) );
 
2091
    }
 
2092
    return newName;
 
2093
}
 
2094
 
 
2095
void KWDocument::pasteFrames( QDomElement topElem, KMacroCommand * macroCmd, bool copyFootNote, bool loadFootNote, bool selectFrames )
1677
2096
{
1678
2097
    m_pasteFramesetsMap = new QMap<QString, QString>();
1679
 
    QList<KWFrameSet> frameSetsToFinalize;
 
2098
    //QPtrList<KWFrameSet> frameSetsToFinalize;
1680
2099
    int ref=0;
1681
 
 
 
2100
    int nb = 0;
1682
2101
    QDomElement elem = topElem.firstChild().toElement();
1683
2102
    for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
1684
2103
    {
 
2104
        //kdDebug() << "pasteFrames: elem=" << elem.tagName() << endl;
1685
2105
        QDomElement frameElem;
1686
2106
        KWFrameSet * fs = 0L;
1687
2107
        if ( elem.tagName() == "FRAME" )
1688
2108
        {
1689
2109
            QString frameSetName = frameElem.attribute( "parentFrameset" );
1690
 
            fs = getFrameSetByName( frameSetName );
 
2110
            fs = frameSetByName( frameSetName );
1691
2111
            if ( !fs )
1692
2112
            {
1693
2113
                kdWarning(32001) << "pasteFrames: Frameset '" << frameSetName << "' not found" << endl;
1699
2119
        {
1700
2120
            // Prepare a new name for the frameset
1701
2121
            QString oldName = elem.attribute( "name" );
1702
 
            QString newName=i18n("Copy-%1").arg( oldName );
1703
 
            if ( getFrameSetByName( newName ) )
1704
 
                newName = generateFramesetName( newName+"-%1" );
 
2122
            QString newName = uniqueFramesetName( oldName ); // make up a new name for the frame
 
2123
 
1705
2124
            m_pasteFramesetsMap->insert( oldName, newName ); // remember the name transformation
1706
 
            kdDebug() << "KWDocument::pasteFrames new frame : " << oldName << "->" << newName << endl;
1707
 
 
 
2125
            kdDebug(32001) << "KWDocument::pasteFrames new frame : " << oldName << "->" << newName << endl;
1708
2126
            FrameSetType frameSetType = static_cast<FrameSetType>( KWDocument::getAttribute( elem, "frameType", FT_BASE ) );
1709
2127
            switch ( frameSetType ) {
1710
2128
            case FT_TABLE: {
1711
2129
                KWTableFrameSet *table = new KWTableFrameSet( this, newName );
1712
2130
                table->fromXML( elem, true, false /*don't apply names*/ );
1713
2131
                table->moveBy( 20.0, 20.0 );
1714
 
                frames.append( table );
 
2132
                m_lstFrameSet.append( table );
 
2133
                table->setZOrder();
1715
2134
                if ( macroCmd )
1716
2135
                    macroCmd->addCommand( new KWCreateTableCommand( QString::null, table ) );
1717
2136
                fs = table;
1718
2137
                break;
1719
2138
            }
1720
2139
            case FT_PART:
1721
 
                kdWarning(32001) << "Copying part objects isn't implemented yet" << endl;
 
2140
            {
 
2141
                ref |= Embedded;
 
2142
#if 0
 
2143
                KWPartFrameSet *part = new KWPartFrameSet( this, newName );
 
2144
                part->fromXML( elem, true, false /*don't apply names*/ );
 
2145
                part->moveBy( 20.0, 20.0 );
 
2146
                m_lstFrameSet.append( part );
 
2147
                part->setZOrder();
 
2148
                fs = part;
 
2149
#endif
1722
2150
                break;
 
2151
            }
1723
2152
            default:
1724
 
                fs = loadFrameSet( elem, false );
1725
 
                fs->setName( newName );
1726
 
                frameElem = elem.namedItem( "FRAME" ).toElement();
 
2153
                fs = loadFrameSet( elem, false, loadFootNote );
 
2154
                if ( fs )
 
2155
                {
 
2156
                    kdDebug() << "KWDocument::pasteFrames created frame " << newName << endl;
 
2157
                    fs->setName( newName );
 
2158
                    frameElem = elem.namedItem( "FRAME" ).toElement();
 
2159
                }
1727
2160
            }
1728
 
             //when we paste a header/footer we transforme it in a body frame
1729
 
            if(fs->isHeaderOrFooter())
 
2161
            //when we paste a header/footer we transforme it in a body frame
 
2162
            if(fs && (fs->isHeaderOrFooter() || ( !copyFootNote && fs->isFootEndNote())))
1730
2163
                fs->setFrameSetInfo(KWFrameSet::FI_BODY);
1731
2164
        }
1732
2165
        // Test commented out since the toplevel element can contain "PARAGRAPH" now
1735
2168
 
1736
2169
        if ( fs )
1737
2170
        {
1738
 
            if ( frameSetsToFinalize.findRef( fs ) == -1 )
1739
 
                frameSetsToFinalize.append( fs );
 
2171
            //if ( frameSetsToFinalize.findRef( fs ) == -1 )
 
2172
            //    frameSetsToFinalize.append( fs );
1740
2173
 
1741
2174
            // Load the frame
1742
2175
            if ( !frameElem.isNull() )
1748
2181
                rect.setRight( KWDocument::getAttribute( frameElem, "right", 0.0 ) + offs );
1749
2182
                rect.setBottom( KWDocument::getAttribute( frameElem, "bottom", 0.0 ) + offs );
1750
2183
                KWFrame * frame = new KWFrame( fs, rect.x(), rect.y(), rect.width(), rect.height() );
1751
 
                frame->load( frameElem, fs->isHeaderOrFooter(), KWDocument::CURRENT_SYNTAX_VERSION );
 
2184
                frame->load( frameElem, fs, KWDocument::CURRENT_SYNTAX_VERSION );
 
2185
                frame->setZOrder( maxZOrder( frame->pageNum(this) ) + 1 +nb ); // make sure it's on top
 
2186
                if ( selectFrames )
 
2187
                    frame->setSelected(TRUE);
 
2188
                nb++;
1752
2189
                fs->addFrame( frame, false );
1753
2190
                if ( macroCmd )
1754
2191
                {
1763
2200
            case FT_TEXT:
1764
2201
                type=(int)TextFrames;
1765
2202
                break;
 
2203
            case FT_CLIPART:
 
2204
            {
 
2205
                kdError(32001) << "FT_CLIPART used! (in KWDocument::loadFrameSet)" << endl;
 
2206
                // Do not break!
 
2207
            }
1766
2208
            case FT_PICTURE:
1767
2209
                type=(int)Pictures;
1768
2210
                break;
1781
2223
            ref|=type;
1782
2224
        }
1783
2225
    }
1784
 
    processImageRequests();
 
2226
    refreshDocStructure(ref);
 
2227
}
 
2228
 
 
2229
void KWDocument::completePasting()
 
2230
{
 
2231
    processPictureRequests();
1785
2232
    processAnchorRequests();
 
2233
    if ( processFootNoteRequests() )
 
2234
    {
 
2235
        // We pasted footnotes. Relayout frames.
 
2236
        recalcFrames();
 
2237
    }
1786
2238
 
1787
2239
    // Finalize afterwards - especially in case of inline frames, made them inline in processAnchorRequests
1788
 
    for ( QListIterator<KWFrameSet> fit( frameSetsToFinalize ); fit.current(); ++fit )
 
2240
    //for ( QPtrListIterator<KWFrameSet> fit( frameSetsToFinalize ); fit.current(); ++fit )
 
2241
 
 
2242
    // Do it on all of them (we'd need to store frameSetsToFinalize as member var if this is really slow)
 
2243
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
2244
    for ( ; fit.current() ; ++fit )
1789
2245
        fit.current()->finalize();
1790
 
 
1791
2246
    repaintAllViews();
1792
 
    refreshDocStructure(ref);
1793
2247
    delete m_pasteFramesetsMap;
1794
2248
    m_pasteFramesetsMap = 0L;
1795
2249
}
1796
2250
 
 
2251
void KWDocument::insertEmbedded( KoStore *store, QDomElement topElem, KMacroCommand * macroCmd, double offset )
 
2252
{
 
2253
    if ( !m_pasteFramesetsMap ) // may have been created by pasteFrames
 
2254
        m_pasteFramesetsMap = new QMap<QString, QString>();
 
2255
 
 
2256
    QDomElement elem = topElem.firstChild().toElement();
 
2257
    for ( ; !elem.isNull() ; elem = elem.nextSibling().toElement() )
 
2258
    {
 
2259
        if ( elem.tagName() == "EMBEDDED" )
 
2260
        {
 
2261
            kdDebug()<<"KWDocument::insertEmbedded() Embedded object"<<endl;
 
2262
            QDomElement object = elem.namedItem( "OBJECT" ).toElement();
 
2263
            QDomElement settings = elem.namedItem( "SETTINGS" ).toElement();
 
2264
            if ( object.isNull() || settings.isNull() )
 
2265
            {
 
2266
                kdError() << "No <OBJECT> or <SETTINGS> tag" << endl;
 
2267
            }
 
2268
            else
 
2269
            {
 
2270
                KWChild *ch = new KWChild( this );
 
2271
                kdDebug()<<"KWDocument::insertEmbedded() loading document"<<endl;
 
2272
                if ( ch->load( object, true ) )
 
2273
                {
 
2274
                    ch->loadDocument( store );
 
2275
                    insertChild( ch );
 
2276
                    QString oldName = settings.attribute( "name" );
 
2277
                    QString newName = uniqueFramesetName( oldName );
 
2278
                    m_pasteFramesetsMap->insert( oldName, newName ); // remember the name transformation
 
2279
                    KWPartFrameSet *part = new KWPartFrameSet( this, ch, newName );
 
2280
                    m_lstFrameSet.append( part );
 
2281
                    kdDebug() << "KWDocument::insertEmbedded loading embedded object" << endl;
 
2282
                    part->load( settings );
 
2283
                    if ( offset != 0 ) {
 
2284
                        QRect r = ch->geometry();
 
2285
                        r.moveBy( (int)offset, (int)offset );
 
2286
                        ch->setGeometry( r );
 
2287
                    }
 
2288
                    part->setZOrder();
 
2289
                    if ( macroCmd )
 
2290
                    {
 
2291
                        QPtrListIterator<KWFrame> frameIt( part->frameIterator() );
 
2292
                        for ( ; frameIt.current(); ++frameIt )
 
2293
                        {
 
2294
                            macroCmd->addCommand( new KWCreateFrameCommand( QString::null, frameIt.current() ) );
 
2295
                        }
 
2296
                    }
 
2297
                }
 
2298
            }
 
2299
        }
 
2300
    }
 
2301
    refreshDocStructure( (int)Embedded );
 
2302
}
 
2303
 
1797
2304
QDomDocument KWDocument::saveXML()
1798
2305
{
1799
 
    QDomDocument doc( "DOC" );
1800
 
    doc.appendChild( doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ) );
1801
 
    QDomElement kwdoc = doc.createElement( "DOC" );
 
2306
    m_varColl->variableSetting()->setModificationDate(QDateTime::currentDateTime());
 
2307
    recalcVariables( VT_DATE );
 
2308
    recalcVariables( VT_TIME ); // for "current time"
 
2309
    QDomDocument doc = createDomDocument( "DOC", CURRENT_DTD_VERSION );
 
2310
    QDomElement kwdoc = doc.documentElement();
1802
2311
    kwdoc.setAttribute( "editor", "KWord" );
1803
2312
    kwdoc.setAttribute( "mime", "application/x-kword" );
1804
2313
    m_syntaxVersion = CURRENT_SYNTAX_VERSION;
1805
2314
    kwdoc.setAttribute( "syntaxVersion", m_syntaxVersion );
1806
 
    doc.appendChild( kwdoc );
1807
2315
 
1808
2316
    QDomElement paper = doc.createElement( "PAPER" );
1809
2317
    kwdoc.appendChild( paper );
1810
2318
    paper.setAttribute( "format", static_cast<int>( m_pageLayout.format ) );
 
2319
    paper.setAttribute( "pages", m_pages );
1811
2320
    paper.setAttribute( "width", m_pageLayout.ptWidth );
1812
2321
    paper.setAttribute( "height", m_pageLayout.ptHeight );
1813
2322
    paper.setAttribute( "orientation", static_cast<int>( m_pageLayout.orientation ) );
1817
2326
    paper.setAttribute( "fType", static_cast<int>( m_pageHeaderFooter.footer ) );
1818
2327
    paper.setAttribute( "spHeadBody", m_pageHeaderFooter.ptHeaderBodySpacing );
1819
2328
    paper.setAttribute( "spFootBody", m_pageHeaderFooter.ptFooterBodySpacing );
 
2329
    paper.setAttribute( "spFootNoteBody", m_pageHeaderFooter.ptFootNoteBodySpacing );
 
2330
    if ( m_footNoteSeparatorLinePos!=SLP_LEFT )
 
2331
    {
 
2332
        if (m_footNoteSeparatorLinePos==SLP_CENTERED )
 
2333
            paper.setAttribute( "slFootNotePosition", "centered" );
 
2334
        else if ( m_footNoteSeparatorLinePos==SLP_RIGHT )
 
2335
            paper.setAttribute( "slFootNotePosition", "right" );
 
2336
        else if ( m_footNoteSeparatorLinePos==SLP_LEFT ) //never !
 
2337
            paper.setAttribute( "slFootNotePosition", "left" );
 
2338
    }
 
2339
    if ( m_footNoteSeparatorLineType != SLT_SOLID )
 
2340
        paper.setAttribute( "slFootNoteType", static_cast<int>(m_footNoteSeparatorLineType) );
 
2341
 
 
2342
 
 
2343
    paper.setAttribute("slFootNoteLength", m_iFootNoteSeparatorLineLength);
 
2344
    paper.setAttribute("slFootNoteWidth", m_footNoteSeparatorLineWidth);
1820
2345
 
1821
2346
    // Now part of the app config
1822
2347
    //paper.setAttribute( "zoom",m_zoom );
1834
2359
    docattrs.setAttribute( "standardpage", 1 );
1835
2360
    docattrs.setAttribute( "hasHeader", static_cast<int>(isHeaderVisible()) );
1836
2361
    docattrs.setAttribute( "hasFooter", static_cast<int>(isFooterVisible()) );
1837
 
    docattrs.setAttribute( "unit", KWUnit::unitName(getUnit()) );
 
2362
    docattrs.setAttribute( "unit", KoUnit::unitName(getUnit()) );
1838
2363
    docattrs.setAttribute( "hasTOC", static_cast<int>(m_hasTOC));
1839
 
 
1840
 
//    out << otag << "<FOOTNOTEMGR>" << endl;
1841
 
//    footNoteManager.save( out );
1842
 
//    out << etag << "</FOOTNOTEMGR>" << endl;
 
2364
    docattrs.setAttribute( "tabStopValue", m_tabStop );
 
2365
 
 
2366
    // Save visual info for the first view, such as active table and active cell
 
2367
    // It looks like a hack, but reopening a document creates only one view anyway (David)
 
2368
    KWView * view = static_cast<KWView*>(views().getFirst());
 
2369
    if ( view ) // no view if embedded document
 
2370
    {
 
2371
        KWFrameSetEdit* edit = view->getGUI()->canvasWidget()->currentFrameSetEdit();
 
2372
        if ( edit )
 
2373
        {
 
2374
            docattrs.setAttribute( "activeFrameset", edit->frameSet()->getName() );
 
2375
            KWTextFrameSetEdit* textedit = dynamic_cast<KWTextFrameSetEdit *>(edit);
 
2376
            if ( textedit && textedit->cursor() ) {
 
2377
                KoTextCursor* cursor = textedit->cursor();
 
2378
                docattrs.setAttribute( "cursorParagraph", cursor->parag()->paragId() );
 
2379
                docattrs.setAttribute( "cursorIndex", cursor->index() );
 
2380
            }
 
2381
        }
 
2382
    }
 
2383
 
 
2384
    if( !m_bookmarkList.isEmpty() )
 
2385
    {
 
2386
        QDomElement bookmark = doc.createElement( "BOOKMARKS" );
 
2387
        kwdoc.appendChild( bookmark );
 
2388
 
 
2389
        QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
2390
        for ( ; book.current() ; ++book )
 
2391
        {
 
2392
            if ( book.current()->startParag()!=0 &&
 
2393
                 book.current()->endParag()!=0 &&
 
2394
                 !book.current()->frameSet()->isDeleted())
 
2395
            {
 
2396
                QDomElement bookElem = doc.createElement( "BOOKMARKITEM" );
 
2397
                bookmark.appendChild( bookElem );
 
2398
                bookElem.setAttribute( "name", book.current()->bookMarkName());
 
2399
                bookElem.setAttribute( "frameset", book.current()->frameSet()->getName());
 
2400
                bookElem.setAttribute( "startparag", book.current()->startParag()->paragId());
 
2401
                bookElem.setAttribute( "endparag", book.current()->endParag()->paragId());
 
2402
 
 
2403
                bookElem.setAttribute( "cursorIndexStart", book.current()->bookmarkStartIndex());
 
2404
                bookElem.setAttribute( "cursorIndexEnd", book.current()->bookmarkEndIndex());
 
2405
 
 
2406
            }
 
2407
        }
 
2408
    }
 
2409
    getVariableCollection()->variableSetting()->save(kwdoc );
1843
2410
 
1844
2411
    QDomElement framesets = doc.createElement( "FRAMESETS" );
1845
2412
    kwdoc.appendChild( framesets );
1846
2413
 
1847
 
    QValueList<KoImageKey> saveImages;
1848
 
    QValueList<KoClipartKey> saveCliparts;
1849
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
2414
    m_textImageRequests.clear(); // for KWTextImage
 
2415
    QValueList<KoPictureKey> savePictures;
 
2416
 
 
2417
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1850
2418
    for ( ; fit.current() ; ++fit )
1851
2419
    {
1852
2420
        KWFrameSet *frameSet = fit.current();
1857
2425
        {
1858
2426
            // Set the child geometry from the frame geometry, with no viewmode applied
1859
2427
            // to prepare saving below with the correct geometry
1860
 
            static_cast<KWPartFrameSet *>(frameSet)->updateChildGeometry();
 
2428
            static_cast<KWPartFrameSet *>(frameSet)->updateChildGeometry( 0L );
1861
2429
        }
1862
2430
 
1863
2431
        // If picture frameset, make a note of the image it needs.
1864
 
        if ( !frameSet->isDeleted() && frameSet->type() == FT_PICTURE )
1865
 
        {
1866
 
            KoImageKey key = static_cast<KWPictureFrameSet *>( frameSet )->key();
1867
 
            if ( !saveImages.contains( key ) )
1868
 
                saveImages.append( key );
1869
 
        }
1870
 
        if ( !frameSet->isDeleted() && frameSet->type() == FT_CLIPART )
1871
 
        {
1872
 
            KoClipartKey key = static_cast<KWClipartFrameSet *>( frameSet )->key();
1873
 
            if ( !saveCliparts.contains( key ) )
1874
 
                saveCliparts.append( key );
1875
 
        }
 
2432
        if ( !frameSet->isDeleted() && ( frameSet->type() == FT_PICTURE ) )
 
2433
        {
 
2434
            KoPictureKey key = static_cast<KWPictureFrameSet *>( frameSet )->key();
 
2435
            if ( !savePictures.contains( key ) )
 
2436
                savePictures.append( key );
 
2437
        }
 
2438
    }
 
2439
 
 
2440
    // Process the data of the KWTextImage classes.
 
2441
    QPtrListIterator<KWTextImage> textIt ( m_textImageRequests );
 
2442
    for ( ; textIt.current() ; ++textIt )
 
2443
    {
 
2444
        KoPictureKey key = textIt.current()->getKey();
 
2445
        kdDebug(32001) << "KWDocument::saveXML registering text image " << key.toString() << endl;
 
2446
        if ( !savePictures.contains( key ) )
 
2447
            savePictures.append( key );
1876
2448
    }
1877
2449
 
1878
2450
    QDomElement styles = doc.createElement( "STYLES" );
1879
2451
    kwdoc.appendChild( styles );
 
2452
    QPtrList<KWStyle> m_styleList(m_styleColl->styleList());
1880
2453
    for ( KWStyle * p = m_styleList.first(); p != 0L; p = m_styleList.next() )
1881
 
        p->save( styles );
1882
 
 
1883
 
    // Save the PIXMAPS list
1884
 
    QString prefix = isStoredExtern() ? QString::null : url().url() + "/";
1885
 
    QDomElement pixmaps = m_imageCollection.saveXML( doc, saveImages, prefix );
1886
 
    kwdoc.appendChild( pixmaps );
1887
 
    QDomElement cliparts = m_clipartCollection.saveXML( doc, saveCliparts, prefix );
1888
 
    kwdoc.appendChild( cliparts );
1889
 
 
 
2454
        saveStyle( p, styles );
 
2455
 
 
2456
    QDomElement frameStyles = doc.createElement( "FRAMESTYLES" );
 
2457
    kwdoc.appendChild( frameStyles );
 
2458
    QPtrList<KWFrameStyle> m_frameStyleList(m_frameStyleColl->frameStyleList());
 
2459
    for ( KWFrameStyle * p = m_frameStyleList.first(); p != 0L; p = m_frameStyleList.next() )
 
2460
        saveFrameStyle( p, frameStyles );
 
2461
 
 
2462
    QDomElement tableStyles = doc.createElement( "TABLESTYLES" );
 
2463
    kwdoc.appendChild( tableStyles );
 
2464
    QPtrList<KWTableStyle> m_tableStyleList(m_tableStyleColl->tableStyleList());
 
2465
    for ( KWTableStyle * p = m_tableStyleList.first(); p != 0L; p = m_tableStyleList.next() )
 
2466
        saveTableStyle( p, tableStyles );
 
2467
 
 
2468
    if (specialOutputFlag()==SaveAsKOffice1dot1)
 
2469
    {
 
2470
        m_pictureCollection.saveXMLAsKOffice1Dot1( doc, kwdoc, savePictures );
 
2471
    }
 
2472
    else
 
2473
    {
 
2474
        QDomElement pictures = m_pictureCollection.saveXML( KoPictureCollection::CollectionPicture, doc, savePictures );
 
2475
        kwdoc.appendChild( pictures );
 
2476
    }
1890
2477
    // Not needed anymore
1891
2478
#if 0
1892
2479
    // Write out the list of parags (id) that form the table of contents, see KWContents::createContents
1903
2490
    }
1904
2491
#endif
1905
2492
 
1906
 
/*
1907
 
    out << otag << "<SERIALL>" << endl;
1908
 
    slDataBase->save( out );
1909
 
    out << etag << "</SERIALL>" << endl; */
1910
 
 
1911
 
    // Write "OBJECT" tag for every child
1912
 
    QListIterator<KoDocumentChild> chl( children() );
 
2493
    QDomElement mailMerge=m_slDataBase->save(doc);
 
2494
    kwdoc.appendChild(mailMerge);
 
2495
 
 
2496
    if( !m_spellListIgnoreAll.isEmpty() )
 
2497
    {
 
2498
        QDomElement spellCheckIgnore = doc.createElement( "SPELLCHECKIGNORELIST" );
 
2499
        kwdoc.appendChild( spellCheckIgnore );
 
2500
        for ( QStringList::Iterator it = m_spellListIgnoreAll.begin(); it != m_spellListIgnoreAll.end(); ++it )
 
2501
        {
 
2502
            QDomElement spellElem = doc.createElement( "SPELLCHECKIGNOREWORD" );
 
2503
            spellCheckIgnore.appendChild( spellElem );
 
2504
            spellElem.setAttribute( "word", *it );
 
2505
        }
 
2506
    }
 
2507
 
 
2508
    // Save embedded objects
 
2509
    saveEmbeddedObjects( kwdoc, children() );
 
2510
    return doc;
 
2511
}
 
2512
 
 
2513
void KWDocument::saveEmbeddedObjects( QDomElement& parentElem, const QPtrList<KoDocumentChild>& childList )
 
2514
{
 
2515
    // Write "OBJECT" tag for every child, appending "EMBEDDING" tags to the main XML
 
2516
    QPtrListIterator<KoDocumentChild> chl( childList );
 
2517
    QDomDocument doc = parentElem.ownerDocument();
1913
2518
    for( ; chl.current(); ++chl ) {
1914
 
        QDomElement embeddedElem = doc.createElement( "EMBEDDED" );
1915
 
        kwdoc.appendChild( embeddedElem );
1916
 
 
1917
2519
        KWChild* curr = static_cast<KWChild*>(chl.current());
1918
 
 
1919
 
        QDomElement objectElem = curr->save( doc, true );
1920
 
        embeddedElem.appendChild( objectElem );
1921
 
 
1922
 
        QDomElement settingsElem = doc.createElement( "SETTINGS" );
1923
 
        embeddedElem.appendChild( settingsElem );
1924
 
 
1925
 
        QListIterator<KWFrameSet> fit = framesetsIterator();
1926
 
        for ( ; fit.current() ; ++fit )
 
2520
        if ( !curr->isDeleted() )
1927
2521
        {
1928
 
            KWFrameSet * fs = fit.current();
1929
 
            if ( fs->type() == FT_PART &&
1930
 
                 dynamic_cast<KWPartFrameSet*>( fs )->getChild() == curr )
1931
 
                fs->save( settingsElem );
 
2522
            QDomElement embeddedElem = doc.createElement( "EMBEDDED" );
 
2523
            parentElem.appendChild( embeddedElem );
 
2524
 
 
2525
            QDomElement objectElem = curr->save( doc, true );
 
2526
            embeddedElem.appendChild( objectElem );
 
2527
 
 
2528
            QDomElement settingsElem = doc.createElement( "SETTINGS" );
 
2529
            embeddedElem.appendChild( settingsElem );
 
2530
 
 
2531
            curr->partFrameSet()->save( settingsElem );
1932
2532
        }
1933
2533
    }
1934
 
 
1935
 
    return doc;
 
2534
}
 
2535
 
 
2536
void KWDocument::saveStyle( KWStyle *sty, QDomElement parentElem )
 
2537
{
 
2538
    QDomDocument doc = parentElem.ownerDocument();
 
2539
    QDomElement styleElem = doc.createElement( "STYLE" );
 
2540
    parentElem.appendChild( styleElem );
 
2541
 
 
2542
    sty->saveStyle( styleElem );
 
2543
 
 
2544
    QDomElement formatElem = KWTextParag::saveFormat( doc, &sty->format(), 0L, 0, 0 );
 
2545
    styleElem.appendChild( formatElem );
 
2546
}
 
2547
 
 
2548
void KWDocument::saveFrameStyle( KWFrameStyle *sty, QDomElement parentElem )
 
2549
{
 
2550
    QDomDocument doc = parentElem.ownerDocument();
 
2551
    QDomElement frameStyleElem = doc.createElement( "FRAMESTYLE" );
 
2552
    parentElem.appendChild( frameStyleElem );
 
2553
 
 
2554
    sty->saveFrameStyle( frameStyleElem );
 
2555
}
 
2556
 
 
2557
void KWDocument::saveTableStyle( KWTableStyle *sty, QDomElement parentElem )
 
2558
{
 
2559
    QDomDocument doc = parentElem.ownerDocument();
 
2560
    QDomElement tableStyleElem = doc.createElement( "TABLESTYLE" );
 
2561
    parentElem.appendChild( tableStyleElem );
 
2562
 
 
2563
    sty->saveTableStyle( tableStyleElem );
1936
2564
}
1937
2565
 
1938
2566
bool KWDocument::completeSaving( KoStore *_store )
1940
2568
    if ( !_store )
1941
2569
        return TRUE;
1942
2570
 
1943
 
    QValueList<KoImageKey> saveImages;
1944
 
    QValueList<KoClipartKey> saveCliparts;
1945
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
2571
    QString u = KURL( url() ).path();
 
2572
 
 
2573
    QValueList<KoPictureKey> savePictures;
 
2574
 
 
2575
    // At first, we must process the data of the KWTextImage classes.
 
2576
    // Process the data of the KWTextImage classes.
 
2577
    QPtrListIterator<KWTextImage> textIt ( m_textImageRequests );
 
2578
    for ( ; textIt.current() ; ++textIt )
 
2579
    {
 
2580
        KoPictureKey key = textIt.current()->getKey();
 
2581
        kdDebug(32001) << "KWDocument::saveXML registering text image " << key.toString() << endl;
 
2582
        if ( !savePictures.contains( key ) )
 
2583
            savePictures.append( key );
 
2584
    }
 
2585
    m_textImageRequests.clear(); // Save some memory!
 
2586
 
 
2587
    // Now do the images/cliparts in frames.
 
2588
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
1946
2589
    for ( ; fit.current() ; ++fit )
1947
2590
    {
1948
2591
        KWFrameSet *frameSet = fit.current();
1949
2592
        // If picture frameset, make a note of the image it needs.
1950
 
        if ( !frameSet->isDeleted() && frameSet->type() == FT_PICTURE )
1951
 
        {
1952
 
            KoImageKey key = static_cast<KWPictureFrameSet *>( frameSet )->key();
1953
 
            if ( !saveImages.contains( key ) )
1954
 
                saveImages.append( key );
1955
 
        }
1956
 
        if ( !frameSet->isDeleted() && frameSet->type() == FT_CLIPART )
1957
 
        {
1958
 
            KoClipartKey key = static_cast<KWClipartFrameSet *>( frameSet )->key();
1959
 
            if ( !saveCliparts.contains( key ) )
1960
 
                saveCliparts.append( key );
1961
 
        }
1962
 
    }
1963
 
    QString prefix = isStoredExtern() ? QString::null : url().url() + "/";
1964
 
    m_imageCollection.saveToStore( _store, saveImages, prefix );
1965
 
    m_clipartCollection.saveToStore( _store, saveCliparts, prefix );
1966
 
    return TRUE;
1967
 
}
1968
 
 
1969
 
bool KWDocument::saveChildren( KoStore *_store, const QString &_path )
1970
 
{
1971
 
    int i = 0;
1972
 
 
1973
 
    QListIterator<KoDocumentChild> it( children() );
1974
 
    for( ; it.current(); ++it ) {
1975
 
        QString internURL = QString( "%1/%2" ).arg( _path ).arg( i++ );
1976
 
        if ( !((KoDocumentChild*)(it.current()))->document()->saveToStore( _store, internURL ) )
1977
 
          return FALSE;
1978
 
    }
1979
 
    return true;
 
2593
        if ( !frameSet->isDeleted() && ( frameSet->type() == FT_PICTURE ) )
 
2594
        {
 
2595
            KoPictureKey key = static_cast<KWPictureFrameSet *>( frameSet )->key();
 
2596
            if ( !savePictures.contains( key ) )
 
2597
                savePictures.append( key );
 
2598
        }
 
2599
    }
 
2600
    if (specialOutputFlag()==SaveAsKOffice1dot1)
 
2601
    {
 
2602
        return m_pictureCollection.saveToStoreAsKOffice1Dot1( KoPictureCollection::CollectionImage, _store, savePictures );
 
2603
    }
 
2604
    else
 
2605
    {
 
2606
        return m_pictureCollection.saveToStore( KoPictureCollection::CollectionPicture, _store, savePictures );
 
2607
    }
1980
2608
}
1981
2609
 
1982
2610
void KWDocument::addView( KoView *_view )
1983
2611
{
1984
2612
    m_lstViews.append( (KWView*)_view );
1985
2613
    KoDocument::addView( _view );
 
2614
    QPtrListIterator<KWView> it( m_lstViews );
 
2615
    for ( ; it.current() ; ++it )
 
2616
        it.current()->deselectAllFrames();
1986
2617
}
1987
2618
 
1988
2619
void KWDocument::removeView( KoView *_view )
1995
2626
 
1996
2627
void KWDocument::addShell( KoMainWindow *shell )
1997
2628
{
1998
 
#if KDE_VERSION >= 220 // kdelibs >= 2.2 only
1999
2629
    connect( shell, SIGNAL( documentSaved() ), m_commandHistory, SLOT( documentSaved() ) );
2000
 
#endif
2001
2630
    KoDocument::addShell( shell );
2002
2631
}
2003
2632
 
2004
2633
KoView* KWDocument::createViewInstance( QWidget* parent, const char* name )
2005
2634
{
2006
 
    return new KWView( parent, name, this );
 
2635
    return new KWView( m_viewMode, parent, name, this );
2007
2636
}
2008
2637
 
2009
2638
void KWDocument::paintContent( QPainter& painter, const QRect& _rect, bool transparent, double zoomX, double zoomY )
2010
2639
{
2011
 
    //kdDebug() << "KWDocument::paintContent zoomX=" << zoomX << " zoomY=" << zoomY << endl;
 
2640
    //kdDebug(32001) << "KWDocument::paintContent m_zoom=" << m_zoom << " zoomX=" << zoomX << " zoomY=" << zoomY << " transparent=" << transparent << endl;
2012
2641
    m_zoom = 100;
2013
2642
    if ( m_zoomedResolutionX != zoomX || m_zoomedResolutionY != zoomY )
2014
2643
    {
2015
 
        m_zoomedResolutionX = zoomX;
2016
 
        m_zoomedResolutionY = zoomY;
2017
 
        newZoomAndResolution( false, painter.device() && painter.device()->devType() == QInternal::Printer );
 
2644
        setResolution( zoomX, zoomY );
 
2645
        bool forPrint = painter.device() && painter.device()->devType() == QInternal::Printer;
 
2646
        newZoomAndResolution( false, forPrint );
 
2647
        if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() )
 
2648
            formulaDocument->setZoomAndResolution( m_zoom, zoomX, zoomY, false, forPrint );
2018
2649
    }
2019
2650
 
2020
2651
    QRect rect( _rect );
2033
2664
        eraseEmptySpace( &painter, emptyRegion, cg.brush( QColorGroup::Base ) );
2034
2665
    }
2035
2666
 
2036
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
2667
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2037
2668
    for ( ; fit.current() ; ++fit )
2038
2669
    {
2039
2670
        KWFrameSet * frameset = fit.current();
2040
 
        if ( frameset->isVisible() && !frameset->isFloating() )
 
2671
        if ( frameset->isVisible( viewMode ) && !frameset->isFloating() )
2041
2672
            frameset->drawContents( &painter, rect, cg, false /*onlyChanged*/, true /*resetChanged*/,
2042
 
                                    0L, viewMode, 0L );
 
2673
                                    0L, viewMode );
2043
2674
    }
2044
2675
    delete viewMode;
2045
2676
}
2046
2677
 
 
2678
QPixmap KWDocument::generatePreview( const QSize& size )
 
2679
{
 
2680
    int oldZoom = m_zoom;
 
2681
    double oldZoomX = m_zoomedResolutionX;
 
2682
    double oldZoomY = m_zoomedResolutionY;
 
2683
 
 
2684
    QPixmap pix = KoDocument::generatePreview(size);
 
2685
 
 
2686
    m_zoom = oldZoom;
 
2687
    setResolution( oldZoomX, oldZoomY );
 
2688
    newZoomAndResolution( false, false );
 
2689
 
 
2690
    if ( KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document() ) {
 
2691
        formulaDocument->setZoomAndResolution( oldZoom, oldZoomX, oldZoomY );
 
2692
    }
 
2693
    return pix;
 
2694
}
 
2695
 
2047
2696
void KWDocument::createEmptyRegion( const QRect & crect, QRegion & emptyRegion, KWViewMode * viewMode )
2048
2697
{
2049
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
2698
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2050
2699
    for ( ; fit.current() ; ++fit )
2051
2700
    {
2052
2701
        KWFrameSet *frameset = fit.current();
2053
 
        if ( frameset->isVisible() )
 
2702
        if ( frameset->isVisible( viewMode ) )
2054
2703
            frameset->createEmptyRegion( crect, emptyRegion, viewMode );
2055
2704
    }
2056
2705
}
2058
2707
void KWDocument::eraseEmptySpace( QPainter * painter, const QRegion & emptySpaceRegion, const QBrush & brush )
2059
2708
{
2060
2709
    painter->save();
2061
 
    // Translate emptySpaceRegion in device coordinates
2062
 
    // ( ARGL why on earth isn't QPainter::setClipRegion in transformed coordinate system ?? )
2063
 
    QRegion devReg;
2064
 
    QArray<QRect>rs = emptySpaceRegion.rects();
2065
 
    rs.detach();
2066
 
    for ( uint i = 0 ; i < rs.size() ; ++i )
2067
 
    {
2068
 
        //kdDebug() << "KWDocument::drawBorders emptySpaceRegion includes: " << DEBUGRECT( rs[i] ) << endl;
2069
 
        rs[i] = painter->xForm( rs[i] );
2070
 
    }
2071
 
    devReg.setRects( rs.data(), rs.size() );
2072
 
    painter->setClipRegion( devReg );
 
2710
    painter->setClipRegion( emptySpaceRegion, QPainter::CoordPainter );
2073
2711
    painter->setPen( Qt::NoPen );
2074
2712
 
2075
 
    //kdDebug() << "KWDocument::eraseEmptySpace emptySpaceRegion: " << DEBUGRECT( emptySpaceRegion.boundingRect() ) << endl;
 
2713
    //kdDebug(32001) << "KWDocument::eraseEmptySpace emptySpaceRegion: " << emptySpaceRegion << endl;
 
2714
    //kdDebug(32001) << "                            boundingRect: " << DEBUGRECT( emptySpaceRegion.boundingRect() ) << endl;
2076
2715
    painter->fillRect( emptySpaceRegion.boundingRect(), brush );
2077
2716
    painter->restore();
2078
2717
}
2079
2718
 
2080
2719
void KWDocument::insertObject( const KoRect& rect, KoDocumentEntry& _e )
2081
2720
{
2082
 
 
2083
2721
    KoDocument* doc = _e.createDoc( this );
2084
 
    if ( !doc || !doc->initDoc() )
 
2722
    if ( !doc )
 
2723
        return;
 
2724
    doc->setInitDocFlags( KoDocument::InitDocEmbedded );
 
2725
    if ( !doc->initDoc() )
2085
2726
        return;
2086
2727
 
2087
2728
    KWChild* ch = new KWChild( this, rect.toQRect(), doc );
2091
2732
 
2092
2733
    KWPartFrameSet *frameset = new KWPartFrameSet( this, ch, QString::null );
2093
2734
    KWFrame *frame = new KWFrame(frameset, rect.x(), rect.y(), rect.width(), rect.height() );
 
2735
    frame->setZOrder( maxZOrder( frame->pageNum(this) ) + 1 ); // make sure it's on top
2094
2736
    frameset->addFrame( frame );
2095
2737
    addFrameSet( frameset );
 
2738
    frameset->updateChildGeometry( viewMode() ); // set initial coordinates of 'ch' correctly
2096
2739
 
2097
 
    KWCreateFrameCommand *cmd = new KWCreateFrameCommand( i18n("Create a part frame"), frame);
 
2740
    KWCreateFrameCommand *cmd = new KWCreateFrameCommand( i18n("Create Part Frame"), frame);
2098
2741
    addCommand(cmd);
2099
2742
 
2100
2743
    emit sig_insertObject( ch, frameset );
2102
2745
    frameChanged( frame ); // repaint etc.
2103
2746
}
2104
2747
 
2105
 
KWStyle* KWDocument::findStyle( const QString & _name )
2106
 
{
2107
 
    // Caching, to speed things up
2108
 
    if ( m_lastStyle && m_lastStyle->name() == _name )
2109
 
        return m_lastStyle;
2110
 
 
2111
 
    QListIterator<KWStyle> styleIt( m_styleList );
2112
 
    for ( ; styleIt.current(); ++styleIt )
 
2748
 
 
2749
void KWDocument::delayedRepaintAllViews() {
 
2750
    if (!m_repaintAllViewsPending) {
 
2751
        QTimer::singleShot( 0, this, SLOT( slotRepaintAllViews() ) );
 
2752
        m_repaintAllViewsPending=true;
 
2753
    }
 
2754
}
 
2755
 
 
2756
void KWDocument::slotRepaintAllViews() {
 
2757
    m_repaintAllViewsPending=false;
 
2758
    repaintAllViews( false );
 
2759
}
 
2760
 
 
2761
void KWDocument::delayedRecalcFrames( int fromPage ) {
 
2762
    //kdDebug() << k_funcinfo << fromPage << endl;
 
2763
    if ( m_recalcFramesPending == -1 || fromPage < m_recalcFramesPending )
2113
2764
    {
2114
 
        if ( styleIt.current()->name() == _name ) {
2115
 
            m_lastStyle = styleIt.current();
2116
 
            return m_lastStyle;
2117
 
        }
 
2765
        m_recalcFramesPending = fromPage;
 
2766
        QTimer::singleShot( 0, this, SLOT( slotRecalcFrames() ) );
2118
2767
    }
2119
 
 
2120
 
    return 0L;
2121
 
}
2122
 
 
2123
 
/* Update all views of this document, area can be cleared
2124
 
   before redrawing with the _erase flag. (false implied)
2125
 
   All views EXCEPT the argument _view are updated ( 0L = all )
2126
 
 */
 
2768
}
 
2769
 
 
2770
void KWDocument::slotRecalcFrames() {
 
2771
    int from = m_recalcFramesPending;
 
2772
    kdDebug() << k_funcinfo << "from=" << from << endl;
 
2773
    m_recalcFramesPending = -1;
 
2774
    if ( from != -1 )
 
2775
        recalcFrames( from );
 
2776
}
 
2777
 
2127
2778
void KWDocument::repaintAllViewsExcept( KWView *_view, bool erase )
2128
2779
{
2129
 
    //kdDebug() << "KWDocument::repaintAllViewsExcept" << endl;
 
2780
    //kdDebug(32001) << "KWDocument::repaintAllViewsExcept" << endl;
2130
2781
    for ( KWView * viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() ) {
2131
 
        if ( viewPtr->getGUI() && viewPtr->getGUI()->canvasWidget() ) {
2132
 
            if ( viewPtr != _view )
2133
 
                viewPtr->getGUI()->canvasWidget()->repaintAll( erase );
 
2782
        if ( viewPtr != _view /*&& viewPtr->getGUI() && viewPtr->getGUI()->canvasWidget()*/ ) {
 
2783
            viewPtr->getGUI()->canvasWidget()->repaintAll( erase );
2134
2784
        }
2135
2785
    }
2136
2786
}
2137
2787
 
2138
 
void KWDocument::setUnit( KWUnit::Unit _unit )
 
2788
void KWDocument::setUnit( KoUnit::Unit _unit )
2139
2789
{
2140
2790
    m_unit = _unit;
2141
 
    switch ( m_unit ) {
2142
 
    case KWUnit::U_MM: m_pageLayout.unit = PG_MM;
2143
 
        break;
2144
 
    case KWUnit::U_PT: m_pageLayout.unit = PG_PT;
2145
 
        break;
2146
 
    case KWUnit::U_INCH: m_pageLayout.unit = PG_INCH;
2147
 
        break;
2148
 
    }
2149
 
 
2150
2791
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() ) {
2151
2792
        if ( viewPtr->getGUI() ) {
2152
 
            viewPtr->getGUI()->getHorzRuler()->setUnit( KWUnit::unitName( m_unit ) );
2153
 
            viewPtr->getGUI()->getVertRuler()->setUnit( KWUnit::unitName( m_unit ) );
 
2793
            viewPtr->getGUI()->getHorzRuler()->setUnit( KoUnit::unitName( m_unit ) );
 
2794
            viewPtr->getGUI()->getVertRuler()->setUnit( KoUnit::unitName( m_unit ) );
2154
2795
        }
2155
2796
    }
2156
2797
}
2161
2802
        viewPtr->updateStyleList();
2162
2803
}
2163
2804
 
2164
 
void KWDocument::applyStyleChange( KWStyle * changedStyle, int paragLayoutChanged, int formatChanged )
2165
 
{
2166
 
    QList<KWTextFrameSet> textFramesets;
2167
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2168
 
    for ( ; fit.current() ; ++fit ) {
2169
 
        fit.current()->addTextFramesets(textFramesets);
2170
 
    }
 
2805
void KWDocument::updateStyleListOrder( const QStringList &list )
 
2806
{
 
2807
    styleCollection()->updateStyleListOrder( list );
 
2808
}
 
2809
 
 
2810
void KWDocument::applyStyleChange( StyleChangeDefMap changed )
 
2811
{
 
2812
    QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
2171
2813
 
2172
2814
    KWTextFrameSet *frm;
2173
2815
    for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
2174
 
        frm->applyStyleChange( changedStyle, paragLayoutChanged, formatChanged );
 
2816
        frm->applyStyleChange( changed );
2175
2817
    }
2176
2818
}
2177
2819
 
 
2820
void KWDocument::updateAllFrameStyleLists()
 
2821
{
 
2822
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
2823
        viewPtr->updateFrameStyleList();
 
2824
}
 
2825
 
 
2826
void KWDocument::updateAllTableStyleLists()
 
2827
{
 
2828
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
2829
        viewPtr->updateTableStyleList();
 
2830
}
 
2831
 
2178
2832
void KWDocument::repaintAllViews( bool erase )
2179
2833
{
2180
 
    //kdDebug() << "KWDocument::repaintAllViews" << endl;
 
2834
    //kdDebug(32001) << "KWDocument::repaintAllViews" << endl;
2181
2835
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
2182
2836
        viewPtr->getGUI()->canvasWidget()->repaintAll( erase );
2183
2837
}
2184
2838
 
2185
 
void KWDocument::appendPage( /*unsigned int _page*/ )
 
2839
QPtrList<KWFrame> KWDocument::framesToCopyOnNewPage( int afterPageNum ) const // can be -1 for 'before page 0'
2186
2840
{
2187
 
    int thisPageNum = m_pages-1;
2188
 
#ifdef DEBUG_PAGES
2189
 
    kdDebug(32002) << "KWDocument::appendPage m_pages=" << m_pages << " so thisPageNum=" << thisPageNum << endl;
2190
 
#endif
2191
 
    m_pages++;
2192
 
 
2193
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2194
 
    for ( ; fit.current() ; ++fit )
2195
 
    {
2196
 
        KWFrameSet * frameSet = fit.current();
 
2841
    // Look at frames on pages afterPageNum and afterPageNum-1 (for sheetside stuff)
 
2842
    QPtrList<KWFrame> framesToLookAt;
 
2843
    if ( afterPageNum >= 0 )
 
2844
        framesToLookAt = framesInPage( afterPageNum, false );
 
2845
 
 
2846
    if ( afterPageNum >= 1 )
 
2847
    {
 
2848
        QPtrList<KWFrame> framesToAlsoLookAt = framesInPage( afterPageNum-1, false ); // order doesn't matter
 
2849
 
 
2850
        // Merge into single list. Other alternative, two loops, code inside moved to another method.
 
2851
        QPtrListIterator<KWFrame> frameAlsoIt( framesToAlsoLookAt );
 
2852
        for ( ; frameAlsoIt.current(); ++frameAlsoIt )
 
2853
            framesToLookAt.append( frameAlsoIt.current() );
 
2854
    }
 
2855
 
 
2856
    QPtrList<KWFrame> framesToCopy; // the result
 
2857
 
 
2858
    QPtrListIterator<KWFrame> frameIt( framesToLookAt );
 
2859
    for ( ; frameIt.current(); ++frameIt )
 
2860
    {
 
2861
        KWFrame * frame = frameIt.current();
 
2862
        KWFrameSet* frameSet = frame->frameSet();
 
2863
 
2197
2864
        // don't add tables! A table cell ( frameset ) _must_ not have cells auto-added to them!
2198
2865
        if ( frameSet->type() == FT_TABLE ) continue;
2199
2866
 
 
2867
        /* copy the frame if: - it is on this page or
 
2868
           - it is on the former page and the frame is set to double sided.
 
2869
           - AND the frame is set to be reconnected or copied
 
2870
           -  */
2200
2871
#ifdef DEBUG_PAGES
2201
 
        kdDebug(32002) << "KWDocument::appendPage looking at frameset " << frameSet->getName() << endl;
 
2872
        kdDebug(32002) << "KWDocument::framesToCopyOnNewPage looking at frame " << frame << ", pageNum=" << frame->pageNum() << " from " << frameSet->getName() << endl;
 
2873
        static const char * newFrameBh[] = { "Reconnect", "NoFollowup", "Copy" };
 
2874
        kdDebug(32002) << "   frame->newFrameBehavior()==" << newFrameBh[frame->newFrameBehavior()] << endl;
2202
2875
#endif
2203
 
        // KWFrameSet::addFrame triggers a reshuffle in the frames list (KWTextFrameSet::updateFrames)
2204
 
        // which destroys the iterators -> append the new frames at the end.
2205
 
        QList<KWFrame> newFrames;
2206
 
 
2207
 
        QListIterator<KWFrame> frameIt( frameSet->frameIterator() );
2208
 
        for ( ; frameIt.current(); ++frameIt )
 
2876
        if ( (frame->pageNum() == afterPageNum ||
 
2877
              (frame->pageNum() == afterPageNum -1 && frame->sheetSide() != KWFrame::AnySide) )
 
2878
             &&
 
2879
             ( ( frame->newFrameBehavior()==KWFrame::Reconnect && frameSet->type() == FT_TEXT ) ||  // (*)
 
2880
               ( frame->newFrameBehavior()==KWFrame::Copy && !frameSet->isAHeader() && !frameSet->isAFooter() ) ) // (**)
 
2881
            )
2209
2882
        {
2210
 
            KWFrame * frame = frameIt.current();
2211
 
            /* copy the frame if: - it is on this page or
2212
 
                                  - it is on the former page and the frame is set to double sided.
2213
 
                                  - AND the frame is set to be reconnected or copied
2214
 
                                  -  */
2215
 
#ifdef DEBUG_PAGES
2216
 
            kdDebug(32002) << "   frame=" << frame << " frame->pageNum()=" << frame->pageNum() << endl;
2217
 
            static const char * newFrameBh[] = { "Reconnect", "NoFollowup", "Copy" };
2218
 
            kdDebug(32002) << "   frame->getNewFrameBehaviour()==" << newFrameBh[frame->getNewFrameBehaviour()] << endl;
2219
 
#endif
2220
 
            if ( (frame->pageNum() == thisPageNum ||
2221
 
                  (frame->pageNum() == thisPageNum -1 && frame->getSheetSide() != KWFrame::AnySide) )
2222
 
                 &&
2223
 
                 ( ( frame->getNewFrameBehaviour()==KWFrame::Reconnect && frameSet->type() == FT_TEXT ) ||  // (*)
2224
 
                   ( frame->getNewFrameBehaviour()==KWFrame::Copy && !frameSet->isAHeader() && !frameSet->isAFooter() ) ) // (**)
2225
 
                )
2226
 
            {
2227
 
                // (*) : Reconnect only makes sense for text frames
2228
 
                // (**) : NewFrameBehaviour == Copy is handled here except for headers/footers, which
2229
 
                // are created in recalcFrames() anyway.
2230
 
 
2231
 
                KWFrame *frm = frame->getCopy();
2232
 
                frm->moveBy( 0, ptPaperHeight() );
2233
 
                //frm->setPageNum( frame->pageNum()+1 );
2234
 
                newFrames.append( frm );
2235
 
 
2236
 
                if ( frame->getNewFrameBehaviour()==KWFrame::Copy )
2237
 
                    frm->setCopy( true );
2238
 
                //kdDebug(32002) << "   => created frame " << frm << endl;
2239
 
            }
 
2883
            // (*) : Reconnect only makes sense for text frames
 
2884
            // (**) : NewFrameBehavior == Copy is handled here except for headers/footers, which
 
2885
            // are created in recalcFrames() anyway.
 
2886
            framesToCopy.append( frame );
2240
2887
        }
2241
 
        QListIterator<KWFrame> newFrameIt( newFrames );
2242
 
        for ( ; newFrameIt.current() ; ++newFrameIt )
2243
 
            frameSet->addFrame( newFrameIt.current() );
2244
 
    }
 
2888
    }
 
2889
    return framesToCopy;
 
2890
}
 
2891
 
 
2892
void KWDocument::insertPage( int afterPageNum ) // can be -1 for 'before page 0'
 
2893
{
 
2894
#ifdef DEBUG_PAGES
 
2895
    kdDebug(32002) << "insertPage: afterPageNum=" << afterPageNum << endl;
 
2896
#endif
 
2897
    if ( processingType() == WP )
 
2898
        Q_ASSERT( afterPageNum == m_pages-1 ); // WP mode: can only append.
 
2899
 
 
2900
    // If not appending, move down everything after 'afterPageNum', to make room.
 
2901
    for ( int pg = m_pages-1 ; pg > afterPageNum ; --pg )
 
2902
    {
 
2903
        // pg is the 'src' page. Its contents must be moved to the page pg+1
 
2904
        QPtrList<KWFrame> frames = framesInPage( pg, false );
 
2905
#ifdef DEBUG_PAGES
 
2906
        kdDebug(32002) << "insertPage: moving " << frames.count() << " frames down, from page " << pg << endl;
 
2907
#endif
 
2908
        QPtrListIterator<KWFrame> frameIt( frames );
 
2909
        for ( ; frameIt.current(); ++frameIt )
 
2910
            frameIt.current()->moveBy( 0, ptPaperHeight() );
 
2911
    }
 
2912
 
 
2913
    m_pages++;
 
2914
 
 
2915
    // Fill in the new page
 
2916
    QPtrList<KWFrame> framesToCopy = framesToCopyOnNewPage( afterPageNum );
 
2917
    QPtrListIterator<KWFrame> frameIt( framesToCopy );
 
2918
    for ( ; frameIt.current(); ++frameIt )
 
2919
    {
 
2920
        KWFrame * frame = frameIt.current();
 
2921
 
 
2922
        KWFrame *newFrame = frame->getCopy();
 
2923
        newFrame->moveBy( 0, ptPaperHeight() );
 
2924
        //newFrame->setPageNum( frame->pageNum()+1 );
 
2925
        frame->frameSet()->addFrame( newFrame );
 
2926
 
 
2927
        if ( frame->newFrameBehavior()==KWFrame::Copy )
 
2928
            newFrame->setCopy( true );
 
2929
        //kdDebug(32002) << "   => created frame " << newFrame << " " << *newFrame << endl;
 
2930
    }
 
2931
}
 
2932
 
 
2933
int KWDocument::appendPage()
 
2934
{
 
2935
#ifdef DEBUG_PAGES
 
2936
    kdDebug(32002) << "KWDocument::appendPage m_pages=" << m_pages << " -> insertPage(" << m_pages-1 << ")" << endl;
 
2937
#endif
 
2938
    insertPage( m_pages - 1 );
 
2939
    return m_pages - 1; // Note that insertPage changes m_pages!
 
2940
}
 
2941
 
 
2942
void KWDocument::afterAppendPage( int pageNum )
 
2943
{
 
2944
#ifdef DEBUG_PAGES
 
2945
    kdDebug(32002) << "KWDocument::afterAppendPage " << pageNum << endl;
 
2946
#endif
2245
2947
    emit newContentsSize();
2246
2948
 
2247
 
    if ( isHeaderVisible() || isFooterVisible() )
2248
 
        recalcFrames();  // Get headers and footers on the new page
2249
 
    // setModified(TRUE); This is called by formatMore, possibly on loading -> don't set modified
 
2949
    if ( isHeaderVisible() || isFooterVisible() || m_bHasEndNotes )
 
2950
    {
 
2951
#ifdef DEBUG_PAGES
 
2952
        kdDebug(32002) << "KWDocument::afterAppendPage calling recalcFrames" << endl;
 
2953
#endif
 
2954
        // Get headers and footers on the new page
 
2955
        // This shouldn't delete the newly created page because it's still empty though
 
2956
        recalcFrames( pageNum, -1, KWFrameLayout::DontRemovePages );
 
2957
#ifdef DEBUG_PAGES
 
2958
        kdDebug(32002) << "KWDocument::afterAppendPage recalcFrames done" << endl;
 
2959
#endif
 
2960
    }
 
2961
    else
 
2962
    {
 
2963
        // Take into account the frames on the new page, and run updateFramesOnTopOrBelow (#73819)
 
2964
        updateAllFrames();
 
2965
    }
2250
2966
 
2251
2967
    recalcVariables( VT_PGNUM );
2252
2968
    emit pageNumChanged();
2254
2970
 
2255
2971
bool KWDocument::canRemovePage( int num )
2256
2972
{
2257
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
2973
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2258
2974
    for ( ; fit.current() ; ++fit )
2259
2975
    {
2260
2976
        KWFrameSet * frameSet = fit.current();
2261
 
        if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY ) // if header/footer/footnote
 
2977
        if ( frameSet->isHeaderOrFooter() ) // don't look at headers/footers, but look at footnotes/endnotes
2262
2978
            continue;
2263
2979
        if ( frameSet->isVisible() && !frameSet->canRemovePage( num ) )
2264
2980
            return false;
2269
2985
    return true;
2270
2986
}
2271
2987
 
2272
 
void KWDocument::removePage( int num )
 
2988
void KWDocument::removePage( int pageNum )
2273
2989
{
 
2990
    if ( processingType() == WP )
 
2991
        Q_ASSERT( pageNum == m_pages-1 ); // WP mode: can only remove last page.
 
2992
    Q_ASSERT( m_pages > 1 );
 
2993
    if ( m_pages == 1 )
 
2994
        return;
 
2995
 
 
2996
    // ## This assumes that framesInPage is up-to-date.
 
2997
    QPtrList<KWFrame> framesToDelete = framesInPage( pageNum, false );
2274
2998
#ifdef DEBUG_PAGES
2275
 
    kdDebug() << "KWDocument::removePage " << num << endl;
 
2999
    kdDebug(32002) << "KWDocument::removePage " << pageNum << ", " << framesToDelete.count() << " frames to delete" << endl;
2276
3000
#endif
2277
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2278
 
    for ( ; fit.current() ; ++fit )
 
3001
    QPtrListIterator<KWFrame> frameIt( framesToDelete );
 
3002
    for ( ; frameIt.current(); ++frameIt )
2279
3003
    {
2280
 
        KWFrameSet * frameSet = fit.current();
 
3004
        KWFrame * frame = frameIt.current();
 
3005
        KWFrameSet * frameSet = frame->frameSet();
2281
3006
        if ( frameSet->frameSetInfo() != KWFrameSet::FI_BODY )
2282
3007
            continue;
2283
 
        QListIterator<KWFrame> frameIt( frameSet->frameIterator() );
2284
 
        QList<KWFrame> toDelete;
2285
 
        for ( ; frameIt.current(); ++frameIt )
2286
 
        {
2287
 
            KWFrame * frm = frameIt.current();
2288
 
            if ( frm->pageNum() == num )
2289
 
            {
 
3008
        frameSet->delFrame( frame, true );
 
3009
    }
 
3010
 
 
3011
    // If not removing the last one, move up everything after the one we removed.
 
3012
    for ( int pg = pageNum+1 ; pg < m_pages ; ++pg )
 
3013
    {
 
3014
        // pg is the 'src' page. Its contents must be moved to the page pg-1
 
3015
        QPtrList<KWFrame> frames = framesInPage( pg, false );
2290
3016
#ifdef DEBUG_PAGES
2291
 
                kdDebug() << "KWDocument::removePage deleting frame " << frm << " (from frameset " << frameSet->getName() << ")" << endl;
 
3017
        kdDebug(32002) << "removePage: moving " << frames.count() << " frames up, from page " << pg << endl;
2292
3018
#endif
2293
 
                toDelete.append( frm ); // Can't remove the frame here, it screws up the iterator -> toDelete
2294
 
            }
2295
 
        }
2296
 
        QListIterator<KWFrame> delIt( toDelete );
2297
 
        for ( ; delIt.current(); ++delIt )
2298
 
            frameSet->delFrame( delIt.current(), true );
 
3019
        QPtrListIterator<KWFrame> frameIt( frames );
 
3020
        for ( ; frameIt.current(); ++frameIt )
 
3021
            frameIt.current()->moveBy( 0, -ptPaperHeight() );
2299
3022
    }
 
3023
 
2300
3024
    m_pages--;
2301
3025
#ifdef DEBUG_PAGES
2302
 
    kdDebug() << "KWDocument::removePage -- -> " << m_pages << endl;
 
3026
    kdDebug(32002) << "KWDocument::removePage -- -> " << m_pages << endl;
2303
3027
#endif
 
3028
    // Emitting this one for each page being removed helps giving the user some feedback
2304
3029
    emit pageNumChanged();
 
3030
}
 
3031
 
 
3032
void KWDocument::afterRemovePages()
 
3033
{
 
3034
    //### IMHO recalcFrames should take care of updateAllFrames (it already does it partially).
 
3035
    recalcFrames();
 
3036
    // Do this before recalcVariables (which repaints). The removed frames must be removed from the frame caches.
 
3037
    // We don't call updateAllFrames() directly, because it still calls
 
3038
    // updateFramesOnTopOrBelow, which is useless (and slow) here.
 
3039
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
3040
    for ( ; fit.current() ; ++fit )
 
3041
        fit.current()->updateFrames();
 
3042
 
2305
3043
    recalcVariables( VT_PGNUM );
2306
 
    recalcFrames();
2307
3044
    emit newContentsSize();
2308
3045
}
2309
3046
 
2310
 
KWFrameSet * KWDocument::getFrameSetByName( const QString & name )
 
3047
void KWDocument::tryRemovingPages()
 
3048
{
 
3049
    int lastPage = numPages() - 1;
 
3050
    bool removed = false;
 
3051
    // Last frame is empty -> try removing last page, and more if necessary
 
3052
    while ( lastPage > 0 && canRemovePage( lastPage ) )
 
3053
    {
 
3054
        removePage( lastPage ); // this modifies m_pages
 
3055
        if ( lastPage <= m_pages - 1 )
 
3056
        {
 
3057
            kdWarning() << "Didn't manage to remove page " << lastPage << " (still having " << m_pages << " pages ). Aborting" << endl;
 
3058
            break;
 
3059
        }
 
3060
        removed = true;
 
3061
        lastPage = m_pages - 1;
 
3062
    }
 
3063
    // Do all the recalc in one go. Speeds up deleting many pages.
 
3064
    if ( removed )
 
3065
        afterRemovePages();
 
3066
}
 
3067
 
 
3068
 
 
3069
KWFrameSet * KWDocument::frameSetByName( const QString & name )
2311
3070
{
2312
3071
    // Note: this isn't recursive, so it won't find table cells.
2313
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
3072
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2314
3073
    for ( ; fit.current() ; ++fit )
2315
3074
        if ( fit.current()->getName() == name )
2316
3075
            return fit.current();
2317
3076
    return 0L;
2318
3077
}
2319
3078
 
2320
 
KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border )
 
3079
//#define DEBUG_FRAMESELECT
 
3080
 
 
3081
 
 
3082
KWFrame * KWDocument::deepestInlineFrame(KWFrame *parent, const QPoint& nPoint, bool *border) {
 
3083
#ifdef DEBUG_FRAMESELECT
 
3084
    kdDebug(32001) << "KWDocument::deepestInlineFrame parent=" << parent << " nPoint=" << nPoint << endl;
 
3085
#endif
 
3086
    KWFrameSet *hostFrameSet=parent->frameSet();
 
3087
    KoPoint docPoint( unzoomPoint( nPoint ) );
 
3088
    int page = QMIN(m_pages-1, static_cast<int>(docPoint.y() / ptPaperHeight()));
 
3089
    QPtrList<KWFrame> frames = framesInPage(page);
 
3090
 
 
3091
    for (KWFrame *f = frames.last();f;f=frames.prev()) { // z-order
 
3092
        // only consider inline frames.
 
3093
        if (! f->frameSet()->isFloating())
 
3094
            continue;
 
3095
 
 
3096
        // only use the frames that are embedded in the parent
 
3097
        if (hostFrameSet != f->frameSet()->anchorFrameset())
 
3098
            continue;
 
3099
 
 
3100
        if(f->frameAtPos(nPoint, true)) {
 
3101
            if ( border ) *border = true;
 
3102
            return f;
 
3103
        }
 
3104
        if(f->frameAtPos(nPoint)) {
 
3105
            return deepestInlineFrame(f,nPoint,border);
 
3106
        }
 
3107
    }
 
3108
    if (border != 0) *border=false;
 
3109
    return parent;
 
3110
}
 
3111
 
 
3112
KWFrame * KWDocument::frameBelowFrame(const QPoint& nPoint, KWFrame *frame, bool *border) {
 
3113
 
 
3114
#ifdef DEBUG_FRAMESELECT
 
3115
    kdDebug(32001) << "KWDocument::frameBelowFrame frame=" << frame << " nPoint=" << nPoint << endl;
 
3116
#endif
 
3117
 
 
3118
    KWFrameSet *fs = frame->frameSet();
 
3119
    KoPoint docPoint( unzoomPoint( nPoint ) );
 
3120
    if (fs->isFloating()) {
 
3121
        // now lets be smart here; we know that a frame that is floating is embedded
 
3122
        // inside its hostFrameSet frame. This basically means that the frame directly
 
3123
        // below is the hostFrameSet frame :)
 
3124
        // since we know nPoint is already in frame, we don't have to check for anchorFrame here.
 
3125
        KWFrameSet *hostFrameSet = fs->anchorFrameset();
 
3126
        KWFrame *f = hostFrameSet->frameByBorder(nPoint);
 
3127
        if (f) {
 
3128
            if (border) *border=true;
 
3129
            return f;
 
3130
        }
 
3131
        f = hostFrameSet->frameAtPos(docPoint.x(),docPoint.y());
 
3132
        if (f) {
 
3133
            if (border) *border=false;
 
3134
            return f;
 
3135
        }
 
3136
    } else {
 
3137
        QPtrList<KWFrame> frames = frame->framesBelow();
 
3138
        for (KWFrame *f = frames.last(); f;f=frames.prev()) {
 
3139
                if (f->frameAtPos(nPoint,true)) {
 
3140
                        if(border) *border=true;
 
3141
                        return f;
 
3142
                }
 
3143
                if (f->frameAtPos(nPoint)) {
 
3144
                        return deepestInlineFrame(f,nPoint,border);
 
3145
                }
 
3146
        }
 
3147
    }
 
3148
    if (border != 0) *border=false;
 
3149
    return 0L;
 
3150
}
 
3151
 
 
3152
KWFrame * KWDocument::topFrameUnderMouse( const QPoint& nPoint, bool* border) {
 
3153
#ifdef DEBUG_FRAMESELECT
 
3154
    kdDebug(32001) << "KWDocument::topFrameUnderMouse nPoint=" << nPoint << endl;
 
3155
#endif
 
3156
    KoPoint docPoint( unzoomPoint( nPoint ) );
 
3157
    int page = QMIN(m_pages-1, static_cast<int>(docPoint.y() / ptPaperHeight()));
 
3158
    QPtrList<KWFrame> frames = framesInPage(page);
 
3159
 
 
3160
 
 
3161
    for (KWFrame *f = frames.last();f;f=frames.prev()) { // z-order
 
3162
        // only consider non-inline frames.
 
3163
        if (f->frameSet()->isFloating())
 
3164
            continue;
 
3165
 
 
3166
        if(f->frameAtPos(nPoint, true)) {
 
3167
#ifdef DEBUG_FRAMESELECT
 
3168
            kdDebug(32001) << "KWDocument::topFrameUnderMouse found frame " << f << " by border" << endl;
 
3169
#endif
 
3170
            if ( border ) *border = true;
 
3171
            return f;
 
3172
        }
 
3173
        if(f->frameAtPos(nPoint)) {
 
3174
#ifdef DEBUG_FRAMESELECT
 
3175
            kdDebug(32001) << "KWDocument::topFrameUnderMouse found frame " << f << ", will dig into it." << endl;
 
3176
#endif
 
3177
            return deepestInlineFrame(f,nPoint,border);
 
3178
        }
 
3179
    }
 
3180
    if (border != 0) *border=false;
 
3181
    return 0L;
 
3182
}
 
3183
 
 
3184
 
 
3185
KWFrame * KWDocument::frameUnderMouse( const QPoint& nPoint, bool* border, bool firstNonSelected )
2321
3186
{
2322
 
    KoPoint docPoint( unzoomPoint( nPoint ) );
2323
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2324
 
    for ( fit.toLast(); fit.current() ; --fit ) // z-order
 
3187
    if ( !m_viewMode->hasFrames() )
2325
3188
    {
2326
 
        KWFrameSet *frameSet = fit.current();
2327
 
        if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
2328
 
            continue;
2329
 
        KWFrame * frame = frameSet->frameByBorder( nPoint );
2330
 
        if ( frame )
2331
 
        {
2332
 
            if ( border ) *border = true;
2333
 
            return frame;
2334
 
        }
2335
 
        frame = frameSet->frameAtPos( docPoint.x(), docPoint.y() );
2336
 
        //kdDebug() << "KWDocument::frameAtPos found frameset " << frameSet
2337
 
        // << " at position " << docPoint.x() << "," << docPoint.y() << endl;
2338
 
        if ( frame )
2339
 
        {
2340
 
            if ( border ) *border = false;
2341
 
            return frame;
2342
 
        }
2343
 
    }
2344
 
    return 0L;
2345
 
 
 
3189
        KWViewModeText* vmt = dynamic_cast<KWViewModeText *>( m_viewMode );
 
3190
        return vmt ? vmt->textFrameSet()->frame(0) : 0L;
 
3191
    }
 
3192
#ifdef DEBUG_FRAMESELECT
 
3193
    kdDebug(32001) << "KWDocument::frameUnderMouse nPoint=" << nPoint << " firstNonSelected=" << firstNonSelected << endl;
 
3194
#endif
 
3195
    KWFrame *candidate = topFrameUnderMouse(nPoint, border);
 
3196
    if (!firstNonSelected)
 
3197
        return candidate;
 
3198
    KWFrame *goDeeper=candidate;
 
3199
    bool foundselected=false;
 
3200
    while (goDeeper) {
 
3201
        while (goDeeper && goDeeper->isSelected())
 
3202
        {
 
3203
            goDeeper=frameBelowFrame(nPoint, goDeeper, border);
 
3204
            foundselected=true;
 
3205
        }
 
3206
        if (foundselected) {
 
3207
            if (goDeeper)
 
3208
                return goDeeper;
 
3209
            else
 
3210
                return candidate;
 
3211
        } else
 
3212
            goDeeper=frameBelowFrame(nPoint, goDeeper, border);
 
3213
 
 
3214
    }
 
3215
    return candidate;
 
3216
}
 
3217
 
 
3218
MouseMeaning KWDocument::getMouseMeaning( const QPoint &nPoint, int keyState, KWFrame** pFrame )
 
3219
{
 
3220
    if ( pFrame )
 
3221
        *pFrame = 0L;
 
3222
    if (m_viewMode->hasFrames() &&
 
3223
        positionToSelectRowcolTable(nPoint) != TABLE_POSITION_NONE)
 
3224
        return MEANING_MOUSE_SELECT;
 
3225
 
 
3226
    bool border=true;
 
3227
    KWFrame *frameundermouse = frameUnderMouse(nPoint, &border);
 
3228
    if (frameundermouse) {
 
3229
        KWFrameSet *frameSet = frameundermouse->frameSet();
 
3230
        if ( pFrame )
 
3231
            *pFrame = frameundermouse;
 
3232
        if ( m_viewMode->hasFrames() )
 
3233
            return frameSet->getMouseMeaning(nPoint, keyState);
 
3234
        else // text view mode
 
3235
            return MEANING_MOUSE_INSIDE_TEXT;
 
3236
    }
 
3237
    return MEANING_NONE;
 
3238
}
 
3239
 
 
3240
QCursor KWDocument::getMouseCursor( const QPoint &nPoint, int keyState )
 
3241
{
 
3242
    KWFrame* frame = 0L;
 
3243
    MouseMeaning meaning = getMouseMeaning( nPoint, keyState, &frame );
 
3244
    KWFrameSet* frameSet = frame ? frame->frameSet() : 0L;
 
3245
    switch ( meaning ) {
 
3246
    case MEANING_NONE:
 
3247
        return Qt::ibeamCursor; // default cursor in margins
 
3248
    case MEANING_MOUSE_INSIDE:
 
3249
        return QCursor(); // default cursor !?!?
 
3250
    case MEANING_MOUSE_INSIDE_TEXT:
 
3251
        return Qt::ibeamCursor;
 
3252
    case MEANING_MOUSE_MOVE:
 
3253
        return Qt::sizeAllCursor;
 
3254
    case MEANING_MOUSE_SELECT:
 
3255
        return KCursor::handCursor();
 
3256
    case MEANING_ACTIVATE_PART:
 
3257
        return KCursor::handCursor();
 
3258
    case MEANING_TOPLEFT:
 
3259
    case MEANING_BOTTOMRIGHT:
 
3260
        if ( frameSet->isProtectSize() )
 
3261
            return Qt::forbiddenCursor;
 
3262
        return Qt::sizeFDiagCursor;
 
3263
    case MEANING_LEFT:
 
3264
    case MEANING_RIGHT:
 
3265
        if ( frameSet->isProtectSize() )
 
3266
            return Qt::forbiddenCursor;
 
3267
        return Qt::sizeHorCursor;
 
3268
    case MEANING_BOTTOMLEFT:
 
3269
    case MEANING_TOPRIGHT:
 
3270
        if ( frameSet->isProtectSize() )
 
3271
            return Qt::forbiddenCursor;
 
3272
        return Qt::sizeBDiagCursor;
 
3273
    case MEANING_TOP:
 
3274
    case MEANING_BOTTOM:
 
3275
        if ( frameSet->isProtectSize() )
 
3276
            return Qt::forbiddenCursor;
 
3277
        return Qt::sizeVerCursor;
 
3278
    case MEANING_RESIZE_COLUMN:
 
3279
        // Bug in Qt up to Qt-3.1.1 : Qt::splitVCursor and Qt::splitHCursor are swapped!
 
3280
#if QT_VERSION <= 0x030101
 
3281
        return Qt::splitVCursor;
 
3282
#else
 
3283
        return Qt::splitHCursor;
 
3284
#endif
 
3285
    case MEANING_RESIZE_ROW:
 
3286
#if QT_VERSION <= 0x030101
 
3287
        return Qt::splitHCursor;
 
3288
#else
 
3289
        return Qt::splitVCursor;
 
3290
#endif
 
3291
    }
 
3292
    return QCursor(); // default cursor !?!?
2346
3293
}
2347
3294
 
2348
3295
QString KWDocument::generateFramesetName( const QString & templateName )
2352
3299
    bool exists;
2353
3300
    do {
2354
3301
        name = templateName.arg( num );
2355
 
        exists = getFrameSetByName( name );
 
3302
        exists = frameSetByName( name );
2356
3303
        ++num;
2357
3304
    } while ( exists );
2358
3305
    return name;
2359
3306
}
2360
3307
 
2361
 
QCursor KWDocument::getMouseCursor( const QPoint &nPoint, bool controlPressed )
2362
 
{
2363
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2364
 
    for ( fit.toLast(); fit.current() ; --fit )
 
3308
/** if we are close on the left or the top of a table,
 
3309
 * the user can select rows/cols */
 
3310
KWDocument::TableToSelectPosition KWDocument::positionToSelectRowcolTable(const QPoint& nPoint, KWTableFrameSet **ppTable /*=0L*/) {
 
3311
    KWFrame *frameundermouse, *frameclosetomouseright, *frameclosetomouseunder;
 
3312
 
 
3313
    TableToSelectPosition result = TABLE_POSITION_NONE;
 
3314
 
 
3315
    // now simply check the actual frame under the mouse
 
3316
    bool border=true;
 
3317
    frameundermouse = frameUnderMouse(nPoint, &border );
 
3318
 
 
3319
    // now get a frame close to the mouse pointer
 
3320
    // slightly on the right (could it be that it is a table?)
 
3321
    QPoint pointTestTableSelect = nPoint;
 
3322
    pointTestTableSelect.rx() += KWDocument::DISTANCE_TABLE_SELECT_ROWCOL;
 
3323
    frameclosetomouseright = frameUnderMouse(pointTestTableSelect, &border);
 
3324
 
 
3325
    pointTestTableSelect = nPoint;
 
3326
    pointTestTableSelect.ry() += KWDocument::DISTANCE_TABLE_SELECT_ROWCOL;
 
3327
    frameclosetomouseunder = frameUnderMouse(pointTestTableSelect, &border);
 
3328
 
 
3329
    KWFrame *frameclosetomouse; // the frame that we are going to test to know whether it is a table
 
3330
 
 
3331
    if ( frameclosetomouseright && frameclosetomouseright->frameSet()->getGroupManager() ) {
 
3332
        // ok, we can test the right frame
 
3333
        frameclosetomouse = frameclosetomouseright;
 
3334
        result = TABLE_POSITION_RIGHT;
 
3335
    }
 
3336
    else {
 
3337
        // right frame is not good. maybe the one under?
 
3338
        frameclosetomouse = frameclosetomouseunder;
 
3339
        result = TABLE_POSITION_BOTTOM;
 
3340
    }
 
3341
 
 
3342
    // is there a frame close to the cursor?
 
3343
    if (frameclosetomouse) {
 
3344
        if ( frameclosetomouse->frameSet()->getGroupManager() && (!frameundermouse || !frameundermouse->frameSet()->getGroupManager()) ) {
 
3345
            // there is a frame, it is a table, and the cursor is NOT on a table ATM
 
3346
            if (ppTable)
 
3347
                *ppTable =frameclosetomouse->frameSet()->getGroupManager();
 
3348
            // place the cursor to say that we can select row/columns
 
3349
            return result;
 
3350
        }
 
3351
    }
 
3352
    return TABLE_POSITION_NONE;
 
3353
}
 
3354
 
 
3355
 
 
3356
// TODO pass viewmode for isVisible
 
3357
QPtrList<KWFrame> KWDocument::getSelectedFrames() const {
 
3358
    QPtrList<KWFrame> frames;
 
3359
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
3360
    for ( ; fit.current() ; ++fit )
2365
3361
    {
2366
3362
        KWFrameSet *frameSet = fit.current();
2367
3363
        if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
2368
3364
            continue;
2369
 
 
2370
 
        QCursor cursor;
2371
 
        if ( frameSet->getMouseCursor( nPoint, controlPressed, cursor ) )
2372
 
            return cursor;
2373
 
    }
2374
 
 
2375
 
    return ibeamCursor;
2376
 
}
2377
 
 
2378
 
QList<KWFrame> KWDocument::getSelectedFrames() {
2379
 
    QList<KWFrame> frames;
2380
 
    frames.setAutoDelete( FALSE );
2381
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
2382
 
    for ( ; fit.current() ; ++fit )
2383
 
    {
2384
 
        KWFrameSet *frameSet = fit.current();
2385
 
        if ( !frameSet->isVisible() )
2386
 
            continue;
2387
 
        if ( frameSet->isRemoveableHeader() )
2388
 
            continue;
2389
 
        QListIterator<KWFrame> frameIt = frameSet->frameIterator();
 
3365
        QPtrListIterator<KWFrame> frameIt = frameSet->frameIterator();
2390
3366
        for ( ; frameIt.current(); ++frameIt )
2391
3367
            if ( frameIt.current()->isSelected() )
2392
3368
                frames.append( frameIt.current() );
2395
3371
    return frames;
2396
3372
}
2397
3373
 
2398
 
KWFrame *KWDocument::getFirstSelectedFrame()
2399
 
{
2400
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
3374
 
 
3375
void KWDocument::fixZOrders() {
 
3376
    bool fixed_something = false;
 
3377
    for (int pgnum = 0 ; pgnum < m_pages ; pgnum++) {
 
3378
        QPtrList<KWFrame> frames= framesInPage(pgnum,false);
 
3379
        // scan this page to see if we need to fixup.
 
3380
        bool need_fixup=true;
 
3381
        for (KWFrame *f = frames.last();f;f=frames.prev()) {
 
3382
            if (f->zOrder() != 0) { // assumption: old documents come with no zorder=>initialised to 0
 
3383
                need_fixup=false;
 
3384
                break;
 
3385
            }
 
3386
        }
 
3387
        if (need_fixup) {
 
3388
            int current_zorder=0;
 
3389
            kdDebug() << "fixing page " << pgnum << " z-orders " << endl;
 
3390
            for (KWFrame *fr = frames.first();fr;fr=frames.next()) {
 
3391
                // only consider non-inline framesets.
 
3392
                if (fr->frameSet()->isFloating())
 
3393
                    continue;
 
3394
                current_zorder++;
 
3395
                fr->setZOrder(current_zorder);
 
3396
                fixed_something = true;
 
3397
            }
 
3398
        }
 
3399
 
 
3400
        if ( m_processingType == KWDocument::WP )
 
3401
        {
 
3402
            // In all cases, ensure the main frames are below the rest.
 
3403
            // (This could not be the case after e.g. an import filter does it wrong)
 
3404
            lowerMainFrames( pgnum );
 
3405
        }
 
3406
    }
 
3407
    if ( fixed_something )
 
3408
        updateFramesOnTopOrBelow();
 
3409
}
 
3410
 
 
3411
void KWDocument::lowerMainFrames( int pageNum )
 
3412
{
 
3413
    QPtrList<KWFrame> framesInPage = this->framesInPage(pageNum);
 
3414
    int lowestZOrder=10000;
 
3415
    for ( QPtrListIterator<KWFrame> frameIt( framesInPage ); frameIt.current(); ++frameIt )
 
3416
        lowestZOrder=QMIN(lowestZOrder, frameIt.current()->zOrder());
 
3417
    lowerMainFrames( pageNum, lowestZOrder );
 
3418
}
 
3419
 
 
3420
// separated from the above one for KWView (which knows lowestZOrder already)
 
3421
void KWDocument::lowerMainFrames( int pageNum, int lowestZOrder )
 
3422
{
 
3423
    // Get the main frameset and see if we have to lower its frame(s).
 
3424
    QPtrList<KWFrame> framesInPage = this->framesInPage(pageNum);
 
3425
    for ( QPtrListIterator<KWFrame> frameIt( framesInPage ); frameIt.current(); ++frameIt ) {
 
3426
        if(frameIt.current()->frameSet()->isMainFrameset()) {
 
3427
            if(lowestZOrder <= frameIt.current()->zOrder())
 
3428
                frameIt.current()->setZOrder(lowestZOrder-1);
 
3429
            // keep going, in case of multiple columns
 
3430
        }
 
3431
    }
 
3432
}
 
3433
 
 
3434
// TODO pass viewmode for isVisible? Depends on how framesInPage is being used...
 
3435
QPtrList<KWFrame> KWDocument::framesInPage( int pageNum, bool sorted ) const {
 
3436
    KWFrameList frames;
 
3437
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
3438
    for ( ; fit.current() ; ++fit )
 
3439
    {
 
3440
        KWFrameSet *frameSet = fit.current();
 
3441
        if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
 
3442
            continue;
 
3443
        // Append all frames from frameSet in page pageNum
 
3444
        QPtrListIterator<KWFrame> it( frameSet->framesInPage( pageNum ) );
 
3445
        for ( ; it.current() ; ++it )
 
3446
            frames.append( it.current() );
 
3447
    }
 
3448
    if (sorted) frames.sort();
 
3449
    return frames;
 
3450
}
 
3451
 
 
3452
 
 
3453
KWFrame *KWDocument::getFirstSelectedFrame() const
 
3454
{
 
3455
    // ### This should be done much more efficiently (caching?). It's called all the time.
 
3456
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2401
3457
    for ( ; fit.current() ; ++fit )
2402
3458
    {
2403
3459
        KWFrameSet *frameSet = fit.current();
2404
3460
        for ( unsigned int j = 0; j < frameSet->getNumFrames(); j++ ) {
2405
 
            if ( !frameSet->isVisible() )
2406
 
                continue;
2407
 
            if ( frameSet->isRemoveableHeader() )
2408
 
                continue;
2409
 
            if ( frameSet->getFrame( j )->isSelected() )
2410
 
                return frameSet->getFrame( j );
 
3461
            if ( !frameSet->isVisible() || frameSet->isRemoveableHeader() )
 
3462
                continue;
 
3463
            if ( frameSet->frame( j )->isSelected() )
 
3464
                return frameSet->frame( j );
2411
3465
        }
2412
3466
    }
2413
3467
    return 0L;
2415
3469
 
2416
3470
void KWDocument::updateAllFrames()
2417
3471
{
2418
 
    kdDebug(32002) << "KWDocument::updateAllFrames " << frames.count() << " framesets." << endl;
2419
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
3472
#ifdef DEBUG_SPEED
 
3473
    QTime dt;
 
3474
    dt.start();
 
3475
#endif
 
3476
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2420
3477
    for ( ; fit.current() ; ++fit )
2421
3478
        fit.current()->updateFrames();
 
3479
 
 
3480
#ifdef DEBUG_SPEED
 
3481
    kdDebug(32001) << "updateAllFrames took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl;
 
3482
#endif
 
3483
 
 
3484
    // TODO: check all calls to updateAllFrames, and fix them.
 
3485
    // E.g., if one frame moved, updateAllFrames isn't necessary,
 
3486
    // only fs->updateFrames() and doc->updateFramesOnTopOrBelow() are necessary.
 
3487
 
 
3488
    // Update frames ontop and below _afterwards_,
 
3489
    // it needs the 'frames in page' array (in other framesets)
 
3490
    updateFramesOnTopOrBelow();
 
3491
}
 
3492
 
 
3493
void KWDocument::updateFramesOnTopOrBelow( int _pageNum /* -1 == all */ )
 
3494
{
 
3495
    if ( viewMode() && !viewMode()->hasFrames() )
 
3496
        return;
 
3497
 
 
3498
#ifdef DEBUG_SPEED
 
3499
    kdDebug() << "KWDocument::updateFramesOnTopOrBelow  pageNum=" << _pageNum << endl;
 
3500
    QTime dt;
 
3501
    dt.start();
 
3502
    int numberAdded = 0;
 
3503
#endif
 
3504
 
 
3505
    // Look at all pages if _pageNum == -1, otherwise look at _pageNum only.
 
3506
    int fromPage = _pageNum == -1 ? 0 : _pageNum;
 
3507
    int toPage = _pageNum == -1 ? m_pages - 1 : _pageNum;
 
3508
    for ( int pageNum = fromPage ; pageNum <= toPage ; ++pageNum )
 
3509
    {
 
3510
        // For all frames in that page: clear ontop/below lists.
 
3511
        // TODO we need to fix the case of multipage frames... somehow.
 
3512
        QPtrList<KWFrame> framesInThisPage = framesInPage( pageNum );
 
3513
        QPtrListIterator<KWFrame> frameIt( framesInThisPage );
 
3514
        for ( ; frameIt.current(); ++frameIt )
 
3515
        {
 
3516
            frameIt.current()->clearFramesOnTop();
 
3517
            frameIt.current()->clearFramesBelow();
 
3518
        }
 
3519
 
 
3520
        frameIt.toFirst();
 
3521
        for ( ; frameIt.current(); ++frameIt )
 
3522
        {
 
3523
            // currentFrame is the frame we're taking care of now
 
3524
            // (the one whose ontop/below caches we're modifying)
 
3525
            KWFrame* currentFrame = frameIt.current();
 
3526
            KWFrameSet* currentFrameSet = currentFrame->frameSet();
 
3527
            KWTableFrameSet* table = currentFrameSet->getGroupManager();
 
3528
            bool isInline = currentFrameSet->isFloating();
 
3529
 
 
3530
            // Frank's code for going up to the right frame/frameset, if currentFrame is
 
3531
            // floating, in order to use the right z order.
 
3532
            // ### Maybe this logic could be in KWFrame::zOrder() ?
 
3533
            // ### or at least we could have a 'first non-floating parent frame' method
 
3534
            KWFrame *parentFrame = currentFrame;
 
3535
            KWFrameSet *parentFrameset = currentFrameSet;
 
3536
            while (parentFrameset->isFloating()) {
 
3537
                parentFrameset=parentFrameset->anchorFrameset();
 
3538
                KWFrame *oldParentFrame = parentFrame;
 
3539
                parentFrame=parentFrameset->frameAtPos(parentFrame->x(), parentFrame->y());
 
3540
                if(!parentFrame)
 
3541
                    parentFrame = oldParentFrame;
 
3542
            }
 
3543
 
 
3544
            // We now look at all other frames (in the same page)
 
3545
            // to check for intersections. This is o(n^2), but with n small.
 
3546
            QPtrListIterator<KWFrame> it( framesInThisPage );
 
3547
            for ( ; it.current() ; ++it )
 
3548
            {
 
3549
                KWFrame* frameMaybeOnTop = it.current();
 
3550
                if ( currentFrame == frameMaybeOnTop ) // Skip identity case ;)
 
3551
                    continue;
 
3552
                KWFrameSet* frameSet = frameMaybeOnTop->frameSet();
 
3553
 
 
3554
                // Skip all cells from 'currentFrameSet' if 'currentFrameSet' is a table.
 
3555
                // We trust that KWTableFrameSet will not make cells overlap ;)
 
3556
                if ( table && frameSet->getGroupManager() == table )
 
3557
                    continue;
 
3558
                // Skip all frames from the parent frameset, if 'currentFrameSet' is inline
 
3559
                // ## might need a for loop for the case of inline-inside-inline,
 
3560
                // or maybe calling isPaintedBy instead [depending on what should happen for tables]
 
3561
                if ( isInline && frameSet == parentFrameset )
 
3562
                    continue;
 
3563
                // Floating frames are not "on top", they are "inside".
 
3564
                // They are not "below" anything either - the parent frameset is.
 
3565
                if ( frameSet->isFloating() )
 
3566
                    continue;
 
3567
 
 
3568
                //kdDebug(32001) << "        comparing our frame " << parentFrame << " (z:" << parentFrame->zOrder() << ") with frame " << frameMaybeOnTop << " (z:" << frameMaybeOnTop->zOrder() << ") from frameset " << frameSet << endl;
 
3569
                KoRect intersect = currentFrame->intersect( frameMaybeOnTop->outerKoRect() );
 
3570
                if( !intersect.isEmpty() )
 
3571
                {
 
3572
                    bool added = false;
 
3573
                    if ( parentFrame->zOrder() < frameMaybeOnTop->zOrder() )
 
3574
                    {
 
3575
                        // Floating frames are not "on top", they are "inside".
 
3576
                        if ( !frameSet->isPaintedBy( currentFrameSet ) ) {
 
3577
                            added = true;
 
3578
                            currentFrame->addFrameOnTop( frameMaybeOnTop );
 
3579
                        }
 
3580
                    } else
 
3581
                    {
 
3582
                        // Don't treat a frameset as 'below' its inline framesets.
 
3583
                        // Same problem with table cells. In general we want to forbid that, if
 
3584
                        // painting A leads to painting B, A is stored as 'below B'.
 
3585
                        // This is where the infinite loop comes from, if B is transparent.
 
3586
                        // (Note: we only forbid this for 'below', not for 'on top', to get
 
3587
                        // proper clipping).
 
3588
                        if ( !currentFrameSet->isPaintedBy( frameSet ) && parentFrame->zOrder() > frameMaybeOnTop->zOrder() )
 
3589
                        {
 
3590
                            added = true;
 
3591
                            currentFrame->addFrameBelow( frameMaybeOnTop );
 
3592
                        }
 
3593
                    }
 
3594
#ifdef DEBUG_SPEED
 
3595
                    if ( added )
 
3596
                        numberAdded++;
 
3597
#endif
 
3598
 
 
3599
#if 0
 
3600
                    if ( added )
 
3601
                    {
 
3602
                        kdDebug(32002)
 
3603
                            << "          adding frame "
 
3604
                            << frameMaybeOnTop << "("<<frameSet->getName()<<")"
 
3605
                            << " (zorder: " << frameMaybeOnTop->zOrder() << ")"
 
3606
                            << (  parentFrame->zOrder() < frameMaybeOnTop->zOrder() ? " on top of" : " below" )
 
3607
                            << " frame " << currentFrame << "("<<currentFrameSet->getName()<<")"
 
3608
                            << " parentFrame " << parentFrame << " (zorder: " << parentFrame->zOrder() << ")" << endl;
 
3609
                            //kdDebug(32002) << "   intersect: " << intersect
 
3610
                            //<< " (zoomed: " << zoomRect( intersect ) << ")" << endl;
 
3611
                    }
 
3612
#endif
 
3613
                }
 
3614
            } // 'it' for loop
 
3615
        } // 'frameIt' for loop
 
3616
 
 
3617
        frameIt.toFirst();
 
3618
        for ( ; frameIt.current(); ++frameIt )
 
3619
            frameIt.current()->sortFramesBelow();
 
3620
 
 
3621
    } // for (pages)
 
3622
 
 
3623
#ifdef DEBUG_SPEED
 
3624
    kdDebug(32001) << "updateFramesOnTopOrBelow("<<_pageNum<<") took " << (float)(dt.elapsed()) / 1000 << " seconds, added " << numberAdded << " frames" << endl;
 
3625
#endif
2422
3626
}
2423
3627
 
2424
3628
// Tell this method when a frame is moved / resized / created / deleted
2425
3629
// and everything will be update / repainted accordingly
2426
3630
void KWDocument::frameChanged( KWFrame * frame, KWView * view )
2427
3631
{
2428
 
    //kdDebug() << "KWDocument::frameChanged" << endl;
2429
 
    updateAllFrames();
 
3632
    if ( !frame ) // TODO call another method for 'deleted frame', which passes the frameset
 
3633
        updateAllFrames(); // ... in order to get rid of that call, and use the 'else' case instead
 
3634
    else {
 
3635
        frame->frameSet()->updateFrames();
 
3636
        updateFramesOnTopOrBelow();
 
3637
    }
 
3638
 
 
3639
    //kdDebug(32002) << "KWDocument::frameChanged" << endl;
2430
3640
    // If frame with text flowing around it -> re-layout all frames
2431
3641
    if ( !frame || frame->runAround() != KWFrame::RA_NO )
2432
3642
    {
2434
3644
    }
2435
3645
    else
2436
3646
    {
2437
 
        frame->getFrameSet()->layout();
 
3647
        frame->frameSet()->layout();
2438
3648
    }
2439
3649
    repaintAllViewsExcept( view );
2440
3650
    updateRulerFrameStartEnd();
 
3651
    if ( frame && frame->isSelected() )
 
3652
        updateFrameStatusBarItem();
2441
3653
}
2442
3654
 
2443
 
void KWDocument::framesChanged( const QList<KWFrame> & frames, KWView * view )
 
3655
void KWDocument::framesChanged( const QPtrList<KWFrame> & frames, KWView * view )
2444
3656
{
2445
 
    //kdDebug() << "KWDocument::framesChanged" << endl;
 
3657
    //kdDebug(32002) << "KWDocument::framesChanged" << endl;
 
3658
    // TODO replace with 'make unique list of framesets', call updateFrames on those,
 
3659
    // then call updateFramesOnTopOrBelow.
2446
3660
    updateAllFrames();
2447
 
    updateRulerFrameStartEnd();
2448
 
    QListIterator<KWFrame> it( frames );
 
3661
    // Is there at least one frame with a text runaround set ?
 
3662
    QPtrListIterator<KWFrame> it( frames );
2449
3663
    for ( ; it.current() ; ++it )
2450
3664
        if ( it.current()->runAround() != KWFrame::RA_NO )
2451
3665
        {
2452
 
            //kdDebug() << "KWDocument::framesChanged ->layout" << endl;
 
3666
            //kdDebug(32002) << "KWDocument::framesChanged ->layout" << endl;
2453
3667
            layout();
2454
 
            //kdDebug() << "KWDocument::framesChanged ->repaintAllViewsExcept" << endl;
 
3668
            //kdDebug(32002) << "KWDocument::framesChanged ->repaintAllViewsExcept" << endl;
2455
3669
            repaintAllViewsExcept( view );
2456
 
            return;
 
3670
            break;
 
3671
        }
 
3672
    updateRulerFrameStartEnd();
 
3673
    // Is at least one frame selected ?
 
3674
    QPtrListIterator<KWFrame> it2( frames );
 
3675
    for ( ; it2.current() ; ++it2 )
 
3676
        if ( it2.current()->isSelected() ) {
 
3677
            updateFrameStatusBarItem();
 
3678
            break;
2457
3679
        }
2458
3680
}
2459
3681
 
2463
3685
    recalcFrames();
2464
3686
    updateAllFrames();
2465
3687
    layout();
 
3688
    setModified(true);
2466
3689
    repaintAllViews( true );
2467
3690
}
2468
3691
 
2472
3695
    recalcFrames();
2473
3696
    updateAllFrames();
2474
3697
    layout();
 
3698
    setModified(true);
2475
3699
    repaintAllViews( true );
2476
3700
}
2477
3701
 
2478
 
void KWDocument::getFrameMargins( double &l, double &r, double &t, double &b )
2479
 
{
2480
 
    for ( unsigned int i = 0; i < getNumFrameSets(); i++ ) {
2481
 
        if ( getFrameSet( i )->hasSelectedFrame() ) {
2482
 
            for ( unsigned int j = 0; j < getFrameSet( i )->getNumFrames(); j++ ) {
2483
 
                if ( getFrameSet( i )->getFrame( j )->isSelected() ) {
2484
 
                    l = getFrameSet( i )->getFrame( j )->getBLeft();
2485
 
                    r = getFrameSet( i )->getFrame( j )->getBRight();
2486
 
                    t = getFrameSet( i )->getFrame( j )->getBTop();
2487
 
                    b = getFrameSet( i )->getFrame( j )->getBBottom();
2488
 
                    return;
2489
 
                }
2490
 
            }
2491
 
        }
2492
 
    }
2493
 
}
 
3702
bool KWDocument::hasEndNotes() const
 
3703
{
 
3704
    return m_bHasEndNotes;
 
3705
}
 
3706
 
 
3707
void KWDocument::updateHeaderButton()
 
3708
{
 
3709
    QPtrListIterator<KWView> it( m_lstViews );
 
3710
    for ( ; it.current() ; ++it )
 
3711
    {
 
3712
        it.current()->updateHeaderFooterButton();
 
3713
        it.current()->updateHeader();
 
3714
    }
 
3715
}
 
3716
 
 
3717
void KWDocument::updateFooterButton()
 
3718
{
 
3719
    QPtrListIterator<KWView> it( m_lstViews );
 
3720
    for ( ; it.current() ; ++it )
 
3721
    {
 
3722
        it.current()->updateHeaderFooterButton();
 
3723
        it.current()->updateFooter();
 
3724
    }
 
3725
}
 
3726
 
2494
3727
 
2495
3728
bool KWDocument::isOnlyOneFrameSelected() {
2496
3729
    return getSelectedFrames().count()==1;
2500
3733
{
2501
3734
    // todo, make this more OO, and update the tableheaders as well..
2502
3735
    for ( unsigned int i = 0; i < getNumFrameSets(); i++ ) {
2503
 
        if ( getFrameSet( i )->hasSelectedFrame() ) {
2504
 
            KWFrameSet *frameset = getFrameSet( i );
 
3736
        if ( frameSet( i )->hasSelectedFrame() ) {
 
3737
            KWFrameSet *frameset = frameSet( i );
2505
3738
            for ( unsigned int j = 0; j < frameset->getNumFrames(); j++ ) {
2506
 
                if ( frameset->getFrame( j )->isSelected() ) {
2507
 
                    frameset->getFrame( j )->setBLeft( l );
2508
 
                    frameset->getFrame( j )->setBRight( r );
2509
 
                    frameset->getFrame( j )->setBTop( t );
2510
 
                    frameset->getFrame( j )->setBBottom( b );
 
3739
                if ( frameset->frame( j )->isSelected() ) {
 
3740
                    frameset->frame( j )->setBLeft( l );
 
3741
                    frameset->frame( j )->setBRight( r );
 
3742
                    frameset->frame( j )->setBTop( t );
 
3743
                    frameset->frame( j )->setBBottom( b );
2511
3744
                }
2512
3745
            }
2513
3746
        }
2516
3749
    setModified(TRUE);
2517
3750
}
2518
3751
 
2519
 
void KWDocument::addImageRequest( const KoImageKey &key, KWTextImage *img )
2520
 
{
2521
 
    m_imageRequests.insert( key, img );
2522
 
}
2523
 
 
2524
 
void KWDocument::addImageRequest( KWPictureFrameSet *fs )
2525
 
{
2526
 
    m_imageRequests2.append( fs );
2527
 
}
2528
 
 
2529
 
void KWDocument::addClipartRequest( KWClipartFrameSet *fs )
2530
 
{
2531
 
    m_clipartRequests.append( fs );
 
3752
void KWDocument::addTextImageRequest( KWTextImage *img )
 
3753
{
 
3754
    m_textImageRequests.append( img );
 
3755
}
 
3756
 
 
3757
void KWDocument::addPictureRequest( KWPictureFrameSet *fs )
 
3758
{
 
3759
    m_pictureRequests.append( fs );
2532
3760
}
2533
3761
 
2534
3762
void KWDocument::addAnchorRequest( const QString &framesetName, const KWAnchorPosition &anchorPos )
2536
3764
    m_anchorRequests.insert( framesetName, anchorPos );
2537
3765
}
2538
3766
 
2539
 
KWVariableFormat * KWDocument::variableFormat( int type )
2540
 
{
2541
 
    // Look into the map
2542
 
    QMap<int,KWVariableFormat*>::Iterator it = m_mapVariableFormats.find( type );
2543
 
    if ( it != m_mapVariableFormats.end() )
2544
 
    {
2545
 
        return it.data();
2546
 
    }
2547
 
    else
2548
 
    {
2549
 
        KWVariableFormat * format = 0L;
2550
 
        // The formats are created on demand.
2551
 
        // TODO save those that have settings
2552
 
        switch( type )
2553
 
        {
2554
 
            case VF_DATE:
2555
 
                format = new KWVariableDateFormat();
2556
 
                break;
2557
 
            case VF_TIME:
2558
 
                format = new KWVariableTimeFormat();
2559
 
                break;
2560
 
            case VF_NUM:
2561
 
                format = new KWVariableNumberFormat();
2562
 
                break;
2563
 
            case VF_STRING:
2564
 
                format = new KWVariableStringFormat();
2565
 
                break;
2566
 
            default:
2567
 
                break;
2568
 
        }
2569
 
        if ( format )
2570
 
            m_mapVariableFormats.insert( type, format );
2571
 
        return format;
2572
 
    }
2573
 
}
2574
 
 
2575
 
void KWDocument::registerVariable( KWVariable *var )
2576
 
{
2577
 
    if ( !var )
2578
 
        return;
2579
 
    variables.append( var );
 
3767
void KWDocument::addFootNoteRequest( const QString &framesetName, KWFootNoteVariable* var )
 
3768
{
 
3769
    if ( var->noteType() == EndNote )
 
3770
        m_bHasEndNotes = true;
 
3771
    m_footnoteVarRequests.insert( framesetName, var );
2580
3772
}
2581
3773
 
2582
3774
 
2585
3777
   emit sig_refreshMenuCustomVariable();
2586
3778
}
2587
3779
 
2588
 
void KWDocument::unregisterVariable( KWVariable *var )
2589
 
{
2590
 
    variables.take( variables.findRef( var ) );
2591
 
}
2592
3780
 
2593
3781
void KWDocument::recalcVariables( int type )
2594
3782
{
 
3783
    m_varColl->recalcVariables(type);
 
3784
    slotRepaintVariable();
 
3785
#if 0
2595
3786
    bool update = false;
2596
 
    QListIterator<KWVariable> it( variables );
2597
 
    QList<KWTextFrameSet> toRepaint;
 
3787
    QPtrListIterator<KWVariable> it( variables );
 
3788
    QPtrList<KWTextFrameSet> toRepaint;
2598
3789
    for ( ; it.current() ; ++it )
2599
3790
    {
2600
3791
        if ( it.current()->type() == type )
2601
3792
        {
2602
3793
            update = true;
2603
3794
            it.current()->recalc();
2604
 
            QTextParag * parag = it.current()->paragraph();
 
3795
            KoTextParag * parag = it.current()->paragraph();
2605
3796
            if ( parag )
2606
3797
            {
2607
 
                kdDebug() << "KWDoc::recalcVariables -> invalidating parag " << parag->paragId() << endl;
 
3798
                kdDebug(32002) << "KWDoc::recalcVariables -> invalidating parag " << parag->paragId() << endl;
2608
3799
                parag->invalidate( 0 );
2609
3800
                parag->setChanged( true );
2610
 
                KWTextFrameSet * textfs = it.current()->textDocument()->textFrameSet();
 
3801
                KWTextFrameSet * textfs = static_cast<KWTextDocument *>(it.current()->textDocument())->textFrameSet();
2611
3802
                if ( toRepaint.findRef( textfs ) == -1 )
2612
3803
                    toRepaint.append( textfs );
2613
3804
            }
2615
3806
    }
2616
3807
    for ( KWTextFrameSet * fs = toRepaint.first() ; fs ; fs = toRepaint.next() )
2617
3808
        slotRepaintChanged( fs );
2618
 
}
2619
 
 
2620
 
void KWDocument::setVariableValue( const QString &name, const QString &value )
2621
 
{
2622
 
    varValues[ name ] = value;
2623
 
}
2624
 
 
2625
 
QString KWDocument::getVariableValue( const QString &name ) const
2626
 
{
2627
 
    if ( !varValues.contains( name ) )
2628
 
        return i18n( "No value" );
2629
 
    return varValues[ name ];
2630
 
}
2631
 
 
2632
 
KWSerialLetterDataBase *KWDocument::getSerialLetterDataBase() const
2633
 
{
2634
 
    return slDataBase;
2635
 
}
2636
 
 
2637
 
int KWDocument::getSerialLetterRecord() const
 
3809
#endif
 
3810
}
 
3811
 
 
3812
// TODO pass list of textdocuments as argument
 
3813
void KWDocument::slotRepaintVariable()
 
3814
{
 
3815
    QPtrListIterator<KWFrameSet> it = framesetsIterator();
 
3816
    for (; it.current(); ++it )
 
3817
        if( it.current()->type()==FT_TEXT)
 
3818
            slotRepaintChanged( (*it) );
 
3819
#if 0
 
3820
    KWTextFrameSet * textfs = static_cast<KWTextDocument *>(it.current()->textDocument())->textFrameSet();
 
3821
    if ( toRepaint.findRef( textfs ) == -1 )
 
3822
        toRepaint.append( textfs );
 
3823
 
 
3824
 
 
3825
    QPtrListIteratorQPtrList<KWTextFrameSet> toRepaint;
 
3826
        for ( KWTextFrameSet * fs = toRepaint.first() ; fs ; fs = toRepaint.next() )
 
3827
        slotRepaintChanged( fs );
 
3828
#endif
 
3829
}
 
3830
 
 
3831
int KWDocument::getMailMergeRecord() const
2638
3832
{
2639
3833
    return slRecordNum;
2640
3834
}
2641
3835
 
2642
 
void KWDocument::setSerialLetterRecord( int r )
 
3836
void KWDocument::setMailMergeRecord( int r )
2643
3837
{
2644
3838
    slRecordNum = r;
2645
3839
}
2653
3847
 
2654
3848
void KWDocument::addFrameSet( KWFrameSet *f, bool finalize /*= true*/ )
2655
3849
{
2656
 
    frames.append(f);
 
3850
    if(m_lstFrameSet.contains(f) > 0) {
 
3851
        kdWarning(32001) << "Frameset " << f << " " << f->getName() << " already in list!" << endl;
 
3852
        return;
 
3853
    }
 
3854
    m_lstFrameSet.append(f);
2657
3855
    if ( finalize )
2658
3856
        f->finalize();
2659
3857
    setModified( true );
2662
3860
void KWDocument::removeFrameSet( KWFrameSet *f )
2663
3861
{
2664
3862
    emit sig_terminateEditing( f );
2665
 
    frames.take( frames.find(f) );
 
3863
    m_lstFrameSet.take( m_lstFrameSet.find(f) );
 
3864
    if ( m_bgSpellCheck->currentCheckSpellingFrame() == f )
 
3865
        // TODO nextTextFrameSet instead of:
 
3866
        m_bgSpellCheck->objectForSpell( 0L);
2666
3867
    setModified( true );
2667
3868
}
2668
3869
 
2669
 
// Returns 0-based page number where rect is (in fact its topleft corner).
2670
 
// Use isOutOfPage to check that the rectangle is fully contained in that page.
2671
3870
int KWDocument::getPageOfRect( KoRect & _rect ) const
2672
3871
{
2673
3872
    int page = static_cast<int>(_rect.y() / ptPaperHeight());
2685
3884
 
2686
3885
void KWDocument::addCommand( KCommand * cmd )
2687
3886
{
2688
 
    kdDebug() << "KWDocument::addCommand " << cmd->name() << endl;
 
3887
    Q_ASSERT( cmd );
 
3888
    //kdDebug(32001) << "KWDocument::addCommand " << cmd->name() << endl;
2689
3889
    m_commandHistory->addCommand( cmd, false );
2690
3890
    setModified( true );
2691
3891
}
2700
3900
    setModified( true );
2701
3901
}
2702
3902
 
2703
 
void KWDocument::setKSpellConfig(KSpellConfig _kspell)
 
3903
 
 
3904
void KWDocument::setKOSpellConfig(const KOSpellConfig& _kspell)
2704
3905
{
2705
 
  if(m_pKSpellConfig==0)
2706
 
    m_pKSpellConfig=new KSpellConfig();
 
3906
  if(m_pKOSpellConfig==0)
 
3907
    m_pKOSpellConfig=new KOSpellConfig();
2707
3908
 
2708
 
  m_pKSpellConfig->setNoRootAffix(_kspell.noRootAffix ());
2709
 
  m_pKSpellConfig->setRunTogether(_kspell.runTogether ());
2710
 
  m_pKSpellConfig->setDictionary(_kspell.dictionary ());
2711
 
  m_pKSpellConfig->setDictFromList(_kspell.dictFromList());
2712
 
  m_pKSpellConfig->setEncoding(_kspell.encoding());
2713
 
  m_pKSpellConfig->setClient(_kspell.client());
 
3909
  m_pKOSpellConfig->setNoRootAffix(_kspell.noRootAffix ());
 
3910
  m_pKOSpellConfig->setRunTogether(_kspell.runTogether ());
 
3911
  m_pKOSpellConfig->setDictionary(_kspell.dictionary ());
 
3912
  m_pKOSpellConfig->setDictFromList(_kspell.dictFromList());
 
3913
  m_pKOSpellConfig->setEncoding(_kspell.encoding());
 
3914
  m_pKOSpellConfig->setEncoding(_kspell.encoding());
 
3915
  m_pKOSpellConfig->setIgnoreCase ( _kspell.ignoreCase ());
 
3916
  m_pKOSpellConfig->setIgnoreAccent( _kspell.ignoreAccent());
 
3917
  m_pKOSpellConfig->setDontCheckTitleCase( _kspell.dontCheckTitleCase());
 
3918
  m_pKOSpellConfig->setDontCheckUpperWord( _kspell.dontCheckUpperWord() );
 
3919
  m_pKOSpellConfig->setSpellWordWithNumber( _kspell.spellWordWithNumber());
 
3920
  m_pKOSpellConfig->setClient (_kspell.client());
 
3921
  m_bgSpellCheck->setKSpellConfig(_kspell);
2714
3922
}
2715
3923
 
2716
3924
#ifndef NDEBUG
 
3925
void KWDocument::printStyleDebug()
 
3926
{
 
3927
    kdDebug() << "----------------------------------------"<<endl;
 
3928
    QPtrList<KWStyle> m_styleList(m_styleColl->styleList());
 
3929
    for ( KWStyle * p = m_styleList.first(); p != 0L; p = m_styleList.next() )
 
3930
    {
 
3931
        kdDebug() << "Style " << p << "  " << p->name() <<endl;
 
3932
        kdDebug() << "   format: " << p->format().key() <<endl;
 
3933
        static const char * const s_align[] = { "Auto", "Left", "Right", "ERROR", "HCenter", "ERR", "ERR", "ERR", "Justify", };
 
3934
        kdDebug() << "  align: " << s_align[p->paragLayout().alignment] << endl;
 
3935
 
 
3936
        kdDebug() << "   following style: " << p->followingStyle() << " "
 
3937
                  << ( p->followingStyle() ? p->followingStyle()->name() : QString::null ) << endl;
 
3938
    }
 
3939
}
 
3940
 
2717
3941
void KWDocument::printDebug()
2718
3942
{
2719
3943
    kdDebug() << "----------------------------------------"<<endl;
2725
3949
    kdDebug() << "Footer visible: " << isFooterVisible() << endl;
2726
3950
    kdDebug() << "Units: " << getUnit() <<endl;
2727
3951
    kdDebug() << "# Framesets: " << getNumFrameSets() <<endl;
2728
 
    QListIterator<KWFrameSet> fit = framesetsIterator();
 
3952
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
2729
3953
    for ( unsigned int iFrameset = 0; fit.current() ; ++fit, iFrameset++ )
2730
3954
    {
2731
3955
        KWFrameSet * frameset = fit.current();
2732
3956
        kdDebug() << "Frameset " << iFrameset << ": '" <<
2733
 
            frameset->getName() << "' (" << frameset << ")" <<endl;
2734
 
        frameset->printDebug();
 
3957
            frameset->getName() << "' (" << frameset << ")" << (frameset->isDeleted()?" Deleted":"")<<endl;
 
3958
        if ( frameset->isVisible())
 
3959
            frameset->printDebug();
2735
3960
    }
 
3961
 
 
3962
    for ( uint pgNum = 0 ; pgNum < m_sectionTitles.size() ; ++pgNum )
 
3963
        kdDebug() << "Page " << pgNum << "  Section: '" << m_sectionTitles[ pgNum ] << "'"<< endl;
2736
3964
    /*
2737
3965
    kdDebug() << "# Images: " << getImageCollection()->iterator().count() <<endl;
2738
3966
    QDictIterator<KWImage> it( getImageCollection()->iterator() );
2746
3974
 
2747
3975
void KWDocument::layout()
2748
3976
{
2749
 
    QListIterator<KWFrameSet> it = framesetsIterator();
 
3977
    QPtrListIterator<KWFrameSet> it = framesetsIterator();
2750
3978
    for (; it.current(); ++it )
2751
3979
        if ( it.current()->isVisible() )
2752
3980
            it.current()->layout();
2753
3981
}
2754
3982
 
2755
 
void KWDocument::invalidate()
 
3983
void KWDocument::invalidate(const KWFrameSet *skipThisFrameSet)
2756
3984
{
2757
 
    QListIterator<KWFrameSet> it = framesetsIterator();
 
3985
    QPtrListIterator<KWFrameSet> it = framesetsIterator();
2758
3986
    for (; it.current(); ++it )
2759
 
        it.current()->invalidate();
 
3987
        if(it.current()!=skipThisFrameSet)
 
3988
            it.current()->invalidate();
2760
3989
}
2761
3990
 
2762
 
KFormula::KFormulaDocument* KWDocument::getFormulaDocument()
 
3991
KFormula::Document* KWDocument::getFormulaDocument()
2763
3992
{
2764
 
    return m_formulaDocument;
 
3993
    KFormula::Document* formulaDocument = m_formulaDocumentWrapper->document();
 
3994
    if (!formulaDocument) {
 
3995
        kdDebug() << k_funcinfo << endl;
 
3996
        formulaDocument = new KFormula::Document;
 
3997
        m_formulaDocumentWrapper->document( formulaDocument );
 
3998
        if ( formulaDocument != 0 ) {
 
3999
            // re-calculate dpiX and dpiY
 
4000
            formulaDocument->setZoomAndResolution( m_zoom,
 
4001
                                                   qRound(INCH_TO_POINT( m_resolutionX )),
 
4002
                                                   qRound(INCH_TO_POINT( m_resolutionY )) );
 
4003
            formulaDocument->newZoomAndResolution(false,false);
 
4004
        }
 
4005
    }
 
4006
    return formulaDocument;
2765
4007
}
2766
4008
 
2767
4009
 
2769
4011
{
2770
4012
    // This has to be a loop instead of a signal, so that we can
2771
4013
    // send "true" for the last view (see KWFrameSet::drawContents)
2772
 
    QListIterator<KWView> it( m_lstViews );
 
4014
    QPtrListIterator<KWView> it( m_lstViews );
2773
4015
    for ( ; it.current() ; ++it )
2774
4016
        it.current()->getGUI()->canvasWidget()->repaintChanged( frameset, it.atLast() );
2775
4017
}
2780
4022
    KWFrame *frame= getFirstSelectedFrame();
2781
4023
    if (frame)
2782
4024
    {
2783
 
        QListIterator<KWView> it( m_lstViews );
 
4025
        QPtrListIterator<KWView> it( m_lstViews );
2784
4026
        frame = KWFrameSet::settingsFrame(frame);
2785
4027
        for ( ; it.current() ; ++it )
2786
4028
        {
2789
4031
    }
2790
4032
}
2791
4033
 
 
4034
void KWDocument::repaintResizeHandles()
 
4035
{
 
4036
   QPtrList<KWFrame> selectedFrames = getSelectedFrames();
 
4037
   KWFrame *frame=0L;
 
4038
   for(frame=selectedFrames.first(); frame != 0; frame=selectedFrames.next() )
 
4039
   {
 
4040
       frame->repaintResizeHandles();
 
4041
   }
 
4042
}
 
4043
 
2792
4044
void KWDocument::updateResizeHandles( )
2793
4045
{
2794
 
   QList<KWFrame> selectedFrames = getSelectedFrames();
 
4046
   QPtrList<KWFrame> selectedFrames = getSelectedFrames();
2795
4047
   KWFrame *frame=0L;
2796
4048
   for(frame=selectedFrames.first(); frame != 0; frame=selectedFrames.next() )
2797
4049
   {
2800
4052
   updateRulerFrameStartEnd();
2801
4053
}
2802
4054
 
 
4055
void KWDocument::updateCursorType( )
 
4056
{
 
4057
   QPtrList<KWFrame> selectedFrames = getSelectedFrames();
 
4058
   KWFrame *frame=0L;
 
4059
   for(frame=selectedFrames.first(); frame != 0; frame=selectedFrames.next() )
 
4060
   {
 
4061
       frame->updateCursorType();
 
4062
   }
 
4063
}
 
4064
 
2803
4065
void KWDocument::deleteTable( KWTableFrameSet *table )
2804
4066
{
2805
4067
    if ( !table )
2813
4075
    }
2814
4076
    else
2815
4077
    {
2816
 
        KWDeleteTableCommand *cmd = new KWDeleteTableCommand( i18n("Delete table"), table );
 
4078
        KWDeleteTableCommand *cmd = new KWDeleteTableCommand( i18n("Delete Table"), table );
2817
4079
        addCommand( cmd );
2818
4080
        cmd->execute();
2819
4081
    }
2821
4083
 
2822
4084
void KWDocument::deleteFrame( KWFrame * frame )
2823
4085
{
2824
 
    KWFrameSet * fs = frame->getFrameSet();
 
4086
    KWFrameSet * fs = frame->frameSet();
 
4087
    kdDebug(32002) << "KWDocument::deleteFrame frame=" << frame << " fs=" << fs << endl;
2825
4088
    frame->setSelected(false);
2826
4089
    QString cmdName;
2827
4090
    TypeStructDocItem docItem = (TypeStructDocItem) 0;
2828
4091
    switch (fs->type() ) {
2829
4092
    case FT_TEXT:
2830
 
        cmdName=i18n("Delete text frame");
 
4093
        cmdName=i18n("Delete Text Frame");
2831
4094
        docItem=TextFrames;
2832
4095
        break;
2833
4096
    case FT_FORMULA:
2834
 
        cmdName=i18n("Delete formula frame");
 
4097
        cmdName=i18n("Delete Formula Frame");
2835
4098
        docItem=FormulaFrames;
2836
4099
        break;
 
4100
    case FT_CLIPART:
 
4101
    {
 
4102
        kdError(32001) << "FT_CLIPART used! (in KWDocument::loadFrameSet)" << endl;
 
4103
        // Do not break!
 
4104
    }
2837
4105
    case FT_PICTURE:
2838
 
        cmdName=i18n("Delete picture frame");
 
4106
        cmdName=i18n("Delete Picture Frame");
2839
4107
        docItem=Pictures;
2840
4108
        break;
2841
 
    case FT_CLIPART:
2842
 
        cmdName=i18n("Delete picture frame"); // TODO "Delete clipart frame" after msg freeze
2843
 
        docItem=Cliparts;
2844
 
        break;
2845
4109
    case FT_PART:
2846
 
        cmdName=i18n("Delete object frame");
 
4110
        cmdName=i18n("Delete Object Frame");
2847
4111
        docItem=Embedded;
2848
4112
        break;
 
4113
#if 0 // KWORD_HORIZONTAL_LINE
 
4114
    case FT_HORZLINE:
 
4115
        cmdName=i18n("Delete Horizontal Line");
 
4116
        break;
 
4117
#endif
2849
4118
    case FT_TABLE:
2850
4119
    case FT_BASE:
2851
 
        ASSERT( 0 );
 
4120
        Q_ASSERT( 0 );
2852
4121
        break;
2853
4122
    }
2854
4123
    if ( fs->isFloating() )
2865
4134
    emit docStructureChanged(docItem);
2866
4135
}
2867
4136
 
2868
 
void KWDocument::deleteSeveralFrame()
 
4137
void KWDocument::deleteSelectedFrames()
2869
4138
{
2870
 
    QList<KWFrame> frames=getSelectedFrames();
 
4139
    QPtrList<KWFrame> frames=getSelectedFrames();
2871
4140
    int nbCommand=0;
2872
4141
    KWFrame *tmp=0;
2873
4142
 
2874
4143
    int docItem=0;
2875
4144
 
2876
 
    KMacroCommand * macroCmd = new KMacroCommand( i18n("Delete frames") );
 
4145
    KMacroCommand * macroCmd = new KMacroCommand( i18n("Delete Frames") );
2877
4146
    for ( tmp=frames.first(); tmp != 0; tmp=frames.next() )
2878
4147
    {
2879
 
        KWFrameSet *fs = tmp->getFrameSet();
 
4148
        KWFrameSet *fs = tmp->frameSet();
2880
4149
        if ( fs->isAFooter() || fs->isAHeader() )
2881
4150
            continue;
2882
4151
        //a table
2883
4152
        if ( fs->getGroupManager() )
2884
4153
        {
2885
4154
            KWTableFrameSet *table=fs->getGroupManager();
2886
 
            ASSERT(table);
 
4155
            Q_ASSERT(table);
2887
4156
            docItem|=typeItemDocStructure(table->type());
2888
4157
 
2889
4158
            if ( table->isFloating() )
2898
4167
            }
2899
4168
            else
2900
4169
            {
2901
 
                KWDeleteTableCommand *cmd = new KWDeleteTableCommand( i18n("Delete table"), table );
2902
 
                addCommand( cmd );
 
4170
                KWDeleteTableCommand *cmd = new KWDeleteTableCommand( i18n("Delete Table"), table );
2903
4171
                cmd->execute();
2904
4172
                macroCmd->addCommand(cmd);
2905
4173
                nbCommand++;
2909
4177
        {// a simple frame
2910
4178
            if ( fs->type() == FT_TEXT)
2911
4179
            {
2912
 
                if ( processingType() == KWDocument::WP && getFrameSetNum( fs ) == 0 )
 
4180
                if ( processingType() == KWDocument::WP && frameSetNum( fs ) == 0 )
2913
4181
                    continue;
2914
4182
            }
2915
4183
 
2925
4193
            }
2926
4194
            else
2927
4195
            {
2928
 
                KWDeleteFrameCommand *cmd = new KWDeleteFrameCommand( i18n("Delete frame"), tmp );
2929
 
                addCommand( cmd );
 
4196
                KWDeleteFrameCommand *cmd = new KWDeleteFrameCommand( i18n("Delete Frame"), tmp );
2930
4197
                cmd->execute();
2931
4198
                macroCmd->addCommand(cmd);
2932
4199
                nbCommand++;
2933
4200
            }
2934
4201
        }
2935
4202
    }
2936
 
    if( nbCommand)
 
4203
    if( nbCommand )
2937
4204
    {
2938
4205
        addCommand(macroCmd);
2939
4206
        emit refreshDocStructure(docItem);
2945
4212
 
2946
4213
void KWDocument::reorganizeGUI()
2947
4214
{
2948
 
   QListIterator<KWView> it( m_lstViews );
 
4215
   QPtrListIterator<KWView> it( m_lstViews );
2949
4216
   for ( ; it.current() ; ++it )
2950
4217
       it.current()->getGUI()->reorganize();
2951
4218
}
2952
4219
 
2953
4220
void KWDocument::slotDocumentInfoModifed()
2954
4221
{
2955
 
    recalcVariables( VT_FIELD );
 
4222
    if (!getVariableCollection()->variableSetting()->displayFieldCode())
 
4223
        recalcVariables( VT_FIELD );
2956
4224
}
2957
4225
 
2958
4226
void KWDocument::refreshDocStructure(int type)
2991
4259
    emit docStructureChanged(typeItemDocStructure(_type));
2992
4260
}
2993
4261
 
2994
 
QColor KWDocument::resolveTextColor( const QColor & col, QPainter * painter )
2995
 
{
2996
 
    if (col.isValid())
2997
 
        return col;
2998
 
 
2999
 
    return defaultTextColor( painter );
3000
 
}
3001
 
 
3002
 
QColor KWDocument::defaultTextColor( QPainter * painter )
3003
 
{
3004
 
    if ( painter->device()->devType() == QInternal::Printer )
3005
 
        return Qt::black;
3006
 
    return QApplication::palette().color( QPalette::Active, QColorGroup::Text );
3007
 
}
3008
 
 
3009
4262
QColor KWDocument::resolveBgColor( const QColor & col, QPainter * painter )
3010
4263
{
3011
4264
    if (col.isValid())
3025
4278
void KWDocument::renameButtonTOC(bool b)
3026
4279
{
3027
4280
    m_hasTOC=b;
3028
 
    QListIterator<KWView> it( m_lstViews );
 
4281
    QPtrListIterator<KWView> it( m_lstViews );
3029
4282
    for ( ; it.current() ; ++it )
3030
4283
    {
3031
4284
        it.current()->renameButtonTOC(b);
3034
4287
 
3035
4288
void KWDocument::refreshMenuExpression()
3036
4289
{
3037
 
    QListIterator<KWView> it( m_lstViews );
 
4290
    QPtrListIterator<KWView> it( m_lstViews );
3038
4291
    for ( ; it.current() ; ++it )
3039
4292
        it.current()->refreshMenuExpression();
3040
4293
}
3046
4299
 
3047
4300
void KWDocument::updateZoomRuler()
3048
4301
{
3049
 
    QListIterator<KWView> it( m_lstViews );
 
4302
    QPtrListIterator<KWView> it( m_lstViews );
3050
4303
    for ( ; it.current() ; ++it )
3051
4304
    {
3052
4305
        it.current()->getGUI()->getHorzRuler()->setZoom( zoomedResolutionX() );
3057
4310
 
3058
4311
void KWDocument::updateRulerFrameStartEnd()
3059
4312
{
3060
 
    QListIterator<KWView> it( m_lstViews );
 
4313
    QPtrListIterator<KWView> it( m_lstViews );
3061
4314
    for ( ; it.current() ; ++it )
3062
4315
        it.current()->slotUpdateRuler();
3063
4316
}
3064
4317
 
 
4318
void KWDocument::updateFrameStatusBarItem()
 
4319
{
 
4320
    QPtrListIterator<KWView> it( m_lstViews );
 
4321
    for ( ; it.current() ; ++it )
 
4322
        it.current()->updateFrameStatusBarItem();
 
4323
}
 
4324
 
 
4325
int KWDocument::undoRedoLimit() const
 
4326
{
 
4327
    return m_commandHistory->undoLimit();
 
4328
}
 
4329
 
 
4330
void KWDocument::setUndoRedoLimit(int val)
 
4331
{
 
4332
    m_commandHistory->setUndoLimit(val);
 
4333
    m_commandHistory->setRedoLimit(val);
 
4334
}
 
4335
 
 
4336
void KWDocument::setGridX(double _gridx) {
 
4337
    m_gridX = _gridx;
 
4338
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4339
        viewPtr->getGUI()->getHorzRuler()->setGridSize(_gridx);
 
4340
}
 
4341
 
 
4342
QValueList<KoTextObject *> KWDocument::visibleTextObjects(KWViewMode *viewmode) const
 
4343
{
 
4344
    QValueList<KoTextObject *> lst;
 
4345
    QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
 
4346
 
 
4347
    KWTextFrameSet *frm;
 
4348
    for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ) {
 
4349
        if ( frm && frm->isVisible(viewmode) && !frm->textObject()->protectContent() )
 
4350
        {
 
4351
            lst.append( frm->textObject() );
 
4352
        }
 
4353
    }
 
4354
 
 
4355
    return lst;
 
4356
}
 
4357
 
 
4358
void KWDocument::refreshGUIButton()
 
4359
{
 
4360
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4361
        viewPtr->initGUIButton();
 
4362
}
 
4363
 
 
4364
void KWDocument::enableBackgroundSpellCheck( bool b )
 
4365
{
 
4366
    m_bgSpellCheck->enableBackgroundSpellCheck(b);
 
4367
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4368
        viewPtr->updateBgSpellCheckingState();
 
4369
}
 
4370
 
 
4371
bool KWDocument::backgroundSpellCheckEnabled() const
 
4372
{
 
4373
    return m_bgSpellCheck->backgroundSpellCheckEnabled();
 
4374
}
 
4375
 
 
4376
void KWDocument::reactivateBgSpellChecking()
 
4377
{
 
4378
    QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
 
4379
 
 
4380
    KWTextFrameSet *frm;
 
4381
    for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
 
4382
        frm->textObject()->setNeedSpellCheck(true);
 
4383
    }
 
4384
    repaintAllViews();
 
4385
    startBackgroundSpellCheck();
 
4386
}
 
4387
 
 
4388
// to be removed
 
4389
KWTextFrameSet* KWDocument::nextTextFrameSet(KWTextFrameSet *obj)
 
4390
{
 
4391
    int pos = -1;
 
4392
    if ( bgFrameSpellChecked )
 
4393
        pos=m_lstFrameSet.findNextRef(bgFrameSpellChecked);
 
4394
    if(pos !=-1)
 
4395
    {
 
4396
        KWFrameSet *frm=0L;
 
4397
        for ( frm=m_lstFrameSet.at(pos); frm != 0; frm=m_lstFrameSet.next() ){
 
4398
            KWTextFrameSet *newFrm = frm->nextTextObject( obj );
 
4399
            if(newFrm && !newFrm->isDeleted()  && newFrm->textObject()->needSpellCheck())
 
4400
            {
 
4401
                //kdDebug() << "KWDocument::nextTextFrameSet checking " << bgFrameSpellChecked << endl;
 
4402
                bgFrameSpellChecked = frm;
 
4403
                return newFrm;
 
4404
            }
 
4405
        }
 
4406
    }
 
4407
    else
 
4408
    {
 
4409
        KWFrameSet *frm=0L;
 
4410
        for ( frm=m_lstFrameSet.first(); frm != 0; frm=m_lstFrameSet.next() ){
 
4411
            KWTextFrameSet *newFrm = frm->nextTextObject( obj );
 
4412
            if(newFrm && !newFrm->isDeleted() && newFrm->textObject()->needSpellCheck())
 
4413
            {
 
4414
                //kdDebug() << "KWDocument::nextTextFrameSet checking " << bgFrameSpellChecked << endl;
 
4415
                bgFrameSpellChecked = frm;
 
4416
                return newFrm;
 
4417
            }
 
4418
        }
 
4419
    }
 
4420
    //kdDebug() << "KWDocument::nextTextFrameSet returning 0L" << endl;
 
4421
    bgFrameSpellChecked = 0L;
 
4422
    return 0L;
 
4423
}
 
4424
 
 
4425
void KWDocument::slotChapterParagraphFormatted( KoTextParag* /*parag*/ )
 
4426
{
 
4427
    // Attempt at invalidating from the parag's page only
 
4428
    // But that's not good enough - if a header gets moved down,
 
4429
    // we also need to invalidate the previous page, from where the paragraph disappeared.
 
4430
    /*
 
4431
      KoPoint p;
 
4432
    KWFrame* frame = internalToDocument( parag->rect().topLeft(), p );
 
4433
    Q_ASSERT( frame );
 
4434
    if ( frame )
 
4435
        // Remove any information from this page and further pages.
 
4436
        m_sectionTitles.resize( frame->pageNum() );
 
4437
    */
 
4438
 
 
4439
    m_sectionTitles.resize( 0 ); // clear up the entire cache
 
4440
 
 
4441
    // Don't store info from parag into m_sectionTitles here.
 
4442
    // It breaks when having two headings in the same page
 
4443
    // (or if it keeps existing info then it can't update properly)
 
4444
}
 
4445
 
 
4446
QString KWDocument::checkSectionTitleInParag( KoTextParag* parag, KWTextFrameSet* frameset, int pageNum ) const
 
4447
{
 
4448
    if ( parag->counter() && parag->counter()->numbering() == KoParagCounter::NUM_CHAPTER
 
4449
         && parag->counter()->depth() == 0 )
 
4450
    {
 
4451
        QString txt = parag->string()->toString();
 
4452
        txt = txt.left( txt.length() - 1 ); // remove trailing space
 
4453
#ifndef NDEBUG // not needed, just checking
 
4454
        KoPoint p;
 
4455
        KWFrame* frame = frameset->internalToDocument( parag->rect().topLeft(), p );
 
4456
        Q_ASSERT( frame );
 
4457
        if ( frame ) {
 
4458
            int pgNum = frame->pageNum();
 
4459
            if( pgNum != pageNum )
 
4460
                kdWarning() << "sectionTitle: was looking for pageNum " << pageNum << ", got frame " << frame << " page " << pgNum << endl;
 
4461
        }
 
4462
        kdDebug(32001) << "KWDocument::sectionTitle for " << pageNum << ":" << txt << endl;
 
4463
#endif
 
4464
        // Ensure array is big enough
 
4465
        if ( pageNum > (int)m_sectionTitles.size()-1 )
 
4466
            const_cast<KWDocument*>(this)->m_sectionTitles.resize( pageNum + 1 );
 
4467
        const_cast<KWDocument*>(this)->m_sectionTitles[ pageNum ] = txt;
 
4468
        return txt;
 
4469
    }
 
4470
    return QString::null;
 
4471
}
 
4472
 
 
4473
QString KWDocument::sectionTitle( int pageNum ) const
 
4474
{
 
4475
    //kdDebug(32001) << "KWDocument::sectionTitle(pageNum=" << pageNum << ") m_sectionTitles.size()=" << m_sectionTitles.size() << endl;
 
4476
    // First look in the cache. If info is present, it's uptodate (see slotChapterParagraphFormatted)
 
4477
    if ( (int)m_sectionTitles.size() > pageNum )
 
4478
    {
 
4479
        // Look whether this page has a section title, and if not, go back pages, one by one
 
4480
        for ( int i = pageNum; i >= 0 ; --i )
 
4481
        {
 
4482
            const QString& s = m_sectionTitles[i];
 
4483
            if ( !s.isEmpty() )
 
4484
            {
 
4485
                // Update cache, to make this faster next time
 
4486
                if ( pageNum > (int)m_sectionTitles.size()-1 )
 
4487
                    const_cast<KWDocument*>(this)->m_sectionTitles.resize( pageNum + 1 );
 
4488
                const_cast<KWDocument*>(this)->m_sectionTitles[ pageNum ] = s;
 
4489
                return s;
 
4490
            }
 
4491
        }
 
4492
    }
 
4493
 
 
4494
    // If not in the cache, determine from the paragraphs in the page.
 
4495
 
 
4496
    if ( m_lstFrameSet.isEmpty() )
 
4497
        return QString::null;
 
4498
    // We use the "main" frameset to determine section titles.
 
4499
    KWTextFrameSet *frameset = dynamic_cast<KWTextFrameSet *>( m_lstFrameSet.getFirst() );
 
4500
    if ( !frameset )
 
4501
        return QString::null;
 
4502
 
 
4503
    int topLUpix, bottomLUpix;
 
4504
    if ( !frameset->minMaxInternalOnPage( pageNum, topLUpix, bottomLUpix ) )
 
4505
        return QString::null;
 
4506
 
 
4507
    KoTextParag* parag = frameset->textDocument()->firstParag();
 
4508
    //kdDebug(32001) << "KWDocument::sectionTitle " << pageNum
 
4509
    //          << " topLUpix=" << topLUpix << " bottomLUpix=" << bottomLUpix << endl;
 
4510
 
 
4511
    KoTextParag* lastParagOfPageAbove = parag;
 
4512
    for ( ; parag ; parag = parag->next() )
 
4513
    {
 
4514
        if ( parag->rect().bottom() < topLUpix ) // too early
 
4515
        {
 
4516
            lastParagOfPageAbove = parag;
 
4517
            continue;
 
4518
        }
 
4519
        if ( parag->rect().top() > bottomLUpix ) // done
 
4520
            break;
 
4521
        QString txt = checkSectionTitleInParag( parag, frameset, pageNum );
 
4522
        if ( !txt.isEmpty() )
 
4523
            return txt;
 
4524
    }
 
4525
 
 
4526
    // No heading found in page.
 
4527
    // Go back up until the first section parag
 
4528
    parag = lastParagOfPageAbove;
 
4529
    for (  ; parag ; parag = parag->prev() )
 
4530
    {
 
4531
        QString txt = checkSectionTitleInParag( parag, frameset, pageNum );
 
4532
        if ( !txt.isEmpty() )
 
4533
            return txt;
 
4534
    }
 
4535
 
 
4536
    // First page, no heading found
 
4537
    return QString::null;
 
4538
}
 
4539
 
 
4540
void KWDocument::addIgnoreWordAll( const QString & word)
 
4541
{
 
4542
    if( m_spellListIgnoreAll.findIndex( word )==-1)
 
4543
        m_spellListIgnoreAll.append( word );
 
4544
    m_bgSpellCheck->addIgnoreWordAll( word );
 
4545
 
 
4546
}
 
4547
 
 
4548
void KWDocument::clearIgnoreWordAll( )
 
4549
{
 
4550
    m_spellListIgnoreAll.clear();
 
4551
    m_bgSpellCheck->clearIgnoreWordAll();
 
4552
 
 
4553
}
 
4554
 
 
4555
int KWDocument::maxZOrder( int pageNum) const
 
4556
{
 
4557
    bool first = true;
 
4558
    int maxZOrder = 0; //this value is only used if there's no frame on the page
 
4559
    QPtrList<KWFrame> frames = framesInPage( pageNum );
 
4560
    QPtrListIterator<KWFrame> frameIt( frames );
 
4561
    for ( ; frameIt.current(); ++frameIt ) {
 
4562
        if ( first || frameIt.current()->zOrder() > maxZOrder ) {
 
4563
            maxZOrder = frameIt.current()->zOrder();
 
4564
            first = false;
 
4565
        }
 
4566
    }
 
4567
    return maxZOrder;
 
4568
}
 
4569
 
 
4570
QPtrList<KWTextFrameSet> KWDocument::allTextFramesets(bool onlyReadWrite) const
 
4571
{
 
4572
    QPtrList<KWTextFrameSet> textFramesets;
 
4573
    QPtrListIterator<KWFrameSet> fit = framesetsIterator();
 
4574
    for ( ; fit.current() ; ++fit ) {
 
4575
        if(fit.current()->isDeleted()) continue;
 
4576
        fit.current()->addTextFrameSets(textFramesets, onlyReadWrite);
 
4577
    }
 
4578
    return textFramesets;
 
4579
}
 
4580
 
 
4581
int KWDocument::numberOfTextFrameSet( KWFrameSet* fs, bool onlyReadWrite )
 
4582
{
 
4583
    QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( onlyReadWrite );
 
4584
    return textFramesets.findRef( static_cast<KWTextFrameSet*>(fs) );
 
4585
}
 
4586
 
 
4587
KWFrameSet * KWDocument::textFrameSetFromIndex( unsigned int _num, bool onlyReadWrite )
 
4588
{
 
4589
    return allTextFramesets( onlyReadWrite ).at( _num );
 
4590
}
 
4591
 
 
4592
void KWDocument::updateTextFrameSetEdit()
 
4593
{
 
4594
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4595
        viewPtr->slotFrameSetEditChanged();
 
4596
 
 
4597
}
 
4598
 
 
4599
void KWDocument::displayFootNoteFieldCode()
 
4600
{
 
4601
    QPtrListIterator<KoVariable> it( m_varColl->getVariables() );
 
4602
    for ( ; it.current() ; ++it )
 
4603
    {
 
4604
        if ( it.current()->type() == VT_FOOTNOTE )
 
4605
        {
 
4606
            static_cast<KWFootNoteVariable *>(it.current())->resize();
 
4607
            static_cast<KWFootNoteVariable *>(it.current())->frameSet()->setCounterText( static_cast<KWFootNoteVariable *>(it.current())->text() );
 
4608
 
 
4609
            KoTextParag * parag = it.current()->paragraph();
 
4610
            if ( parag )
 
4611
            {
 
4612
                parag->invalidate( 0 );
 
4613
                parag->setChanged( true );
 
4614
            }
 
4615
        }
 
4616
    }
 
4617
}
 
4618
 
 
4619
void KWDocument::changeFootNoteConfig()
 
4620
{
 
4621
    QPtrListIterator<KoVariable> it( m_varColl->getVariables() );
 
4622
    for ( ; it.current() ; ++it )
 
4623
    {
 
4624
        if ( it.current()->type() == VT_FOOTNOTE )
 
4625
        {
 
4626
            static_cast<KWFootNoteVariable *>(it.current())->formatedNote();
 
4627
            static_cast<KWFootNoteVariable *>(it.current())->resize();
 
4628
            static_cast<KWFootNoteVariable *>(it.current())->frameSet()->setCounterText( static_cast<KWFootNoteVariable *>(it.current())->text() );
 
4629
 
 
4630
            KoTextParag * parag = it.current()->paragraph();
 
4631
            if ( parag )
 
4632
            {
 
4633
                parag->invalidate( 0 );
 
4634
                parag->setChanged( true );
 
4635
            }
 
4636
        }
 
4637
    }
 
4638
    slotRepaintVariable();
 
4639
}
 
4640
 
 
4641
 
 
4642
void KWDocument::setTabStopValue ( double _tabStop )
 
4643
{
 
4644
    m_tabStop = _tabStop;
 
4645
    QPtrList<KWTextFrameSet> textFramesets = allTextFramesets( true );
 
4646
 
 
4647
    KWTextFrameSet *frm;
 
4648
    for ( frm=textFramesets.first(); frm != 0; frm=textFramesets.next() ){
 
4649
        frm->textDocument()->setTabStops( ptToLayoutUnitPixX( _tabStop ));
 
4650
        frm->layout();
 
4651
    }
 
4652
    repaintAllViews();
 
4653
}
 
4654
 
 
4655
void KWDocument::switchViewMode( KWViewMode * newViewMode )
 
4656
{
 
4657
    // Don't compare m_viewMode and newViewMode here, it would break
 
4658
    // changing the number of pages per row for the preview mode, in kwconfig.
 
4659
    delete m_viewMode;
 
4660
    m_viewMode = newViewMode;
 
4661
    m_lastViewMode = m_viewMode->type(); // remember for saving config
 
4662
 
 
4663
    //necessary to switchmode view in all canvas in first.
 
4664
    //otherwise in multiview kword crash !
 
4665
    //perhaps it's not a good idea to store m_modeView into kwcanvas.
 
4666
    //but it's necessary for the futur when kword will support
 
4667
    //different view mode in different view.
 
4668
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4669
        viewPtr->getGUI()->canvasWidget()->switchViewMode( m_viewMode );
 
4670
 
 
4671
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4672
        viewPtr->switchModeView();
 
4673
    emit newContentsSize();
 
4674
    updateResizeHandles();
 
4675
 
 
4676
    // Since the text layout depends on the view mode, we need to redo it
 
4677
    // But after telling the canvas about the new viewmode, otherwise stuff like
 
4678
    // slotNewContentsSize will crash.
 
4679
    updateAllFrames();
 
4680
    layout();
 
4681
 
 
4682
    repaintAllViews( true );
 
4683
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4684
        viewPtr->getGUI()->canvasWidget()->ensureCursorVisible();
 
4685
}
 
4686
 
 
4687
void KWDocument::changeBgSpellCheckingState( bool b )
 
4688
{
 
4689
    enableBackgroundSpellCheck( b );
 
4690
    reactivateBgSpellChecking();
 
4691
    KConfig *config = KWFactory::global()->config();
 
4692
    config->setGroup("KSpell kword" );
 
4693
    config->writeEntry( "SpellCheck", (int)b );
 
4694
}
 
4695
 
 
4696
QString KWDocument::initialFrameSet() const
 
4697
{
 
4698
    return m_initialEditing ? m_initialEditing->m_initialFrameSet : QString::null;
 
4699
}
 
4700
 
 
4701
int KWDocument::initialCursorParag() const
 
4702
{
 
4703
    return m_initialEditing ? m_initialEditing->m_initialCursorParag : 0;
 
4704
}
 
4705
 
 
4706
int KWDocument::initialCursorIndex() const
 
4707
{
 
4708
    return m_initialEditing ? m_initialEditing->m_initialCursorIndex : 0;
 
4709
}
 
4710
 
 
4711
void KWDocument::deleteInitialEditingInfo()
 
4712
{
 
4713
    delete m_initialEditing;
 
4714
    m_initialEditing = 0L;
 
4715
}
 
4716
 
 
4717
bool KWDocument::cursorInProtectedArea()const
 
4718
{
 
4719
    return m_cursorInProtectectedArea;
 
4720
}
 
4721
 
 
4722
void KWDocument::setCursorInProtectedArea( bool b )
 
4723
{
 
4724
    m_cursorInProtectectedArea=b;
 
4725
    testAndCloseAllFrameSetProtectedContent();
 
4726
}
 
4727
 
 
4728
 
 
4729
void KWDocument::testAndCloseAllFrameSetProtectedContent()
 
4730
{
 
4731
    if ( !m_cursorInProtectectedArea )
 
4732
    {
 
4733
        for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4734
            viewPtr->testAndCloseAllFrameSetProtectedContent();
 
4735
    }
 
4736
}
 
4737
 
 
4738
void KWDocument::updateRulerInProtectContentMode()
 
4739
{
 
4740
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4741
        viewPtr->updateRulerInProtectContentMode();
 
4742
}
 
4743
 
 
4744
 
 
4745
void KWDocument::insertBookMark(const QString &_name, KWTextParag *_startparag,KWTextParag *_endparag, KWFrameSet *_frameSet, int _start, int _end)
 
4746
{
 
4747
    KWBookMark *book = new KWBookMark( _name, _startparag, _endparag, _frameSet, _start, _end );
 
4748
    m_bookmarkList.append( book );
 
4749
}
 
4750
 
 
4751
void KWDocument::deleteBookMark(const QString &_name)
 
4752
{
 
4753
    QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4754
    for ( ; book.current() ; ++book )
 
4755
    {
 
4756
        if ( book.current()->bookMarkName()==_name)
 
4757
        {
 
4758
            m_bookmarkList.remove(book.current());
 
4759
            setModified(true);
 
4760
            break;
 
4761
        }
 
4762
    }
 
4763
}
 
4764
 
 
4765
void KWDocument::renameBookMark(const QString &_oldName, const QString &_newName)
 
4766
{
 
4767
    if ( _oldName==_newName)
 
4768
        return;
 
4769
    QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4770
    for ( ; book.current() ; ++book )
 
4771
    {
 
4772
        if ( book.current()->bookMarkName()==_oldName)
 
4773
        {
 
4774
            book.current()->setBookMarkName(_newName );
 
4775
            setModified(true);
 
4776
            break;
 
4777
        }
 
4778
    }
 
4779
}
 
4780
 
 
4781
KWBookMark * KWDocument::bookMarkByName( const QString & name )
 
4782
{
 
4783
    QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4784
    for ( ; book.current() ; ++book )
 
4785
    {
 
4786
        if ( book.current()->bookMarkName()==name)
 
4787
            return book.current();
 
4788
    }
 
4789
    return 0L;
 
4790
}
 
4791
 
 
4792
QStringList KWDocument::listOfBookmarkName(KWViewMode * viewMode)const
 
4793
{
 
4794
    QStringList list;
 
4795
    if ( viewMode && viewMode->type()!="ModeText")
 
4796
    {
 
4797
        QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4798
        for ( ; book.current() ; ++book )
 
4799
        {
 
4800
            if ( !book.current()->frameSet()->isDeleted())
 
4801
                list.append( book.current()->bookMarkName());
 
4802
        }
 
4803
    }
 
4804
    else
 
4805
    {
 
4806
        QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4807
        for ( ; book.current() ; ++book )
 
4808
        {
 
4809
            if ( book.current()->frameSet()->isVisible( viewMode )&& !book.current()->frameSet()->isDeleted())
 
4810
                list.append( book.current()->bookMarkName());
 
4811
        }
 
4812
    }
 
4813
    return list;
 
4814
}
 
4815
 
 
4816
void KWDocument::paragraphModified(KoTextParag* /*_parag*/, int /*KoTextParag::ParagModifyType*/ /*_type*/, int /*start*/, int /*lenght*/)
 
4817
{
 
4818
    //kdDebug()<<" _parag :"<<_parag<<" start :"<<start<<" lenght :"<<lenght<<endl;
 
4819
}
 
4820
 
 
4821
 
 
4822
void KWDocument::spellCheckParagraphDeleted( KoTextParag *_parag,  KWTextFrameSet *frm)
 
4823
{
 
4824
    m_bgSpellCheck->spellCheckParagraphDeleted( _parag, frm->textObject());
 
4825
}
 
4826
 
 
4827
void KWDocument::paragraphDeleted( KoTextParag *_parag, KWFrameSet *frm )
 
4828
{
 
4829
    if ( m_bookmarkList.isEmpty() )
 
4830
        return;
 
4831
    QPtrListIterator<KWBookMark> book(m_bookmarkList);
 
4832
    for ( ; book.current() ; ++book ) {
 
4833
        KWBookMark* bk = book.current();
 
4834
        if ( bk->frameSet()==frm ) {
 
4835
            // Adjust bookmark to point to a valid paragraph, below or above the deleted one.
 
4836
            // The old implementation turned the bookmark into a useless one. OOo simply deletes the bookmark...
 
4837
            if ( bk->startParag() == _parag )
 
4838
                bk->setStartParag( _parag->next() ? _parag->next() : _parag->prev() );
 
4839
            if ( bk->endParag() == _parag )
 
4840
                bk->setEndParag( _parag->next() ? _parag->next() : _parag->prev() );
 
4841
        }
 
4842
    }
 
4843
}
 
4844
 
 
4845
void KWDocument::initBookmarkList()
 
4846
{
 
4847
    QPtrListIterator<bookMark> book(m_tmpBookMarkList);
 
4848
    for ( ; book.current() ; ++book )
 
4849
    {
 
4850
        KWFrameSet * fs = 0L;
 
4851
        QString fsName = book.current()->frameSetName;
 
4852
        if ( !fsName.isEmpty() )
 
4853
            fs = frameSetByName( fsName );
 
4854
        if ( fs )
 
4855
        {
 
4856
            KWTextFrameSet *frm = dynamic_cast<KWTextFrameSet *>(fs);
 
4857
            if ( frm)
 
4858
            {
 
4859
                KWBookMark *tmp =new KWBookMark( book.current()->bookname);
 
4860
                tmp->setFrameSet(frm);
 
4861
                KWTextParag* startparag = dynamic_cast<KWTextParag*>(frm->textDocument()->paragAt( book.current()->paragStartIndex ));
 
4862
                KWTextParag* endparag = dynamic_cast<KWTextParag*>(frm->textDocument()->paragAt( book.current()->paragEndIndex ));
 
4863
 
 
4864
                if ( !startparag || !endparag)
 
4865
                {
 
4866
                    delete tmp;
 
4867
                }
 
4868
                else
 
4869
                {
 
4870
                    tmp->setStartParag( startparag );
 
4871
                    tmp->setEndParag( endparag );
 
4872
                    tmp->setBookmarkStartIndex( book.current()->cursorStartIndex);
 
4873
                    tmp->setBookmarkEndIndex( book.current()->cursorEndIndex);
 
4874
                    m_bookmarkList.append( tmp );
 
4875
                }
 
4876
            }
 
4877
        }
 
4878
    }
 
4879
    m_tmpBookMarkList.setAutoDelete( true );
 
4880
    m_tmpBookMarkList.clear();
 
4881
}
 
4882
 
 
4883
QPixmap* KWDocument::doubleBufferPixmap( const QSize& s )
 
4884
{
 
4885
    if ( !m_bufPixmap ) {
 
4886
        int w = QABS( s.width() );
 
4887
        int h = QABS( s.height() );
 
4888
        m_bufPixmap = new QPixmap( w, h );
 
4889
    } else {
 
4890
        if ( m_bufPixmap->width() < s.width() ||
 
4891
             m_bufPixmap->height() < s.height() ) {
 
4892
            m_bufPixmap->resize( QMAX( s.width(), m_bufPixmap->width() ),
 
4893
                                QMAX( s.height(), m_bufPixmap->height() ) );
 
4894
        }
 
4895
    }
 
4896
 
 
4897
    return m_bufPixmap;
 
4898
}
 
4899
 
 
4900
void KWDocument::maybeDeleteDoubleBufferPixmap()
 
4901
{
 
4902
    if ( m_bufPixmap && m_bufPixmap->height() * m_bufPixmap->width() > 400*400 )
 
4903
    {
 
4904
        delete m_bufPixmap;
 
4905
        m_bufPixmap = 0L;
 
4906
    }
 
4907
}
 
4908
 
 
4909
void KWDocument::configureSpellChecker()
 
4910
{
 
4911
    KWView * view = static_cast<KWView*>(views().getFirst());
 
4912
    if ( view ) // no view if embedded document
 
4913
    {
 
4914
        view->configureSpellChecker();
 
4915
    }
 
4916
}
 
4917
 
 
4918
void KWDocument::setPersonalExpressionPath( const QStringList & lst)
 
4919
{
 
4920
    m_personalExpressionPath = lst;
 
4921
    refreshMenuExpression();
 
4922
}
 
4923
 
 
4924
void KWDocument::updateDirectCursorButton()
 
4925
{
 
4926
    for ( KWView *viewPtr = m_lstViews.first(); viewPtr != 0; viewPtr = m_lstViews.next() )
 
4927
        viewPtr->updateDirectCursorButton();
 
4928
}
 
4929
 
 
4930
void KWDocument::setInsertDirectCursor(bool _b)
 
4931
{
 
4932
    m_bInsertDirectCursor=_b;
 
4933
    KConfig *config = KWFactory::global()->config();
 
4934
    config->setGroup( "Interface" );
 
4935
    config->writeEntry( "InsertDirectCursor", _b );
 
4936
    updateDirectCursorButton();
 
4937
}
 
4938
 
 
4939
#if 0 // KWORD_HORIZONTAL_LINE
 
4940
void KWDocument::setHorizontalLinePath( const QStringList & lst)
 
4941
{
 
4942
    m_horizontalLinePath = lst;
 
4943
}
 
4944
#endif
 
4945
 
 
4946
void KWDocument::addWordToDictionary( const QString & word)
 
4947
{
 
4948
    if ( m_bgSpellCheck )
 
4949
    {
 
4950
        m_bgSpellCheck->addPersonalDictonary( word );
 
4951
    }
 
4952
}
 
4953
 
 
4954
void KWDocument::setEmpty()
 
4955
{
 
4956
    KoDocument::setEmpty();
 
4957
    // Whether loaded from template or from empty doc: this is a new one -> set creation date
 
4958
    m_varColl->variableSetting()->setCreationDate(QDateTime::currentDateTime());
 
4959
}
 
4960
 
3065
4961
#include "kwdoc.moc"