1 #pragma once
2 
3 #ifndef TNZ_SCROLLBAR_INCLUDED
4 #define TNZ_SCROLLBAR_INCLUDED
5 
6 //#include "tw/action.h"
7 //#include "traster.h"
8 #include "tw/tw.h"
9 
10 #undef DVAPI
11 #undef DVVAR
12 #ifdef TWIN_EXPORTS
13 #define DVAPI DV_EXPORT_API
14 #define DVVAR DV_EXPORT_VAR
15 #else
16 #define DVAPI DV_IMPORT_API
17 #define DVVAR DV_IMPORT_VAR
18 #endif
19 
20 class TScrollbarGenericAction {
21 public:
TScrollbarGenericAction()22   TScrollbarGenericAction() {}
~TScrollbarGenericAction()23   virtual ~TScrollbarGenericAction() {}
24   virtual void notify(int value) = 0;
25 };
26 
27 template <class T>
28 class TScrollbarAction : public TScrollbarGenericAction {
29 public:
30   typedef void (T::*CommandMethod)(int value);
31 
32   T *m_target;
33   CommandMethod m_method;
34 
35   TScrollbarAction<T>(T *target, CommandMethod method)
m_target(target)36       : m_target(target), m_method(method){};
notify(int value)37   void notify(int value) { (m_target->*m_method)(value); };
38 };
39 
40 class DVAPI TScrollbar : public TWidget {
41   int m_oldPos;
42   int m_gPos, m_gMinPos, m_gMaxPos, m_gSize;
43   int m_value, m_minValue, m_maxValue, m_cursorSize;
44   const int m_buttonAreaSize;
45   TScrollbarGenericAction *m_action;
46   bool m_firstButtonPressed, m_secondButtonPressed;
47   bool m_horizontal;
48   bool m_minOverflowEnabled;
49   bool m_maxOverflowEnabled;
50   int m_buttonIncrement;
51 
52 protected:
53   void updatePositions();
54 
55   void drawHCursor(int x0, int x1);
56   void drawVCursor(int y0, int y1);
57   enum ButtonId { FIRST_BUTTON, SECOND_BUTTON };
58   void drawButton(ButtonId id);
59 
60 public:
61   TScrollbar(TWidget *parent, string name = "scrollbar");
62   ~TScrollbar();
63 
64   void repaint();
65 
66   void leftButtonDown(const TMouseEvent &);
67   void leftButtonDrag(const TMouseEvent &);
68   void leftButtonUp(const TMouseEvent &);
69 
70   void configureNotify(const TDimension &d);
71 
72   void setValue(int value, int min, int max, int size);
getValue()73   int getValue() const { return m_value; }
74 
75   // min <= value <= max
76   // il cursore occupa almeno size/(max-min+size) dell'area disponibile
77   // se size = 0 non c'e' cursore e lo slider e' disabilitato
78   // se size>=max-min il cursore occupa tutto lo spazio e lo slider e'
79   // disabilitato
80   //
81   // value == min quando il cursore e' in alto
82   // value == max quando il cursore e' in basso
83   //
84   // quando vengono premuti i bottoni value viene incrementato/decrementato di
85   // uno
86   //
87 
88   // abilita/disabilita la possibilita' di agire sui bottoni anche
89   // quando lo slider e' gia' sul massimo/minimo
90   // default: false/false
91   void enableButtonOverflow(bool min, bool max);
92 
93   // default: 4
94   void setButtonIncrement(int d);
95 
96   void setAction(TScrollbarGenericAction *action);
97   void onTimer(int v);
98 };
99 
100 #endif
101