From dadc34655c3ab961b0b0b94a10eaaba710f0b5e8 Mon Sep 17 00:00:00 2001 From: tpearson Date: Mon, 4 Jul 2011 22:38:03 +0000 Subject: Added kmymoney git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kmymoney@1239792 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- libkdchart/KDChartCustomBox.h | 1043 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1043 insertions(+) create mode 100644 libkdchart/KDChartCustomBox.h (limited to 'libkdchart/KDChartCustomBox.h') diff --git a/libkdchart/KDChartCustomBox.h b/libkdchart/KDChartCustomBox.h new file mode 100644 index 0000000..f4f8694 --- /dev/null +++ b/libkdchart/KDChartCustomBox.h @@ -0,0 +1,1043 @@ +/* -*- Mode: C++ -*- + KDChart - a multi-platform charting engine + */ + +/**************************************************************************** + ** Copyright (C) 2001-2003 Klarälvdalens Datakonsult AB. All rights reserved. + ** + ** This file is part of the KDChart library. + ** + ** This file may be distributed and/or modified under the terms of the + ** GNU General Public License version 2 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. + ** + ** Licensees holding valid commercial KDChart licenses may use this file in + ** accordance with the KDChart Commercial License Agreement provided with + ** the Software. + ** + ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ** + ** See http://www.klaralvdalens-datakonsult.se/?page=products for + ** information about KDChart Commercial License Agreements. + ** + ** Contact info@klaralvdalens-datakonsult.se if any conditions of this + ** licensing are not clear to you. + ** + **********************************************************************/ +#ifndef __KDCHARTCUSTOMBOX_H__ +#define __KDCHARTCUSTOMBOX_H__ + +#include +#include +#include +#include +#include "KDChartGlobal.h" +#include "KDChartEnums.h" +#include "KDChartTextPiece.h" + + +class KDFrame; + +// needed because there was no AlignAuto before Qt 3.0 +#define KDCHART_AlignAuto 0 + + +/** \file KDChartCustomBox.h + \brief Definition of a class for specifying and drawing custom boxes. + */ + +/** + Class for specifying and drawing custom boxes. + */ +class KDCHART_EXPORT KDChartCustomBox :public QObject +{ + Q_OBJECT + friend class KDChartPainter; + friend class KDChartParams; + +public: + + /** + Constructor. + Set default values. + */ + KDChartCustomBox() : + _rotation( 0 ), + _fontSize( -10 ), + _fontScaleGlobal( true ), + _deltaX( 0 ), + _deltaY( 0 ), + _width( 0 ), + _height( 0 ), + _color( Qt::black ), + _paper( Qt::NoBrush ), + _anchorArea( KDChartEnums::AreaInnermost ), + _anchorPos( KDChartEnums::PosTopLeft ), + _anchorAlign( Qt::AlignTop + Qt::AlignLeft ), + _dataRow( 0 ), + _dataCol( 0 ), + _data3rd( 0 ), + _deltaAlign( KDCHART_AlignAuto ), + _deltaScaleGlobal( true ), + _anchorBeingCalculated( false ), + _parentAxisArea( -1 ) + { + const KDChartTextPiece piece( 0, "", QFont( "helvetica", 8, QFont::Normal, false ) ); + _content.deepCopy( &piece ); + } + + /** + Constructor. + Set content and font size but no position/size parameters. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param content The string or rich text string to be written into the box. + \param fontSize The size of the font to be used, see explanation above. + \param fontScaleGlobal If true the font size will be calculated based + upon the the size of the drawing area, otherwise it will be calculated + based upon the height of the box. + */ + KDChartCustomBox( const KDChartTextPiece & content, + int fontSize, + bool fontScaleGlobal = true ) : + _rotation( 0 ), + _fontSize( fontSize ), + _fontScaleGlobal( fontScaleGlobal ), + _deltaX( 0 ), + _deltaY( 0 ), + _width( 0 ), + _height( 0 ), + _color( Qt::black ), + _paper( Qt::NoBrush ), + _anchorArea( KDChartEnums::AreaInnermost ), + _anchorPos( KDChartEnums::PosTopLeft ), + _anchorAlign( Qt::AlignTop + Qt::AlignLeft ), + _dataRow( 0 ), + _dataCol( 0 ), + _data3rd( 0 ), + _deltaAlign( KDCHART_AlignAuto ), + _deltaScaleGlobal( true ), + _anchorBeingCalculated( false ), + _parentAxisArea( -1 ) + { + _content.deepCopy( &content ); + } + + + /** + Constructor. + Set content and position/size parameters and the color and brush to be used. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param content The text piece to be displayed. + \param fontSize If \c fontSize value is greater 0, the value is taken as exact size, + if \c fontSize is less than 0 it is interpreted as being a per-mille value + of the size of the drawing area (or of the height of the box in case + \c fontScaleGlobal is set to false, resp.). + Normally the actual font size is calculated dynamically in methode paint. + However if fontSize is zero no calculating will take place but the + size of the content font is used. + \param fontScaleGlobal If true the font size will be calculated based + upon the the size of the drawing area, otherwise it will be calculated + based upon the height of the box. + \param deltaX The X distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + size of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in methode trueRect. + \param deltaY The Y distance between the box and its anchor. + \param width The width of the box. + \param height The height of the box. + \param color The text color. + \param paper The brush to be used for the background. + \param area The area to which the box is to be aligned. + \param position The anchor position. This is the edge (or + the corner, resp.) of the area to which + the box is to be aligned. + \param align The way how the box is to be aligned to its anchor. + \param dataRow The row number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion. + \param dataCol The column number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion. + \param data3rd The third dimensions number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion + or if there is no 3-dimensional data structure. + \param deltaAlign The way how \c deltaX and \deltaY affect the position of the box. + Leave this parameter to its default value KDCHART_AlignAuto to have the delta values + used according to the box's main \c align settings, otherwise specify your own + alignment settings: e.g. right means there will be a gap between the right side of + the box and its anchor point - if the main \c align parameter is set to right too + the anchor point will to be outside of the box / if \c align is set to left + (but the \c deltaAlign to right) the anchor point will be inside the box. + Possible values for \c deltaAlign are: + \li \c KDCHART_AlignAuto + \li \c Qt::AlignLeft | Qt::AlignTop + \li \c Qt::AlignLeft | Qt::AlignBottom + \li \c Qt::AlignRight | Qt::AlignTop + \li \c Qt::AlignRight | Qt::AlignBottom + Using AlignVCenter or AlignHCenter or AlignCenter does not make sense here: + center delta alignment will cause KDChart to ignore the respective delta + settings: deltaX or deltaY or both will become ineffective. + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + */ + KDChartCustomBox( const KDChartTextPiece & content, + int fontSize, + bool fontScaleGlobal, + int deltaX, + int deltaY, + int width, + int height, + const QColor & color = QColor( Qt::black ), + const QBrush & paper = QBrush( Qt::NoBrush ), + uint area = KDChartEnums::AreaInnermost, + KDChartEnums::PositionFlag position = KDChartEnums::PosTopLeft, + uint align = Qt::AlignTop + Qt::AlignLeft, + uint dataRow = 0, + uint dataCol = 0, + uint data3rd = 0, + uint deltaAlign = KDCHART_AlignAuto, + bool deltaScaleGlobal = true, + int parentAxis = -1 ) + : _rotation( 0 ), + _fontSize( fontSize ), + _fontScaleGlobal( fontScaleGlobal ), + _deltaX( deltaX ), + _deltaY( deltaY ), + _width( width ), + _height( height ), + _color( color ), + _paper( paper ), + _anchorArea( area ), + _anchorPos( position ), + _anchorAlign( align ), + _dataRow( dataRow ), + _dataCol( dataCol ), + _data3rd( data3rd ), + _deltaAlign( deltaAlign ), + _deltaScaleGlobal( deltaScaleGlobal ), + _anchorBeingCalculated( false ), + _parentAxisArea( parentAxis ) + { + _content.deepCopy( &content ); + } + + + /** + Constructor. + Use this special constructor to specify a rotated box, reference + point of the rotation is the anchor specified by the \c area and the + \c position parameters. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param rotation The box's rotation angle in degrees (0 .. 360). + \param content The text piece to be displayed. + \param fontSize If \c fontSize value is greater 0, the value is taken as exact size, + if \c fontSize is less than 0 it is interpreted as being a per-mille value + of the size of the drawing area (or of the height of the box in case + \c fontScaleGlobal is set to false, resp.). + Normally the actual font size is calculated dynamically in methode paint. + However if fontSize is zero no calculating will take place but the + size of the content font is used. + \param fontScaleGlobal If true the font size will be calculated based + upon the the size of the drawing area, otherwise it will be calculated + based upon the height of the box. + \param deltaX The X distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + width of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in method trueRect. + \param deltaY The Y distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + height of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in method trueRect. + \param width The width of the box. + \param height The height of the box. + \param color The text color. + \param paper The brush to be used for the background. + \param area The area to which the box is to be aligned. + \param position The anchor position. This is the edge (or + the corner, resp.) of the area to which the box is to be aligned + and it is also used as the reference point of the rotation. + \param align The way how the box is to be aligned to its anchor. + \param dataRow The row number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion. + \param dataCol The column number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion. + \param data3rd The third dimensions number of the KDChart data region that is to be used + as anchor area. This parameter is ignored if \c area is not \c AreaChartDataRegion + or if there is no 3-dimensional data structure. + \param deltaAlign The way how \c deltaX and \deltaY affect the position of the box. + Leave this parameter to its default value KDCHART_AlignAuto to have the delta values + used according to the box's main \c align settings, otherwise specify your own + alignment settings: e.g. Qt::AlignRight means the box will be moved to the left + (by the amount calculated using the \c deltaX value), so there will be a gap + between the right side of the box and its anchor point IF the main \c align flag + is set to Qt::AlignRight too, so the anchor point will to be outside of the + box then. However if the main \c align flag is set to Qt::AlignLeft the anchor + point will be inside the box. + Possible values for \c deltaAlign are: + \li \c KDCHART_AlignAuto + \li \c Qt::AlignLeft | Qt::AlignTop + \li \c Qt::AlignLeft | Qt::AlignBottom + \li \c Qt::AlignRight | Qt::AlignTop + \li \c Qt::AlignRight | Qt::AlignBottom + Using AlignVCenter or AlignHCenter or AlignCenter does not make sense here: + center delta alignment will cause KDChart to ignore the respective delta + settings: deltaX or deltaY or both will become ineffective. + \note Moving of the box due to \c deltaAlign settings is applied after + the box is rotated: e.g. this means a gap specified by \c deltaAlign = Qt::AlignTop + gap will actually result in a left gap if the box is rotated by 90 degrees. + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + */ + KDChartCustomBox( int rotation, + const KDChartTextPiece & content, + int fontSize, + bool fontScaleGlobal, + int deltaX, + int deltaY, + int width, + int height, + const QColor & color = QColor( Qt::black ), + const QBrush & paper = QBrush( Qt::NoBrush ), + uint area = KDChartEnums::AreaInnermost, + KDChartEnums::PositionFlag position = KDChartEnums::PosTopLeft, + uint align = Qt::AlignTop + Qt::AlignLeft, + uint dataRow = 0, + uint dataCol = 0, + uint data3rd = 0, + uint deltaAlign = KDCHART_AlignAuto, + bool deltaScaleGlobal = true, + int parentAxis = -1 ) + : _rotation( rotation ), + _fontSize( fontSize ), + _fontScaleGlobal( fontScaleGlobal ), + _deltaX( deltaX ), + _deltaY( deltaY ), + _width( width ), + _height( height ), + _color( color ), + _paper( paper ), + _anchorArea( area ), + _anchorPos( position ), + _anchorAlign( align ), + _dataRow( dataRow ), + _dataCol( dataCol ), + _data3rd( data3rd ), + _deltaAlign( deltaAlign ), + _deltaScaleGlobal( deltaScaleGlobal ), + _anchorBeingCalculated( false ), + _parentAxisArea( parentAxis ) + { + _content.deepCopy( &content ); + } + + + /** + Creates a DOM element node that represents a custom box for use + in a DOM document. + + \param document the DOM document to which the node will belong + \param parent the parent node to which the new node will be appended + \param elementName the name of the new node + \param custombox the custom box to be represented + */ + static void createCustomBoxNode( QDomDocument& document, + QDomNode& parent, + const QString& elementName, + const KDChartCustomBox* custombox ); + + /** + Reads data from a DOM element node that represents a custom box + object and fills a KDChartCustomBox object with the data. + + \param element the DOM element to read from + \param settings the custom box object to read the data into + */ + static bool readCustomBoxNode( const QDomElement& element, + KDChartCustomBox& custombox ); + +public slots: // PENDING(blackie) merge slots sections. + + float trueFontSize( double areaWidthP1000, + double areaHeightP1000, + int rectHeight ) const; + int trueFontLineSpacing( double areaWidthP1000, + double areaHeightP1000, + int rectHeight ) const; + int trueRectAlignX(const QRect& rect) const; + int trueRectAlignY(const QRect& rect) const; + void getTrueShift( double areaWidthP1000, + double areaHeightP1000, + int rectHeight, + int& dX, + int& dY )const; + + + /** + Return the actual rectangle which to draw box into. + + \note When ever possible, use this method, instead of the other trueRect(), that + has no \c QPainter parameter. Passing a QPainter will give you more exact results. + + \param painter The QPainter to be used. + \param anchor The anchor point which the box is to be aligned to. + This can be any point within the painter drawing area but you + will probably compute a point using anchorArea(), anchorPosition(), anchorAlign() + (and dataRow(), dataCol(), data3rd() when dealing with KDChart data regions, resp.) + \param areaWidthP1000 The thousands part of the logical width + of the area to be used for drawing. + \param areaHeightP1000 The thousands part of the logical height + of the area to be used for drawing. + */ + QRect trueRect( QPainter * painter, + QPoint anchor, double areaWidthP1000, double areaHeightP1000 ) const ; + + /** + Return the actual rectangle which to draw box into. + + \param anchor The anchor point which the box is to be aligned to. + This can be any point within the painter drawing area but you + will probably compute a point using anchorArea(), anchorPosition(), anchorAlign() + (and dataRow(), dataCol(), data3rd() when dealing with KDChart data regions, resp.) + \param areaWidthP1000 The thousands part of the logical width + of the area to be used for drawing. + \param areaHeightP1000 The thousands part of the logical height + of the area to be used for drawing. + */ + virtual QRect trueRect( QPoint anchor, + double areaWidthP1000, + double areaHeightP1000 ) const ; + + /** + Paints the box. + + \param painter The QPainter to be used for drawing. + \param anchor The anchor point which the box is to be aligned to. + This can be any point within the painter drawing area but you + will probably compute a point using anchorArea(), anchorPosition(), anchorAlign() + (and dataRow(), dataCol(), data3rd() when dealing with KDChart data regions, resp.) + \param areaWidthP1000 The thousands part of the drawing area width. + \param areaHeightP1000 The thousands part of the drawing area height. + \param color The text color to be used. + \param paper The brush to be used for the background. + \param rect The rectangle to be drawn into. If empty the rectangle will be + calculated dynamically based upon the \c x, \c y, \c width, \c height values + (that were set via Constructor or via setPosAndSize) and based upon the + logical height (or width, resp.) of the painters drawing area. + */ + virtual void paint( QPainter* painter, + QPoint anchor, + double areaWidthP1000, + double areaHeightP1000, + const KDFrame* frame = 0, + const QRect& frameRect = QRect(), + const QColor * color = 0, + const QBrush * paper = 0 ) const ; + + /** + Specifies the rotation angle of the box in degrees (0..360). + */ + void setRotation( int rotation ) + { + _rotation = rotation; + } + + /** + Specifies the text piece content to be drawn. + */ + void setContent( const KDChartTextPiece & content ) + { + _content.deepCopy( &content ); + } + + /** + Specifies the font size to be used. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param fontSize If \c fontSize value is greater 0, the value is taken as exact size, + if \c fontSize is less than 0 it is interpreted as being a per-mille value + of the size of the drawing area (or of the height of the box in case + \c fontScaleGlobal is set to false, resp.). + Normally the actual font size is calculated dynamically in methode paint. + However if fontSize is zero no calculating will take place but the + size of the content font is used. + \param fontScaleGlobal If true the font size will be calculated based + upon the the size of the drawing area, otherwise it will be calculated + based upon the height of the box. + */ + void setFontSize( int fontSize, bool fontScaleGlobal ) + { + _fontSize = fontSize; + _fontScaleGlobal = fontScaleGlobal; + } + + /** + Specifies the area to which the box is to be aligned. + */ + void setAnchorArea( uint area ) + { + _anchorArea = area; + } + + /** + Specifies the anchor position. + This is the edge (or the corner, resp.) of the area + to which the box is to be aligned. + */ + void setAnchorPosition( KDChartEnums::PositionFlag position ) + { + // Note if you change the parameters here, then you must also change them in wrappers/KDChartCustomBoxWrapper.h + _anchorPos = position; + } + + /** + Specifies the way how the box is to be aligned to its anchor. + */ + void setAnchorAlign( uint align ) + { + _anchorAlign = align; + } + + /** + Specifies the row number of the KDChart data region that is to be used + as anchor area. This value is ignored if anchorArea is not \c AreaChartDataRegion. + */ + void setDataRow( uint dataRow ) + { + _dataRow = dataRow; + } + + /** + Specifies the column number of the KDChart data region that is to be used + as anchor area. This value is ignored if anchorArea is not \c AreaChartDataRegion. + */ + void setDataCol( uint dataCol ) + { + _dataCol = dataCol; + } + + /** + Specifies the third dimensions number of the KDChart data region that is to be used + as anchor area. This value is ignored if anchorArea is not \c AreaChartDataRegion + or if there is no 3-dimensional data structure. + */ + void setData3rd( uint data3rd ) + { + _data3rd = data3rd; + } + + /** + Specifies the distance between the box and the anchor point and + specifies the size of the box. + + \param deltaX The X distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + size of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in methode trueRect. + \param deltaY The Y distance between the box and its anchor. + \param width The width of the drawing region. + \param height The height of the drawing region. + \param deltaAlign the way how the values specified for deltaX and/or deltaY + affect the position of the box. + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + + \sa setDistance, setSize, setDeltaAlign, setDeltaScale + */ + void setDistanceAndSize( int deltaX, + int deltaY, + int width, + int height, + uint deltaAlign = KDCHART_AlignAuto, + bool deltaScaleGlobal = true ) + { + _deltaX = deltaX; + _deltaY = deltaY; + _width = width; + _height = height; + _deltaAlign = deltaAlign; + _deltaScaleGlobal = deltaScaleGlobal; + } + + /** + Specifies the distance between the box and the anchor point. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param deltaX The X distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + size of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in methode trueRect. + \param deltaY The Y distance between the box and its anchor. + \param align the way how the values specified for deltaX and/or deltaY + affect the position of the box. + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + + \sa setDistanceAndSize, setSize, setDeltaAlign, setDeltaScale + */ + void setDistance( int deltaX, + int deltaY, + uint align = KDCHART_AlignAuto, + bool deltaScaleGlobal = true ) + { + _deltaX = deltaX; + _deltaY = deltaY; + _deltaAlign = align; + _deltaScaleGlobal = deltaScaleGlobal; + } + + /** + Specifies the way how the values specified for deltaX and/or deltaY + affect the position of the box. + + Set this to KDHART_KDCHART_AlignAuto to have the delta values + used according to the box's main \c align settings, otherwise specify your own + alignment settings: e.g. right means there will be a gap between the right side of + the box and its anchor point - if the main \c align parameter is set to right too + the anchor point will to be outside of the box / if \c align is set to left + (but the \c deltaAlign to right) the anchor point will be inside the box. + Possible values for \c deltaAlign are: + \li \c KDCHART_AlignAuto + \li \c Qt::AlignLeft | Qt::AlignTop + \li \c Qt::AlignLeft | Qt::AlignBottom + \li \c Qt::AlignRight | Qt::AlignTop + \li \c Qt::AlignRight | Qt::AlignBottom + Using AlignVCenter or AlignHCenter or AlignCenter does not make sense here: + center delta alignment will cause KDChart to ignore the respective delta + settings: deltaX or deltaY or both will become ineffective. + \note Moving of the box due to \c deltaAlign settings is applied after + the box is rotated: e.g. this means a gap specified by \c deltaAlign = Qt::AlignTop + gap will actually result in a left gap if the box is rotated by 90 degrees. + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + + \sa setDeltaScale, setDistance, setDistanceAndSize, deltaAlign + */ + void setDeltaAlign( uint align, + bool deltaScaleGlobal = true ) + { + _deltaAlign = align; + _deltaScaleGlobal = deltaScaleGlobal; + } + + /** + Specifies the way how the distance between the box and its anchor + will be calculated. + + \param deltaScaleGlobal If true the actual delta X and delta Y values will + be calculated by \c deltaX and \c deltaY based upon the size of the + drawing area, otherwise they will be calculated based upon the actual + font size. + + \sa setDeltaAlign, setDistance, setDistanceAndSize, deltaAlign + */ + void setDeltaScale( bool deltaScaleGlobal ) + { + _deltaScaleGlobal = deltaScaleGlobal; + } + + /** + Specifies the size of the box. + + \note If \c fontScaleGlobal is set to true it is not necessary to + specify the size of the box: if both \c width and \c height are zero + and \c fontScaleGlobal is true the size of the box will be calculated + automatically based upon the content size. In this case the content + size is interpreted as rich text string - even if the text is NOT + framed by and . + + \param width The width of the box. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value + of the logical height (or width, resp.) of the area to be used for drawing. + Actual drawing position/size is calculated dynamically in methode trueRect. + \param height The height of the box. + + \sa setDistance, setDistanceAndSize, setDeltaAlign + */ + void setSize( int width, int height ) + { + _width = width; + _height = height; + } + + /** + Specifies the text color to be used. + + \param color The text color. + */ + void setColor( QColor color ) + { + _color = color; + } + + /** + Specifies the brush to be used for the background. + + \param paper The brush to be used for the background. + */ + void setPaper( const QBrush & paper ) + { + _paper = paper; + } + + /** + Returns the rotation angle of the box in degrees (0..360). + */ + int rotation() const + { + return _rotation; + } + + /** + Returns the text piece content that is to be drawn. + */ + const KDChartTextPiece & content() const + { + return _content; + } + + /** + Returns the font size to be used. + + \note If fontSize value is greater 0, the value is taken as exact size, + if less than 0, it is interpreted as being a per-mille value of the logical + height (or width, resp.) of the area to be used for drawing. + Normally the actual font size is calculated dynamically in methode paint. + However if fontSize is zero no calculating will take place but the + size of the content font is used. + */ + int fontSize() const + { + return _fontSize; + } + + /** + Returns the way how the font size is calculated if fontSize() is negative. + + If true the font size will be calculated based upon the the size of the drawing + area, otherwise it will be calculated based upon the height of the box. + */ + bool fontScaleGlobal() const + { + return _fontScaleGlobal; + } + + /** + Returns the area to which the box is to be aligned. + */ + uint anchorArea() const + { + return _anchorArea; + } + + /** + Returns the anchor position. + This is the edge (or the corner, resp.) of the area + to which the box is to be aligned. + */ + KDChartEnums::PositionFlag anchorPosition() const + { + return _anchorPos; + } + + /** + Returns the way how the box is to be aligned to its anchor. + */ + uint anchorAlign() const + { + return _anchorAlign; + } + + /** + Returns the row number of the KDChart data region that is to be used + as anchor area. You should use this if anchorArea is \c AreaChartDataRegion + to find out the data region which the box is to be aligned to. + */ + uint dataRow() const + { + return _dataRow; + } + + /** + Returns the column number of the KDChart data region that is to be used + as anchor area. You should use this if anchorArea is \c AreaChartDataRegion + to find out the data region which the box is to be aligned to. + */ + uint dataCol() const + { + return _dataCol; + } + + /** + Returns the third dimensions number of the KDChart data region that is to be used + as anchor area. You should use this if anchorArea is \c AreaChartDataRegion + and if there is a 3-dimensional data structure + to find out the data region which the box is to be aligned to. + */ + uint data3rd() const + { + return _data3rd; + } + + /** + Returns the X distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + size of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in methode trueRect. + + \sa deltaY, deltaAlign, deltaScaleGlobal + */ + int deltaX() const + { + return _deltaX; + } + + /** + Returns the Y distance between the box and its anchor. + Note: If greater 0, the value is taken as exact offset, + if less than 0, it is interpreted as being a per-mille value of the + size of the drawing area (or as percent value of the actual font size + (as returned by QFontMetrics::lineSpacing() ) if deltaScaleGlobal is FALSE, resp.). + Actual drawing position/size is calculated dynamically in methode trueRect. + + \sa deltaX, deltaAlign, deltaScaleGlobal + */ + int deltaY() const + { + return _deltaY; + } + + /** + Returns the way how the values specified for deltaX and/or deltaY + affect the position of the box. + + \sa setDeltaAlign, deltaX, deltaY, deltaScaleGlobal + */ + uint deltaAlign() const + { + return _deltaAlign; + } + + /** + Returns the way how the distance between the box and its anchor + is calculated. + + \sa setDeltaScaleGlobal, deltaX, deltaY, deltaAlign + */ + bool deltaScaleGlobal() const + { + return _deltaScaleGlobal; + } + + /** + Returns the width of the region where + to draw the box. Note: If greater 0, the value is the exact offset, + if less than 0, it is interpreted as being a per-mille value + of the logical height (or width, resp.) of the area to be used for drawing. + Actual drawing position/size is calculated dynamically in methode trueRect. + */ + int width() const + { + return _width; + } + + /** + Returns the height of the region where + to draw the box. Note: If greater 0, the value is the exact offset, + if less than 0, it is interpreted as being a per-mille value + of the logical height (or width, resp.) of the area to be used for drawing. + Actual drawing position/size is calculated dynamically in methode trueRect. + */ + int height() const + { + return _height; + } + + /** + Returns the text color. + */ + QColor color() const + { + return _color; + } + + /** + Returns the background brush. + */ + const QBrush & paper() const + { + return _paper; + } + +public: + /** + Destructor. Only defined to have it virtual. + */ + virtual ~KDChartCustomBox(); + + /** + Copy the settings of box \c source into this box. + + \note Use this method instead of using the assignment operator. + + \sa clone + */ + void deepCopy( const KDChartCustomBox* source ); + + + /** + Create a new box on the heap, copy the settings stored by + this box into the newly created box and return + the pointer to the new box. + + \note Use this method instead of using the copy constructor. + + \sa deepCopy + */ + const KDChartCustomBox* clone() const; + +private: + KDChartCustomBox( const KDChartCustomBox& ) : QObject(0) {} + +protected: + /** + Internal routine for recursion handling. + Note: This is a const methode changing NO VITAL information + of the box but setting an internal, temporary flag. + */ + void setInternalFlagAnchorBeingCalculated( bool flag ) const + { + KDChartCustomBox* that = const_cast(this); + that->_anchorBeingCalculated = flag; + } + /** + Internal routine for recursion handling. + */ + bool anchorBeingCalculated() const + { + return _anchorBeingCalculated; + } + + void setParentAxisArea( int parentAxis ) const + { + KDChartCustomBox* that = const_cast(this); + that->_parentAxisArea = parentAxis; + } + + int parentAxisArea() const + { + return _parentAxisArea; + } + +private: + int _rotation; + KDChartTextPiece _content; + int _fontSize; + bool _fontScaleGlobal; + // Values to be transformed into a real rect at painting time. + // If greater 0, values are exact, if less than 0, values are in per-mille + // of the size of the drawing area. + int _deltaX; + int _deltaY; + int _width; + int _height; + + QColor _color; + QBrush _paper; + + uint _anchorArea; + KDChartEnums::PositionFlag _anchorPos; + uint _anchorAlign; + uint _dataRow; + uint _dataCol; + uint _data3rd; + uint _deltaAlign; + bool _deltaScaleGlobal; + // + // The following flag is NOT to be saved/restored in a file. + // + // Being a TEMPORARY flag preventing circular recursion + // it must be set to f a l s e + // after loading a KDChartCustomBox from a file. + bool _anchorBeingCalculated; + int _parentAxisArea; +}; + + +/** + Writes the KDChartCustomBox object p as an XML document to the text stream s. + + \param s the text stream to write to + \param p the KDChartCustomBox object to write + \return the text stream after the write operation + */ +//QTextStream& operator<<( QTextStream& s, const KDChartCustomBox& p ); + + +/** + Reads the an XML document from the text stream s into the + KDChartCustomBox object p + + \param s the text stream to read from + \param p the KDChartCustomBox object to read into + \return the text stream after the read operation + */ +//QTextStream& operator>>( QTextStream& s, KDChartCustomBox& p ); + + +#endif -- cgit v1.2.1