/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_SCALE_WIDGET_H
#define QWT_SCALE_WIDGET_H

#include "qwt_global.h"
#include "qwt_text.h"
#include "qwt_scale_draw.h"
#include <qwidget.h>
#include <qfont.h>
#include <qcolor.h>
#include <qstring.h>

class QPainter;
class QwtScaleTransformation;
class QwtScaleDiv;
class QwtColorMap;

/*!
  \brief A Widget which contains a scale

  This Widget can be used to decorate composite widgets with
  a scale.
*/

class QWT_EXPORT QwtScaleWidget : public QWidget
{
    Q_OBJECT

public:
    //! Layout flags of the title
    enum LayoutFlag
    {
        /*!
          The title of vertical scales is painted from top to bottom. 
          Otherwise it is painted from bottom to top.
         */
        TitleInverted = 1
    };

    //! Layout flags of the title
    typedef QFlags<LayoutFlag> LayoutFlags;

    explicit QwtScaleWidget( QWidget *parent = NULL );
    explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL );
    virtual ~QwtScaleWidget();

Q_SIGNALS:
    //! Signal emitted, whenever the scale divison changes
    void scaleDivChanged();

public:
    void setTitle( const QString &title );
    void setTitle( const QwtText &title );
    QwtText title() const;

    void setLayoutFlag( LayoutFlag, bool on );
    bool testLayoutFlag( LayoutFlag ) const;

    void setBorderDist( int start, int end );
    int startBorderDist() const;
    int endBorderDist() const;

    void getBorderDistHint( int &start, int &end ) const;

    void getMinBorderDist( int &start, int &end ) const;
    void setMinBorderDist( int start, int end );

    void setMargin( int );
    int margin() const;

    void setSpacing( int td );
    int spacing() const;

    void setScaleDiv( QwtScaleTransformation *, const QwtScaleDiv &sd );

    void setScaleDraw( QwtScaleDraw * );
    const QwtScaleDraw *scaleDraw() const;
    QwtScaleDraw *scaleDraw();

    void setLabelAlignment( Qt::Alignment );
    void setLabelRotation( double rotation );

    void setColorBarEnabled( bool );
    bool isColorBarEnabled() const;

    void setColorBarWidth( int );
    int colorBarWidth() const;

    void setColorMap( const QwtInterval &, QwtColorMap * );

    QwtInterval colorBarInterval() const;
    const QwtColorMap *colorMap() const;

    virtual QSize sizeHint() const;
    virtual QSize minimumSizeHint() const;

    int titleHeightForWidth( int width ) const;
    int dimForLength( int length, const QFont &scaleFont ) const;

    void drawColorBar( QPainter *painter, const QRectF & ) const;
    void drawTitle( QPainter *painter, QwtScaleDraw::Alignment,
        const QRectF &rect ) const;

    void setAlignment( QwtScaleDraw::Alignment );
    QwtScaleDraw::Alignment alignment() const;

    QRectF colorBarRect( const QRectF& ) const;

protected:
    virtual void paintEvent( QPaintEvent * );
    virtual void resizeEvent( QResizeEvent * );

    void draw( QPainter *p ) const;

    void scaleChange();
    void layoutScale( bool update = true );

private:
    void initScale( QwtScaleDraw::Alignment );

    class PrivateData;
    PrivateData *d_data;
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleWidget::LayoutFlags )

#endif
