summaryrefslogtreecommitdiffstats
path: root/lib/kotext/KoTextView.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kotext/KoTextView.h')
-rw-r--r--lib/kotext/KoTextView.h306
1 files changed, 306 insertions, 0 deletions
diff --git a/lib/kotext/KoTextView.h b/lib/kotext/KoTextView.h
new file mode 100644
index 00000000..51da4fb2
--- /dev/null
+++ b/lib/kotext/KoTextView.h
@@ -0,0 +1,306 @@
+/* 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 kotextview_h
+#define kotextview_h
+
+#include <qobject.h>
+#include <qpoint.h>
+#include <qcolor.h>
+#include <qfont.h>
+#include <KoRuler.h> // for KoTabulatorList
+#include <KoTextObject.h> // for KoTextView
+#include <koffice_export.h>
+class KoBgSpellCheck;
+class KoTextObject;
+class KoTextDocument;
+class KoTextParag;
+class KoTextFormat;
+class KoParagCounter;
+class KCommand;
+class QTimer;
+class KAction;
+class KInstance;
+class KDataToolInfo;
+class KoLinkVariable;
+class KoVariable;
+class KoTextViewIface;
+#include "KoRichText.h"
+class KoBorder;
+class KoParagStyle;
+
+/**
+ * Object that is created to edit a KoTextObject.
+ * It handles all the events for it (mouse, keyboard).
+ * There can be several KoTextView instances for the same KoTextObject.
+ */
+class KOTEXT_EXPORT KoTextView : public QObject, public KoTextFormatInterface
+{
+ Q_OBJECT
+public:
+ /**
+ * Constructor. A KoTextView is associated to a KoTextObject.
+ * Don't forget to call updateUI(true,true) in your derived constructor
+ */
+ KoTextView( KoTextObject *textobj );
+ virtual ~KoTextView();
+
+ void setBackSpeller( KoBgSpellCheck* backSpeller );
+
+ virtual KoTextViewIface* dcopObject();
+
+ /** Call this before deleting */
+ /** don't remove selection when we made dnd between different frame*/
+ void terminate( bool removeselection=true );
+
+ KoTextObject * textObject() const { return m_textobj; }
+ KoTextCursor * cursor() const { return m_cursor; }
+ void setCursor( const KoTextCursor& cursor ) { *m_cursor = cursor; };
+ KoTextDocument * textDocument() const;
+
+ /** Return true if the view is allowed to modify the text object.
+ This is the case by default */
+ bool isReadWrite() const { return m_bReadWrite; }
+ /** Call setReadWrite(false) to make the text view readonly */
+ void setReadWrite( bool b ) { m_bReadWrite = b; }
+
+ virtual KoTextFormat * currentFormat() const { return m_currentFormat; }
+ void setCurrentFormat( KoTextFormat *fmt ) { m_currentFormat = fmt; }
+
+ /**
+ * Use this format for displaying the properties (Align/counter/...) of the object
+ */
+ virtual const KoParagLayout * currentParagLayoutFormat() const;
+
+ virtual bool rtl() const;
+
+ virtual KCommand *setChangeCaseOfTextCommand( KoChangeCaseDia::TypeOfCase _type );
+
+ virtual KCommand* setParagLayoutFormatCommand( KoParagLayout *newLayout, int flags, int marginIndex = -1 );
+
+ /** Implement the KoTextFormatInterface */
+ virtual KCommand* setFormatCommand( const KoTextFormat * newFormat, int flags, bool zoomFont = false );
+
+ // -- Paragraph settings --
+ KCommand * setCounterCommand( const KoParagCounter & counter );
+ KCommand * setAlignCommand( int align );
+ KCommand * setPageBreakingCommand( int pageBreaking );
+ KCommand * setLineSpacingCommand( double spacing, KoParagLayout::SpacingType _type );
+ KCommand * setBordersCommand( const KoBorder& leftBorder, const KoBorder& rightBorder, const KoBorder& bottomBorder, const KoBorder& topBorder );
+ KCommand * setJoinBordersCommand( bool join );
+ KCommand * setMarginCommand( QStyleSheetItem::Margin m, double margin );
+ KCommand * setTabListCommand( const KoTabulatorList & tabList );
+ KCommand * setBackgroundColorCommand( const QColor & color );
+ void applyStyle( const KoParagStyle * style );
+
+ void dragStarted();
+ void focusInEvent();
+ void focusOutEvent();
+ void handleKeyPressEvent( QKeyEvent * e, QWidget *, const QPoint& );
+ void handleKeyReleaseEvent( QKeyEvent * e );
+ void handleImStartEvent( QIMEvent * e );
+ void handleImComposeEvent( QIMEvent * e );
+ void handleImEndEvent( QIMEvent * e );
+ // iPoint is in Layout Unit pixels
+ // return true if we add new parag with "insert direct cursor"
+ bool handleMousePressEvent( QMouseEvent* e, const QPoint& iPoint, bool canStartDrag = true, bool insertDirectCursor = false );
+ void handleMouseMoveEvent( QMouseEvent* e, const QPoint& iPoint );
+ void handleMouseReleaseEvent();
+ void handleMouseDoubleClickEvent( QMouseEvent* e, const QPoint& iPoint );
+ void handleMouseTripleClickEvent( QMouseEvent* e, const QPoint& /* Currently unused */ );
+ bool maybeStartDrag( QMouseEvent* e );
+
+ KoTextCursor selectWordUnderCursor( const KoTextCursor& cursor, int selectionId = KoTextDocument::Standard );
+ KoTextCursor selectParagUnderCursor( const KoTextCursor& cursor, int selectionId = KoTextDocument::Standard, bool copyAndNotify = true );
+ void extendParagraphSelection( const QPoint& iPoint );
+
+ QString wordUnderCursor( const KoTextCursor& cursor );
+
+ /** Return the list of actions from data-tools. Used to populate a RMB popupmenu usually. */
+ QPtrList<KAction> dataToolActionList( KInstance * instance, const QString& word, bool & _singleWord );
+
+ void insertSoftHyphen();
+ void insertLineBreak();
+ void insertNonbreakingSpace();
+ void insertNonbreakingHyphen();
+ void increaseNumberingLevel( const KoStyleCollection* styleCollection );
+ void decreaseNumberingLevel( const KoStyleCollection* styleCollection );
+ void insertSpecialChar( QChar _c, const QString& font );
+ void changeCaseOfText( KoChangeCaseDia::TypeOfCase _type );
+
+ void addBookmarks( const QString& );
+
+ //return a pointer to the variable under the cursor, if any
+ KoVariable *variable();
+ //return a pointer to the link variable under the cursor, if any
+ // (special case of variable())
+ KoLinkVariable *linkVariable();
+
+ /// A "drop move" will move the selected text to the given cursor position.
+ /// This method only takes care of "removing the selected text"
+ /// if the drop cursor isn't in the selected text (and !protectContent).
+ KCommand *prepareDropMove( KoTextCursor dropCursor );
+
+ void removeComment();
+ void copyTextOfComment();
+
+ // This is in fact "from selection or cursor"
+ KoParagStyle * createStyleFromSelection( const QString & name );
+ void updateStyleFromSelection( KoParagStyle* style );
+
+ QString currentWordOrSelection() const;
+
+ virtual void removeToolTipCompletion() {}
+
+ // return true if we "insert direct cursor" and we insert new parag
+ bool placeCursor( const QPoint &pos /* in internal coordinates */, bool insertDirectCursor=false );
+ void setOverwriteMode( bool overwriteMode );
+
+public slots:
+ /** Show the current settings (those for the paragraph and character under the cursor), in the GUI.
+ * The default implementation handles m_currentFormat and calls showCurrentFormat().
+ * If you reimplement, make sure to call KoTextView::updateUI(updateFormat,force); */
+ virtual void updateUI( bool updateFormat, bool force = false );
+ virtual void ensureCursorVisible() = 0;
+ void showCurrentFormat();
+
+ // This allows KoTextObject to hide/show all the cursors before modifying anything
+ void hideCursor() { drawCursor( false ); }
+ void showCursor() { drawCursor( true ); }
+
+ /** This is a slot so that it's accessible from DCOP */
+ void insertText( const QString &text );
+ void newParagraph();
+
+ void copyLink();
+ void removeLink();
+ void completion();
+
+ void setCursor( KoTextCursor * _cursor ) { *m_cursor = *_cursor; }
+
+protected slots:
+ /** Start a drag */
+ virtual void startDrag() = 0;
+ void slotToolActivated( const KDataToolInfo & info, const QString & command );
+signals:
+ void copy();
+ void cut();
+ void paste();
+
+protected:
+ /**
+ * Called when a character (@p ch) has been inserted into @p parag, at the given @p index.
+ * This is a virtual method rather than a signal for performance reasons.
+ */
+ virtual void doAutoFormat( KoTextCursor* /*cursor*/, KoTextParag * /*parag*/,
+ int /*index*/, QChar /*ch*/ ) { }
+
+ virtual bool doCompletion( KoTextCursor* , KoTextParag *, int ) { return false; }
+ virtual bool doToolTipCompletion( KoTextCursor* , KoTextParag *, int, int ) { return false; }
+ virtual void showToolTipBox( KoTextParag *, int , QWidget *, const QPoint& ) {}
+
+ virtual void textIncreaseIndent() {}
+ virtual bool textDecreaseIndent() { return true; }
+
+ //return true if we are a doubleSpace
+ virtual bool doIgnoreDoubleSpace(KoTextParag * /*parag*/,
+ int /*index*/,QChar /*ch*/ ) { return false;}
+
+ /** Show the settings of this format in the GUI. Needs to be implemented in the application. */
+ virtual void showFormat( KoTextFormat *format ) = 0;
+
+ /** Draws the cursor (or hides it if b is false).
+ * The default implementation only changes an internal flag, make sure to reimplement
+ * and to call the parent implementation (in all cases)
+ */
+ virtual void drawCursor( bool b );
+
+ /// Called when clicking on a link
+ virtual bool openLink( KoLinkVariable* linkVariable );
+
+ /** Reimplement this to handle PageUp. Example implementation:
+ textView->cursor()->gotoPageUp( scrollview->visibleHeight() ); */
+ virtual bool pgUpKeyPressed() = 0;
+ /** Reimplement this to handle PageDown. Example implementation:
+ textView->cursor()->gotoPageDown( scrollview->visibleHeight() ); */
+ virtual bool pgDownKeyPressed() = 0;
+ /** Reimplement this to handle CTRL+PageUp. Default implementation calls pgUpKeyPressed */
+ virtual void ctrlPgUpKeyPressed() { pgUpKeyPressed(); }
+ /** Reimplement this to handle CTRL+PageDown. Default implementation calls pgDownKeyPressed */
+ virtual void ctrlPgDownKeyPressed() { pgDownKeyPressed(); }
+
+ void deleteWordLeft();
+ void deleteWordRight();
+ bool insertParagraph( const QPoint &pos );
+
+private slots:
+ void blinkCursor();
+ void tripleClickTimeout();
+ void afterTripleClickTimeout();
+protected:
+ KoTextViewIface *dcop;
+ public: // necessary to be public to allow script action in KoTextViewIface
+ enum CursorAction { // keep in sync with QTextEdit
+ MoveBackward,
+ MoveForward,
+ MoveWordBackward,
+ MoveWordForward,
+ MoveUp,
+ MoveDown,
+ MoveLineStart,
+ MoveLineEnd,
+ MoveHome,
+ MoveEnd,
+ MovePgUp,
+ MovePgDown,
+ MoveParagUp, // libkotext-specific
+ MoveParagDown, // libkotext-specific
+ MoveViewportUp, // KWord-specific
+ MoveViewportDown // KWord-specific
+ };
+
+ void moveCursor( CursorAction action, bool select );
+ bool moveCursor( CursorAction action );
+
+private:
+ KoTextObject *m_textobj;
+ KoTextCursor *m_cursor;
+
+ // Store the index of the variable on which we last clicked, to position m_cursor
+ int m_variablePosition;
+ bool m_overwriteMode;
+
+ KoTextFormat *m_currentFormat;
+ QTimer *blinkTimer, *dragStartTimer;
+ class KoTextViewPrivate;
+ KoTextViewPrivate *d;
+ QPoint dragStartPos;
+ bool m_cursorVisible;
+ bool blinkCursorVisible;
+ bool inDoubleClick;
+ bool mightStartDrag;
+ bool m_bReadWrite;
+ bool possibleTripleClick;
+ bool afterTripleClick;
+
+ bool m_singleWord;
+ QString m_wordUnderCursor;
+};
+
+#endif