KissCount/lib/libkdchart/src/KDChartChart.h

519 lines
20 KiB
C++

/****************************************************************************
** Copyright (C) 2001-2011 Klaralvdalens Datakonsult AB. All rights reserved.
**
** This file is part of the KD Chart library.
**
** Licensees holding valid commercial KD Chart licenses may use this file in
** accordance with the KD Chart Commercial License Agreement provided with
** the Software.
**
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 and version 3 as published by the
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** Contact info@kdab.com if any conditions of this licensing are not
** clear to you.
**
**********************************************************************/
#ifndef KDCHARTCHART_H
#define KDCHARTCHART_H
#include <QWidget>
#include "kdchart_export.h"
#include "KDChartGlobal.h"
/** \file KDChartChart.h
* \brief Declaring the class KDChart::Chart.
*
*
*/
namespace KDChart {
class BackgroundAttributes;
class FrameAttributes;
class AbstractDiagram;
class AbstractCoordinatePlane;
class HeaderFooter;
class Legend;
typedef QList<AbstractCoordinatePlane*> CoordinatePlaneList;
typedef QList<HeaderFooter*> HeaderFooterList;
typedef QList<Legend*> LegendList;
/**
* @class Chart KDChartChart.h KDChartChart
* @brief A chart with one or more diagrams.
*
* The Chart class represents a drawing consisting of one or more diagrams
* and various optional elements such as legends, axes, text boxes, headers
* or footers. It takes ownership of all these elements when they are assigned
* to it. Each diagram is associated with a coordinate plane, of which the chart
* can have more than one. The coordinate planes (and thus the associated diagrams)
* can be laid out in various ways.
*
* The Chart class makes heavy use of the Qt Interview framework for model/view
* programming, and thus requires data to be presented to it in a QAbstractItemModel
* compatible way. For many simple charts, especially if the visualized data is
* static, KDChart::Widget provides an abstracted interface, that hides the complexity
* of Interview to a large extent.
*/
class KDCHART_EXPORT Chart : public QWidget
{
Q_OBJECT
Q_PROPERTY( int globalLeadingTop READ globalLeadingTop WRITE setGlobalLeadingTop )
Q_PROPERTY( int globalLeadingBottom READ globalLeadingBottom WRITE setGlobalLeadingBottom )
Q_PROPERTY( int globalLeadingLeft READ globalLeadingLeft WRITE setGlobalLeadingLeft )
Q_PROPERTY( int globalLeadingRight READ globalLeadingRight WRITE setGlobalLeadingRight )
KDCHART_DECLARE_PRIVATE_BASE_POLYMORPHIC_QWIDGET( Chart )
public:
explicit Chart ( QWidget* parent = 0 );
~Chart();
/**
\brief Specify the frame attributes to be used, by default is it a thin black line.
To hide the frame line, you could do something like this:
\verbatim
KDChart::FrameAttributes frameAttrs( my_chart->frameAttributes() );
frameAttrs.setVisible( false );
my_chart->setFrameAttributes( frameAttrs );
\endverbatim
\sa setBackgroundAttributes
*/
void setFrameAttributes( const FrameAttributes &a );
FrameAttributes frameAttributes() const;
/**
\brief Specify the background attributes to be used, by default there is no background.
To set a light blue background, you could do something like this:
\verbatim
KDChart::BackgroundAttributes backgroundAttrs( my_chart->backgroundAttributes() );
backgroundAttrs.setVisible( true );
backgroundAttrs.setBrush( QColor(0xd0,0xd0,0xff) );
my_chart->setBackgroundAttributes( backgroundAttrs );
\endverbatim
\sa setFrameAttributes
*/
void setBackgroundAttributes( const BackgroundAttributes &a );
BackgroundAttributes backgroundAttributes() const;
/**
* Each chart must have at least one coordinate plane.
* Initially a default CartesianCoordinatePlane is created.
* Use replaceCoordinatePlane() to replace it with a different
* one, such as a PolarCoordinatePlane.
* @return The first coordinate plane of the chart.
*/
AbstractCoordinatePlane* coordinatePlane();
/**
* The list of coordinate planes.
* @return The list of coordinate planes.
*/
CoordinatePlaneList coordinatePlanes();
/**
* Adds a coordinate plane to the chart. The chart takes ownership.
* @param plane The coordinate plane to add.
*
* \sa replaceCoordinatePlane, takeCoordinatePlane
*/
void addCoordinatePlane( AbstractCoordinatePlane* plane );
/**
* Replaces the old coordinate plane, or appends the
* plane, it there is none yet.
*
* @param plane The coordinate plane to be used instead of the old plane.
* This parameter must not be zero, or the method will do nothing.
*
* @param oldPlane The coordinate plane to be removed by the new plane. This
* plane will be deleted automatically. If the parameter is omitted,
* the very first coordinate plane will be replaced. In case, there was no
* plane yet, the new plane will just be added.
*
* \note If you want to re-use the old coordinate plane, call takeCoordinatePlane and
* addCoordinatePlane, instead of using replaceCoordinatePlane.
*
* \sa addCoordinatePlane, takeCoordinatePlane
*/
void replaceCoordinatePlane( AbstractCoordinatePlane* plane,
AbstractCoordinatePlane* oldPlane = 0 );
/**
* Removes the coordinate plane from the chart, without deleting it.
*
* The chart no longer owns the plane, so it is
* the caller's responsibility to delete the plane.
*
* \sa addCoordinatePlane, takeCoordinatePlane
*/
void takeCoordinatePlane( AbstractCoordinatePlane* plane );
/**
* Set the coordinate plane layout that should be used as model for
* the internal used layout. The layout needs to be an instance of
* QHBoxLayout or QVBoxLayout.
*/
void setCoordinatePlaneLayout( QLayout * layout );
QLayout* coordinatePlaneLayout();
/**
* The first header or footer of the chart. By default there is none.
* @return The first header or footer of the chart or 0 if there was none
* added to the chart.
*/
HeaderFooter* headerFooter();
/**
* The list of headers and footers associated with the chart.
* @return The list of headers and footers associated with the chart.
*/
HeaderFooterList headerFooters();
/**
* Adds a header or a footer to the chart. The chart takes ownership.
* @param headerFooter The header (or footer, resp.) to add.
*
* \sa replaceHeaderFooter, takeHeaderFooter
*/
void addHeaderFooter( HeaderFooter* headerFooter );
/**
* Replaces the old header (or footer, resp.), or appends the
* new header or footer, it there is none yet.
*
* @param headerFooter The header or footer to be used instead of the old one.
* This parameter must not be zero, or the method will do nothing.
*
* @param oldHeaderFooter The header or footer to be removed by the new one. This
* header or footer will be deleted automatically. If the parameter is omitted,
* the very first header or footer will be replaced. In case, there was no
* header and no footer yet, the new header or footer will just be added.
*
* \note If you want to re-use the old header or footer, call takeHeaderFooter and
* addHeaderFooter, instead of using replaceHeaderFooter.
*
* \sa addHeaderFooter, takeHeaderFooter
*/
void replaceHeaderFooter ( HeaderFooter* headerFooter,
HeaderFooter* oldHeaderFooter = 0 );
/**
* Removes the header (or footer, resp.) from the chart, without deleting it.
*
* The chart no longer owns the header or footer, so it is
* the caller's responsibility to delete the header or footer.
*
* \sa addHeaderFooter, replaceHeaderFooter
*/
void takeHeaderFooter( HeaderFooter* headerFooter );
/**
* The first legend of the chart or 0 if there was none added to the chart.
* @return The first legend of the chart or 0 if none exists.
*/
Legend* legend();
/**
* The list of all legends associated with the chart.
* @return The list of all legends associated with the chart.
*/
LegendList legends();
/**
* Add the given legend to the chart. The chart takes ownership.
* @param legend The legend to add.
*
* \sa replaceLegend, takeLegend
*/
void addLegend( Legend* legend );
/**
* Replaces the old legend, or appends the
* new legend, it there is none yet.
*
* @param legend The legend to be used instead of the old one.
* This parameter must not be zero, or the method will do nothing.
*
* @param oldLegend The legend to be removed by the new one. This
* legend will be deleted automatically. If the parameter is omitted,
* the very first legend will be replaced. In case, there was no
* legend yet, the new legend will just be added.
*
* If you want to re-use the old legend, call takeLegend and
* addLegend, instead of using replaceLegend.
*
* \note Whenever addLegend is called the font sizes used by the
* Legend are set to relative and they get coupled to the Chart's size,
* with their relative values being 20 for the item texts and 24 to the
* title text. So if you want to use custom font sizes for the Legend
* make sure to set them after calling addLegend.
*
* \sa addLegend, takeLegend
*/
void replaceLegend ( Legend* legend, Legend* oldLegend = 0 );
/**
* Removes the legend from the chart, without deleting it.
*
* The chart no longer owns the legend, so it is
* the caller's responsibility to delete the legend.
*
* \sa addLegend, takeLegend
*/
void takeLegend( Legend* legend );
/**
* Set the padding between the margin of the widget and the area that
* the contents are drawn into.
* @param left The padding on the left side.
* @param top The padding at the top.
* @param right The padding on the left hand side.
* @param bottom The padding on the bottom.
*
* \note Using previous versions of KD Chart you might have called
* setGlobalLeading() to make room for long Abscissa labels (or for an
* overlapping top label of an Ordinate axis, resp.) that would not fit
* into the normal axis area. This is \em no \em longer \em needed
* because KD Chart now is using hidden auto-spacer items reserving
* as much free space as is needed for axes with overlaping content
* at the respective sides.
*
* \sa setGlobalLeadingTop, setGlobalLeadingBottom, setGlobalLeadingLeft, setGlobalLeadingRight
* \sa globalLeadingTop, globalLeadingBottom, globalLeadingLeft, globalLeadingRight
*/
void setGlobalLeading( int left, int top, int right, int bottom );
/**
* Set the padding between the start of the widget and the start
* of the area that is used for drawing on the left.
* @param leading The padding value.
*
* \sa setGlobalLeading
*/
void setGlobalLeadingLeft( int leading );
/**
* The padding between the start of the widget and the start
* of the area that is used for drawing on the left.
* @return The padding between the start of the widget and the start
* of the area that is used for drawing on the left.
*
* \sa setGlobalLeading
*/
int globalLeadingLeft() const;
/**
* Set the padding between the start of the widget and the start
* of the area that is used for drawing at the top.
* @param leading The padding value.
*
* \sa setGlobalLeading
*/
void setGlobalLeadingTop( int leading );
/**
* The padding between the start of the widget and the start
* of the area that is used for drawing at the top.
* @return The padding between the start of the widget and the start
* of the area that is used for drawing at the top.
*
* \sa setGlobalLeading
*/
int globalLeadingTop() const;
/**
* Set the padding between the start of the widget and the start
* of the area that is used for drawing on the right.
* @param leading The padding value.
*
* \sa setGlobalLeading
*/
void setGlobalLeadingRight( int leading );
/**
* The padding between the start of the widget and the start
* of the area that is used for drawing on the right.
* @return The padding between the start of the widget and the start
* of the area that is used for drawing on the right.
*
* \sa setGlobalLeading
*/
int globalLeadingRight() const;
/**
* Set the padding between the start of the widget and the start
* of the area that is used for drawing on the bottom.
* @param leading The padding value.
*
* \sa setGlobalLeading
*/
void setGlobalLeadingBottom( int leading );
/**
* The padding between the start of the widget and the start
* of the area that is used for drawing at the bottom.
* @return The padding between the start of the widget and the start
* of the area that is used for drawing at the bottom.
*
* \sa setGlobalLeading
*/
int globalLeadingBottom() const;
/**
* Paints all the contents of the chart. Use this method, to make KDChart
* draw into your QPainter.
*
* \note Any global leading settings will be used by the paint method too,
* so make sure to set them to zero, if you want the drawing to have the exact
* size of the target rectangle.
*
* \param painter The painter to be drawn into.
* \param target The rectangle to be filled by the Chart's drawing.
*
* \sa setGlobalLeading
*/
void paint( QPainter* painter, const QRect& target );
void reLayoutFloatingLegends();
Q_SIGNALS:
/** Emitted upon change of a property of the Chart or any of its components. */
void propertiesChanged();
protected:
/**
* Adjusts the internal layout when the chart is resized.
*/
/* reimp */ void resizeEvent ( QResizeEvent * event );
/**
* @brief Draws the background and frame, then calls paint().
*
* In most cases there is no need to override this method in a derived
* class, but if you do, do not forget to call paint().
* @sa paint
*/
/* reimp */ void paintEvent( QPaintEvent* event );
/** reimp */
void mousePressEvent( QMouseEvent* event );
/** reimp */
void mouseDoubleClickEvent( QMouseEvent* event );
/** reimp */
void mouseMoveEvent( QMouseEvent* event );
/** reimp */
void mouseReleaseEvent( QMouseEvent* event );
/** reimp */
bool event( QEvent* event );
};
// Here we have a few docu block to be included into the API documentation:
/**
* \dir src
* \brief Implementation directory of KDChart.
*
* This directory contains the header files and the source files of both,
* the private and the public classes.
*
* \note Only classes that have an include wrapper in the \c $KDCHARTDIR/include
* directory are part of the supported API.
* All other classes are to be considered as implemntation details, they
* could be changed in future versions of KDChart without notice.
*
* In other words: No class that is not mentioned in the \c $KDCHARTDIR/include
* directory may be directly used by your application.
*
* The recommended way to include classes of the KDChart API is including
* them by class name, so instead of including KDChartChart.h you would say:
*
\verbatim
#include <KDChartChart>
\endverbatim
*
* When following this there is no reason to include the \c $KDCHARTDIR/src
* directory, it is sufficient to include \c $KDCHARTDIR/include
*/
}
/**
* @class QAbstractItemView "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QAbstractProxyModel "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QFrame "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QObject "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QSortFilterProxyModel "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QWidget "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QTextDocument "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QLayoutItem "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
/**
* @class QGraphicsPolygonItem "(do not include)"
* @brief Class only listed here to document inheritance of some KDChart classes.
*
* Please consult the respective Qt documentation for details:
* <A HREF="http://doc.trolltech.com/">http://doc.trolltech.com/</A>
*/
#endif