diff options
Diffstat (limited to 'kword/KWFrame.h')
-rw-r--r-- | kword/KWFrame.h | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/kword/KWFrame.h b/kword/KWFrame.h new file mode 100644 index 00000000..37a3ff25 --- /dev/null +++ b/kword/KWFrame.h @@ -0,0 +1,335 @@ +/* This file is part of the KDE project + Copyright (C) 1998, 1999, 2000 Reginald Stadlbauer <reggie@kde.org> + Copyright (C) 2000-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 frame_h +#define frame_h + +#include "defs.h" +#include <KoRect.h> +#include <qbrush.h> +#include "KoBorder.h" +#include <qptrlist.h> + +class KWCanvas; +class KWDocument; +class KWFrame; +class KWFrameList; +class KWFrameSet; +class KWViewMode; + +class KoGenStyle; +class KoGenStyles; +class KoOasisContext; +class KoStyleStack; +class KoXmlWriter; + +class QDomElement; + +/** + * small utility class representing a sortable (by z-order) list of frames + * you can use sort() and inSort(item) + * + * Deprecated, use QValueVector<KWFrame*> from now on, and sort it with + * std::sort(frames.begin(),frames.end(),KWFrame::compareFrameZOrder); + * + * With Qt4 we'll be able to use qSort for lists. + */ +class ZOrderedFrameList : public QPtrList<KWFrame> +{ +protected: + virtual int compareItems(QPtrCollection::Item a, QPtrCollection::Item b); +}; + + +/** + * This class represents a single frame. + * A frame belongs to a frameset which states its contents. + * A frame does NOT have contents, the frameset stores that. + * A frame is really just a square that is used to place the content + * of a frameset. + */ +class KWFrame : public KoRect +{ +public: + /** Runaround types + * RA_NO = No run around, all text is just printed. + * RA_BOUNDINGRECT = run around the square of this frame. + * RA_SKIP = stop running text on the whole horizontal space this frame occupies. + */ + enum RunAround { RA_NO = 0, RA_BOUNDINGRECT = 1, RA_SKIP = 2 }; + + /** Runaround side - only meaningful when RA_BOUNDINGRECT is used + */ + enum RunAroundSide { RA_BIGGEST = 0, RA_LEFT = 1, RA_RIGHT = 2 }; + + /** + * Constructor + * @param fs parent frameset + * @param left, top, width, height coordinates of the frame + * The page number will be automatically determined from the position of the frame. + * @param ra the "runaround" setting, i.e. whether text should flow below the frame, + * around the frame, or avoiding the frame on the whole horizontal band. + */ + KWFrame(KWFrameSet *fs, double left, double top, double width, double height, + RunAround ra = RA_BOUNDINGRECT); + KWFrame(KWFrame * frame); + /** Destructor + */ + virtual ~KWFrame(); + + double runAroundLeft() const { return m_runAroundLeft; } + double runAroundRight() const { return m_runAroundRight; } + double runAroundTop() const { return m_runAroundTop; } + double runAroundBottom() const { return m_runAroundBottom; } + + void setRunAroundGap( double left, double right, double top, double bottom ) { + m_runAroundLeft = left; + m_runAroundRight = right; + m_runAroundTop = top; + m_runAroundBottom = bottom; + } + + RunAround runAround()const { return m_runAround; } + void setRunAround( RunAround _ra ) { m_runAround = _ra; } + + RunAroundSide runAroundSide() const { return m_runAroundSide; } + void setRunAroundSide( RunAroundSide rs ) { m_runAroundSide = rs; } + + /** what should happen when the frame is full + */ + enum FrameBehavior { AutoExtendFrame=0 , AutoCreateNewFrame=1, Ignore=2 }; + + FrameBehavior frameBehavior()const { return m_frameBehavior; } + void setFrameBehavior( FrameBehavior fb ) { m_frameBehavior = fb; } + + /* Frame duplication properties */ + + /** This frame will only be copied to: + * AnySide, OddSide or EvenSide + */ + enum SheetSide { AnySide=0, OddSide=1, EvenSide=2}; + SheetSide sheetSide()const { return m_sheetSide; } + void setSheetSide( SheetSide ss ) { m_sheetSide = ss; } + + /** What happens on new page + * (create a new frame and reconnect, no followup, make copy) */ + enum NewFrameBehavior { Reconnect=0, NoFollowup=1, Copy=2 }; + NewFrameBehavior newFrameBehavior()const { return m_newFrameBehavior; } + void setNewFrameBehavior( NewFrameBehavior nfb ) { m_newFrameBehavior = nfb; } + + /** Drawing property: if isCopy, this frame is a copy of the previous frame in the frameset + */ + bool isCopy()const { return m_bCopy; } + void setCopy( bool copy ) { m_bCopy = copy; } + + /** Data stucture methods + */ + KWFrameSet *frameSet() const { return m_frameSet; } + void setFrameSet( KWFrameSet *fs ) { m_frameSet = fs; } + + /** The page on which this frame is + */ + int pageNumber() const; + /** Same as pageNumber(), but works if the frame hasn't been added to a frameset yet + */ + int pageNumber( KWDocument* doc ) const; + + /** The z-order of the frame, relative to the other frames on the same page + */ + void setZOrder( int z ) { m_zOrder = z; } + int zOrder() const { return m_zOrder; } + + /** + * This is a method used to sort a list using the STL sorting methods. + * @param f1 the first object + * @param f2 the second object + */ + static bool compareFrameZOrder(KWFrame *f1, KWFrame *f2); + + KWFrameList* frameStack() { return m_frameStack; } + void setFrameStack(KWFrameList *fl) { m_frameStack = fl; } + + /** All borders can be custom drawn with their own colors etc. + */ + const KoBorder &leftBorder() const { return m_borderLeft; } + const KoBorder &rightBorder() const { return m_borderRight; } + const KoBorder &topBorder() const { return m_borderTop; } + const KoBorder &bottomBorder() const { return m_borderBottom; } + + + void setLeftBorder( KoBorder _brd ) { m_borderLeft = _brd; } + void setRightBorder( KoBorder _brd ) { m_borderRight = _brd; } + void setTopBorder( KoBorder _brd ) { m_borderTop = _brd; } + void setBottomBorder( KoBorder _brd ) { m_borderBottom = _brd; } + + /** Return the _zoomed_ rectangle for this frame, including the border - for drawing + * @param viewMode needed to know if borders are visible or not + */ + QRect outerRect( KWViewMode* viewMode ) const; + + /** Return the unzoomed rectangle, including the border, for the frames-on-top list. + * The default border of size 1-pixel that is drawn on screen is _not_ included here + * [since it depends on the zoom] + */ + KoRect outerKoRect() const; + + /** Return the rectangle for this frame including the border and the runaround gap. + * This is the rectangle that the surrounding text must run around. + */ + KoRect runAroundRect() const; + + /** Return the rectangle for this frame. + * This method is just so that new code doesn't rely on "KWFrame inherits KoRect", + * which would be good to get rid of, at some point. + */ + const KoRect& rect() const { return *this; } + + /** Marks a frame to have changed position/borders. + Make sure you call this when the frame borders changed so when its inline it will be moved. + */ + void frameBordersChanged(); + void updateRulerHandles(); + + QBrush backgroundColor() const { return m_backgroundColor; } + void setBackgroundColor( const QBrush &_color ); + bool isTransparent() const { return m_backgroundColor.style() != Qt::SolidPattern; } + + KoRect innerRect() const; + + double innerWidth() const; + double innerHeight() const; + + + /** The "internal Y" is the offset (in pt) of the real frame showed in this one + * ("real" means "the last that isn't a copy") + * This offset in pt is the sum of the height of the frames before that one. + * For text frames, this is equivalent to the layout units (after multiplication). */ + void setInternalY( double y ) { m_internalY = y; } + double internalY() const { return m_internalY; } + + /// set left padding (distance between frame contents and frame border) + void setPaddingLeft( double b ) { m_paddingLeft = b; } + /// set right padding + void setPaddingRight( double b ) { m_paddingRight = b; } + /// set top padding + void setPaddingTop( double b ) { m_paddingTop = b; } + /// set bottom padding + void setPaddingBottom( double b ) { m_paddingBottom = b; } + + /// get left padding + double paddingLeft() const { return m_paddingLeft; } + /// get right padding + double paddingRight() const { return m_paddingRight; } + /// get top padding + double paddingTop() const { return m_paddingTop; } + /// get bottom padding + double paddingBottom() const { return m_paddingBottom; } + + void setFramePadding( double _left, double _top, double right, double bottom); + /** returns a copy of self + */ + KWFrame *getCopy(); + + void copySettings(KWFrame *frm); + + /** create XML to describe yourself + */ + void save( QDomElement &frameElem ); + /** read attributes from XML. @p headerOrFooter if true some defaults are different + */ + void load( QDomElement &frameElem, KWFrameSet* frameSet, int syntaxVersion ); + void loadCommonOasisProperties( KoOasisContext& context, KWFrameSet* frameSet, const char* typeProperties ); + void loadBorderProperties( KoStyleStack& styleStack ); + + QString saveOasisFrameStyle( KoGenStyles& mainStyles ) const; + /** + * Write out a draw:frame element and its style. + * The caller is responsible for creating the child element and closing the draw:frame element. + * @p lastFrameName is the name of the previous frame in the same frameset; this is only used for copy-frames + */ + void startOasisFrame( KoXmlWriter &xmlWriter, KoGenStyles& mainStyles, const QString& name, + const QString& lastFrameName = QString::null ) const; + void saveBorderProperties( KoGenStyle& frameStyle ) const; + void saveMarginProperties( KoGenStyle& frameStyle ) const; + void saveMarginAttributes( KoXmlWriter &writer ) const; + + /** + * The property minimum frame height is used to make the automatic frame shrinking code stop. + * Each frame has a height based on its frame dimentions, but changes in content may change + * the sizes automatically. If all text is removed from a text frame it will grow smaller + * until the minimum frame height is reached, and it will not shrink below that. + * @param h the new minimum height + */ + void setMinimumFrameHeight(double h) { m_minFrameHeight = h; } + /** + * @return the minimum frame height. + * @see setMinimumFrameHeight() for details. + */ + double minimumFrameHeight(void)const {return m_minFrameHeight;} + + /** Return if the point is on the frame. + @param nPoint the point in normal coordinates. + @param borderOfFrameOnly when true an additional check is done if the point + is on the border. */ + bool frameAtPos( const QPoint& nPoint, bool borderOfFrameOnly=false ) const; + + /** + * Only applicable to frames of the main text frameset. + * Set to true by KWFrameLayout if the "footnote line" should be + * drawn under this frame. + */ + void setDrawFootNoteLine( bool b ) { m_drawFootNoteLine = b; } + bool drawFootNoteLine()const { return m_drawFootNoteLine; } + +private: + SheetSide m_sheetSide : 2; + RunAround m_runAround : 2; + RunAroundSide m_runAroundSide : 2; + FrameBehavior m_frameBehavior : 2; + NewFrameBehavior m_newFrameBehavior : 2; + bool m_bCopy; + bool m_drawFootNoteLine; + + double m_runAroundLeft, m_runAroundRight, m_runAroundTop, m_runAroundBottom; + double m_paddingLeft, m_paddingRight, m_paddingTop, m_paddingBottom; + double m_minFrameHeight; + + double m_internalY; + int m_zOrder; + + QBrush m_backgroundColor; + KoBorder m_borderLeft, m_borderRight, m_borderTop, m_borderBottom; + + /** List of frames we have below and on top of us. + * Frames on top we should never overwrite. Frames below us needd for selection code & + * transparancy */ + KWFrameList *m_frameStack; + KWFrameSet *m_frameSet; + + /** Prevent operator= + */ + KWFrame &operator=( const KWFrame &_frame ); + /** Prevent copy constructor + */ + KWFrame ( const KWFrame &_frame ); +}; + +#endif |