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.btnpic 07.02.07 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 include {
17 "btn.g"
18 "ctrlci.g"
19 }
20 /* Компонента vBtnPic, порождена от vBtn
21 События
22 */
23 type vBtnPic <inherit = vBtn>
24 {
25 //Hidden Fields
26 ustr pImage
27 uint pFlat
28 PicText pPicText
29 uint flgEnter
30 uint flgDown
31 uint pNoFocus
32 //Events
33 }
34
35
36 //Устаревшее
37 define <export>{
38 //Расположение картинки и текста
39 bplPicLeft = 0
40 bplPicTop = 1
41 }
42
43 /*------------------------------------------------------------------------------
44 Internal Methods
45 */
46
47
48 method vBtnPic.iUpdateImage()
49 {
50 .pPicText.PtrImage = &this.GetImage( .pImage )
51 }
52
53 /*------------------------------------------------------------------------------
54 Properties
55 */
56 /* Свойство ustr vBtnPic.Image - Get Set
57 Устанавливает или получает картинку
58 */
59 property ustr vBtnPic.Image <result>
60 {
61 result = this.pImage
62 }
63
64 property vBtnPic.Image( ustr val )
65 {
66 if val != this.pImage
67 {
68 this.pImage = val
69 .iUpdateImage()
70 }
71 }
72
73 /* Свойство str vBtnPic.Layout - Get Set
74 Усотанавливает или получает взаимное расположение картинки текста
75 */
76 property uint vBtnPic.Layout
77 {
78 return .pPicText.Layout
79 }
80
81 property vBtnPic.Layout( uint val )
82 {
83 .pPicText.Layout = val
84 }
85
86 /* Свойство str vPicture.Flat - Get Set
87 Всплывающая кнопка как в toolbar
88 */
89 property uint vBtnPic.Flat
90 {
91 return this.pFlat
92 }
93
94 property vBtnPic.Flat( uint val )
95 {
96 if val != this.pFlat
97 {
98 this.pFlat = val
99 .Invalidate()
100 }
101 }
102
103 /* Свойство str vBtnPic.ContHorzAlign - Get Set
104 Устанавливает или получает расположение содежимого по горизонтали
105 */
106 property uint vBtnPic.ContHorzAlign
107 {
108 return .pPicText.ContHorzAlign
109 }
110
111 property vBtnPic.ContHorzAlign( uint val )
112 {
113 .pPicText.ContHorzAlign = val
114 }
115
116 /* Свойство uint vBtnPic.ContVertAlign - Get Set
117 Устанавливает или получает расположение содежимого по вертикали
118 */
119 property uint vBtnPic.ContVertAlign
120 {
121 return .pPicText.ContVertAlign
122 }
123
124 property vBtnPic.ContVertAlign( uint val )
125 {
126 .pPicText.ContVertAlign = val
127 }
128
129 /* Свойство uin vBtnPic.NoFocus - Get Set
130 Устанавливает или получает режим без фокуса ввода
131 */
132 property uint vBtnPic.NoFocus
133 {
134 return .pNoFocus
135 }
136
137 property vBtnPic.NoFocus( uint val )
138 {
139 if .pNoFocus != val
140 {
141 .pNoFocus = val
142 if val : .TabStop = 0
143 .Invalidate()
144 }
145 }
146
147 /*------------------------------------------------------------------------------
148 Registration
149 */
150 /*Системный метод vBtnPic vBtnPic.init - Инициализация объекта
151 */
152 method vBtnPic vBtnPic.init( )
153 {
154 this.pTypeId = vBtnPic
155
156 this.pCanFocus = 1
157 this.pTabStop = 1
158 this.loc.width = 100
159 this.loc.height = 25
160 this.flgOwnerRedraw = 1
161
162 this.pPicText.Ctrl = this
163 return this
164 }
165 define {
166 BSTATE_NORMAL = $TS_NORMAL
167 BSTATE_PRESSED = $TS_PRESSED
168 BSTATE_CHECKED = $TS_CHECKED
169 BSTATE_HOT = $TS_HOT
170 BSTATE_HOTCHECKED = $TS_HOTCHECKED
171 BSTATE_DISABLED = $TS_DISABLED
172 }
173
174 //method uint vBtn.wmpaint <alias=vBtn_wmpaint>( winmsg wmsg )
175 method vBtnPic.mWinDrawItem <alias=vBtnPic_mWinDrawItem>( DRAWITEMSTRUCT ds )
176 {
177 uint off
178 if ds.itemState & $ODS_SELECTED : off = 1
179
180 uint state
181 if .pEnabled
182 {
183 if ds.itemState & $ODS_SELECTED || ( .flgDown && .flgEnter )
184 {
185 state = $BSTATE_PRESSED
186 }
187 else
188 {
189 if .pChecked && ( this.pBtnStyle == $bsAsCheckBox ||
190 this.pBtnStyle == $bsAsRadioBtn )
191 {
192 if .flgEnter : state = $BSTATE_HOTCHECKED
193 else : state = $BSTATE_CHECKED
194 }
195 else
196 {
197 if .flgEnter : state = $BSTATE_HOT
198 else : state = $BSTATE_NORMAL
199 }
200
201 }
202 }
203 else
204 {
205 state = $PBS_DISABLED
206 }
207 if isThemed
208 {
209 if !.pFlat
210 {
211 if state == $BSTATE_CHECKED : state = $PBS_PRESSED
212 elif state == $BSTATE_HOTCHECKED : state = $PBS_HOT
213 }
214 ifdef $DESIGNING {
215 if .p_designing && .pFlat && state == $BSTATE_NORMAL : state = $TS_HOT
216 }
217 pDrawThemeParentBackground->stdcall( this.hwnd, ds.hDC, 0 );
218 pDrawThemeBackground->stdcall(
219 ThemeData[?( .pFlat, $theme_toolbar, $theme_button )],
220 ds.hDC, $BP_PUSHBUTTON, state, ds.rcItem, 0 )
221 }
222 else
223 {
224
225 if .pFlat
226 {
227 FillRect( ds.hDC, ds.rcItem, ?( state == $BSTATE_CHECKED,
228 $COLOR_BTNHIGHLIGHT, $COLOR_BTNFACE) + 1 )
229 if state == $BSTATE_CHECKED || state == $BSTATE_HOTCHECKED ||
230 state == $BSTATE_PRESSED
231 {
232 state = 2
233 }
234 elif state == $BSTATE_HOT : state = 4
235 else
236 {
237 state = 0
238 ifdef $DESIGNING {
239 if .p_designing: state = 4
240 }
241
242 }
243
244 if state
245 {
246 DrawEdge( ds.hDC, ds.rcItem, state, 0xf )
247 }
248 }
249 else
250 {
251 if state == $BSTATE_CHECKED || state == $BSTATE_HOTCHECKED
252 {
253 state = 0x410
254 }
255 elif state == $BSTATE_PRESSED
256 {
257 state = 0x210
258 }
259 else : state = 0x010
260 DrawFrameControl( ds.hDC, ds.rcItem, 4, state )
261 }
262 }
263 RECT r
264 .pPicText.Draw( ds.hDC, off, off )
265
266 if GetFocus() == this.hwnd
267 {
268 r.left = 3
269 r.top = 3
270 r.right = .clloc.width - 3
271 r.bottom = .clloc.height - 3
272 DrawFocusRect( ds.hDC, r )
273 }
274 //wmsg.flags = 1
275 return
276 }
277
278 /*Виртуальный метод vBtnPic.mSetCaption - Обновить заголовок
279 */
280 method vBtnPic.mSetCaption <alias=vBtnPic_mSetCaption>( ustr caption )
281 {
282 this->vBtn.mSetCaption( caption )
283 .pPicText.LangCaption = this.pCaption.Text( this )
284 }
285
286 /*Виртуальный метод vBtnPic.mPosChanged - Изменились размеры
287 */
288 method vBtnPic.mPosChanged <alias=vBtnPic_mPosChanged>(evparEvent ev)
289 {
290 this->vCtrl.mPosChanged(ev)
291 .pPicText.Width = .clloc.width
292 .pPicText.Height = .clloc.height
293 }
294
295 /*Виртуальный метод vURL.mMouse - События от мыши
296 */
297 method uint vBtnPic.mMouse <alias=vBtnPic_mMouse>( evparMouse em )
298 {
299 switch em.evmtype
300 {
301 case $evmLDown
302 {
303 if .pNoFocus
304 {
305 SetCapture(.hwnd)
306 .flgDown = 1
307 .Invalidate()
308 return 1
309 }
310 }
311 case $evmLUp
312 {
313 if .pNoFocus
314 {
315 ReleaseCapture()
316 if .flgDown
317 {
318 .flgDown = 0
319 .Invalidate()
320 if .flgEnter
321 {
322 .Owner->vCtrl.WinMsg( $WM_COMMAND, $BN_CLICKED << 16, .hwnd )
323 }
324 }
325 return 1
326 }
327 }
328 case $evmMove
329 {
330 if .pNoFocus && .flgDown
331 {
332 POINT pnt
333 GetCursorPos( pnt )
334 if WindowFromPoint( pnt.x, pnt.y ) != .hwnd
335 {
336 if .flgEnter
337 {
338 .flgEnter = 0
339 .Invalidate()
340 }
341 }
342 elif !.flgEnter
343 {
344 .flgEnter = 1
345 .Invalidate()
346 }
347 }
348 elif !.flgEnter
349 {
350 .flgEnter = 1
351 TRACKMOUSEEVENT tm
352
353 tm.cbSize = sizeof( TRACKMOUSEEVENT )
354 tm.dwFlags = $TME_LEAVE
355 tm.hwndTrack = .hwnd
356 tm.dwHoverTime = 40
357 TrackMouseEvent(tm)
358 .Invalidate()
359 }
360 }
361 case $evmLeave
362 {
363 .flgEnter = 0
364 .Invalidate()
365 }
366 /*case $evmActivate
367 {
368 print( "NOACT 1\n" )
369 em.ret = 3//$MA_NOACTIVATE
370 return 1
371 }*/
372 }
373 return 0
374 }
375
376 /*Виртуальный метод uint vBtnPic.mWinCmd - Обработка windows сообщения с командой
377 */
378 method uint vBtnPic.mWinCmd <alias=vBtnPic_mWinCmd>( uint ntfcmd, uint id )
379 {
380 if ntfcmd == $BN_CLICKED
381 {
382 if .pBtnStyle == $bsAsRadioBtn
383 {
384 uint owner as this.Owner->vCtrl
385 uint i
386 if &owner
387 {
388 fornum i=0, owner.pCtrls
389 {
390 uint btn as owner.Comps[i]->vCustomBtn
391 if &btn == &this
392 {
393 btn.Checked = 1
394 }
395 elif btn.TypeIs( vCustomBtn ) &&
396 btn.pBtnStyle == $bsAsRadioBtn
397 {
398 btn.Checked = 0
399 }
400 }
401 }
402 }
403 elif .pBtnStyle == $bsAsCheckBox
404 {
405 .Checked = !.pChecked
406 }
407 evparEvent ev
408 ev.sender = &this
409 this.OnClick.Run( ev, this )
410 }
411 return 0
412 }
413
414 /*Виртуальный метод uint vCustomBtn.mLangChanged - Изменение текущего языка
415 */
416 method vBtnPic.mLangChanged <alias=vBtnPic_mLangChanged>()
417 {
418 this->vBtn.mLangChanged()
419 .iUpdateImage()
420 }
421
422 /*Виртуальный метод vBtnPic.mFontChanged - Изменился шрифт
423 */
424 method vBtnPic.mFontChanged <alias=vBtnPic_mFontChanged>()
425 {
426 this->vCtrl.mFontChanged()
427 .pPicText.FontChanged()
428 }
429
430 /*Виртуальный метод vBtnPic.mFocus - Установка фокуса
431 */
432 /*method uint vBtnPic.mFocus <alias=vBtnPic_mFocus>( evparValUint eu )
433 {
434 this->vCtrl.mFocus( eu )
435 return 1
436 }
437 */
438 func init_vBtnPic <entry>()
439 {
440 regcomp( vBtnPic, "vBtnPic", vBtn, $vCtrl_last,
441 %{ //%{$mCreateWin, vBtnPic_mCreateWin},
442 %{$mPosChanged, vBtnPic_mPosChanged },
443 %{$mSetCaption, vBtnPic_mSetCaption},
444 %{$mWinDrawItem, vBtnPic_mWinDrawItem},
445 %{$mLangChanged, vBtnPic_mLangChanged},
446 %{$mMouse, vBtnPic_mMouse},
447 %{$mFontChanged, vBtnPic_mFontChanged }/*,
448 %{$mFocus, vBtnPic_mFocus}*/
449 },
450 0->collection )
451
452
453 ifdef $DESIGNING {
454 cm.AddComp( vBtnPic, 1, "Additional", "btnpic" )
455
456 cm.AddProps( vBtnPic, %{
457 "Image" , ustr, 0,
458 "Layout" , uint, 0,
459 "Flat" , uint, 0,
460 "ContVertAlign", uint, 0,
461 "ContHorzAlign", uint, 0,
462 "TabStop", uint, 0,
463 "NoFocus", uint, 0
464 })
465
466 cm.AddPropVals( vBtnPic, "Layout", %{
467 "lPicLeft", $lPicLeft,
468 "lPicTop", $lPicTop
469 })
470
471 cm.AddPropVals( vBtnPic, "ContHorzAlign", %{
472 "ptLeft", $ptLeft,
473 "ptCenter", $ptCenter,
474 "ptRight", $ptRight
475 })
476
477 cm.AddPropVals( vBtnPic, "ContVertAlign", %{
478 "ptTop", $ptTop,
479 "ptVertCenter", $ptVertCenter,
480 "ptBottom", $ptBottom
481 })
482
483
484 }
485
486 }
487