summaryrefslogtreecommitdiffstats
path: root/lib/kotext/KoTextObject.h
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
commit8362bf63dea22bbf6736609b0f49c152f975eb63 (patch)
tree0eea3928e39e50fae91d4e68b21b1e6cbae25604 /lib/kotext/KoTextObject.h
downloadkoffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz
koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'lib/kotext/KoTextObject.h')
-rw-r--r--lib/kotext/KoTextObject.h641
1 files changed, 641 insertions, 0 deletions
diff --git a/lib/kotext/KoTextObject.h b/lib/kotext/KoTextObject.h
new file mode 100644
index 000000000..58c92e9b0
--- /dev/null
+++ b/lib/kotext/KoTextObject.h
@@ -0,0 +1,641 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001-2006 David Faure <faure@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 kotextobject_h
+#define kotextobject_h
+
+#include <KoRichText.h>
+#include "KoChangeCaseDia.h"
+#include "KoStyleCollection.h"
+#include "KoTextDocument.h"
+#include <koffice_export.h>
+
+class KoSavingContext;
+class KCommand;
+class KoTextFormat;
+class QProgressDialog;
+class KoLinkVariable;
+class KoVariable;
+
+//#define TIMING_FORMAT
+//#include <qdatetime.h>
+
+/**
+ * The KoTextFormatInterface is a pure interface that allows access to the
+ * "current text format". This is implemented by both KoTextObject and KoTextView.
+ * For KoTextView, it's the format under the cursor.
+ * For KoTextObject, it's the global format.
+ * By changing this format and calling setFormat (with the appropriate flags),
+ * it's possible to implement "setBold", "setItalic" etc. only once, whether it applies
+ * to a text selection or to complete text objects.
+ */
+class KOTEXT_EXPORT KoTextFormatInterface
+{
+public:
+ KoTextFormatInterface() {}
+ virtual ~KoTextFormatInterface() {}
+
+ /** Interface for accessing the current format */
+ virtual KoTextFormat * currentFormat() const = 0;
+
+ virtual bool rtl() const = 0;
+
+ /**
+ * Interface for setting the modified format
+ * @param format can be a temporary format
+ * @param zoomFont set to true if the font size was used-specified (e.g. in KoFontDia)
+ * @param flags see enum KoTextFormat::Flags
+ */
+ virtual KCommand *setFormatCommand( const KoTextFormat *format, int flags, bool zoomFont = false ) = 0;
+
+ /** Interface for accessing the current parag layout */
+ virtual const KoParagLayout * currentParagLayoutFormat() const = 0;
+
+ /** Interface for changing the paragraph layout.
+ * @param newLayout pointer to the new layout to apply
+ * @param flags one of the KoParagLayout flags
+ * @param marginIndex type of margin. Only used if flags==KoParagLayout::Margins
+ */
+ virtual KCommand *setParagLayoutFormatCommand( KoParagLayout *newLayout, int flags, int marginIndex=-1) = 0;
+
+ virtual KCommand *setChangeCaseOfTextCommand(KoChangeCaseDia::TypeOfCase _type)=0;
+
+ KoTextDocCommand *deleteTextCommand( KoTextDocument *textdoc, int id, int index, const QMemArray<KoTextStringChar> & str, const CustomItemsMap & customItemsMap, const QValueList<KoParagLayout> & oldParagLayouts );
+
+ void setParagLayoutFormat( KoParagLayout *newLayout,int flags, int marginIndex=-1);
+ void setFormat( KoTextFormat * newFormat, int flags, bool zoomFont = false );
+
+ // Warning: use the methods that return a command! The others just leak the commands away
+ //void setBold(bool on);
+ KCommand *setBoldCommand(bool on);
+ //void setItalic(bool on);
+ KCommand *setItalicCommand(bool on);
+ //void setUnderline(bool on);
+ KCommand *setUnderlineCommand(bool on);
+ //void setStrikeOut(bool on);
+ KCommand *setDoubleUnderlineCommand( bool on );
+ KCommand *setUnderlineColorCommand( const QColor &color );
+ KCommand *setStrikeOutCommand(bool on);
+ //void setTextColor(const QColor &color);
+ KCommand *setTextColorCommand(const QColor &color);
+ //void setPointSize( int s );
+ KCommand *setPointSizeCommand( int s );
+ //void setFamily(const QString &font);
+ KCommand *setFamilyCommand(const QString &font);
+ //void setTextSubScript(bool on);
+ KCommand *setTextSubScriptCommand(bool on);
+ //void setTextSuperScript(bool on);
+ KCommand *setTextSuperScriptCommand(bool on);
+
+ //void setDefaultFormat();
+ KCommand *setDefaultFormatCommand();
+
+ //void setTextBackgroundColor(const QColor &);
+ KCommand *setTextBackgroundColorCommand(const QColor &);
+
+ //void setAlign(int align);
+ KCommand *setAlignCommand(int align);
+
+ //void setMargin(QStyleSheetItem::Margin m, double margin);
+ KCommand *setMarginCommand(QStyleSheetItem::Margin m, double margin);
+
+ //void setTabList(const KoTabulatorList & tabList );
+ KCommand *setTabListCommand(const KoTabulatorList & tabList );
+
+ //void setBackgroundColor(const QColor & color );
+ KCommand *setBackgroundColorCommand(const QColor & color );
+
+ //void setCounter(const KoParagCounter & counter );
+ KCommand *setCounterCommand(const KoParagCounter & counter );
+
+ KCommand *setLanguageCommand(const QString &);
+
+ KCommand *setShadowTextCommand( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor );
+
+ KCommand *setHyphenationCommand( bool _b );
+
+
+ KCommand *setFontAttributeCommand( KoTextFormat::AttributeStyle _att);
+
+ KCommand *setRelativeTextSizeCommand( double _size );
+
+ KCommand *setOffsetFromBaseLineCommand( int _offset );
+
+ KCommand *setWordByWordCommand( bool _b );
+
+
+ QColor textColor() const;
+ QFont textFont() const;
+ QString textFontFamily()const;
+ QString language() const;
+ QColor textBackgroundColor()const;
+ QColor textUnderlineColor()const;
+
+ KoTextFormat::UnderlineType underlineType()const;
+ KoTextFormat::StrikeOutType strikeOutType()const;
+ KoTextFormat::UnderlineStyle underlineStyle()const;
+ KoTextFormat::StrikeOutStyle strikeOutStyle()const;
+
+
+
+ bool textUnderline()const;
+ bool textDoubleUnderline()const;
+
+ bool textBold()const;
+ bool textStrikeOut()const;
+ bool textItalic() const;
+ bool textSubScript() const;
+ bool textSuperScript() const;
+ double shadowDistanceX() const;
+ double shadowDistanceY() const;
+ QColor shadowColor() const;
+ KoTextFormat::AttributeStyle fontAttribute() const;
+ double relativeTextSize() const;
+ int offsetFromBaseLine()const;
+ bool wordByWord()const;
+ bool hyphenation()const;
+};
+
+/**
+ * The KoTextObject is the high-level object that contains a KoTextDocument
+ * (the list of paragraphs), and takes care of the operations on it (particularly
+ * the undo/redo commands).
+ * Editing the text isn't done by KoTextObject but by KoTextView (document/view design).
+ */
+class KOTEXT_EXPORT KoTextObject : public QObject, public KoTextFormatInterface
+{
+ Q_OBJECT
+public:
+ /** Constructor.
+ * This constructor creates the contained KoTextDocument automatically.
+ *
+ * @param zh the zoom handler (to be passed to the KoTextDocument ctor)
+ * @param defaultFont the font to use by default (see KoTextFormatCollection)
+ * @param defaultLanguage the language to use by default (see KoTextFormatCollection)
+ * @param defaultHyphenation the default setting for hyphenation (see KoTextFormatCollection)
+ * @param defaultStyle the style to use by default (initial pararaph, and when deleting a used style)
+ * @param tabStopWidth the global value for the tabstop width
+ * @param parent parent widget for this object
+ * @param name name for this object
+ *
+ */
+ KoTextObject( KoTextZoomHandler *zh, const QFont& defaultFont, const QString &defaultLanguage,
+ bool defaultHyphenation, KoParagStyle* defaultStyle, int tabStopWidth = -1,
+ QObject* parent = 0, const char *name = 0 );
+
+ /** Alternative constructor.
+ * This constructor allows to use a derived class from KoTextDocument.
+ *
+ * @param textdoc the text document to use in this text object. Ownership is transferred
+ * to the text object.
+ * @param defaultStyle the style to use by default (initial pararaph, and when deleting a used style)
+ * @param parent parent widget for this object
+ * @param name name for this object
+ */
+ KoTextObject( KoTextDocument *textdoc, KoParagStyle* defaultStyle,
+ QObject* parent = 0, const char *name = 0 );
+
+ virtual ~KoTextObject();
+
+
+ static const char * acceptSelectionMimeType();
+ /// Check if the mimesource @p mime provides one of the OASIS mimetypes,
+ /// and if so, return it. Otherwise return an empty string.
+ static QCString providesOasis( QMimeSource* mime );
+
+ void setNeedSpellCheck(bool b);
+ bool needSpellCheck() const { return m_needsSpellCheck;}
+ void setProtectContent(bool b) { m_protectContent = b; }
+ bool protectContent() const{ return m_protectContent;}
+ /**
+ * Return the text document contained in this KoTextObject
+ */
+ KoTextDocument *textDocument() const { return textdoc; }
+
+ void setAvailableHeight( int avail ) { m_availableHeight = avail; }
+ int availableHeight() const;
+
+ void undo();
+ void redo();
+ /** Terminate our current undo/redo info, to start with a new one */
+ void clearUndoRedoInfo();
+
+ /** return true if some text is selected */
+ bool hasSelection() const { return textdoc->hasSelection( KoTextDocument::Standard, true ); }
+ /** returns the selected text [without formatting] if hasSelection() */
+ QString selectedText( KoTextDocument::SelectionId selectionId = KoTextDocument::Standard ) const {
+ return textdoc->selectedText( selectionId );
+ }
+ /** returns true if the given selection has any custom item in it */
+ bool selectionHasCustomItems( KoTextDocument::SelectionId selectionId = KoTextDocument::Standard ) const;
+
+ enum InsertFlag {
+ DefaultInsertFlags = 0,
+ CheckNewLine = 1, /// < if true, the text to be inserted is checked for '\\n' (as a paragraph delimiter)
+ OverwriteMode = 2,
+ DoNotRemoveSelected = 4, ///< whether to remove selected text before
+ DoNotRepaint = 8 ///< usually we repaint in insert(), this allows to turn it off
+ };
+
+ /**
+ * The main "insert" method, including undo/redo creation/update.
+ *
+ * @param cursor the insertion point
+ * @param currentFormat the current textformat, to apply to the inserted text
+ * @param text the text to be inserted
+ * @param insertFlags flags, see InsertFlag
+ * @param commandName the name to give the undo/redo command if we haven't created it already
+ * @param customItemsMap the map of custom items to include in the new text
+ * @param selectionId which selection to use (See KoTextDocument::SelectionId)
+ */
+ void insert( KoTextCursor * cursor, KoTextFormat * currentFormat, const QString &text,
+ const QString & commandName,
+ KoTextDocument::SelectionId selectionId = KoTextDocument::Standard,
+ int insertFlags = DefaultInsertFlags, // KDE4: TODO use QFlags
+ CustomItemsMap customItemsMap = CustomItemsMap() );
+
+ /**
+ * Remove the text currently selected, including undo/redo creation/update.
+ * @param cursor the caret position
+ * @param selectionId which selection to remove (usually Standard)
+ * @param cmdName the name to give the undo/redo command, if we haven't created it already
+ * @param createUndoRedo create an undo history entry for this removal
+ */
+ void removeSelectedText( KoTextCursor * cursor, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard,
+ const QString & cmdName = QString::null, bool createUndoRedo=true );
+
+ KCommand * replaceSelectionCommand( KoTextCursor * cursor, const QString & replacement,
+ const QString & cmdName,
+ KoTextDocument::SelectionId selectionId = KoTextDocument::Standard,
+ int insertFlags = DefaultInsertFlags, // KDE4: TODO use QFlags
+ CustomItemsMap customItemsMap = CustomItemsMap() );
+ KCommand * removeSelectedTextCommand( KoTextCursor * cursor, KoTextDocument::SelectionId selectionId, bool repaint = true );
+ KCommand* insertParagraphCommand( KoTextCursor * cursor );
+
+ /**
+ * Paste plain text at the given @p cursor
+ * @param cursor location to paste text
+ * @param text the text to paste
+ * @param currentFormat format to apply to the pasted text
+ * @param removeSelected @c true when pasting with the keyboard, but @c false when dropping text.
+ *
+ * @todo Can currentFormat be NULL?
+ * @todo Besides saying when removeSelected is @c true, perhaps explain
+ * what it does (presumably, removes the selection and replaces it
+ * with the pasted text).
+ */
+ void pasteText( KoTextCursor * cursor, const QString & text, KoTextFormat * currentFormat,
+ bool removeSelected );
+ void selectAll( bool select );
+
+ /** Highlighting support (for search/replace, spellchecking etc.).
+ * Don't forget to ensure the paragraph is visible.
+ */
+ void highlightPortion( KoTextParag * parag, int index, int length, bool repaint );
+ void removeHighlight( bool repaint );
+
+ /** Implementation of setFormatCommand from KoTextFormatInterface - apply change to the whole document */
+ KCommand *setFormatCommand( const KoTextFormat *format, int flags, bool zoomFont = false );
+
+ /** Set format changes on selection or current cursor.
+ Returns a command if the format was applied to a selection */
+ KCommand *setFormatCommand( KoTextCursor * cursor, KoTextFormat ** currentFormat, const KoTextFormat *format, int flags, bool zoomFont = false, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+
+ enum KeyboardAction { // keep in sync with QTextEdit
+ ActionBackspace,
+ ActionDelete,
+ ActionReturn,
+ ActionKill
+ };
+ /** Executes keyboard action @p action. This is normally called by
+ * a key event handler. */
+ void doKeyboardAction( KoTextCursor * cursor, KoTextFormat * & currentFormat, KeyboardAction action );
+
+ // -- Paragraph settings --
+ KCommand * setCounterCommand( KoTextCursor * cursor, const KoParagCounter & counter, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ KCommand * setAlignCommand( KoTextCursor * cursor, int align , KoTextDocument::SelectionId selectionId = KoTextDocument::Standard);
+ KCommand * setLineSpacingCommand( KoTextCursor * cursor, double spacing, KoParagLayout::SpacingType _type,KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ KCommand * setBordersCommand( KoTextCursor * cursor, const KoBorder& leftBorder, const KoBorder& rightBorder, const KoBorder& topBorder, const KoBorder& bottomBorder, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ KCommand * setJoinBordersCommand( KoTextCursor * cursor, bool join, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ KCommand * setMarginCommand( KoTextCursor * cursor, QStyleSheetItem::Margin m, double margin, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard);
+ KCommand* setTabListCommand( KoTextCursor * cursor,const KoTabulatorList & tabList , KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ KCommand* setBackgroundColorCommand( KoTextCursor * cursor,const QColor & color , KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+
+ KCommand * setParagDirectionCommand( KoTextCursor * cursor, QChar::Direction d, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+
+ /**
+ * Apply a KoParagStyle to a selection.
+ * @param cursor the current cursor; used if there is no selection. Can be 0L if there is one.
+ * @param style the KoParagStyle to apply
+ * @param selectionId the id of the selection, usually Standard or Temp
+ * @param paragLayoutFlags which settings from the paragraph layout to apply
+ * @param formatFlags which settings from the text format to apply
+ * @param createUndoRedo if true, an undo/redo command will be created and emitted
+ * @param interactive if true, the text will be reformatted/repainted to show the new style
+ */
+ void applyStyle( KoTextCursor * cursor, const KoParagStyle * style,
+ KoTextDocument::SelectionId selectionId = KoTextDocument::Standard,
+ int paragLayoutFlags = KoParagLayout::All, int formatFlags = KoTextFormat::Format,
+ bool createUndoRedo = true, bool interactive = true );
+
+ /**
+ * Helper for applyStyle. Can also be called directly, so that the command isn't emitted,
+ * e.g. to put it into a macro-command.
+ * @return the command for 'apply style', or 0L if createUndoRedo is false.
+ */
+ KCommand* applyStyleCommand( KoTextCursor * cursor, const KoParagStyle * style,
+ KoTextDocument::SelectionId selectionId = KoTextDocument::Standard,
+ int paragLayoutFlags = KoParagLayout::All, int formatFlags = KoTextFormat::Format,
+ bool createUndoRedo = true, bool interactive = true );
+
+
+ /** Update the paragraph that use the given style, after this style was changed.
+ * The flags tell which changes should be applied.
+ * @param changed map of styles that have changed
+ */
+ void applyStyleChange( KoStyleChangeDefMap changed );
+ /** Set format changes on selection or current cursor.
+ Creates a command if the format was applied to a selection */
+ void setFormat( KoTextCursor * cursor, KoTextFormat ** currentFormat, KoTextFormat *format, int flags, bool zoomFont = false );
+
+
+ /**
+ * Support for treating the whole textobject as a single object
+ * Use this format for displaying the properties (font/color/...) of the object.
+ * Interface for accessing the current format
+ */
+ virtual KoTextFormat * currentFormat() const;
+
+ /**
+ * Use this format for displaying the properties (Align/counter/...) of the object
+ */
+ virtual const KoParagLayout * currentParagLayoutFormat() const;
+
+ virtual bool rtl() const;
+
+ /**
+ * Support for changing the format in the whole textobject
+ */
+ virtual KCommand *setParagLayoutFormatCommand( KoParagLayout *newLayout, int flags, int marginIndex=-1);
+
+ // common for setParagLayoutFormatCommand above and KoTextView::setParagLayoutFormatCommand
+ KCommand *setParagLayoutCommand( KoTextCursor * cursor, const KoParagLayout& paragLayout,
+ KoTextDocument::SelectionId selectionId, int paragLayoutFlags,
+ int marginIndex, bool createUndoRedo );
+ /**
+ * Support for changing the format in the whole textobject
+ */
+ virtual void setFormat( KoTextFormat * newFormat, int flags, bool zoomFont = false );
+
+ /** Return the user-visible font size for this format (i.e. LU to pt conversion) */
+ int docFontSize( KoTextFormat * format ) const;
+ /** Return the font size in LU, for this user-visible font size in pt */
+ int zoomedFontSize( int docFontSize ) const;
+
+ /** Set the bottom of the view - in LU */
+ void setViewArea( QWidget* w, int maxY );
+ /** Make sure that @p parag is formatted */
+ void ensureFormatted( KoTextParag * parag, bool emitAfterFormatting = true );
+ void setLastFormattedParag( KoTextParag *parag );
+
+ static QChar customItemChar() { return QChar( s_customItemChar ); }
+
+ // Qt should really have support for public signals
+ void emitHideCursor() { emit hideCursor(); }
+ void emitShowCursor() { emit showCursor(); }
+ void emitEnsureCursorVisible() { emit ensureCursorVisible(); }
+ void emitUpdateUI( bool updateFormat, bool force = false ) { emit updateUI( updateFormat, force ); }
+
+ void typingStarted();
+ void typingDone();
+
+ /**
+ * Abort the current formatMore() loop, or prevent the next one from starting.
+ * Use with care. This is e.g. for KWFootNoteVariable, so that it can do
+ * a frame layout before formatting the main text again.
+ * It is important to make sure that formatMore will be called again ;)
+ */
+ void abortFormatting();
+
+ void selectionChangedNotify( bool enableActions = true );
+
+ void emitNewCommand(KCommand *cmd);
+
+ virtual KCommand *setChangeCaseOfTextCommand(KoChangeCaseDia::TypeOfCase _type);
+
+ KCommand *changeCaseOfText(KoTextCursor *cursor, KoChangeCaseDia::TypeOfCase _type);
+ QString textChangedCase(const QString& _text, KoChangeCaseDia::TypeOfCase _type);
+ KCommand *changeCaseOfTextParag(int cursorPosStart, int cursorPosEnd,KoChangeCaseDia::TypeOfCase _type,KoTextCursor *cursor, KoTextParag *parag);
+
+ void loadOasisContent( const QDomElement &bodyElem, KoOasisContext& context, KoStyleCollection * styleColl );
+ void saveOasisContent( KoXmlWriter& writer, KoSavingContext& context ) const;
+
+ // Similar to KoTextDocument::loadOasisText but there's no newline inserted before the first paragraph
+ // or after the last one - so it's possible to paste just a few chars.
+ // It also handles m_lastFormatted
+ KoTextCursor pasteOasisText( const QDomElement &bodyElem, KoOasisContext& context,
+ KoTextCursor& cursor, KoStyleCollection * styleColl );
+
+#ifndef NDEBUG
+ void printRTDebug(int);
+#endif
+
+ bool statistics( QProgressDialog *progress, ulong & charsWithSpace, ulong & charsWithoutSpace, ulong & words, ulong & sentences, ulong & syllables, ulong & lines, bool selected );
+ int numberOfparagraphLineSelected( KoTextParag *parag);
+
+ /**
+ * Return the variable at the given point (in document coordinates), if any
+ */
+ KoVariable* variableAtPoint( const QPoint& iPoint ) const;
+
+ /**
+ * Return the variable at the given position, if any.
+ * Passing KoTextView's m_cursor here is usually wrong, index must come from the variablePosition
+ * value returned by KoTextCursor::place().
+ */
+ KoVariable* variableAtPosition( KoTextParag* parag, int index ) const;
+
+ enum ParagModifyType { AddChar = 0, RemoveChar = 1, ChangeFormat = 2 };
+
+signals:
+ /** Emitted by availableHeight() when the available height hasn't been
+ * calculated yet or is invalid. Connect to a slot that calls setAvailableHeight() */
+ void availableHeightNeeded();
+
+ /** Emitted by formatMore() after formatting a bunch of paragraphs.
+ * KWord uses this signal to check for things like 'I need to create a new page'
+ */
+ void afterFormatting( int bottom, KoTextParag* m_lastFormatted, bool* abort );
+
+ /**
+ * Emitted by formatMore() when formatting a "Head 1" paragraph.
+ * Used for the Section variable
+ */
+ void chapterParagraphFormatted( KoTextParag* parag );
+
+ /** Emitted by formatMore() when formatting the first paragraph.
+ */
+ void formattingFirstParag();
+
+ /** Emitted when a new command has been created and should be added to
+ * the main list of commands (usually in the KoDocument).
+ * Make sure to connect to that one, otherwise the commands will just leak away...
+ */
+ void newCommand( KCommand *cmd );
+
+ /** Tell the world that we'd like some repainting to happen */
+ void repaintChanged( KoTextObject * );
+
+ void hideCursor();
+ void showCursor();
+ /** Special hack for undo/redo - used by KoTextView */
+ void setCursor( KoTextCursor * cursor );
+ /** Emitted when the formatting under the cursor may have changed.
+ * The Edit object should re-read settings and update the UI. */
+ void updateUI( bool updateFormat, bool force = false );
+ /** Same thing, when the current format (of the edit object) was changed */
+ void showCurrentFormat();
+ /** The views should make sure the cursor is visible */
+ void ensureCursorVisible();
+ /** Tell the views that the selection changed (for cut/copy...) */
+ void selectionChanged( bool hasSelection );
+
+ void showFormatObject(const KoTextFormat &);
+
+ // Keeping track of text modifications - not emitted during loading/closing.
+ void paragraphCreated( KoTextParag* parag );
+ void paragraphModified( KoTextParag* parag, int /*ParagModifyType*/, int pos, int length );
+ void paragraphDeleted( KoTextParag* parag );
+
+public slots:
+ // The default arguments are those used by the formatTimer.
+ // The return value is used by ensureFormatted
+ bool formatMore( int count = 10, bool emitAfterFormatting = true );
+
+ void emitRepaintChanged() { emit repaintChanged( this ); }
+
+public: // made public for KWTextFrameSet...
+
+ /** This prepares undoRedoInfo for a paragraph formatting change
+ * If this does too much, we could pass an enum flag to it.
+ * But the main point is to avoid too much duplicated code */
+ void storeParagUndoRedoInfo( KoTextCursor * cursor, KoTextDocument::SelectionId selectionId = KoTextDocument::Standard );
+ /** Copies a formatted char, <parag, position>, into undoRedoInfo.text, at position @p index. */
+ void copyCharFormatting( KoTextParag *parag, int position, int index /*in text*/, bool moveCustomItems );
+ void readFormats( KoTextCursor &c1, KoTextCursor &c2, bool copyParagLayouts = false, bool moveCustomItems = false );
+
+ /**
+ * The undo-redo structure holds the _temporary_ information for the current
+ * undo/redo command. For instance, when typing "a" and then "b", we don't
+ * want a command for each letter. So we keep adding info to this structure,
+ * and when the user does something else and we call clear(), it's at that
+ * point that the command is created.
+ * See also the place-holder command (in fact an empty macro-command is created
+ * right at the beginning, so that it's possible to undo at any time).
+ */
+ struct KOTEXT_EXPORT UndoRedoInfo { // borrowed from QTextEdit
+ enum Type { Invalid, Insert, Delete, Return, RemoveSelected };
+ UndoRedoInfo( KoTextObject* textobj );
+ ~UndoRedoInfo() {}
+ void clear();
+ bool valid() const;
+
+ KoTextString text; // storage for formatted text
+ int id; // id of first parag
+ int eid; // id of last parag
+ int index; // index (for insertion/deletion)
+ Type type; // type of command
+ KoTextObject* textobj; // parent
+ CustomItemsMap customItemsMap; // character position -> qtextcustomitem
+ QValueList<KoParagLayout> oldParagLayouts;
+ KoParagLayout newParagLayout;
+ KoTextCursor *cursor; // basically a "mark" of the view that started this undo/redo info
+ // If the view changes, the next call to checkUndoRedoInfo will terminate the previous view's edition
+ KMacroCommand *placeHolderCmd;
+ };
+ /**
+ * Creates a place holder for a command that will be completed later on.
+ * This is used for the insert and delete text commands, which are
+ * build delayed (see the UndoRedoInfo structure), in order to
+ * have an entry in the undo/redo history asap.
+ */
+ void newPlaceHolderCommand( const QString & name );
+ void checkUndoRedoInfo( KoTextCursor * cursor, UndoRedoInfo::Type t );
+
+ /** for KWTextFrameSet */
+ UndoRedoInfo & undoRedoInfoStruct() { return undoRedoInfo; }
+
+ void setVisible(bool vis) { m_visible=vis; }
+ bool isVisible() const { return m_visible; }
+
+private slots:
+ void doChangeInterval();
+ /** This is done in a singleShot timer because of macro-commands.
+ * We need to do this _after_ terminating the macro command (for instance
+ * in the case of undoing a floating-frame insertion, we need to delete
+ * the frame first) */
+ void slotAfterUndoRedo();
+ void slotParagraphModified(KoTextParag *, int, int , int);
+ void slotParagraphCreated(KoTextParag *);
+ void slotParagraphDeleted(KoTextParag *);
+private:
+ void init();
+
+private:
+ class KoTextObjectPrivate;
+ KoTextObjectPrivate* d;
+ /** The text document, containing the paragraphs */
+ KoTextDocument *textdoc;
+
+ /** The style to use by default (initial pararaph, and when deleting a used style)
+ TODO: check that we support 0 */
+ KoParagStyle* m_defaultStyle;
+
+ bool m_visible;
+
+ /** Currently built undo/redo info */
+ UndoRedoInfo undoRedoInfo;
+
+ /** All paragraphs up to this one are guaranteed to be formatted.
+ The idle-time formatting (formatMore()) pushes this forward.
+ Any operation on a paragraph pushes this backward. */
+ KoTextParag *m_lastFormatted;
+ /** Idle-time formatting */
+ QTimer *formatTimer, *changeIntervalTimer;
+ int interval;
+
+ /** The total height available for our text object at the moment */
+ int m_availableHeight;
+ /** Store the "needs" of each view */
+ QMap<QWidget *, int> m_mapViewAreas;
+
+ //QPtrDict<int> m_origFontSizes; // Format -> doc font size.
+
+ bool m_highlightSelectionAdded;
+
+#ifdef TIMING_FORMAT
+ QTime m_time;
+#endif
+
+ static const char s_customItemChar;
+ bool m_needsSpellCheck;
+ bool m_protectContent;
+};
+
+#endif