1 // Written by Christopher E. Miller
2 // See the included license.txt for copyright and license details.
3 
4 
5 
6 module dfl.progressbar;
7 
8 private import dfl.base, dfl.control, dfl.drawing, dfl.application,
9         dfl.event;
10 private import dfl.internal.winapi;
11 
12 
13 private extern(Windows) void _initProgressbar();
14 
15 
16 
17 class ProgressBar: ControlSuperClass { // docmain
18    this() {
19       _initProgressbar();
20 
21       wexstyle |= WS_EX_CLIENTEDGE;
22       wclassStyle = progressbarClassStyle;
23    }
24 
25 
26 
27    final @property void maximum(int max) { // setter
28       if(max <= 0 /+ || max < _min +/) {
29          //bad_max:
30          //throw new DflException("Unable to set progress bar maximum value");
31          if(max) {
32             return;
33          }
34       }
35 
36       if(created) {
37          prevwproc(PBM_SETRANGE, 0, MAKELPARAM(_min, max));
38       }
39 
40       _max = max;
41 
42       if(_val > max) {
43          _val = max;   // ?
44       }
45    }
46 
47    /// ditto
48    final @property int maximum() { // getter
49       return _max;
50    }
51 
52 
53 
54    final @property void minimum(int min) { // setter
55       if(min < 0 /+ || min > _max +/) {
56          //bad_min:
57          //throw new DflException("Unable to set progress bar minimum value");
58          return;
59       }
60 
61       if(created) {
62          prevwproc(PBM_SETRANGE, 0, MAKELPARAM(min, _max));
63       }
64 
65       _min = min;
66 
67       if(_val < min) {
68          _val = min;   // ?
69       }
70    }
71 
72    /// ditto
73    final @property int minimum() { // getter
74       return _min;
75    }
76 
77 
78 
79    final @property void step(int stepby) { // setter
80       if(stepby <= 0 /+ || stepby > _max +/) {
81          //bad_max:
82          //throw new DflException("Unable to set progress bar step value");
83          if(stepby) {
84             return;
85          }
86       }
87 
88       if(created) {
89          prevwproc(PBM_SETSTEP, stepby, 0);
90       }
91 
92       _step = stepby;
93    }
94 
95    /// ditto
96    final @property int step() { // getter
97       return _step;
98    }
99 
100 
101 
102    final @property void value(int setval) { // setter
103       if(setval < _min || setval > _max) {
104          //throw new DflException("Progress bar value out of minimum/maximum range");
105          //return;
106          if(setval > _max) {
107             setval = _max;
108          } else {
109             setval = _min;
110          }
111       }
112 
113       if(created) {
114          prevwproc(PBM_SETPOS, setval, 0);
115       }
116 
117       _val = setval;
118    }
119 
120    /// ditto
121    final @property int value() { // getter
122       return _val;
123    }
124 
125 
126 
127    final void increment(int incby) {
128       int newpos = _val + incby;
129       if(newpos < _min) {
130          newpos = _min;
131       }
132       if(newpos > _max) {
133          newpos = _max;
134       }
135 
136       if(created) {
137          prevwproc(PBM_SETPOS, newpos, 0);
138       }
139 
140       _val = newpos;
141    }
142 
143 
144 
145    final void performStep() {
146       increment(_step);
147    }
148 
149 
150    protected override void onHandleCreated(EventArgs ea) {
151       super.onHandleCreated(ea);
152 
153       if(_min != MIN_INIT || _max != MAX_INIT) {
154          prevwproc(PBM_SETRANGE, 0, MAKELPARAM(_min, _max));
155       }
156 
157       if(_step != STEP_INIT) {
158          prevwproc(PBM_SETSTEP, _step, 0);
159       }
160 
161       if(_val != VAL_INIT) {
162          prevwproc(PBM_SETPOS, _val, 0);
163       }
164    }
165 
166 
167    protected override @property Size defaultSize() { // getter
168       return Size(100, 23);
169    }
170 
171 
172    static @property Color defaultForeColor() { // getter
173       return SystemColors.highlight;
174    }
175 
176 
177    protected override void createParams(ref CreateParams cp) {
178       super.createParams(cp);
179 
180       cp.className = PROGRESSBAR_CLASSNAME;
181    }
182 
183 
184    protected override void prevWndProc(ref Message msg) {
185       //msg.result = CallWindowProcA(progressbarPrevWndProc, msg.hWnd, msg.msg, msg.wParam, msg.lParam);
186       msg.result = dfl.internal.utf.callWindowProc(progressbarPrevWndProc, msg.hWnd, msg.msg, msg.wParam, msg.lParam);
187    }
188 
189 
190  private:
191 
192    enum MIN_INIT = 0;
193    enum MAX_INIT = 100;
194    enum STEP_INIT = 10;
195    enum VAL_INIT = 0;
196 
197    int _min = MIN_INIT, _max = MAX_INIT, _step = STEP_INIT, _val = VAL_INIT;
198 
199 
200  package:
201  final:
202    LRESULT prevwproc(UINT msg, WPARAM wparam, LPARAM lparam) {
203       //return CallWindowProcA(progressbarPrevWndProc, hwnd, msg, wparam, lparam);
204       return dfl.internal.utf.callWindowProc(progressbarPrevWndProc, hwnd, msg, wparam, lparam);
205    }
206 }
207