# qwt_abstract_scale.cpp

    00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
    00002  * Qwt Widget Library
    00003  * Copyright (C) 1997   Josef Wilgen
    00004  * Copyright (C) 2002   Uwe Rathmann
    00005  *
    00006  * This library is free software; you can redistribute it and/or
    00007  * modify it under the terms of the Qwt License, Version 1.0
    00008  *****************************************************************************/
    00009
    00010 #include "qwt_scale_engine.h"
    00011 #include "qwt_scale_draw.h"
    00012 #include "qwt_scale_div.h"
    00013 #include "qwt_scale_map.h"
    00014 #include "qwt_double_interval.h"
    00015 #include "qwt_abstract_scale.h"
    00016
    00017 class QwtAbstractScale::PrivateData
    00018 {
    00019 public:
    00020     PrivateData():
    00021         maxMajor(5),
    00022         maxMinor(3),
    00023         stepSize(0.0),
    00024         autoScale(true)
    00025     {
    00026         scaleEngine = new QwtLinearScaleEngine;
    00027         scaleDraw = new QwtScaleDraw();
    00028     }
    00029
    00030     ~PrivateData()
    00031     {
    00032         delete scaleEngine;
    00033         delete scaleDraw;
    00034     }
    00035
    00036     QwtScaleEngine *scaleEngine;
    00037     QwtAbstractScaleDraw *scaleDraw;
    00038
    00039     int maxMajor;
    00040     int maxMinor;
    00041     double stepSize;
    00042
    00043     bool autoScale;
    00044 };
    00045
    00053 QwtAbstractScale::QwtAbstractScale()
    00054 {
    00055     d_data = new PrivateData;
    00056     rescale(0.0, 100.0);
    00057 }
    00058
    00060 QwtAbstractScale::~QwtAbstractScale()
    00061 {
    00062     delete d_data;
    00063 }
    00064
    00075 void QwtAbstractScale::setScale(double vmin, double vmax, double stepSize)
    00076 {
    00077     d_data->autoScale = false;
    00078     d_data->stepSize = stepSize;
    00079
    00080     rescale(vmin, vmax, stepSize);
    00081 }
    00082
    00092 void QwtAbstractScale::setScale(const QwtDoubleInterval &interval,
    00093     double stepSize)
    00094 {
    00095     setScale(interval.minValue(), interval.maxValue(), stepSize);
    00096 }
    00097
    00098
    00107 void QwtAbstractScale::setScale(const QwtScaleDiv &scaleDiv)
    00108 {
    00109     d_data->autoScale = false;
    00110
    00111     if (scaleDiv != d_data->scaleDraw->scaleDiv())
    00112     {
    00113         d_data->scaleDraw->setScaleDiv(scaleDiv);
    00114         scaleChange();
    00115     }
    00116 }
    00117
    00127 void QwtAbstractScale::rescale(double vmin, double vmax, double stepSize)
    00128 {
    00129     const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale(
    00130         vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize);
    00131
    00132     if ( scaleDiv != d_data->scaleDraw->scaleDiv() )
    00133     {
    00134         d_data->scaleDraw->setTransformation(
    00135             d_data->scaleEngine->transformation());
    00136         d_data->scaleDraw->setScaleDiv(scaleDiv);
    00137         scaleChange();
    00138     }
    00139 }
    00140
    00147 void QwtAbstractScale::setAutoScale()
    00148 {
    00149     if (!d_data->autoScale)
    00150     {
    00151         d_data->autoScale = true;
    00152         scaleChange();
    00153     }
    00154 }
    00155
    00159 bool QwtAbstractScale::autoScale() const
    00160 {
    00161     return d_data->autoScale;
    00162 }
    00163
    00173 void QwtAbstractScale::setScaleMaxMajor(int ticks)
    00174 {
    00175     if (ticks != d_data->maxMajor)
    00176     {
    00177         d_data->maxMajor = ticks;
    00178         updateScaleDraw();
    00179     }
    00180 }
    00181
    00191 void QwtAbstractScale::setScaleMaxMinor(int ticks)
    00192 {
    00193     if ( ticks != d_data->maxMinor)
    00194     {
    00195         d_data->maxMinor = ticks;
    00196         updateScaleDraw();
    00197     }
    00198 }
    00199
    00204 int QwtAbstractScale::scaleMaxMinor() const
    00205 {
    00206     return d_data->maxMinor;
    00207 }
    00208
    00213 int QwtAbstractScale::scaleMaxMajor() const
    00214 {
    00215     return d_data->maxMajor;
    00216 }
    00217
    00224 void QwtAbstractScale::setAbstractScaleDraw(QwtAbstractScaleDraw *scaleDraw)
    00225 {
    00226     if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw )
    00227         return;
    00228
    00229     delete d_data->scaleDraw;
    00230     d_data->scaleDraw = scaleDraw;
    00231 }
    00232
    00237 QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw()
    00238 {
    00239     return d_data->scaleDraw;
    00240 }
    00241
    00246 const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const
    00247 {
    00248     return d_data->scaleDraw;
    00249 }
    00250
    00251 void QwtAbstractScale::updateScaleDraw()
    00252 {
    00253     rescale( d_data->scaleDraw->scaleDiv().lBound(),
    00254         d_data->scaleDraw->scaleDiv().hBound(), d_data->stepSize);
    00255 }
    00256
    00266 void QwtAbstractScale::setScaleEngine(QwtScaleEngine *scaleEngine)
    00267 {
    00268     if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine )
    00269     {
    00270         delete d_data->scaleEngine;
    00271         d_data->scaleEngine = scaleEngine;
    00272     }
    00273 }
    00274
    00279 const QwtScaleEngine *QwtAbstractScale::scaleEngine() const
    00280 {
    00281     return d_data->scaleEngine;
    00282 }
    00283
    00288 QwtScaleEngine *QwtAbstractScale::scaleEngine()
    00289 {
    00290     return d_data->scaleEngine;
    00291 }
    00292
    00298 void QwtAbstractScale::scaleChange()
    00299 {
    00300 }
    00301
    00305 const QwtScaleMap &QwtAbstractScale::scaleMap() const
    00306 {
    00307     return d_data->scaleDraw->scaleMap();
    00308 }