summaryrefslogtreecommitdiffstats
path: root/kmymoney2/reports/kreportchartview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/reports/kreportchartview.cpp')
-rw-r--r--kmymoney2/reports/kreportchartview.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/kmymoney2/reports/kreportchartview.cpp b/kmymoney2/reports/kreportchartview.cpp
new file mode 100644
index 0000000..21b08fa
--- /dev/null
+++ b/kmymoney2/reports/kreportchartview.cpp
@@ -0,0 +1,210 @@
+/***************************************************************************
+ kreportchartview.cpp
+ -------------------
+ begin : Sun Aug 14 2005
+ copyright : (C) 2004-2005 by Ace Jones
+ email : <ace.j@hotpop.com>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "../../config.h"
+#endif
+#ifdef HAVE_KDCHART
+
+// ----------------------------------------------------------------------------
+// QT Includes
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include "kreportchartview.h"
+#include <KDChartDataRegion.h>
+
+using namespace reports;
+
+KReportChartView::KReportChartView( QWidget* parent, const char* name ): KDChartWidget(parent,name)
+{
+ // ********************************************************************
+ // Set KMyMoney's Chart Parameter Defaults
+ // ********************************************************************
+ this->setPaletteBackgroundColor( Qt::white );
+
+ KDChartParams* _params = new KDChartParams();
+ _params->setChartType( KDChartParams::Line );
+ _params->setAxisLabelStringParams( KDChartAxisParams::AxisPosBottom,&m_abscissaNames,0);
+ _params->setDataSubduedColors();
+
+ /**
+ // use line marker, but only circles.
+ _params->setLineMarker( true );
+ _params->setLineMarkerSize( QSize(8,8) );
+ _params->setLineMarkerStyle( 0, KDChartParams::LineMarkerCircle );
+ _params->setLineMarkerStyle( 1, KDChartParams::LineMarkerCircle );
+ _params->setLineMarkerStyle( 2, KDChartParams::LineMarkerCircle );
+ **/
+
+ // initialize parameters
+ this->setParams(_params);
+
+ // initialize data
+ KDChartTableData* _data = new KDChartTableData();
+ this->setData(_data);
+
+ // ********************************************************************
+ // Some Examplatory Chart Table Data
+ // ********************************************************************
+
+ /**
+ // 1st series
+ this->data()->setCell( 0, 0, 17.5 );
+ this->data()->setCell( 0, 1, 125 ); // highest value
+ this->data()->setCell( 0, 2, 6.67 ); // lowest value
+ this->data()->setCell( 0, 3, 33.333 );
+ this->data()->setCell( 0, 4, 30 );
+ // 2nd series
+ this->data()->setCell( 1, 0, 40 );
+ this->data()->setCell( 1, 1, 40 );
+ this->data()->setCell( 1, 2, 45.5 );
+ this->data()->setCell( 1, 3, 45 );
+ this->data()->setCell( 1, 4, 35 );
+ // 3rd series
+ this->data()->setCell( 2, 0, 25 );
+ // missing value: setCell( 2, 1, 25 );
+ this->data()->setCell( 2, 2, 30 );
+ this->data()->setCell( 2, 3, 45 );
+ this->data()->setCell( 2, 4, 40 );
+ **/
+
+ // ********************************************************************
+ // Tooltip Setup
+ // ********************************************************************
+ label = new QLabel( this );
+ label->hide();
+ // mouse tracking on will force the mouseMoveEvent() method to be called from Qt
+ label->setMouseTracking( true );
+ label->setFrameStyle( QFrame::PopupPanel | QFrame::Raised );
+ label->setAlignment( AlignRight );
+ label->setAutoResize( true );
+}
+
+/**
+ * This function implements mouseMoveEvents
+ */
+void KReportChartView::mouseMoveEvent( QMouseEvent* event )
+{
+ QPoint translate, pos; // some movement helpers
+ uint dataset; // the current dataset (eg. category)
+ uint datasets; // the total number of datasets
+ double value; // the value of the region
+ double pivot_sum; // the sum over all categories in the current pivot point
+
+ // the data region in which the cursor was last time
+ static uint previous;
+
+ // if mouse tracking is disabled, don't show any tooltip
+ if ( !this->hasMouseTracking() )
+ return ;
+
+ // find the data region below the current mouse location
+ // ..by going through every data region and checking whether it
+ // contains the mouse pointer
+ KDChartDataRegion* current = 0;
+ QPtrListIterator < KDChartDataRegion > it( *(this->dataRegions()) );
+ while ( ( current = it.current() ) ) {
+ ++it;
+ if ( current->contains( event->pos() ) )
+ {
+ // we found the data region that contains the mouse
+ value = this->data()->cellVal(current->row, current->col).toDouble();
+
+ // get the dataset that the region corresponds to
+ if ( this->getAccountSeries() )
+ {
+ dataset = current->row;
+ datasets= this->data()->rows();
+ pivot_sum = value * 100.0 / this->data()->colSum(current->col);
+ }
+ else
+ {
+ dataset = current->col;
+ datasets= this->data()->cols();
+ pivot_sum = value * 100.0 / this->data()->rowSum(current->row);
+ }
+
+ // if we entered a new data region or the label was invisible
+ if ( !label->isVisible() || previous != dataset )
+ {
+ // if there is more than one dataset, show percentage
+ if(datasets > 1)
+ {
+ // set the tooltip text
+ label->setText(QString("<h2>%1</h2><strong>%2</strong><br>(%3\%)")
+ .arg(this->params()->legendText( dataset ))
+ .arg(value, 0, 'f', 2)
+ .arg(pivot_sum, 0, 'f', 2)
+ );
+ }
+ else // if there is only one dataset, don't show percentage
+ {
+ // set the tooltip text
+ label->setText(QString("<h2>%1</h2><strong>%2</strong>")
+ .arg(this->params()->legendText( dataset ))
+ .arg(value, 0, 'f', 2)
+ );
+ }
+
+ previous = dataset;
+ }
+
+ translate.setX( -10 - label->width());
+ translate.setY( 20);
+
+ // display the label near the cursor
+ pos = event->pos() + translate;
+
+ // but don't let the label leave the visible area
+ if( pos.x() < 0 )
+ pos.setX(0);
+ if( pos.y() < 0 )
+ pos.setY(0);
+ if( pos.x() + label->width() > this->width() )
+ pos.setX( this->width() - label->width() );
+ if( pos.y() + label->height() > this->height() )
+ pos.setY( this->height() - label->height() );
+
+ // now set the label position and show the label
+ label->move( pos );
+ label->show();
+
+ // In a more abstract class, we would emit a dateMouseMove event:
+ //emit this->dataMouseMove( event->pos(), current->row, current->col );
+
+ return ;
+ }
+ }
+ // if the cursor was not found in any data region, hide the label
+ label->hide();
+}
+
+void KReportChartView::setProperty(int row, int col, int id)
+{
+#ifdef HAVE_KDCHART_SETPROP
+ this->data()->setProp(row, col, id);
+#else
+ this->data()->cell(row, col).setPropertySet(id);
+#endif
+}
+
+#endif