diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 01:29:50 +0000 |
commit | 8362bf63dea22bbf6736609b0f49c152f975eb63 (patch) | |
tree | 0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kword/KWCanvas.h | |
download | koffice-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 'kword/KWCanvas.h')
-rw-r--r-- | kword/KWCanvas.h | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/kword/KWCanvas.h b/kword/KWCanvas.h new file mode 100644 index 00000000..ffd1e85e --- /dev/null +++ b/kword/KWCanvas.h @@ -0,0 +1,488 @@ +/* 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 KWCANVAS_H +#define KWCANVAS_H + +#include <kprinter.h> +#include <KoRect.h> +#include <qscrollview.h> +#include <qstylesheet.h> +#include <KoRichText.h> +#include <KoQueryTrader.h> +#include <KoPicture.h> + +#include "KWTextParag.h" +#include "KWFrame.h" +#include "KWVariable.h" +#include "KWCommand.h" + +class KWTextFrameSetEdit; +class KWDocument; +class KWFrame; +class KWFrameSet; +class KWFrameSetEdit; +class KWTableFrameSet; +class KWFrameMoveCommand; +class KWViewMode; +class KWFrameViewManager; +class KWGUI; +class KWTableTemplate; +class KoTextParag; +class QTimer; +class InteractionPolicy; +class KWFrameView; + +/** + * Class: KWCanvas + * This class is responsible for the rendering of the frames to + * the screen as well as the interaction with the user via mouse + * and keyboard. There is one per view. + */ +class KWCanvas : public QScrollView +{ + Q_OBJECT + +public: + KWCanvas(const QString& viewMode, QWidget *parent, KWDocument *d, KWGUI *lGui); + virtual ~KWCanvas(); + + KWDocument * kWordDocument() const { return m_doc; } + KWGUI * gui() const { return m_gui; } + KWFrameViewManager* frameViewManager() { return m_frameViewManager; } + KWFrameSetEdit *currentFrameSetEdit() const { return m_currentFrameSetEdit; } + + void switchViewMode( const QString& newViewMode ); + KWViewMode *viewMode() const { return m_viewMode; } + + void repaintAll( bool erase = false ); + /** + * Only repaint the frameset @p fs. + * @p resetChanged should only be true for the last view + * (see KWFrameSet::drawContents) + */ + void repaintChanged( KWFrameSet * fs, bool resetChanged ); + + /** We need to repaint if the window is resized. */ + void viewportResizeEvent( QResizeEvent * ); + + void print( QPainter *painter, KPrinter *printer ); + bool eventFilter( QObject *o, QEvent *e ); + bool focusNextPrevChild( bool next); + + void setFrameBackgroundColor( const QBrush &backColor ); + + void editFrameProperties(); + void editFrameProperties( KWFrameSet * frameset ); + + void pasteFrames(); + + // Mouse press + void mpCreate( const QPoint& normalPoint, bool noGrid ); + void mpCreatePixmap( const QPoint& normalPoint, bool noGrid ); + // Mouse move + void mmCreate( const QPoint& normalPoint, bool noGrid ); + // Mouse release + void mrEditFrame(); + void mrCreateText(); + void mrCreatePixmap(); + void mrCreatePart(); + void mrCreateFormula(); + void mrCreateTable(); + + enum MouseMode { + MM_EDIT = 0, + MM_CREATE_TEXT = 2, + MM_CREATE_PIX = 3, + MM_CREATE_TABLE = 5, + MM_CREATE_FORMULA = 6, + MM_CREATE_PART = 7 + }; + void setMouseMode( MouseMode _mm ); + MouseMode mouseMode()const { return m_mouseMode; } + + // makes the user draw the rect for inserting the picture + void insertPicture( const KoPicture& newPicture, QSize pixmapSize, bool _keepRatio ); + void insertPart( const KoDocumentEntry &entry ); + void pasteImage( QMimeSource *e, const KoPoint &docPoint ); + // insert a (non-inline) picture at the given position; used by dnd and dcop + void insertPictureDirect( const KoPicture& picture, const KoPoint& pos, const QSize& sz = QSize() ); + + void updateCurrentFormat(); + + void updateFrameFormat(); + + // Table creation support - methods used by KWView to reuse the last settings + unsigned int tableRows() const { return m_table.rows; } + void setTableRows( unsigned int rows ) { m_table.rows=rows; } + unsigned int tableCols() const { return m_table.cols; } + void setTableCols( unsigned int cols ) { m_table.cols=cols; } + int tableWidthMode()const { return m_table.width; } + int tableHeightMode()const { return m_table.height; } + bool tableIsFloating()const { return m_table.floating; } + int tableFormat()const { return m_table.format;} + + void setTableFormat(int _nb){ m_table.format=_nb;} + + QString tableTemplateName()const { return m_table.tableTemplateName;} + void setTableTemplateName(const QString &_name) { m_table.tableTemplateName=_name;} + + void setPictureInline( bool _inline) { m_picture.pictureInline = _inline;} + bool pictureInline() const { return m_picture.pictureInline; } + + void setPictureKeepRatio( bool _keep) { m_picture.keepRatio = _keep;} + bool pictureKeepRatio() const { return m_picture.keepRatio; } + + void createTable( unsigned int rows, unsigned int cols, + int /*KWTableFrameSet::CellSize*/ wid, int /*KWTableFrameSet::CellSize*/ hei, + bool isFloating, + KWTableTemplate *tt=0L, int format=31 ); + + /// The current table (either because one or more cells are selected, + /// or because the cursor is in a table cell + KWTableFrameSet *getCurrentTable()const { return m_currentTable; } + /// When the cursor is in a table cell, this returns the row + int currentTableRow() const; + /// When the cursor is in a table cell, this returns the column + int currentTableCol() const; + + //move canvas to show point dPoint (in doc coordinates) + void scrollToOffset( const KoPoint & dPoint ); + + //for KWTextFrameSetEdit + void dragStarted() { m_mousePressed = false; } + + void setXimPosition( int x, int y, int w, int h ); + + void updateRulerOffsets( int cx = -1, int cy = -1 ); + + void inlinePictureStarted(); + + void ensureCursorVisible(); + + void editFrameSet( KWFrameSet * frameSet, bool onlyText = false ); + /** + * Starting editing @p fs if we're not yet doing it. + * In all cases, position the cursor at @p parag and @p index. + */ + void editTextFrameSet( KWFrameSet * fs, KoTextParag* parag, int index ); + bool checkCurrentEdit( KWFrameSet * fs, bool onlyText = false); + + + NoteType footNoteType()const{return m_footEndNote.noteType;} + KWFootNoteVariable::Numbering numberingFootNoteType() const { return m_footEndNote.numberingType;} + + void setFootNoteType( NoteType _type ) { m_footEndNote.noteType = _type; } + void setNumberingFootNoteType(KWFootNoteVariable::Numbering _type) { m_footEndNote.numberingType = _type; } + + void tableSelectCell(KWTableFrameSet *table, KWFrameSet *cell); + void selectAllFrames( bool select ); + + KCommand * createTextBox(const KoRect & rect ); + + // Called by KWTextFrameSetEdit when pgup/pgdown can't go further + // or directly called by pgup/pgdown if not using 'moves caret' feature. + void viewportScroll( bool up ); + + /// Resets the status bar text + void resetStatusBarText(); + + /** Returns the caret position in document coordinates. + The current frame must be editable, i.e., a caret is possible. */ + KoPoint caretPos(); + void applyGrid( KoPoint &p ); + + bool overwriteMode() const { return m_overwriteMode; } + + // Returns the current text edit object, or 0 if + // - no frame is being edited + // - a non-text frame is being edited + KWTextFrameSetEdit* currentTextEdit() const; + + bool insertInlinePicture(); + +protected: + void drawGrid( QPainter &p, const QRect& rect ); + + /** + * Reimplemented from QScrollView, to draw the contents of the canvas + */ + virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); + /** + * The main drawing method. + * @param painter guess + * @param crect the area to be repainted, in contents coordinates + * @param viewMode the view mode to be used (usually m_viewMode, except when printing) + */ + void drawDocument( QPainter *painter, const QRect &crect, KWViewMode* viewMode ); + /** + * Draw page borders, but also clear up the space between the frames and the page borders, + * draw the page shadow, and the gray area. + */ + void drawPageBorders( QPainter * painter, const QRect & crect, const QRegion & emptySpaceRegion ); + + virtual void keyPressEvent( QKeyEvent *e ); + virtual void contentsMousePressEvent( QMouseEvent *e ); + virtual void contentsMouseMoveEvent( QMouseEvent *e ); + virtual void contentsMouseReleaseEvent( QMouseEvent *e ); + virtual void contentsMouseDoubleClickEvent( QMouseEvent *e ); + virtual void contentsDragEnterEvent( QDragEnterEvent *e ); + virtual void contentsDragMoveEvent( QDragMoveEvent *e ); + virtual void contentsDragLeaveEvent( QDragLeaveEvent *e ); + virtual void contentsDropEvent( QDropEvent *e ); + virtual void resizeEvent( QResizeEvent *e ); + + KWTableFrameSet * createTable(); // uses m_insRect and m_table to create the table + + void terminateCurrentEdit(); + bool insertInlineTable(); + +signals: + // Emitted when the current frameset edit changes + void currentFrameSetEditChanged(); + // Emitted by the current frameset edit when its selection changes + void selectionChanged( bool hasSelection ); + // Emitted when Mouse Mode changed + void currentMouseModeChanged(int newMouseMode); + // Emitted when frames have been selected or unselected (to disable/enable the UI in kwview) + void frameSelectedChanged(); + // Emitted when the document structure has changed + // ### DF: IMHO this should be only emitted by KWDocument (e.g. addFrameSet) + void docStructChanged(int _type); + // Emitted when the insert key is pressed + void overwriteModeChanged( bool m_overwriteMode ); + + void viewTransformationsChanged(); + + void updateRuler(); + +private slots: + void slotContentsMoving( int, int ); + void slotNewContentsSize(); + void slotMainTextHeightChanged(); + void doAutoScroll(); + + //Terminate editing this frameset, if we were editing it. + void terminateEditing( KWFrameSet *fs ); + +private: + /** + * Draw the contents of one frameset + * @param resetChanged whether the changed flag should be reset to false while redrawing + */ + void drawFrameSet( KWFrameSet * frameset, QPainter * painter, + const QRect & crect, bool onlyChanged, bool resetChanged, KWViewMode* viewMode ); + + void drawMovingRect( QPainter & p ); + void deleteMovingRect(); + /** + * make the parag rectangle have the aspect ratio by changing either the height + * or the width of the ratio. + * @param ratio the ratio the rectangle should have afterwards. + * @param insRect the rectangle that is to be changed in-place + */ + void applyAspectRatio( double ratio, KoRect& insRect ); + +#ifndef NDEBUG + void printRTDebug( int ); +#endif + + KWFrameViewManager *m_frameViewManager; + KWDocument *m_doc; + KWFrameSetEdit *m_currentFrameSetEdit; + KWGUI *m_gui; + QTimer *m_scrollTimer; + bool m_mousePressed; + bool m_printing; + bool m_imageDrag; + + //define type of frame (for set inline frame) + bool m_frameInline; + FrameSetType m_frameInlineType; + + // Warning: the viewmode is stored here for good design ;) + // but it's owned by the document, since we currently have one viewmode for all views. + KWViewMode *m_viewMode; + + // Frame stuff + MouseMode m_mouseMode; + MouseMeaning m_mouseMeaning; // set by mousePress, used by mouseMove + KoRect m_resizedFrameInitialSize; // when resizing a frame + double m_resizedFrameInitialMinHeight; // when resizing a frame + KoRect m_insRect; ///< variable updated and painted to represent the to insert frame + bool m_deleteMovingRect; + KoPicture m_kopicture; // The picture + QSize m_pixmapSize; // size when inserting a picture (not necessarily the size of the picture) + bool m_keepRatio;//when inserting a picture + KoDocumentEntry m_partEntry; // when inserting a part + int m_rowColResized; // when resizing a row or column + bool m_temporaryStatusBarTextShown; // Indicates if the temporary is shown + double m_previousTableSize; //previous column or row size before resizing it + KoPoint m_lastCaretPos; // position of caret when editing stopped in document coordinates + bool m_overwriteMode; + + // Table creation support. + // Having this as a member variable allows to remember and reuse the last settings + struct + { + unsigned int cols; + unsigned int rows; + int format; + int /*KWTableFrameSet::CellSize*/ width; + int /*KWTableFrameSet::CellSize*/ height; + bool floating; + QString tableTemplateName; + KWTableTemplate *tt; + } m_table; + KWTableFrameSet *m_currentTable; + InteractionPolicy *m_interactionPolicy; + + struct + { + NoteType noteType; + KWFootNoteVariable::Numbering numberingType; + } m_footEndNote; + + struct + { + bool pictureInline; + bool keepRatio; + }m_picture; +}; + +/** + * Interaction policy defines the behavior in case the user clicks or drags the mouse. + * The InteractionPolicy is created in the createPolicy() function which defines the + * resulting behavior and initiates a frame-move or a frame-resize, for example. + * The canvas forwards mouseMove events to the handleMouseMove() method and the interaction + * is either finished with finishInteraction() or cancelInteraction() (never both). + */ +class InteractionPolicy { + public: + /** + * Extending classes should implement this method to alter the frames or other data + * based on the new mouse position. + * @param keyState the orred-data of the Shift/Alt/Control buttons being held down + * during the mousemove. + * @param point the new point where the mouse if at. This is in the document (pt-based) + * coordinate system. + */ + virtual void handleMouseMove(Qt::ButtonState keyState, const KoPoint &point) = 0; + /** + * For interactions that are undo-able this method should be implemented to return such + * a command. Implementations should return 0 otherwise. + * @return a command, or 0. + */ + virtual KCommand* createCommand() = 0; + /** + * This method will undo frames based interactions by calling createCommand() + * and unexecuting that. + */ + void cancelInteraction(); + /** + * Override to make final changes to the data on the end of an interaction. + */ + virtual void finishInteraction() = 0; + + /** + * This instanciates a new policy object and decides which policy is created based on the params. + * @param parent the parent canvas for things like redraw commands. + * @param meaning the mouseMeaning of as it is at 'point' + * @param point the place where the mouseDown is registred. + * @param buttonState which button is used to click, like Qt::LeftButton + * @param keyState which keys are held down at the click, like Qt::ControlButton + */ + static InteractionPolicy* createPolicy(KWCanvas *parent, MouseMeaning meaning, KoPoint &point, Qt::ButtonState buttonState, Qt::ButtonState keyState); + + void hadDragEvents() { m_gotDragEvents = true; } + bool gotDragEvents() { return m_gotDragEvents; } + + protected: + /** + * Constructor. + * @param parent the parent canvas. + * @param doInit if true this will initialize the m_frames and m_indexFrame variables. + * @param includeInlineFrames if true the m_frames will include inline frames + */ + InteractionPolicy(KWCanvas *parent, bool doInit = true, bool includeInlineFrames = false); + + QValueList<FrameIndex> m_indexFrame; + KWCanvas *m_parent; + QValueList<KWFrame*> m_frames; + + private: + void init(); + bool m_gotDragEvents; +}; + +/** + * A policy that handles resizes of any number of frames. + * Includes support for undo/redo and support for scale from center plus various other + * usability features. + */ +class FrameResizePolicy : public InteractionPolicy { + public: + FrameResizePolicy(KWCanvas *parent, MouseMeaning meaning, KoPoint &point); + void handleMouseMove(Qt::ButtonState keyState, const KoPoint &point); + KCommand *createCommand(); + void finishInteraction(); + + private: + QValueList<FrameResizeStruct> m_frameResize; + bool m_top, m_bottom, m_left, m_right; + KoRect m_boundingRect; + KoPoint m_hotSpot; +}; + +/** + * A policy that handles frame moves of any number of frames. + * Includes support for undo/redo and linear moves (moves constrained to one axis) + * plus various other usability features. + */ +class FrameMovePolicy : public InteractionPolicy { + public: + FrameMovePolicy(KWCanvas *parent, KoPoint &point); + void handleMouseMove(Qt::ButtonState keyState, const KoPoint &point); + KCommand *createCommand(); + void finishInteraction(); + private: + QValueList<FrameMoveStruct> m_frameMove; + KoPoint m_hotSpot; + KoPoint m_startPoint; + KoRect m_boundingRect; +}; + +/** + * A policy to select frames. + */ +class FrameSelectPolicy : public InteractionPolicy { + public: + FrameSelectPolicy(KWCanvas *parent, MouseMeaning meaning, KoPoint &point, Qt::ButtonState state, Qt::ButtonState keyState); + void handleMouseMove(Qt::ButtonState keyState, const KoPoint &point); + KCommand *createCommand(); + void finishInteraction(); + bool isValid() { return m_validSelection; } + + private: + bool m_validSelection; +}; + +#endif |