You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/lib/kofficecore/KoChild.h

313 lines
9.0 KiB

/* This file is part of the KDE project
Copyright (C) 1998, 1999 Torben Weis <weis@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 __koChild_h__
#define __koChild_h__
#include <qobject.h>
#include <qwmatrix.h>
#include <koffice_export.h>
/**
* KoChild is an abstract base class that represents the geometry
* associated with an embedded document. In general it handles its position
* relative to the embedded document's parent.
*
* In detail it handles size, matrix operations and can give you
* a clip region. It can deal with scaling, rotation etc. because it
* makes heavy usage of QWMatrix.
*
* After applying the matrix, viewGeometry() applies zooming, but can be
* reimplemented to also apply e.g. some translation by the application
* (e.g. for centering the page).
*
* @see KoDocumentChild KoViewChild
*/
class KOFFICECORE_EXPORT KoChild : public QObject
{
Q_OBJECT
public:
/**
* The gadget generally identifies where a child has been hit (generally
* by the mouse pointer).
* Based on this information different actions can be taken, for example
* moving the child or opening a context menu. NoGadget means that
* this child has not been hit.
*
* @see #gadgetHitTest
*/
enum Gadget { NoGadget, TopLeft, TopMid, TopRight, MidLeft, MidRight,
BottomLeft, BottomMid, BottomRight, Move };
KoChild( QObject *parent = 0, const char *name = 0 );
virtual ~KoChild();
/**
* Sets a new geometry for this child document.
* Use noEmit = true if you do not want the 'changed'-signal to be emitted
*/
void setGeometry( const QRect &rect, bool noEmit = false );
/**
* @return the rectangle that would be used to display this
* child document if the child is not rotated or
* subject to some other geometric transformation.
* The rectangle is in the coordinate system of the parent,
* using unzoomed coordinates in points.
*
* @see #setGeometry
*/
QRect geometry() const;
/**
* @return the region of this child part relative to the
* coordinate system of the parent.
* The region is transformed with the passed
* matrix.
*/
virtual QRegion region( const QWMatrix& = QWMatrix() ) const;
/**
* @return the polygon which surrounds the child part. The points
* are in coordinates of the parent.
* The points are transformed with the
* passed matrix.
*/
virtual QPointArray pointArray( const QWMatrix &matrix = QWMatrix() ) const;
/**
* Tests whether the part contains a certain point. The point is
* in the coordinate system of the parent.
*/
//virtual bool contains( const QPoint& ) const;
/**
* @return the effective bounding rect after all transformations.
* The coordinates of the rectangle are in the coordinate system
* of the parent.
*/
QRect boundingRect() const;
/**
* Scales the content of the child part. However, that does not
* affect the size of the child part.
*/
virtual void setScaling( double x, double y );
/**
* @return the x axis scaling of the child part
*/
virtual double xScaling() const;
/**
* @return the y axis scaling of the child part
*/
virtual double yScaling() const;
/**
* Shears the content of the child part.
*/
virtual void setShearing( double x, double y );
/**
* @return the x axis shearing of the child part
*/
virtual double xShearing() const;
/**
* @return the y axis shearing of the child part
*/
virtual double yShearing() const;
/**
* Sets the angle of rotation.
*/
virtual void setRotation( double );
/**
* @return the angle of rotation
*/
virtual double rotation() const;
/**
* Sets the center of the rotation to the point @p pos.
*/
virtual void setRotationPoint( const QPoint& pos );
/**
* @return the center of the rotation
*/
virtual QPoint rotationPoint() const;
/**
* @return true if the child part is an orthogonal rectangle relative
* to its parents coordinate system.
*/
bool isRectangle() const;
/**
* Sets the clip region of the painter, so that only pixels of the
* child part can be drawn.
*
* @param painter the painter do modify.
* @param combine tells whether the new clip region is an intersection
* of the current region with the childs region or whether only
* the childs region is set.
*/
virtual void setClipRegion( QPainter& painter, bool combine = true );
/**
* Transforms the painter (its worldmatrix and the clipping)
* in such a way that the painter can be passed to the child part
* for drawing.
*/
virtual void transform( QPainter& painter );
/**
* Sets the position of the content relative to the child frame.
* This can be used to create a border between the frame border
* and the actual content.
*/
virtual void setContentsPos( int x, int y );
/**
* @return the contents rectangle that is visible.
* This value depends on the scaling and the geometry.
* This is the value that is passed to KoDocument::paintContent.
*
* @see #xScaling #geometry
*/
virtual QRect contentRect() const;
/**
* @return the region of the child frame.
* If solid is set to true the complete area of the child region
* is returned, otherwise only the child border is returned.
*/
virtual QRegion frameRegion( const QWMatrix& matrix = QWMatrix(), bool solid = false ) const;
/**
* @return the frame geometry including a border (6 pixels) as a point
* array with 4 points, one for each corner, transformed by given matrix.
*/
virtual QPointArray framePointArray( const QWMatrix &matrix = QWMatrix() ) const;
/**
* @return the current transformation of this child as matrix.
* This includes translation, scale, rotation, shearing.
*
* @see #updateMatrix
*/
virtual QWMatrix matrix() const;
/**
* Locks this child and stores the current transformation.
* A locked child does not emit changed signals.
*
* This is useful if a series of changes are done on this
* child and only the final result is of interest (GUI updating,...).
*
* @see #locked #unlock
*/
void lock();
/**
* Unlocks this child and emits a changed signal.
*/
void unlock();
/**
* If the child is locked, geometry changes
* (including scaling, rotation, ...) are not backed up.
*
* As long as this child is locked, the backed up
* geometry state can be recovered with oldPointArray.
*
* @return true when this child is locked.
*
* @see #locked #unlock #oldPointArray
*/
bool locked() const;
/**
* @return the backed up geometry transformed by given matrix.
*/
virtual QPointArray oldPointArray( const QWMatrix &matrix );
/**
* Marks this child as either transparent or not.
* @param transparent set this child to transparent (true)
* or opaque (false).
*
* @see #isTransparent
*/
virtual void setTransparent( bool transparent );
/**
* It might be interesting for view updates and repainting in general
* whether a child is transparent or not.
* @return true when this child is marked as transparent.
*/
virtual bool isTransparent() const;
/**
* Different actions are taken depending on where a child frame is
* hit. Two gadgets are known: one for the border (5 pixels) and one
* for the inner area.
* @return the gadget identification for the hit area.
* @param p the hit position.
*
* @see #Gadget
*/
virtual Gadget gadgetHitTest( const QPoint& p );
signals:
/**
* Emitted every time this child changes, but only if this child is not
* locked.
* @see #locked
*/
void changed( KoChild *thisChild );
protected:
/**
* @return point array with the 4 corners of given rectangle, which is
* transformed by given matrix.
*
* @param matrix the transformation of r.
* @param r the rectangle for which the point array should be created.
*/
virtual QPointArray pointArray( const QRect& r, const QWMatrix& matrix = QWMatrix() ) const;
/**
* Stores the current transformation of this child into a matrix.
*
* @see #matrix
*/
virtual void updateMatrix();
private:
class KoChildPrivate;
KoChildPrivate *d;
};
#endif