1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * Qwt Widget Library
3  * Copyright (C) 1997   Josef Wilgen
4  * Copyright (C) 2002   Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #ifndef QWT_ABSTRACT_SCALE_DRAW_H
11 #define QWT_ABSTRACT_SCALE_DRAW_H
12 
13 #include "qwt_global.h"
14 #include "qwt_scale_div.h"
15 #include "qwt_text.h"
16 
17 
18 #if QT_VERSION < 0x040000
19 class QColorGroup;
20 #else
21 class QPalette;
22 #endif
23 class QPainter;
24 class QFont;
25 class QwtScaleTransformation;
26 class QwtScaleMap;
27 
28 /*!
29   \brief A abstract base class for drawing scales
30 
31   QwtAbstractScaleDraw can be used to draw linear or logarithmic scales.
32 
33   After a scale division has been specified as a QwtScaleDiv object
34   using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s),
35   the scale can be drawn with the QwtAbstractScaleDraw::draw() member.
36 */
37 class QWT_EXPORT QwtAbstractScaleDraw
38 {
39 public:
40 
41      /*!
42         Components of a scale
43 
44         - Backbone
45         - Ticks
46         - Labels
47 
48         \sa enableComponent(), hasComponent
49     */
50 
51     enum ScaleComponent
52     {
53         Backbone = 1,
54         Ticks = 2,
55         Labels = 4
56     };
57 
58     QwtAbstractScaleDraw();
59     QwtAbstractScaleDraw( const QwtAbstractScaleDraw & );
60     virtual ~QwtAbstractScaleDraw();
61 
62     QwtAbstractScaleDraw &operator=(const QwtAbstractScaleDraw &);
63 
64     void setScaleDiv(const QwtScaleDiv &s);
65     const QwtScaleDiv& scaleDiv() const;
66 
67     void setTransformation(QwtScaleTransformation *);
68     const QwtScaleMap &map() const;
69 
70     void enableComponent(ScaleComponent, bool enable = true);
71     bool hasComponent(ScaleComponent) const;
72 
73     void setTickLength(QwtScaleDiv::TickType, int length);
74     int tickLength(QwtScaleDiv::TickType) const;
75     int majTickLength() const;
76 
77     void setSpacing(int margin);
78     int spacing() const;
79 
80 #if QT_VERSION < 0x040000
81     virtual void draw(QPainter *, const QColorGroup &) const;
82 #else
83     virtual void draw(QPainter *, const QPalette &) const;
84 #endif
85 
86     virtual QwtText label(double) const;
87 
88     /*!
89       Calculate the extent
90 
91       The extent is the distcance from the baseline to the outermost
92       pixel of the scale draw in opposite to its orientation.
93       It is at least minimumExtent() pixels.
94 
95       \sa setMinimumExtent(), minimumExtent()
96     */
97     virtual int extent(const QPen &, const QFont &) const = 0;
98 
99     void setMinimumExtent(int);
100     int minimumExtent() const;
101 
102     QwtScaleMap &scaleMap();
103 
104 protected:
105     /*!
106        Draw a tick
107 
108        \param painter Painter
109        \param value Value of the tick
110        \param len Lenght of the tick
111 
112        \sa drawBackbone(), drawLabel()
113     */
114     virtual void drawTick(QPainter *painter, double value, int len) const = 0;
115 
116     /*!
117       Draws the baseline of the scale
118       \param painter Painter
119 
120       \sa drawTick(), drawLabel()
121     */
122     virtual void drawBackbone(QPainter *painter) const = 0;
123 
124     /*!
125         Draws the label for a major scale tick
126 
127         \param painter Painter
128         \param value Value
129 
130         \sa drawTick, drawBackbone
131     */
132     virtual void drawLabel(QPainter *painter, double value) const = 0;
133 
134     void invalidateCache();
135     const QwtText &tickLabel(const QFont &, double value) const;
136 
137 private:
138     int operator==(const QwtAbstractScaleDraw &) const;
139     int operator!=(const QwtAbstractScaleDraw &) const;
140 
141     class PrivateData;
142     PrivateData *d_data;
143 };
144 
145 #endif
146