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.
kmymoney/kmymoney2/reports/kreportchartview.cpp

211 lines
7.7 KiB

/***************************************************************************
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( TQWidget* parent, const char* name ): KDChartWidget(parent,name)
{
// ********************************************************************
// Set KMyMoney's Chart Parameter Defaults
// ********************************************************************
this->setPaletteBackgroundColor( TQt::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( TQSize(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 TQLabel( this );
label->hide();
// mouse tracking on will force the mouseMoveEvent() method to be called from TQt
label->setMouseTracking( true );
label->setFrameStyle( TQFrame::PopupPanel | TQFrame::Raised );
label->setAlignment( AlignRight );
label->setAutoResize( true );
}
/**
* This function implements mouseMoveEvents
*/
void KReportChartView::mouseMoveEvent( TQMouseEvent* event )
{
TQPoint 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;
TQPtrListIterator < 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(TQString("<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(TQString("<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