|
|
//*************************************************************************** /* * TOra - An Oracle Toolkit for DBA's and developers * Copyright (C) 2003 Quest Software, Inc * * 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; only version 2 of * the License is valid for this program. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries without written consent from Quest Software, Inc. * Observe that this does not disallow linking to the Qt Free Edition. * * All trademarks belong to their respective owners. * ****************************************************************************/ #ifndef TOLINECHART_H #define TOLINECHART_H #include <list> #include <map> #include <qwidget.h> class QPopupMenu; class QScrollBar; /** A widget that displays a linechart with optional background throbber (Not implemented yet). */ class toLineChart : public QWidget { Q_OBJECT QPopupMenu *Menu; QScrollBar *Horizontal; QScrollBar *Vertical; protected: std::list<std::list<double> > Values; std::list<QString> XValues; std::list<QString> Labels; std::list<bool> Enabled; bool Legend; bool Last; int Grid; bool AxisText; double MinValue; bool MinAuto; double MaxValue; bool MaxAuto; QString YPostfix; int Samples; QString Title; QRect Chart; QPoint MousePoint[2]; int SkipSamples; int UseSamples; int DisplaySamples; bool Zooming; double zMinValue; double zMaxValue; static double round(double round,bool up); QRect fixRect(QPoint p1,QPoint p2); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); virtual void mousePressEvent(QMouseEvent *e); int countSamples(void); void clearZoom(void); virtual void paintLegend(QPainter *p,QRect &rect); virtual void paintTitle(QPainter *p,QRect &rect); virtual void paintAxis(QPainter *p,QRect &rect); virtual void paintChart(QPainter *p,QRect &rect); public: /** Create a new linechart. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toLineChart(QWidget *parent=NULL,const char *name=NULL,WFlags f=0); /** Create a new chart by copying all the data from another chart. * @param chart Chart to copy data from. * @param parent Parent widget. * @param name Name of widget. * @param f Widget flags. */ toLineChart(toLineChart *chart,QWidget *parent=NULL,const char *name=NULL,WFlags f=0); /** Destroy chart */ ~toLineChart(); /** Specify if legend should be displayed to the right of the graph, default is on. * @param on Whether to display legend or not. */ void showLegend(bool on) { Legend=on; update(); } /** Check if legend is displayed or not. * @return If legend is displayed or not. */ bool legend(void) const { return Legend; } /** Show most recent value on top of graph * @param on Whether to display or not. */ void showLast(bool on) { Last=on; update(); } /** Check if last value is displayed or not. * @return If value is displayed or not. */ bool last(void) const { return Last; } /** Set title of the chart. Set to empty string to not display title. * @param title Title of chart. */ void setTitle(const QString &title=QString::null) { Title=title; setCaption(title); update(); } /** Get title of chart. * @return Title of chart. */ const QString &title(void) { return Title; } /** Specify if a grid should be displayed in the graph, default is on. * @param div Number of parts to divide grid into. */ void showGrid(int div=0) { Grid=div; update(); } /** Check if grid is displayed or not. * @return Number of parts to divide grid into. */ int grid(void) const { return Grid; } /** Specify if a y-axis legend should be displayed in the graph, default is on. * @param on Whether to display legend or not. */ void showAxisLegend(bool on) { AxisText=on; update(); } /** Check if y-axis legend is displayed or not. * @return If legend is displayed or not. */ bool axisLegend(void) const { return AxisText; } /** Set y postfix value. This will be appended to the values in the axis legend. * @param postfix The string to append. */ void setYPostfix(const QString &postfix) { YPostfix=postfix; update(); } /** Set max value on y-axis to auto. */ void setMaxValueAuto(void) { MaxAuto=true; update(); } /** Set min value on y-axis to auto. */ void setMinValueAuto(void) { MinAuto=true; update(); } /** Set max value on y-axis. * @param val Max value on y-axis. */ void setMaxValue(double maxVal) { MaxAuto=false; MaxValue=maxVal; update(); } /** Set min value on y-axis. * @param val Min value on y-axis. */ void setMinValue(double minVal) { MinAuto=false; MinValue=minVal; update(); } /** Get minimum value on y-axis. Will not return the automatically determinned minimum value. * @return Minimum value on y-axis. */ double minValue(void) const { return MinValue; } /** Get maximum value on y-axis. Will not return the automatically determinned maximum value. * @return Maximum value on y-axis. */ double maxValue(void) const { return MaxValue; } /** Set the number of samples on the x-axis. Setting samples to -1 will keep all entries. * @param samples Number of samples. */ void setSamples(int samples=-1); /** Get the maximum number of samples on the x-axis. * @return Max number of samples. */ int samples(void) const { return Samples; } /** Set the labels on the chart lines. * @param labels Labels of the lines. Empty labels will not show up in the legend. */ void setLabels(const std::list<QString> &labels) { Labels=labels; update(); } /** Get the labels of the chart lines. * @return List of labels. */ std::list<QString> &labels(void) { return Labels; } /** Add a new value set to the chart. * @param value New values for charts (One for each line). * @param label X-value on these values. */ virtual void addValues(std::list<double> &value,const QString &xValues); /** Get list of labels * @return List of labels */ std::list<QString> &xValues(void) { return XValues; } /** Get list of values. * @return Values in piechart. */ std::list<std::list<double> > &values(void) { return Values; } /** Export chart to a map. * @param data A map that can be used to recreate the data of a chart. * @param prefix Prefix to add to the map. */ virtual void exportData(std::map<QCString,QString> &data,const QCString &prefix); /** Import data * @param data Data to read from a map. * @param prefix Prefix to read data from. */ virtual void importData(std::map<QCString,QString> &data,const QCString &prefix); /** Get enabled datavalues. Values in this list with false are not drawn in the chart. * Could be an empty list if everything is enabled. */ std::list<bool> enabledCharts(void) { return Enabled; } /** Set enabled datavalues. Values in this list with false are not drawn in the chart. */ void setEnabledCharts(std::list<bool> &enabled) { Enabled=enabled; update(); } /** Open chart in new window. */ virtual toLineChart *openCopy(QWidget *parent); signals: /** A new value set was added to the chart. * @param value New values for charts (One for each line). * @param label X-value on these values. */ virtual void valueAdded(std::list<double> &value,const QString &xValues); public slots: /** Clear the values from the chart. */ virtual void clear(void) { Values.clear(); XValues.clear(); update(); } /** Setup values of charts. */ virtual void setup(void); /** Print the chart. */ virtual void editPrint(void); void openCopy(void) { openCopy(NULL); } protected: /** Reimplemented for internal reasons. */ virtual void paintEvent(QPaintEvent *e); /** Reimplemented for internal reasons. */ virtual void addMenues(QPopupMenu *) { } private slots: void horizontalChange(int); void verticalChange(int); void chartSetup(void); }; #endif