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.toolbar 01.04.08 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 /* Компонента vToolBar, порождена от vCtrl
17 */
18 /*! В перспективе:
19 */
20 type vToolBar <inherit = vCtrl>
21 {
22 //Hidden Fields
23 ustr pImageList
24 uint ptrImageList
25 uint iNumIml
26 uint pShowCaption
27 uint pWrapable
28 uint pShowDivider
29 uint pAutoSize
30 uint pVertical
31 //Events
32
33 }
34
35 include {
36 "toolbaritem.g"
37 }
38
39 define <export>{
40 //ShowCaption values:
41 tscNone = 0 //Не показывать подписи к кнопкам
42 tscRight = 1 //Подписи справа
43 tscBottom = 2 //Подписи снизу
44 tscMixed = 3 //Подписи справа выборочно
45 //tscAsHint = 3 //Не показывать подписи но использовать их как подсказки
46 }
47
48 /*------------------------------------------------------------------------------
49 Internal Methods
50 */
51 /*Метод vToolBar.iUpdateImageList()
52 Обновить ImageList
53 */
54 method vToolBar.iUpdateImageList()
55 {
56 .ptrImageList = &.GetImageList( .pImageList, &.iNumIml )
57 if .ptrImageList
58 {
59 .WinMsg( $TB_SETIMAGELIST, 0, .ptrImageList->ImageList.arrIml[.iNumIml].hIml )
60 }
61 else
62 {
63 .WinMsg( $TB_SETIMAGELIST, 0, 0 )
64 }
65 .Invalidate()
66 }
67
68 /*Метод vToolBar.iUpdateSize()
69 Пересчитать размеры левого и правого объекта
70 */
71 /*method vToolBar.iUpdateSize()
72 {
73 uint width = ?( .pOrientation == $soVertical, this.Width, this.Height ) -
74 .pToolBarWidth
75
76 .pDistance = width - max( int( width - .pDistance ), int( .pRightMinSize ) )
77 .pDistance = max( int( .pDistance ), int( .pLeftMinSize ) )
78 .pDistance = min( width, int( .pDistance ))
79
80 if *.Comps && .Comps[0]->vComp.TypeIs( vCtrl )
81 {
82 uint left as .Comps[0]->vCtrl
83 left.HorzAlign = $alhLeft
84 left.VertAlign = $alvTop
85 left.flgNoPosChanging = 0
86 left.Left = 0
87 left.Top = 0
88 if .pOrientation == $soVertical
89 {
90 left.Height = this.Height
91 left.Width = .pDistance
92 }
93 else
94 {
95 left.Height = .pDistance
96 left.Width = .Width
97 }
98 left.flgNoPosChanging = 1
99 }
100 if *.Comps > 1 && .Comps[1]->vComp.TypeIs( vCtrl )
101 {
102 uint right as .Comps[1]->vCtrl
103 right.HorzAlign = $alhLeft
104 right.VertAlign = $alvTop
105 right.flgNoPosChanging = 0
106
107 if .pOrientation == $soVertical
108 {
109 right.Top = 0
110 right.Left = .pDistance + .pToolBarWidth
111 right.Height = this.Height
112 right.Width = .Width - .pDistance - .pToolBarWidth
113 }
114 else
115 {
116 right.Top = .pDistance + .pToolBarWidth
117 right.Left = 0
118 right.Width = this.Width
119 right.Height = .Height - .pDistance - .pToolBarWidth
120 }
121 right.flgNoPosChanging = 1
122 }
123 }*/
124
125 /*------------------------------------------------------------------------------
126 Properties
127 */
128 /* Свойство str vToolBar.ImageList - Get Set
129 Устанавливает или получает имя списка картинок
130 */
131 property ustr vToolBar.ImageList <result>
132 {
133 result = this.pImageList
134 }
135
136 property vToolBar.ImageList( ustr val )
137 {
138 if val != this.pImageList
139 {
140 this.pImageList = val
141 .Virtual( $mLangChanged )
142 //.iUpdateImageList()
143 }
144 }
145
146 /* Свойство str vToolBar.ShowCaption - Get Set
147 Режим отображения заголовков
148 */
149 property uint vToolBar.ShowCaption
150 {
151 return this.pShowCaption
152 }
153
154 property vToolBar.ShowCaption( uint val )
155 {
156 if val != this.pShowCaption
157 {
158 this.pShowCaption = val
159 .Virtual( $mReCreateWin )
160 /* uint style = .WinMsg( $TB_GETSTYLE )
161 style &= ~( $TBSTYLE_LIST | $TBSTYLE_TRANSPARENT )
162 switch val
163 {
164 case $tscRight: style |= $TBSTYLE_LIST
165 case $tscBottom: style |= $TBSTYLE_TRANSPARENT
166 }
167 .WinMsg( $TB_SETSTYLE, 0, style )
168 */
169 }
170 }
171
172 /* Свойство str vToolBar.Wrapable - Get Set
173 Режим отображения заголовков
174 */
175 property uint vToolBar.Wrapable
176 {
177 return this.pWrapable
178 }
179
180 property vToolBar.Wrapable( uint val )
181 {
182 if val != this.pWrapable
183 {
184 this.pWrapable = val
185 .Virtual( $mReCreateWin )
186 }
187 }
188
189
190 /* Свойство str vToolBar.ShowDivider - Get Set
191 Режим отображения заголовков
192 */
193 property uint vToolBar.ShowDivider
194 {
195 return this.pShowDivider
196 }
197
198 property vToolBar.ShowDivider( uint val )
199 {
200 if val != this.pShowDivider
201 {
202 this.pShowDivider = val
203 .Virtual( $mReCreateWin )
204 }
205 }
206
207 /* Свойство str vToolBar.AutoSize - Get Set
208 Режим отображения заголовков
209 */
210 property uint vToolBar.AutoSize
211 {
212 return this.pAutoSize
213 }
214
215 property vToolBar.AutoSize( uint val )
216 {
217 if val != this.pAutoSize
218 {
219 this.pAutoSize = val
220 .Virtual( $mReCreateWin )
221 }
222 }
223
224 /* Свойство str vToolBar.ButtonWidth - Get Set
225 Режим отображения заголовков
226 */
227 /*property uint vToolBar.AutoSize
228 {
229 return this.pAutoSize
230 }
231
232 property vToolBar.AutoSize( uint val )
233 {
234 if val != this.pAutoSize
235 {
236 this.pAutoSize = val
237 .Virtual( $mReCreateWin )
238 }
239 }*/
240
241 /* Свойство str vToolBar.Vertical - Get Set
242 Вертикальный режим, все кнопки вытягиваются на ширину
243 */
244 property uint vToolBar.Vertical
245 {
246 return this.pVertical
247 }
248
249 property vToolBar.Vertical( uint val )
250 {
251 if val != this.pVertical
252 {
253 this.pVertical = val
254 .Virtual( $mReCreateWin )
255 }
256 }
257
258 /*------------------------------------------------------------------------------
259 Virtual Methods
260 */
261 /*Виртуальный метод vToolBar vToolBar.mCreateWin
262 Создание окна
263 */
264 method vToolBar.AddButton( vToolBarItem newcomp, uint idx )
265 {
266 TBBUTTON tb
267 tb.iBitmap = -1
268 tb.fsStyle = $TBSTYLE_BUTTON
269 tb.fsState = 4
270 tb.dwData = &newcomp
271 tb.idCommand = idx//&newcomp
272 //if newcomp.pStyle == $tbsSeparator : tb.idCommand = -1
273 if .pShowCaption == $tscRight ||
274 .pShowCaption == $tscBottom : tb.iString = "".ustr().ptr()
275 .WinMsg( $TB_INSERTBUTTON, idx, &tb )
276 }
277
278
279 method vToolBar vToolBar.mCreateWin <alias=vToolBar_mCreateWin>()
280 {
281 //.Visible = 0
282 uint style = $WS_CHILD | $WS_CLIPCHILDREN |
283 /*$WS_CLIPSIBLINGS |*/ $CCS_NOPARENTALIGN | $TBSTYLE_FLAT |
284 $WS_OVERLAPPED | $CCS_NOMOVEY
285 uint exstyle = $TBSTYLE_EX_DRAWDDARROWS
286 //if !.p_designing : style |=
287 if .pWrapable : style |= $TBSTYLE_WRAPABLE
288 switch .pShowCaption
289 {
290 case $tscRight: style |= $TBSTYLE_LIST
291 case $tscBottom: style |= $TBSTYLE_TRANSPARENT
292 case $tscMixed
293 {
294 style |= $TBSTYLE_LIST
295 exstyle |= $TBSTYLE_EX_MIXEDBUTTONS
296 }
297 }
298 if !.pShowDivider : style |= $CCS_NODIVIDER
299 if !.pAutoSize : style |= $CCS_NORESIZE
300
301 .CreateWin( "ToolbarWindow32".ustr(), 0, style )
302 this->vCtrl.mCreateWin()
303 .WinMsg( $TB_BUTTONSTRUCTSIZE, sizeof( TBBUTTON ) )
304 .WinMsg( $TB_SETEXTENDEDSTYLE, 0, exstyle )
305 .WinMsg( $TB_SETTOOLTIPS, this.GetForm()->vForm.hwndTip )
306 .WinMsg( $TB_SETINDENT, 2 )
307
308 /*SetWindowPos( .hwnd, 0, 0, 0, .Width, .Height-1, $SWP_NOACTIVATE | $SWP_NOMOVE |
309 $SWP_NOZORDER)*/
310 /*SetWindowPos( .hwnd, 0, 0, 0, .Width, .Height, $SWP_NOACTIVATE | $SWP_NOMOVE |
311 $SWP_NOZORDER)*/
312 //.WinMsg( $TB_SETMAXTEXTROWS, 1 )
313 //.WinMsg( $TB_SETBUTTONWIDTH, 0,0x400040 )
314 //.WinMsg( $TB_SETBUTTONSIZE, 0, 0x100010 )
315 //.Visible = 1
316 uint i
317 .Virtual( $mLangChanged )
318 if .pVertical
319 {
320 .WinMsg( $TB_SETINDENT, 0 )
321 }
322
323 fornum i = 0, .pCtrls
324 {
325 .AddButton( .Comps[i]->vToolBarItem, i )
326 .Comps[i]->vToolBarItem.iUpdate()
327 }
328 return this
329 }
330
331 /*Виртуальный метод vToolBar.mInsert
332 Вставка дочерних элементов
333 */
334
335
336 method vToolBar.mInsert <alias=vToolBar_mInsert>( vComp newcomp )
337 {
338 if newcomp.TypeIs( vToolBarItem )
339 {
340 this->vCtrl.mInsert( newcomp )
341 .AddButton( newcomp->vToolBarItem, *.Comps - 1 )
342
343 // print( "insert \( &newcomp )\n" )
344 }
345 }
346
347 method vToolBar.mReCreateWin <alias=vToolBar_mReCreateWin> ()
348 {
349 uint i
350 this->vCtrl.mReCreateWin()
351
352
353 //.iUpdateImageList()
354 }
355
356 /*Виртуальный метод vToolBar.mRemove
357 Удаление дочерних элементов
358 */
359 method vToolBar.mRemove <alias=vToolBar_mRemove>( vComp item )
360 {
361 if item.TypeIs( vToolBarItem )
362 {
363 //print( "remove\n" )
364 .WinMsg( $TB_DELETEBUTTON, .WinMsg( $TB_COMMANDTOINDEX, item->vVirtCtrl.pIndex ))//cidx ) )
365 }
366 this->vCtrl.mRemove( item )
367 }
368
369
370 type NMCUSTOMDRAWINFO {
371 NMHDR hdr;
372 uint dwDrawStage;
373 uint hdc;
374 RECT rc;
375 uint dwItemSpec;
376 uint uItemState;
377 uint lItemlParam;
378 }
379
380 /*Виртуальный метод vToolBar.mWinNtf
381 Обработка сообщения WM_COMMAND
382 */
383 method uint vToolBar.mWinCmd <alias=vToolBar_mWinCmd>( uint ntfcmd, uint id )
384 {
385 if id < *.Comps
386 {
387 uint item as .Comps[id]->vToolBarItem
388 if item.pTBIStyle == $tbsAsRadioBtn
389 {
390 item.Checked = 1
391 }
392 elif item.pTBIStyle == $tbsAsCheckBox
393 {
394 item.Checked = !item.pChecked//( .WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
395 }
396 evparEvent ev
397 ev.sender = &item
398 item.OnClick.Run( ev )
399 }
400 return 0
401 }
402
403 /*Виртуальный метод vToolBar.mWinNtf
404 Обработка сообщения WM_NOTIFY
405 */
406 method uint vToolBar.mWinNtf <alias=vToolBar_mWinNtf >( winmsg wmsg )//NMHDR ntf )
407 {
408 uint ntf as wmsg.lpar->NMHDR
409 switch ntf.code
410 {
411 case $NM_CLICK
412 {
413 /*uint ntftb = &ntf
414 ntftb as NMTOOLBAR
415 if ntftb.iItem && ntftb.iItem !=-1
416 {
417 if ntftb.iItem->vToolBarItem.pTBIStyle == $tbsAsRadioBtn
418 {
419 ntftb.iItem->vToolBarItem.Checked = 1
420
421 }
422 elif ntftb.iItem->vToolBarItem.pTBIStyle == $tbsAsCheckBox
423 {
424 ntftb.iItem->vToolBarItem.Checked = !ntftb.iItem->vToolBarItem.pChecked//( .WinMsg( $BM_GETCHECK ) == $BST_CHECKED )
425 }
426 //print( "Click \(ntf.idFrom) \(ntf.code) \(ntftb.iItem)\n" )
427 evparEvent ev
428 ev.sender = ntftb.iItem
429 ntftb.iItem->vToolBarItem.OnClick.Run( ev )
430 }*/
431 }
432 case $TBN_DROPDOWN
433 {
434 ntf as NMTOOLBAR
435 //uint ntftb as (&ntf)->NMTOOLBAR
436 //ntftb as NMTOOLBAR
437 uint item as .Comps[ntf.iItem]->vToolBarItem
438 //if //ntftb.iItem && ntftb.iItem !=-1
439 {
440 if /*ntftb.iItem->vToolBarItem*/item.pDropDownMenu
441 {
442 POINT pnt
443 pnt.x = item.Left//ntftb.iItem->vToolBarItem.Left
444 pnt.y = item.Top + item.Height//ntftb.iItem->vToolBarItem.Top + ntftb.iItem->vToolBarItem.Height
445 ClientToScreen( this.hwnd, pnt )
446 /*ntftb.iItem->vToolBarItem*/item.DropDownMenu.Show( pnt.x, pnt.y )
447 }
448 }
449 }
450 case $NM_CUSTOMDRAW
451 {
452 if !isThemed
453 {
454 //uint ntftb = &ntf
455 ntf as NMCUSTOMDRAWINFO
456 FillRect( ntf.hdc, ntf.rc, GetSysColorBrush($COLOR_BTNFACE) )
457 }
458 }
459 }
460 return 0
461 }
462
463
464 /*Виртуальный метод vToolBar.mLangChanged - Изменение текущего языка
465 */
466 method vToolBar.mLangChanged <alias=vToolBar_mLangChanged>()
467 {
468 .iUpdateImageList()
469 this->vCtrl.mLangChanged()
470 }
471
472 method vToolBar.mGetHint <alias=vToolBar_mGetHint>( uint id, uint lpar, ustr resstr )
473 {
474 uint item as this.Comps[id]->vToolBarItem//id->vToolBarItem
475 if !*item.pHint.Text( this ) //.pShowCaption == $tscAsHint &&
476 {
477 resstr = item.pCaption.Text( this )
478 }
479 else :resstr = item.pHint.Text( this )
480 }
481
482 /*Виртуальный метод vToolBar.mPosChanged - Изменились размеры
483 */
484 method vToolBar.mPosChanged <alias=vToolBar_mPosChanged>(evparEvent ev)
485 {
486 this->vCtrl.mPosChanged(ev)
487 if .pVertical
488 {
489 .WinMsg( $TB_SETBUTTONWIDTH, 0, (.clloc.width - 2 ) << 16 | .clloc.width - 2 )
490 .WinMsg( $TB_AUTOSIZE )
491 }
492 }
493
494 /*Виртуальный метод vToolBar.mPosChanging
495 Изменение размеров
496 */
497 /*method vToolBar.mPosChanging <alias=vToolBar_mPosChanging>( eventpos evp )
498 {
499 this->vCtrl.mPosChanging( evp )
500 switch .pFixedPart
501 {
502 case $sfpRight
503 {
504 .pDistance += evp.loc.width - .Width
505 }
506 case $sfpNone
507 {
508 .pDistance = uint( .pProportion * double( evp.loc.width ) )
509 }
510 }
511 .iUpdateSize()
512 }
513 */
514 /*Виртуальный метод vToolBar.mMouse
515 Сообщения от мышки
516 */
517 /*method uint vToolBar.mMouse <alias=vToolBar_mMouse> ( evparMouse ev )
518 {
519 switch ev.evmtype
520 {
521 case $evmMove
522 {
523 if .fDrag
524 {
525 .Distance = ?( .pOrientation == $soVertical, ev.x, ev.y )
526 }
527 }
528 case $evmLDown
529 {
530 if !.fDrag
531 {
532 .fDrag = 1
533 SetCapture( .hwnd )
534 }
535 }
536 case $evmLUp
537 {
538 if .fDrag : ReleaseCapture()
539 }
540 }
541
542 if .pOrientation == $soVertical
543 {
544 if ev.x > .pDistance && ev.x <= .pDistance + .pToolBarWidth
545 {
546 SetCursor( App.cursorSizeWE )
547 }
548 }
549 else
550 {
551 if ev.y > .pDistance && ev.y <= .pDistance + .pToolBarWidth
552 {
553 SetCursor( App.cursorSizeNS )
554 }
555 }
556 return this->vCtrl.mMouse( ev )
557 }
558 */
559
560 /*------------------------------------------------------------------------------
561 Windows messages
562 */
563
564 /*------------------------------------------------------------------------------
565 Registration
566 */
567 /*Системный метод vToolBar vToolBar.init
568 Инициализация объекта
569 */
570 method vToolBar vToolBar.init( )
571 {
572 this.pTypeId = vToolBar
573 this.pCanContain = 1
574 this.loc.width = 200
575 this.loc.height = 100
576 return this
577 }
578
579 method vToolBarItem vToolBarItem.init( )
580 {
581 this.pTypeId = vToolBarItem
582 this.loc.left = 0
583 this.loc.top = 0
584 this.loc.width = 100
585 this.loc.height = 100
586 this.pImageIndex = -1
587 return this
588 }
589
590 //Функция регистрации
591 func init_vToolBar <entry>()
592 {
593 regcomp( vToolBar, "vToolBar", vCtrl, $vCtrl_last,
594 %{ %{$mCreateWin, vToolBar_mCreateWin},
595 %{$mReCreateWin,vToolBar_mReCreateWin},
596 %{$mInsert, vToolBar_mInsert },
597 %{$mRemove, vToolBar_mRemove },
598 %{$mLangChanged,vToolBar_mLangChanged},
599 %{$mWinNtf, vToolBar_mWinNtf },
600 %{$mGetHint, vToolBar_mGetHint },
601 %{$mWinCmd, vToolBar_mWinCmd },
602 %{$mPosChanged, vToolBar_mPosChanged }
603 },
604 0->collection
605 /*%{ %{$WM_CAPTURECHANGED, vToolBar_wmcapturechanged }
606 }*/)
607
608 regcomp( vToolBarItem, "vToolBarItem", vVirtCtrl, $vVirtCtrl_last,
609 %{ %{$mCreateWin, vToolBarItem_mCreateWin},
610 %{$mPosUpdate, vToolBarItem_mPosUpdate},
611 %{$mSetVisible, vToolBarItem_mSetVisible},
612 %{$mSetEnabled, vToolBarItem_mSetEnabled},
613 %{$mLangChanged,vToolBarItem_mLangChanged},
614 %{$mSetName, vToolBarItem_mSetName},
615 %{$mSetIndex, vToolBarItem_mSetIndex}
616 },
617 //0->collection,
618 0->collection
619 /*%{ %{$WM_CAPTURECHANGED, vToolBar_wmcapturechanged }
620 }*/)
621
622 ifdef $DESIGNING {
623 cm.AddComp( vToolBar, 1, "Windows", "toolbar" )
624 cm.AddProps( vToolBar, %{
625 "ImageList", ustr, 0,
626 "ShowCaption", uint, 0,
627 "Wrapable", uint, 0,
628 "ShowDivider", uint, 0,
629 "AutoSize", uint, 0,
630 "Vertical", uint, 0
631 })
632
633 cm.AddPropVals( vToolBar, "ShowCaption", %{
634 "tscNone", $tscNone,
635 "tscRight", $tscRight,
636 "tscBottom",$tscBottom,
637 "tscMixed", $tscMixed/*,
638 "tscAsHint",$tscAsHint*/
639 })
640
641 cm.AddComp( vToolBarItem )
642 cm.AddProps( vToolBarItem, %{
643 "TBIStyle", uint, 0,
644 "Caption", ustr, 0,
645 "Checked", uint, 0,
646 "ImageId", ustr, 0,
647 "DropDownMenu", vPopupMenu, $PROP_LOADAFTERCREATE,
648 "ShowCaption", uint, 0,
649 "Index", uint, 0
650 })
651
652 cm.AddPropVals( vToolBarItem, "TBIStyle", %{
653 "tbsButton", $tbsButton,
654 "tbsSeparator", $tbsSeparator,
655 "tbsDropDown", $tbsDropDown,
656 "tbsAsCheckBox", $tbsAsCheckBox,
657 "tbsAsRadioBtn", $tbsAsRadioBtn
658 })
659
660 cm.AddEvents( vToolBarItem, %{
661 "OnClick" , "evparEvent"
662 })
663 }
664
665 }
666