diff options
Diffstat (limited to 'kword/KWDocument.h')
-rw-r--r-- | kword/KWDocument.h | 1020 |
1 files changed, 1020 insertions, 0 deletions
diff --git a/kword/KWDocument.h b/kword/KWDocument.h new file mode 100644 index 00000000..1b8ebac9 --- /dev/null +++ b/kword/KWDocument.h @@ -0,0 +1,1020 @@ +/* This file is part of the KDE project + Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org> + Copyright (C) 2002-2006 David Faure <faure@kde.org> + Copyright (C) 2005 Thomas Zander <zander@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#ifndef kwdoc_h +#define kwdoc_h + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +class QDragObject; +class KoSavingContext; +class KoGenStyles; +class KWDocument; +class KPrinter; +class KWTextImage; +class KWTextFrameSet; +class KWPictureFrameSet; +class KWMailMergeDataBase; +class KWFrameSet; +class KWTableFrameSet; +class KWPartFrameSet; +class KoStyleCollection; +class KoParagStyle; +class KWFrameStyle; +class KWTableStyle; +class KWTableTemplate; +#define KoParagStyle KoParagStyle +class KWFrame; +class KWViewMode; +class KMacroCommand; +class KoDocumentEntry; +class QPainter; +class KoAutoFormat; +class KCommand; +class KoCommandHistory; +class KoVariable; +class KoVariableFormatCollection; +class KWVariableCollection; +class KoTextObject; +class KWBgSpellCheck; +class KoStyleCollection; +class KWFrameStyleCollection; +class KWTableStyleCollection; +class KWTableTemplateCollection; +class KWFootNoteVariable; +class DCOPObject; +class KWLoadingInfo; +class KoPicture; +class KoTextBookmark; +class KoTextBookmarkList; +class KoPictureCollection; +class KWDocumentChild; +class KWPageManager; +class KWPage; + +class QFont; +class QStringList; +class QRect; + +namespace KFormula { + class Document; + class DocumentWrapper; +} + +class KoTextParag; +class KoOasisSettings; + +#include "KWAnchorPos.h" // legacy loading stuff +#include "KWView.h" + +#include <KoDocument.h> +#include <KoTextZoomHandler.h> +#include <KoPictureKey.h> +#include <KoStyleCollection.h> // for KoStyleChangeDefMap + +#include <qmap.h> +#include <qptrlist.h> +#include <qfont.h> +#include <qvaluevector.h> + +/******************************************************************/ +/* Class: KWDocument */ +/******************************************************************/ + +class KWDocument : public KoDocument, public KoTextZoomHandler +{ + Q_OBJECT + Q_PROPERTY( double ptColumnWidth READ ptColumnWidth ) + Q_PROPERTY( double ptColumnSpacing READ ptColumnSpacing ) + Q_PROPERTY( double gridX READ gridX WRITE setGridX ) + Q_PROPERTY( double gridY READ gridY WRITE setGridY ) + Q_PROPERTY( bool snapToGrid READ snapToGrid WRITE setSnapToGrid ) + Q_PROPERTY( double indentValue READ indentValue WRITE setIndentValue ) + Q_PROPERTY( int nbPagePerRow READ nbPagePerRow WRITE setNbPagePerRow ) + Q_PROPERTY( double defaultColumnSpacing READ defaultColumnSpacing WRITE setDefaultColumnSpacing ) + Q_PROPERTY( int maxRecentFiles READ maxRecentFiles ) + Q_PROPERTY( QString globalLanguage READ globalLanguage WRITE setGlobalLanguage ) + Q_PROPERTY( bool globalHyphenation READ globalHyphenation WRITE setGlobalHyphenation ) + Q_PROPERTY( bool insertDirectCursor READ insertDirectCursor WRITE setInsertDirectCursor ) + Q_PROPERTY( QStringList personalExpressionPath READ personalExpressionPath WRITE setPersonalExpressionPath ) + Q_PROPERTY( bool viewFormattingBreak READ viewFormattingBreak WRITE setViewFormattingBreak ) + Q_PROPERTY( bool viewFormattingTabs READ viewFormattingTabs WRITE setViewFormattingTabs ) + Q_PROPERTY( bool viewFormattingSpace READ viewFormattingSpace WRITE setViewFormattingSpace ) + Q_PROPERTY( bool viewFormattingEndParag READ viewFormattingEndParag WRITE setViewFormattingEndParag ) + Q_PROPERTY( bool cursorInProtectedArea READ cursorInProtectedArea WRITE setCursorInProtectedArea ) + Q_PROPERTY( bool pgUpDownMovesCaret READ pgUpDownMovesCaret WRITE setPgUpDownMovesCaret ) + Q_PROPERTY( bool allowAutoFormat READ allowAutoFormat WRITE setAllowAutoFormat ) + Q_PROPERTY( int undoRedoLimit READ undoRedoLimit WRITE setUndoRedoLimit ) + +public: + friend class KWOasisLoader; + friend class KWStartupWidget; + + KWDocument( QWidget *parentWidget = 0, const char *widname = 0, QObject* parent = 0, const char* name = 0, bool singleViewMode = false ); + ~KWDocument(); + + enum ProcessingType {WP = 0, DTP = 1}; + + static const int CURRENT_SYNTAX_VERSION; + +public: + virtual bool initDoc(InitDocFlags flags, QWidget* parentWidget=0); + + virtual bool loadOasis( const QDomDocument& doc, KoOasisStyles& oasisStyles, const QDomDocument& settings, KoStore* store ); + + /** + * Those values are used as KoGenStyle types. + * + * STYLE_FRAME_AUTO: for frame styles (family="graphic") used by actual frames, saved into content.xml + * STYLE_FRAME_USER: for frame styles (family="graphic") defined by the user, saved into styles.xml + * STYLE_TABLE_CELL_AUTO: for table-cell styles (family="table-cell") used by actual tables, saved into content.xml + * STYLE_TABLE_CELL_USER: for table-cell styles (family="table-cell") defined by the user, saved into styles.xml + * ... + */ + enum { STYLE_FRAME_AUTO = 20, STYLE_FRAME_USER, + STYLE_TABLE_CELL_AUTO, STYLE_TABLE_CELL_USER, + STYLE_TABLE, STYLE_TABLE_COLUMN, STYLE_TABLE_ROW }; + + virtual bool saveOasis( KoStore* store, KoXmlWriter* manifestWriter ); + + virtual int supportedSpecialFormats() const; + + enum SaveFlag { SaveAll, SaveSelected }; // kpresenter will also have SavePage + + /** + * Return a drag object with the selected frames + */ + QDragObject* dragSelected( const QValueList<KWFrameView*> &selectedFrames); + /** + * Return a drag object with the selected text + */ + QDragObject* dragSelected( QWidget *parent, KWTextFrameSet* fs ); + + virtual bool loadXML( QIODevice *, const QDomDocument & dom ); + virtual bool loadChildren( KoStore *store ); + virtual QDomDocument saveXML(); + void processPictureRequests(); + void processAnchorRequests(); + bool processFootNoteRequests(); + + int syntaxVersion( ) const { return m_syntaxVersion; } + + /// Called by KWFrame*'s loading code to emit correct progress info + void progressItemLoaded(); + + /** + * Draw as embedded. + */ + virtual void paintContent( QPainter& painter, const QRect& rect, bool transparent = false, double zoomX = 1.0, double zoomY = 1.0 ); + + virtual QPixmap generatePreview( const QSize &size ); + + /** + * @param emptyRegion The region is modified to subtract the areas painted, thus + * allowing the caller to determine which areas remain to be painted. + */ + void createEmptyRegion( const QRect & crect, QRegion & emptyRegion, KWViewMode * viewMode ); + /** + * Erase the empty space defined by @p emptySpaceRegion. + * Usually used to clear the space where there is no frame (e.g. page margins). + */ + void eraseEmptySpace( QPainter * painter, const QRegion & emptySpaceRegion, const QBrush & brush ); + + virtual void setEmpty(); + + virtual void addView( KoView *view ); + virtual void removeView( KoView *view ); + + virtual void addShell( KoMainWindow *shell ); + + KWPartFrameSet* insertObject( const KoRect& rect, KoDocumentEntry& e, QWidget* parentWidget ); + + /// Create an embedded document; used by KWPartFrameSet but is defined here + /// because KoDocument:insertChild is protected. + KWDocumentChild* createChildDoc( const KoRect& rect, KoDocument* childDoc ); + + void setPageLayout( const KoPageLayout& layout, const KoColumns& cl, const KoKWHeaderFooter& hf, bool updateViews = true ); + + void getPageLayout( KoPageLayout& layout, KoColumns& cl, KoKWHeaderFooter& hf ); + + KWTextFrameSet * textFrameSet ( unsigned int num ) const; + /// Return the frameset number @p num + KWFrameSet *frameSet( unsigned int num ) + { return m_lstFrameSet.at( num ); } + + /// Return the frameset with a given name + KWFrameSet * frameSetByName( const QString & name ); + + /// Return the total number of framesets + unsigned int frameSetCount() const + { return m_lstFrameSet.count(); } + + /// Generate a new name for a frameset. @p templateName must contain a %1 [for a number]. + QString generateFramesetName( const QString & templateName ); + + /// Prefer this over frameSet(i), if iterating over all of them + QPtrListIterator<KWFrameSet> framesetsIterator() const { return QPtrListIterator<KWFrameSet>(m_lstFrameSet); } + + QValueList<KoTextObject *> visibleTextObjects(KWViewMode *viewmode) const; + + /// Register new frameset + void addFrameSet( KWFrameSet *f, bool finalize = true ); + /// Remove frameset from list (don't delete) + void removeFrameSet( KWFrameSet *f ); + + /// Frame/table deletion - with undo/redo support + /// Moved to KWDocument so that dialogs can call them if necessary + void deleteTable( KWTableFrameSet *groupManager ); + void deleteFrame( KWFrame * frame ); + + /// return the height of one page in pixels in the current zoom level (normal coord system) + unsigned int paperHeight(int pageNum) const; + /// return the width of one page in pixels in the current zoom level (normal coord system) + unsigned int paperWidth(int pageNum) const; + /// Top of the page number pgNum, in pixels (in the normal coord system) + unsigned int pageTop( int pgNum ) const; + double ptColumnWidth() const; + double ptColumnSpacing() const { return m_pageColumns.ptColumnSpacing; } + double ptFootnoteBodySpacing() const { return m_pageHeaderFooter.ptFootNoteBodySpacing; } + + unsigned int numColumns() const { return m_pageColumns.columns; } + + void repaintAllViews( bool erase = false ); + /** Update all views of this document, area can be cleared before redrawing with the + * erase flag. (false implied). All views EXCEPT the argument view are updated ( give 0L for all ) + */ + void repaintAllViewsExcept( KWView *view, bool erase = false ); + + + /** + * schedule a repaint of all views but don't execute immediately + */ + void delayedRepaintAllViews(); + + /** + * schedule a frame layout (e.g. for footnotes) but don't execute immediately + */ + void delayedRecalcFrames( int fromPage ); + + /** + * Return a double-buffer pixmap of (at least) the given size. + */ + QPixmap* doubleBufferPixmap( const QSize& ); + /** + * Call this when you're done with the double-buffer pixmap (at the + * end of the current painting, for all objects that need to be painted). + * If it's too big, KWDocument will delete it to save memory. + */ + void maybeDeleteDoubleBufferPixmap(); + + /** + * Tell this method when a frame is moved / resized / created / deleted + * and everything will be update / repainted accordingly. + */ + void frameChanged( KWFrame * frame ); + void framesChanged( const QPtrList<KWFrame> & frames, KWView * view = 0L ); + + QString uniqueFramesetName( const QString& oldName ); + /** + * @param copyFootNote ... + * @param dontCreateFootNote true when we copy footnote into an other frameset than mainFrameSet => footnote is removed ! + * @param selectFrames if true, pasted frames are auto-selected. Set to false when loading from a file etc. + */ + void pasteFrames( QDomElement topElem, KMacroCommand * macroCmd, bool copyFootNote = false, bool dontCreateFootNote = false, bool selectFrames = true ); + + void insertEmbedded( KoStore *store, QDomElement topElem, KMacroCommand * macroCmd, double offset ); + void completePasting(); + void completeOasisPasting(); + void saveOasisDocumentStyles( KoStore* store, KoGenStyles& mainStyles, KoSavingContext& savingContext, SaveFlag saveFlag, const QByteArray& headerFooterContent ) const; + + KoStyleCollection * styleCollection()const { return m_styleColl;} + KWFrameStyleCollection * frameStyleCollection()const { return m_frameStyleColl;} + KWTableStyleCollection * tableStyleCollection()const { return m_tableStyleColl;} + KWTableTemplateCollection * tableTemplateCollection()const { return m_tableTemplateColl;} + + QFont defaultFont() const { return m_defaultFont; } + void setDefaultFont( const QFont & newFont ) { + m_defaultFont = newFont; + } + + /** + * returns the amount of pages in the document. + * @see startPage() @see lastPage() + */ + int pageCount() const; + /** + * returns the page number of the first page in this document, this is the page number + * that will be shown on prints and used in the TOC and user-variables. + * @see pageCount() @see lastPage() + */ + int startPage() const; + /** + * Returns the last page number in this document. + * With a higher startPage and a constante pagecount this number will also get higher. + */ + int lastPage() const; + + KoPictureCollection *pictureCollection() { return m_pictureCollection; } + KoVariableFormatCollection *variableFormatCollection()const { return m_varFormatCollection; } + + QValueList<KWView *> getAllViews() const { return m_lstViews; } + + /** + * Insert a new page after another, + * creating followup frames (but not headers/footers), + * @param afterPageNum the page is inserted after the one specified here + * If afterPageNum is -1, a page is inserted before page 0. + * In all cases, the new page will have the number afterPageNum+1. + * Use appendPage in WP mode, insertPage in DTP mode. + */ + KWPage* insertPage( int afterPageNum ); + /** + * Append a new page, creating followup frames (but not headers/footers), + * and return the page number. + */ + KWPage* appendPage(); + /** + * Call this after appendPage, to get headers/footers on the new page, + * and all the caches properly updated. This is separate from appendPage + * so that KWFrameLayout can call appendPage() only. + */ + void afterInsertPage( int num ); + /** + * @return list of frames that will be copied onto the new page + * Used by insertPage but also by KWTextFrameSet to check if it's worth + * auto-inserting a new page (to avoid infinite loops if not) + */ + QPtrList<KWFrame> framesToCopyOnNewPage( int afterPageNum ) const; + + /** + * Remove a page. Call afterRemovePages() after removing one or more pages. + */ + void removePage( int num ); + + /** + * Update things after removing one or more pages. + */ + void afterRemovePages(); + + /** + * Check if we can remove empty page(s) from the end + * If so, do it and return true. + * Note that this doesn't call afterRemovePages, this is up to the caller. + */ + bool tryRemovingPages(); + + ProcessingType processingType()const { return m_processingType; } + int frameSetNum( KWFrameSet* fs ) { return m_lstFrameSet.findRef( fs ); } + + void lowerMainFrames( int pageNum ); + void lowerMainFrames( int pageNum, int lowestZOrder ); + + /// \note This method considers _all_ text framesets, even table cells + QPtrList<KWTextFrameSet> allTextFramesets( bool onlyReadWrite ) const; + /// \note This method considers _all_ text framesets, even table cells + int numberOfTextFrameSet( KWFrameSet* fs, bool onlyReadWrite ); + /// \note This method considers _all_ text framesets, even table cells + KWFrameSet * textFrameSetFromIndex( unsigned int num, bool onlyReadWrite ); + + /// Reimplementation from KoDocument. + /// \note This method considers _all_ text framesets, even table cells + virtual QValueList<KoTextDocument *> allTextDocuments() const; + + + /** Gather all the frames which are on a certain page and return them. + * The list is ordered. @see KWFrameSet::framesInPage + * @param pageNum the number of the page + * @param sorted if true the list is ordered per z-order. should be true always. + */ + QPtrList<KWFrame> framesInPage( int pageNum , bool sorted=true) const; + + + /** + * Max z-order among all frames on the given page + * \note There is no minZOrder() method, because of the main frameset, see kwview::lowerFrame + */ + int maxZOrder( int pageNum ) const; + + void updateAllFrames( int flags = 0xff /* see KWFrameSet::UpdateFramesFlags */ ); + + // The grid is in _pt_ now + double gridX()const { return m_gridX; } + double gridY()const { return m_gridY; } + void setGridX(double gridx); + void setGridY(double gridy) { m_gridY = gridy; } + + void updateGridButton(); + + bool showGrid() const { return m_bShowGrid; } + void setShowGrid ( bool grid ) { m_bShowGrid = grid; } + + bool snapToGrid() const { return m_bSnapToGrid; } + void setSnapToGrid( bool b ) { m_bSnapToGrid = b; } + + // Currently unused. Not sure we want to go that way, now that we have + // paragLayoutChanged and formatChanged in applyStyleChange. + //int applyStyleChangeMask() { return styleMask; } + //void setApplyStyleChangeMask( int f ) { styleMask = f; } + + // paragLayoutChanged is a set of flags for the parag layout - see the enum in KWParagLayout + // formatChanged is a set of flags from KoTextFormat + // If both are -1, it means the style has been deleted. + void applyStyleChange( KoStyleChangeDefMap changed ); + void updateAllStyleLists(); + void updateStyleListOrder( const QStringList &list ); + + void updateAllFrameStyleLists(); + void updateAllTableStyleLists(); + + bool isHeaderVisible() const { return m_headerVisible; } + bool isFooterVisible() const { return m_footerVisible; } + void setHeaderVisible( bool h ); + void setFooterVisible( bool f ); + bool hasEndNotes() const; + + /// @param flags see KWFrameLayout + void recalcFrames( int fromPage = 0, int toPage = -1, uint flags = 0 ); + + KoHFType headerType() const { return m_pageHeaderFooter.header; } + KoHFType footerType() const { return m_pageHeaderFooter.footer; } + const KoKWHeaderFooter& headerFooterInfo() const { return m_pageHeaderFooter; } + + void setFrameCoords( double x, double y, double w, double h ); + + void addCommand( KCommand * cmd ); + + KoCommandHistory * commandHistory() const { return m_commandHistory; } + KoAutoFormat * autoFormat() const { return m_autoFormat; } + + /** + * This is used upon loading, to delay certain things until completeLoading, + * for KWTextImage + */ + void addTextImageRequest( KWTextImage *img ); + /** + * This is used upon loading, to delay certain things until completeLoading, + * for KWPictureFrameSet + */ + void addPictureRequest( KWPictureFrameSet *fs ); + /** + * This is used upon loading, to delay certain things until completeLoading, + * for KWTextParag + */ + void addAnchorRequest( const QString &framesetName, const KWAnchorPosition &anchorPos ); + /** + * This is used upon loading, to delay certain things until completeLoading, + * for KWFootNoteVariable + */ + void addFootNoteRequest( const QString &framesetName, KWFootNoteVariable* var ); + + /// This is used by loadFrameSets() and by KWCanvas to paste framesets + KWFrameSet *loadFrameSet( QDomElement framesetElem, bool loadFrames = true , bool loadFootnote = true); + void loadEmbeddedObjects( QDomElement& word ); + void saveEmbeddedObjects( QDomElement& parentElem, const QPtrList<KoDocumentChild>& childList ); + void loadEmbedded( const QDomElement &embedded ); + + void recalcVariables( int type ); + + KWVariableCollection *variableCollection() const { return m_varColl; } + + KWMailMergeDataBase *mailMergeDataBase() const { return m_slDataBase; } + int mailMergeRecord() const; + void setMailMergeRecord( int r ); + + bool backgroundSpellCheckEnabled() const; + void enableBackgroundSpellCheck( bool b ); + + bool canRemovePage( int num ); + + /** + * Change the zoom factor to @p z (e.g. 150 for 150%) + * and/or change the resolution, given in DPI. + * This is done on startup and when printing. + * The same call combines both so that all the updating done behind + * the scenes is done only once, even if both zoom and DPI must be changed. + */ + virtual void setZoomAndResolution( int zoom, int dpiX, int dpiY ); + + void newZoomAndResolution( bool updateViews, bool forPrint ); + + /** + * Due to the way the text formatter works (it caches layout information in + * the paragraphs and characters), we currently can't have one viewmode per view. + * It has to be the same for all views. + */ + QString viewModeType() const { return m_viewModeType; } + + /** + * The view mode used for text layouting. + */ + KWViewMode* layoutViewMode() const { return m_layoutViewMode; } + + /** + * Changes m_viewMode, and updates all views to this viewmode + */ + void switchViewMode( const QString& newViewMode ); + + + /// \todo useless method + static QString getAttribute(QDomElement &element, const char *attributeName, const QString &defaultValue) + { + return element.attribute( attributeName, defaultValue ); + } + + static int getAttribute(QDomElement &element, const char *attributeName, int defaultValue) + { + QString value; + if ( ( value = element.attribute( attributeName ) ) != QString::null ) + return value.toInt(); + else + return defaultValue; + } + + static double getAttribute(QDomElement &element, const char *attributeName, double defaultValue) + { + QString value; + if ( ( value = element.attribute( attributeName ) ) != QString::null ) + return value.toDouble(); + else + return defaultValue; + } + +#ifndef NDEBUG + void printStyleDebug(); + void printDebug(); +#endif + + /** calls layout() on all framesets */ + void layout(); + + // This settings has to be here [instead of KWView] because we need to + // format paragraphs slightly differently (to add room for the CR char) + bool viewFormattingChars() const { return m_viewFormattingChars; } + void setViewFormattingChars(bool b) { m_viewFormattingChars=b; } + + bool viewFormattingEndParag() const { return m_viewFormattingEndParag; } + void setViewFormattingEndParag(bool b) { m_viewFormattingEndParag=b; } + + bool viewFormattingSpace() const { return m_viewFormattingSpace; } + void setViewFormattingSpace(bool b) { m_viewFormattingSpace=b; } + + bool viewFormattingTabs() const { return m_viewFormattingTabs; } + void setViewFormattingTabs(bool b) { m_viewFormattingTabs=b; } + + bool viewFormattingBreak() const { return m_viewFormattingBreak; } + void setViewFormattingBreak(bool b) { m_viewFormattingBreak=b; } + + // Also view properties, but stored, loaded and saved here (lacking a more global object). + bool viewFrameBorders() const { return m_viewFrameBorders; } + void setViewFrameBorders( bool b ); + void setShowRuler(bool ruler){ m_bShowRuler=ruler; } + bool showRuler() const { return m_bShowRuler; } + + bool showStatusBar() const { return m_bShowStatusBar;} + void setShowStatusBar( bool status ) { m_bShowStatusBar = status;} + + bool showScrollBar() const { return m_bShowScrollBar; } + void setShowScrollBar( bool status ) { m_bShowScrollBar = status;} + + bool pgUpDownMovesCaret() const { return m_pgUpDownMovesCaret; } + void setPgUpDownMovesCaret( bool b ) { m_pgUpDownMovesCaret = b; } + + bool showdocStruct() const {return m_bShowDocStruct;} + void setShowDocStruct(bool b){m_bShowDocStruct=b;} + + bool allowAutoFormat() const { return m_bAllowAutoFormat; } + void setAllowAutoFormat(bool b){ m_bAllowAutoFormat=b; } + + bool insertDirectCursor() const { return m_bInsertDirectCursor; } + void setInsertDirectCursor(bool b); + + + // in pt + double indentValue()const { return m_indent; } + void setIndentValue(double ind) { m_indent=ind; } + + int nbPagePerRow() const{ return m_iNbPagePerRow; } + void setNbPagePerRow(int nb) { m_iNbPagePerRow=nb; } + + int maxRecentFiles() const { return m_maxRecentFiles; } + + + // in pt + double defaultColumnSpacing()const{ return m_defaultColumnSpacing ;} + void setDefaultColumnSpacing(double val){ m_defaultColumnSpacing=val; } + /** + * @returns the document for the formulas + * @param init if true mathematical fonts may be installed if needed. + * Should be true unless no real document is being used (i. e. in + * configuration dialog> + */ + KFormula::Document* formulaDocument( bool init = true ); + + void reorganizeGUI(); + /// Tell all views to stop editing this frameset, if they were doing so + void terminateEditing( KWFrameSet * frameSet ) + { emit sig_terminateEditing( frameSet ); } + + void clearUndoRedoInfos(); + + void refreshDocStructure(FrameSetType); + void refreshDocStructure(int); + + int typeItemDocStructure(FrameSetType type); + + void refreshMenuExpression(); + + void refreshMenuCustomVariable(); + + void updateZoomRuler(); + + /// Mark the document to have a table of contents and update the view-menu-item text + void setTocPresent(bool hasToc); + /// Returns if the document has a table of contents + bool tocPresent(){return m_hasTOC;} + + QString sectionTitle( int pageNum ) const; + + void updateRulerFrameStartEnd(); + + /** Convert a color into a color to be displayed for it + * (when using color schemes, we still want to print black on white). + * See also KoTextFormat::defaultTextColor. */ + static QColor resolveTextColor( const QColor & col, QPainter * painter ); + static QColor defaultTextColor( QPainter * painter ); + static QColor resolveBgColor( const QColor & col, QPainter * painter = 0 ); + static QBrush resolveBgBrush( const QBrush & brush, QPainter * painter = 0 ); + static QColor defaultBgColor( QPainter * painter ); + + + virtual DCOPObject* dcopObject(); + + int undoRedoLimit() const; + void setUndoRedoLimit(int val); + + void updateContentsSize(){emit newContentsSize();} + + void refreshGUIButton(); + + void initConfig(); + void saveConfig(); + void startBackgroundSpellCheck(); + void reactivateBgSpellChecking(); + + void updateHeaderButton(); + void updateFooterButton(); + + QStringList spellCheckIgnoreList() const { return m_spellCheckIgnoreList; } + void setSpellCheckIgnoreList( const QStringList& lst ); + void addSpellCheckIgnoreWord( const QString & ); + + void updateTextFrameSetEdit(); + void changeFootNoteConfig(); + void displayFootNoteFieldCode(); + + + double tabStopValue() const { return m_tabStop; } + void setTabStopValue ( double tabStop ); + + void changeBgSpellCheckingState( bool b ); + + // To position the cursor when opening a document + QString initialFrameSet() const; ///< \note can be empty for "unset" + int initialCursorParag() const; + int initialCursorIndex() const; + /// Once we're done with this info, get rid of it + void deleteInitialEditingInfo(); + + bool cursorInProtectedArea()const; + void setCursorInProtectedArea( bool b ); + + SeparatorLinePos footNoteSeparatorLinePosition()const { return m_footNoteSeparatorLinePos;} + void setFootNoteSeparatorLinePosition(SeparatorLinePos pos) {m_footNoteSeparatorLinePos = pos;} + + int footNoteSeparatorLineLength() const { return m_iFootNoteSeparatorLineLength;} + void setFootNoteSeparatorLineLength( int length){ m_iFootNoteSeparatorLineLength = length;} + + double footNoteSeparatorLineWidth() const { return m_footNoteSeparatorLineWidth;} + void setFootNoteSeparatorLineWidth( double width){ m_footNoteSeparatorLineWidth=width;} + + SeparatorLineLineType footNoteSeparatorLineType()const { return m_footNoteSeparatorLineType;} + void setFootNoteSeparatorLineType( SeparatorLineLineType type) {m_footNoteSeparatorLineType = type;} + + const KoTextBookmarkList* bookmarkList() const { return m_bookmarkList; } + void insertBookmark( const QString &name, KoTextParag *startparag, KoTextParag *endparag, int start, int end ); + void deleteBookmark( const QString &name ); + void renameBookmark( const QString &oldname, const QString &newName ); + + const KoTextBookmark * bookmarkByName( const QString & name ) const; + QStringList listOfBookmarkName(KWViewMode * viewMode) const; + + void paragraphDeleted( KoTextParag *parag, KWFrameSet *frm); + void paragraphModified(KoTextParag* parag, int /*KoTextParag::ParagModifyType*/ type, int start, int lenght); + + void initBookmarkList(); + void loadImagesFromStore( KoStore *store ); + void loadPictureMap ( QDomElement& domElement ); + + void testAndCloseAllFrameSetProtectedContent(); + void updateRulerInProtectContentMode(); + + KoPageLayout pageLayout(int pageNumber = 0) const; + + QStringList personalExpressionPath() const { return m_personalExpressionPath;} + void setPersonalExpressionPath( const QStringList & ); + + + void updateDirectCursorButton(); + + QString globalLanguage()const { return m_globalLanguage; } + void setGlobalLanguage( const QString & lang ){m_globalLanguage = lang;} + void addWordToDictionary( const QString & ); + + bool globalHyphenation() const { return m_bGlobalHyphenation; } + void setGlobalHyphenation ( bool hyphen ); + + KWLoadingInfo* createLoadingInfo(); + KWLoadingInfo* loadingInfo() const { return m_loadingInfo; } + void deleteLoadingInfo(); + + KFormula::DocumentWrapper* formulaDocumentWrapper() { return m_formulaDocumentWrapper; } + + KWPageManager *pageManager() const { return m_pageManager; } + + KWBgSpellCheck* backSpeller() const { return m_bgSpellCheck; } + + /// Load the given page layout; public for KWTextParag + bool loadOasisPageLayout( const QString& masterPageName, KoOasisContext& context ); + + // end of public methods +signals: + + /// This is emitted by setPageLayout if updateViews=true + void pageLayoutChanged( const KoPageLayout& ); + + /// Emitted when the scrollview contents must be resized (e.g. new page, new layout...) + void newContentsSize(); + + /** This is emitted when the height of the text in the main frameset changes + * \note Mostly useful for the text viewmode. + */ + void mainTextHeightChanged(); + + /// This is emitted when the number of pages changes. + void numPagesChanged(); + + void docStructureChanged(int); + void sig_terminateEditing( KWFrameSet * fs ); + + void sig_refreshMenuCustomVariable(); + + void sigFrameSetAdded(KWFrameSet*); + void sigFrameSetRemoved(KWFrameSet*); + +public slots: + void slotRepaintChanged( KWFrameSet * frameset ); + void framesChanged( const QValueList<KWFrame*> &frames); + + /** calls invalidate() on all framesets */ + void invalidate(const KWFrameSet *skipThisFrameSet=0); + + virtual void initEmpty(); + +protected slots: + void slotRecalcFrames(); + void slotRepaintAllViews(); + void slotDocumentRestored(); + void slotCommandExecuted(); + void slotDocumentInfoModifed(); + void slotChapterParagraphFormatted( KoTextParag* parag ); + void saveDialogShown(); ///< called just before the save-dialog is shown + + virtual void openExistingFile( const QString& file ); + virtual void openTemplate( const QString& file ); + +private slots: + /// is called from a singleShot timer due to frameChanged() + void updateFramesChanged(); + +protected: + void nextParagraphNeedingCheck(); + /// fix up Z-order for import from older kword versions. + void fixZOrders(); + QString checkSectionTitleInParag( KoTextParag* parag, KWTextFrameSet*, int pageNum ) const; + KoView* createViewInstance( QWidget* parent, const char* name ); + + virtual bool completeLoading( KoStore* store ); + virtual bool completeSaving( KoStore *store ); + + void loadFrameSets( const QDomElement &framesets ); + void loadStyleTemplates( const QDomElement &styles ); + void saveStyle( KoParagStyle *sty, QDomElement parentElem ); + void saveFrameStyle( KWFrameStyle *sty, QDomElement parentElem ); + void saveTableStyle( KWTableStyle *sty, QDomElement parentElem ); + + void loadFrameStyleTemplates( const QDomElement &styles ); + void loadDefaultFrameStyleTemplates(); + void loadTableStyleTemplates( const QDomElement &styles ); + void loadDefaultTableStyleTemplates(); + void loadDefaultTableTemplates(); + bool loadMasterPageStyle( const QString& masterPageName, KoOasisContext& context ); + + void saveOasisBody( KoXmlWriter& writer, KoSavingContext& context ) const; + void saveOasisCustomFied( KoXmlWriter &writer )const; + + QValueList<KoPictureKey> savePictureList(); + + /// helper method for the 2 different dragSelected() versions + QDragObject* dragSelectedPrivate( QWidget *parent, const QValueList<KWFrameView*> &selectedFrames, KWTextFrameSet* fs); + /** + * Save the whole document, or just the selection, into OASIS format + * When saving the selection, also return the data as plain text and/or plain picture, + * which are used to insert into the KMultipleDrag drag object. + * + * @param store the KoStore to save into + * @param manifestWriter pointer to a koxmlwriter to add entries to the manifest + * @param saveFlag either the whole document, or only the selected text/objects. + * @param plainText must be set when saveFlag==SaveSelected. + * It returns the plain text format of the saved data, when available. + * @param picture must be set when saveFlag==SaveSelected. + * It returns the selected picture, when exactly one picture was selected. + * @param fs the text frameset, which must be set when saveFlag==SaveSelected. + */ + bool saveOasisHelper( KoStore* store, KoXmlWriter* manifestWriter, SaveFlag saveFlag, + const QValueList<KWFrameView*> &selectedFrames, + QString* plainText = 0, KoPicture* picture = 0, KWTextFrameSet* fs = 0 ); + + void saveOasisSettings( KoXmlWriter &settingsWriter ) const; + void saveSelectedFrames( KoXmlWriter& bodyWriter, + KoSavingContext& savingContext, QValueList<KoPictureKey>& pictureList, + const QValueList<KWFrameView*> &selectedFrames, QString* plainText ) const; + + // inherited from KoDocument + QWidget* createCustomDocumentWidget(QWidget *parent); + +private: + void clear(); + void endOfLoading(); + + class FramesChangedHandler { + public: + FramesChangedHandler(KWDocument *parent); + void addFrame(KWFrame*); + void addFrameSet(KWFrameSet*); + void execute(); + private: + KWDocument *m_parent; + QValueList<KWFrameSet*> m_frameSets; + bool m_needLayout; + }; + + // Variables: + QValueList<KWView *> m_lstViews; + + KoColumns m_pageColumns; + KoKWHeaderFooter m_pageHeaderFooter; + + KoPictureCollection* m_pictureCollection; + + QPtrList<KWFrameSet> m_lstFrameSet; + + unsigned int m_itemsLoaded; + unsigned int m_nrItemsToLoad; + + ProcessingType m_processingType; + double m_gridX, m_gridY; + + DCOPObject *dcop; + + KoCommandHistory * m_commandHistory; + KoAutoFormat * m_autoFormat; + + // ===== Legacy loading stuff, remove when switching to OASIS ===== + /// \note Shared between loadXML and loadComplete + QString m_urlIntern; + + QMap<KoPictureKey, QString> m_pictureMap; + + /// List used to help loading and saving images of the old type ("text image" of class KWTextImage) + QPtrList<KWTextImage> m_textImageRequests; + QPtrList<KWPictureFrameSet> m_pictureRequests; + QMap<QString, KWAnchorPosition> m_anchorRequests; + QMap<QString, KWFootNoteVariable *> m_footnoteVarRequests; ///< \todo still needed? (move to KWLoadingInfo if so) + // ===== End of legacy loading stuff ===== + + QMap<QString,QString> * m_pasteFramesetsMap; + + KoVariableFormatCollection *m_varFormatCollection; + KWMailMergeDataBase *m_slDataBase; + int slRecordNum; + + /** + * When a document is written out, the syntax version in use will be recorded. When read back + * in, this variable reflects that value. + * \note KWord legacy format only + */ + int m_syntaxVersion; + + QFont m_defaultFont; + bool m_headerVisible, m_footerVisible; + bool m_viewFrameBorders; + bool m_bShowRuler; + bool m_bShowDocStruct; + bool m_hasTOC; + bool m_bShowStatusBar; + bool m_pgUpDownMovesCaret; + bool m_repaintAllViewsPending; + bool m_bAllowAutoFormat; + bool m_bShowScrollBar; + bool m_cursorInProtectectedArea; + bool m_bInsertDirectCursor; + bool m_bHasEndNotes; + + bool m_viewFormattingChars; + bool m_viewFormattingEndParag; + bool m_viewFormattingSpace; + bool m_viewFormattingTabs; + bool m_viewFormattingBreak; + + /** The wrapper that contains the formula's document and its + * actions. It owns the real document. + */ + KFormula::DocumentWrapper* m_formulaDocumentWrapper; + + double m_indent; ///< \note in pt + double m_defaultColumnSpacing; + + int m_iNbPagePerRow; + int m_maxRecentFiles; + int m_recalcFramesPending; + + /// The name of the viewmode used by all views. + QString m_viewModeType; + /// The viewmode used for text layouting + KWViewMode* m_layoutViewMode; + KWVariableCollection *m_varColl; + KWBgSpellCheck *m_bgSpellCheck; + KoStyleCollection *m_styleColl; + KWFrameStyleCollection *m_frameStyleColl; + KWTableStyleCollection *m_tableStyleColl; + KWTableTemplateCollection *m_tableTemplateColl; + + + SeparatorLinePos m_footNoteSeparatorLinePos; + /// It's a percentage of page. + int m_iFootNoteSeparatorLineLength; + + double m_footNoteSeparatorLineWidth; + + SeparatorLineLineType m_footNoteSeparatorLineType; + + /** Page number -> section title array, for the Section variable. + * Note that pages without a section title don't appear in the array. */ + QValueVector< QString > m_sectionTitles; + + double m_tabStop; + QStringList m_spellCheckIgnoreList; // per-document + QStringList m_spellCheckPersonalDict; // per-user + QPixmap* m_bufPixmap; + + KWLoadingInfo* m_loadingInfo; + + class InitialEditing; + /// \note Remains alive a little bit longer than the loading info (until KWCanvas ctor) + InitialEditing *m_initialEditing; + + KoTextBookmarkList* m_bookmarkList; + + QStringList m_personalExpressionPath; + QString m_globalLanguage; + bool m_bGlobalHyphenation; + bool m_bGeneratingPreview; + + bool m_bShowGrid; + bool m_bSnapToGrid; + + KWPageManager *m_pageManager; + FramesChangedHandler *m_framesChangedHandler; +}; + +#endif |