1 /******************************************************************************
2 *
3 * Copyright (C) 2004-2007, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: vis.btn 17.07.07 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 /* Компонента vCustomBtn, порождена от vCtrl
17 События
18 onClick - вызывается при нажатии на кнопку
19 */
20 type vCustomBtn <inherit = vCtrl>
21 {
22 //Hidden Fields
23 locustr pCaption
24 uint pChecked
25 uint pBtnStyle
26 uint flgPushLike
27 uint flgOwnerRedraw
28 //Events
29 evEvent OnClick
30 }
31
32 /*define {
33 mUpdateCaption = $vCtrl_last
34 vCustomBtn_last
35 }*/
36
37 type vBtn <inherit = vCustomBtn> :
38 type vCheckBox <inherit = vCustomBtn> :
39 type vRadioBtn <inherit = vCustomBtn> :
40
41 extern {
42 method vCustomBtn.iUpdateChecked
43 }
44
45
46 define <export>{
47 //Стили кнопки BtnStyle
48 bsClassic = 0
49 bsAsRadioBtn = 3
50 bsAsCheckBox = 4
51 }
52
53 /*------------------------------------------------------------------------------
54 Internal Methods
55 */
56
57
58 /*------------------------------------------------------------------------------
59 Properties
60 */
61 /* Свойство uint Checked - Get Set
62 Усотанавливает или определяет, находится ли кнопка в выбранном состоянии
63 Действует только для стилей кнопки $bsAsCheckBox или $bsAsRadioBtn
64 1 - кнопка выбрана
65 0 - кнопка не выбрана
66 */
67 property uint vCustomBtn.Checked()
68 {
69 return this.pChecked
70 }
71
72 property vCustomBtn.Checked( uint val)
73 {
74 if this.pChecked != val
75 {
76 this.pChecked = val
77 .iUpdateChecked()
78 }
79 }
80
81 /* Метод iUpdateChecked
82 Связывает состояние кнопки с визуальным отображением
83 */
84 method vCustomBtn.iUpdateChecked
85 {
86 if /*!.flgOwnerRedraw &&*/ ( this.pBtnStyle == $bsAsCheckBox ||
87 this.pBtnStyle == $bsAsRadioBtn ) /*&&
88 this.pChecked != (this.WinMsg( $BM_GETCHECK ) == $BST_CHECKED)*/
89 {
90 this.WinMsg( $BM_SETCHECK, .pChecked )
91 if .pBtnStyle == $bsAsRadioBtn && .pChecked
92 {
93 uint owner as this.Owner->vCtrl
94 uint i
95 if &owner
96 {
97 fornum i=0, owner.pCtrls
98 {
99 uint btn as owner.Comps[i]->vCustomBtn
100 if &btn != &this &&
101 btn.TypeIs( vCustomBtn ) &&
102 btn.pBtnStyle == $bsAsRadioBtn
103 {
104 btn.Checked = 0//( btn.WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
105 }
106 }
107 }
108 }
109 /*uint tabstop = GetFocus()
110 this.WinMsg( $BM_CLICK )
111 SetFocus( tabstop )*/
112 .Invalidate()
113 }
114 else
115 {
116 .Invalidate()
117 }
118 }
119
120 /* Свойство uint BtnStyle - Get Set
121 Усотанавливает или определяет стиль кнопки
122 Возможны следующие варианты:
123 bsClassic - обычный вид,
124 bsAsRadioBtn - работает как RadioBtn,
125 bsAsCheckBox - работает как CheckBox
126 */
127 property uint vCustomBtn.BtnStyle()
128 {
129 return this.pBtnStyle
130 }
131
132 property vCustomBtn.BtnStyle( uint val)
133 {
134 if this.pBtnStyle != val
135 {
136 this.pBtnStyle = val
137 .Virtual( $mReCreateWin )
138 //this.WinMsg( $BM_SETCHECK, 0 )
139 /*uint checked = this.Checked
140 uint remstyle = $BS_AUTORADIOBUTTON | $BS_AUTOCHECKBOX | $BS_PUSHLIKE
141 uint addstyle
142 this.WinMsg( $BM_SETCHECK, 0 )
143 this.pChecked = 0
144 if val == $bsAsRadioBtn
145 {
146 addstyle = $BS_AUTORADIOBUTTON | $BS_PUSHLIKE
147 }
148 elif val == $bsAsCheckBox
149 {
150 addstyle = $BS_AUTOCHECKBOX | $BS_PUSHLIKE
151 }
152 this.ChangeStyle( addstyle, remstyle )
153 this.pBtnStyle = val
154 .iUpdateChecked()*/
155 }
156 }
157
158 /* Свойство ustr Caption - Get Set
159 Устанавливает или определяет заголовок кнопки
160 */
161 property ustr vCustomBtn.Caption <result>
162 {
163 result = this.pCaption.Value
164 }
165
166 property vCustomBtn.Caption( ustr val )
167 {
168 if val != this.pCaption.Value
169 {
170 this.pCaption.Value = val
171 //.Virtual( $mUpdateCaption )
172 .Virtual( $mSetCaption, this.pCaption.Text( this ) )
173 }
174 }
175
176
177 /*------------------------------------------------------------------------------
178 Virtual Methods
179 */
180 /*Виртуальный метод vCustomBtn vCustomBtn.mCreateWin - Создание окна
181 */
182 method vCustomBtn vCustomBtn.mCreateWin <alias=vCustomBtn_mCreateWin>()
183 {
184 uint style = $WS_CHILD | $WS_CLIPSIBLINGS
185 if .pTabStop : style | $WS_TABSTOP//| $BS_BITMAP
186 if .flgOwnerRedraw
187 {
188 style |= $BS_OWNERDRAW
189 }
190 else
191 {
192 switch .pBtnStyle
193 {
194 case $bsAsRadioBtn : style |= $BS_AUTORADIOBUTTON | ?( .flgPushLike, $BS_PUSHLIKE, 0 )
195 case $bsAsCheckBox : style |= $BS_AUTOCHECKBOX | ?( .flgPushLike, $BS_PUSHLIKE, 0 )
196 }
197 }
198 this.CreateWin( "BUTTON".ustr(), 0, style )
199 //.WinMsg( $BM_SETIMAGE, $IMAGE_BITMAP, LoadBitmap( 0, 32754 ))
200 //.Virtual( $mUpdateCaption )
201 .Virtual( $mSetCaption, this.pCaption.Text( this ) )
202 .iUpdateChecked()
203
204 this->vCtrl.mCreateWin()
205
206 return this
207 }
208
209 /*Виртуальный метод uint vCustomBtn.mWinCmd - Обработка windows сообщения с командой
210 */
211 method uint vCustomBtn.mWinCmd <alias=vCustomBtn_mWinCmd>( uint ntfcmd, uint id )
212 {
213 //print( "click\n" )
214 /*if ntfcmd == $BN_CLICKED
215 {
216 if .pBtnStyle == $bsAsRadioBtn
217 {
218 uint owner as this.Owner->vCtrl
219 uint i
220 if &owner
221 {
222 fornum i=0, owner.pCtrls
223 {
224 uint btn as owner.Comps[i]->vCustomBtn
225 if btn.TypeIs( vCustomBtn ) && btn.pBtnStyle == $bsAsRadioBtn
226 {
227
228 btn.pChecked = ( btn.WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
229 }
230 }
231 }
232 }
233 elif .pBtnStyle == $bsAsCheckBox
234 {
235 .pChecked = ( .WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
236 }
237 evparEvent ev
238 ev.sender = &this
239 this.OnClick.run( ev )
240 }*/
241 if ntfcmd == $BN_CLICKED
242 {
243 if .pBtnStyle == $bsAsRadioBtn
244 {
245 .Checked = 1
246 /* uint owner as this.Owner->vCtrl
247 uint i
248 if &owner
249 {
250 fornum i=0, owner.pCtrls
251 {
252 uint btn as owner.Comps[i]->vCustomBtn
253 if &btn == &this
254 {
255 btn.Checked = 1
256 }
257 elif btn.TypeIs( vCustomBtn ) &&
258 btn.pBtnStyle == $bsAsRadioBtn
259 {
260 btn.Checked = 0//( btn.WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
261 }
262 }
263 }*/
264 }
265 elif .pBtnStyle == $bsAsCheckBox
266 {
267 .Checked = !.pChecked//( .WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
268 }
269 evparEvent ev
270 ev.sender = &this
271 this.OnClick.Run( ev, this )
272 }
273 return 0
274 }
275
276 /*Виртуальный метод uint vCustomBtn.mLangChanged - Изменение текущего языка
277 */
278 method vCustomBtn.mLangChanged <alias=vCustomBtn_mLangChanged>()
279 {
280 //.Virtual( $mUpdateCaption )
281 .Virtual( $mSetCaption, this.pCaption.Text( this ) )
282 this->vCtrl.mLangChanged()
283 }
284
285 /*Виртуальный метод vCustomBtn.mSetName - Установка заголовка в режиме проектирования
286 */
287 method uint vCustomBtn.mSetName <alias=vCustomBtn_mSetName>( str newname )
288 {
289 ifdef $DESIGNING {
290 if !.p_loading && .Caption == .Name
291 {
292 .Caption = newname.ustr()
293 }
294 }
295 return 1
296 }
297
298 /*Виртуальный метод vCustomBtn.mUpdateCaption - Обновить заголовок
299 */
300 /*method vCustomBtn.mUpdateCaption <alias=vCustomBtn_mUpdateCaption>()
301 {
302 SetWindowText( this.hwnd, this.pCaption.Text( this ).ptr() )
303 }*/
304
305 /*------------------------------------------------------------------------------
306 Registration
307 */
308 /*Системный метод vCustomBtn vCustomBtn.init - Инициализация объекта
309 */
310 method vCustomBtn vCustomBtn.init( )
311 {
312 this.pTypeId = vCustomBtn
313
314 this.pCanFocus = 1
315 this.pTabStop = 1
316 this.flgXPStyle = 1
317 this.loc.width = 100
318 this.loc.height = 25
319 return this
320 }
321
322 method vBtn vBtn.init( )
323 {
324 this.pTypeId = vBtn
325 this.flgPushLike = 1
326 return this
327 }
328
329 method vCheckBox vCheckBox.init( )
330 {
331 this.pTypeId = vCheckBox
332 this.pBtnStyle = $bsAsCheckBox
333 return this
334 }
335
336 method vRadioBtn vRadioBtn.init( )
337 {
338 this.pTypeId = vRadioBtn
339 this.pBtnStyle = $bsAsRadioBtn
340 return this
341 }
342
343
344 /*method uint vBtn.wmerasebkgnd <alias=vBtn_wmerasebkgnd>( winmsg wmsg )
345 {
346 //if this.Type == vBtn
347 {
348 //print( "erase 100000 \(this.Name)\n" )
349 // pDrawThemeParentBackground->stdcall( this.hwnd, wmsg.wpar, 0 );
350 wmsg.flags = 1
351 }
352 return 1
353 }*/
354
355 func init_vCustomBtn <entry>()
356 {
357 regcomp( vCustomBtn, "vCustomBtn", vCtrl, $vCtrl_last,
358 %{ %{$mCreateWin, vCustomBtn_mCreateWin},
359 %{$mWinCmd, vCustomBtn_mWinCmd},
360 %{$mLangChanged, vCustomBtn_mLangChanged },
361 %{$mSetName, vCustomBtn_mSetName}//,
362 //%{$mWinDrawItem, vCustomBtn_mWinDrawItem},
363 //%{$mUpdateCaption,vCustomBtn_mUpdateCaption}
364 },
365 0->collection )
366 //%{
367 // %{$WM_ERASEBKGND, vBtn_wmerasebkgnd } } )//,
368 //%{$WM_PAINT, vBtn_wmpaint } } )
369 //%{$WM_DRAWITEM , vBtn_wmpaint } } )
370
371 regcomp( vBtn, "vBtn", vCustomBtn, $vCtrl_last,
372 0->collection, 0->collection )
373
374 regcomp( vCheckBox, "vCheckBox", vCustomBtn, $vCtrl_last,
375 0->collection, 0->collection )
376
377 regcomp( vRadioBtn, "vRadioBtn", vCustomBtn, $vCtrl_last,
378 0->collection, 0->collection )
379
380 ifdef $DESIGNING {
381 cm.AddComp( vCustomBtn )
382
383 cm.AddProps( vCustomBtn, %{
384 //"TabOrder", uint, 0,
385 "Caption", ustr, 0,
386 "Checked", uint, 0
387 })
388
389 cm.AddEvents( vCustomBtn, %{
390 "OnClick" , "evparEvent"
391 })
392
393 cm.AddComp( vBtn, 1, "Windows", "btn" )
394
395 cm.AddProps( vBtn, %{
396 "BtnStyle", uint, 0
397 })
398
399 cm.AddPropVals( vBtn, "BtnStyle", %{
400 "bsClassic", $bsClassic,
401 "bsAsRadioBtn", $bsAsRadioBtn,
402 "bsAsCheckBox", $bsAsCheckBox
403 })
404
405 cm.AddComp( vCheckBox, 1, "Windows", "btn" )
406 cm.AddComp( vRadioBtn, 1, "Windows", "btn" )
407 }
408
409 }
410