/* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer Copyright (C) 2002-2006 David Faure Copyright (C) 2005 Thomas Zander 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 #endif class TQDragObject; 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 TQPainter; 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 TQFont; class TQStringList; class TQRect; namespace KFormula { class Document; class DocumentWrapper; } class KoTextParag; class KoOasisSettings; #include "KWAnchorPos.h" // legacy loading stuff #include "KWView.h" #include #include #include #include // for KoStyleChangeDefMap #include #include #include #include /******************************************************************/ /* Class: KWDocument */ /******************************************************************/ class KWDocument : public KoDocument, public KoTextZoomHandler { TQ_OBJECT TQ_PROPERTY( double ptColumnWidth READ ptColumnWidth ) TQ_PROPERTY( double ptColumnSpacing READ ptColumnSpacing ) TQ_PROPERTY( double gridX READ gridX WRITE setGridX ) TQ_PROPERTY( double gridY READ gridY WRITE setGridY ) TQ_PROPERTY( bool snapToGrid READ snapToGrid WRITE setSnapToGrid ) TQ_PROPERTY( double indentValue READ indentValue WRITE setIndentValue ) TQ_PROPERTY( int nbPagePerRow READ nbPagePerRow WRITE setNbPagePerRow ) TQ_PROPERTY( double defaultColumnSpacing READ defaultColumnSpacing WRITE setDefaultColumnSpacing ) TQ_PROPERTY( int maxRecentFiles READ maxRecentFiles ) TQ_PROPERTY( TQString globalLanguage READ globalLanguage WRITE setGlobalLanguage ) TQ_PROPERTY( bool globalHyphenation READ globalHyphenation WRITE setGlobalHyphenation ) TQ_PROPERTY( bool insertDirectCursor READ insertDirectCursor WRITE setInsertDirectCursor ) TQ_PROPERTY( TQStringList personalExpressionPath READ personalExpressionPath WRITE setPersonalExpressionPath ) TQ_PROPERTY( bool viewFormattingBreak READ viewFormattingBreak WRITE setViewFormattingBreak ) TQ_PROPERTY( bool viewFormattingTabs READ viewFormattingTabs WRITE setViewFormattingTabs ) TQ_PROPERTY( bool viewFormattingSpace READ viewFormattingSpace WRITE setViewFormattingSpace ) TQ_PROPERTY( bool viewFormattingEndParag READ viewFormattingEndParag WRITE setViewFormattingEndParag ) TQ_PROPERTY( bool cursorInProtectedArea READ cursorInProtectedArea WRITE setCursorInProtectedArea ) TQ_PROPERTY( bool pgUpDownMovesCaret READ pgUpDownMovesCaret WRITE setPgUpDownMovesCaret ) TQ_PROPERTY( bool allowAutoFormat READ allowAutoFormat WRITE setAllowAutoFormat ) TQ_PROPERTY( int undoRedoLimit READ undoRedoLimit WRITE setUndoRedoLimit ) public: friend class KWOasisLoader; friend class KWStartupWidget; KWDocument( TQWidget *parentWidget = 0, const char *widname = 0, TQObject* 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, TQWidget* parentWidget=0); virtual bool loadOasis( const TQDomDocument& doc, KoOasisStyles& oasisStyles, const TQDomDocument& 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 */ TQDragObject* dragSelected( const TQValueList &selectedFrames); /** * Return a drag object with the selected text */ TQDragObject* dragSelected( TQWidget *parent, KWTextFrameSet* fs ); virtual bool loadXML( TQIODevice *, const TQDomDocument & dom ); virtual bool loadChildren( KoStore *store ); virtual TQDomDocument 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( TQPainter& painter, const TQRect& rect, bool transparent = false, double zoomX = 1.0, double zoomY = 1.0 ); virtual TQPixmap generatePreview( const TQSize &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 TQRect & crect, TQRegion & 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( TQPainter * painter, const TQRegion & emptySpaceRegion, const TQBrush & 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, TQWidget* 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 TQString & 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]. TQString generateFramesetName( const TQString & templateName ); /// Prefer this over frameSet(i), if iterating over all of them TQPtrListIterator framesetsIterator() const { return TQPtrListIterator(m_lstFrameSet); } TQValueList 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. */ TQPixmap* doubleBufferPixmap( const TQSize& ); /** * 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 TQPtrList & frames, KWView * view = 0L ); TQString uniqueFramesetName( const TQString& 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( TQDomElement topElem, KMacroCommand * macroCmd, bool copyFootNote = false, bool dontCreateFootNote = false, bool selectFrames = true ); void insertEmbedded( KoStore *store, TQDomElement topElem, KMacroCommand * macroCmd, double offset ); void completePasting(); void completeOasisPasting(); void saveOasisDocumentStyles( KoStore* store, KoGenStyles& mainStyles, KoSavingContext& savingContext, SaveFlag saveFlag, const TQByteArray& 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;} TQFont defaultFont() const { return m_defaultFont; } void setDefaultFont( const TQFont & 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; } TQValueList 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) */ TQPtrList 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 TQPtrList 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 TQValueList 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. */ TQPtrList 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 TQStringList &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 TQString &framesetName, const KWAnchorPosition &anchorPos ); /** * This is used upon loading, to delay certain things until completeLoading, * for KWFootNoteVariable */ void addFootNoteRequest( const TQString &framesetName, KWFootNoteVariable* var ); /// This is used by loadFrameSets() and by KWCanvas to paste framesets KWFrameSet *loadFrameSet( TQDomElement framesetElem, bool loadFrames = true , bool loadFootnote = true); void loadEmbeddedObjects( TQDomElement& word ); void saveEmbeddedObjects( TQDomElement& parentElem, const TQPtrList& childList ); void loadEmbedded( const TQDomElement &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. */ TQString 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 TQString& newViewMode ); /// \todo useless method static TQString getAttribute(TQDomElement &element, const char *attributeName, const TQString &defaultValue) { return element.attribute( attributeName, defaultValue ); } static int getAttribute(TQDomElement &element, const char *attributeName, int defaultValue) { TQString value; if ( ( value = element.attribute( attributeName ) ) != TQString() ) return value.toInt(); else return defaultValue; } static double getAttribute(TQDomElement &element, const char *attributeName, double defaultValue) { TQString value; if ( ( value = element.attribute( attributeName ) ) != TQString() ) 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;} TQString 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 TQColor resolveTextColor( const TQColor & col, TQPainter * painter ); static TQColor defaultTextColor( TQPainter * painter ); static TQColor resolveBgColor( const TQColor & col, TQPainter * painter = 0 ); static TQBrush resolveBgBrush( const TQBrush & brush, TQPainter * painter = 0 ); static TQColor defaultBgColor( TQPainter * 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(); TQStringList spellCheckIgnoreList() const { return m_spellCheckIgnoreList; } void setSpellCheckIgnoreList( const TQStringList& lst ); void addSpellCheckIgnoreWord( const TQString & ); 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 TQString 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 TQString &name, KoTextParag *startparag, KoTextParag *endparag, int start, int end ); void deleteBookmark( const TQString &name ); void renameBookmark( const TQString &oldname, const TQString &newName ); const KoTextBookmark * bookmarkByName( const TQString & name ) const; TQStringList listOfBookmarkName(KWViewMode * viewMode) const; void paragraphDeleted( KoTextParag *parag, KWFrameSet *frm); void paragraphModified(KoTextParag* parag, int /*KoTextParag::ParagModifyType*/ type, int start, int length); void initBookmarkList(); void loadImagesFromStore( KoStore *store ); void loadPictureMap ( TQDomElement& domElement ); void testAndCloseAllFrameSetProtectedContent(); void updateRulerInProtectContentMode(); KoPageLayout pageLayout(int pageNumber = 0) const; TQStringList personalExpressionPath() const { return m_personalExpressionPath;} void setPersonalExpressionPath( const TQStringList & ); void updateDirectCursorButton(); TQString globalLanguage()const { return m_globalLanguage; } void setGlobalLanguage( const TQString & lang ){m_globalLanguage = lang;} void addWordToDictionary( const TQString & ); 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 TQString& 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 TQValueList &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 TQString& file ); virtual void openTemplate( const TQString& 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(); TQString checkSectionTitleInParag( KoTextParag* parag, KWTextFrameSet*, int pageNum ) const; KoView* createViewInstance( TQWidget* parent, const char* name ); virtual bool completeLoading( KoStore* store ); virtual bool completeSaving( KoStore *store ); void loadFrameSets( const TQDomElement &framesets ); void loadStyleTemplates( const TQDomElement &styles ); void saveStyle( KoParagStyle *sty, TQDomElement parentElem ); void saveFrameStyle( KWFrameStyle *sty, TQDomElement parentElem ); void saveTableStyle( KWTableStyle *sty, TQDomElement parentElem ); void loadFrameStyleTemplates( const TQDomElement &styles ); void loadDefaultFrameStyleTemplates(); void loadTableStyleTemplates( const TQDomElement &styles ); void loadDefaultTableStyleTemplates(); void loadDefaultTableTemplates(); bool loadMasterPageStyle( const TQString& masterPageName, KoOasisContext& context ); void saveOasisBody( KoXmlWriter& writer, KoSavingContext& context ) const; void saveOasisCustomFied( KoXmlWriter &writer )const; TQValueList savePictureList(); /// helper method for the 2 different dragSelected() versions TQDragObject* dragSelectedPrivate( TQWidget *parent, const TQValueList &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 TQValueList &selectedFrames, TQString* plainText = 0, KoPicture* picture = 0, KWTextFrameSet* fs = 0 ); void saveOasisSettings( KoXmlWriter &settingsWriter ) const; void saveSelectedFrames( KoXmlWriter& bodyWriter, KoSavingContext& savingContext, TQValueList& pictureList, const TQValueList &selectedFrames, TQString* plainText ) const; // inherited from KoDocument TQWidget* createCustomDocumentWidget(TQWidget *parent); private: void clear(); void endOfLoading(); class FramesChangedHandler { public: FramesChangedHandler(KWDocument *parent); void addFrame(KWFrame*); void addFrameSet(KWFrameSet*); void execute(); private: KWDocument *m_parent; TQValueList m_frameSets; bool m_needLayout; }; // Variables: TQValueList m_lstViews; KoColumns m_pageColumns; KoKWHeaderFooter m_pageHeaderFooter; KoPictureCollection* m_pictureCollection; TQPtrList 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 TQString m_urlIntern; TQMap m_pictureMap; /// List used to help loading and saving images of the old type ("text image" of class KWTextImage) TQPtrList m_textImageRequests; TQPtrList m_pictureRequests; TQMap m_anchorRequests; TQMap m_footnoteVarRequests; ///< \todo still needed? (move to KWLoadingInfo if so) // ===== End of legacy loading stuff ===== TQMap * 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; TQFont 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. TQString 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. */ TQValueVector< TQString > m_sectionTitles; double m_tabStop; TQStringList m_spellCheckIgnoreList; // per-document TQStringList m_spellCheckPersonalDict; // per-user TQPixmap* 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; TQStringList m_personalExpressionPath; TQString m_globalLanguage; bool m_bGlobalHyphenation; bool m_bGeneratingPreview; bool m_bShowGrid; bool m_bSnapToGrid; KWPageManager *m_pageManager; FramesChangedHandler *m_framesChangedHandler; }; #endif