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.form 15.10.07 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15 /* Компонента vScrollBox, порождена от vCtrl
16 События
17
18 */
19
20
21 include {
22 "panel.g"
23 }
24
25 type vScrollBox <inherit = vCtrl>
26 {
27 uint pBorder
28 uint pAutoScroll
29 uint flgScrolling
30 //uint ptest
31 uint pHorzRange
32 uint pVertRange
33 //vPanel panel
34 // onevent onScrolled
35 evQuery OnBeforeScroll
36 evEvent OnAfterScroll
37 }
38
39 extern {
40 method vScrollBox.mChildPosChanged ( evparEvent ev )
41 method vScrollBox.UpdateScroll()
42 }
43
44 /* Свойство str vPanel.AutoScroll - Get Set
45 Усотанавливает или получает заколовок панели
46 */
47 /*property uint vScrollBox.test
48 {
49 return this.ptest
50 }
51
52 property vScrollBox.test( uint val )
53 {
54 if this.ptest != val
55 {
56 this.ptest = val
57 SCROLLINFO si
58 si.fMask = $SIF_POS
59 si.nPos = val
60 SetScrollInfo( .hwnd, $SB_HORZ, si, 1 )
61 .UpdateScroll()
62 }
63 }
64 */
65
66 method vScrollBox.iSetRange()
67 {
68 SCROLLINFO si
69 si.cbSize = sizeof(SCROLLINFO)
70 si.fMask = $SIF_RANGE | $SIF_PAGE
71 si.nMin = 0
72 si.nMax = ?( .pHorzRange, .pHorzRange, 1 )
73 si.nPage = this.clloc.width + 1
74 SetScrollInfo( .hwnd, $SB_HORZ, si, 0 )
75 //SetScrollRange( .hwnd, $SB_HORZ, 0, .pHorzRange, 1 )
76
77 //SCROLLINFO si
78 si.cbSize = sizeof(SCROLLINFO)
79 si.fMask = $SIF_RANGE | $SIF_PAGE
80 si.nMin = 0
81 si.nMax = ?( .pVertRange, .pVertRange, 1 )
82 si.nPage = this.clloc.height + 1
83 SetScrollInfo( .hwnd, $SB_VERT, si, 1 )
84
85 //print( "Set range3 \(.Name) \(.pHorzRange) \(.pVertRange)\n" )
86 }
87
88
89 /* Свойство str vScrollBox.HorzRange - Get Set
90 Ширина прокручиваемого размера
91 */
92 property uint vScrollBox.HorzRange
93 {
94 return .pHorzRange
95 }
96
97 property vScrollBox.HorzRange( uint val )
98 {
99 if .pHorzRange != val
100 {
101 .pHorzRange = val
102 .iSetRange()
103 .UpdateScroll()
104 }
105 }
106
107 /* Свойство str vScrollBox.VertRange - Get Set
108 Высота прокручиваемого размера
109 */
110 property uint vScrollBox.VertRange
111 {
112 return .pVertRange
113 }
114
115 property vScrollBox.VertRange( uint val )
116 {
117 if .pVertRange != val
118 {
119 .pVertRange = val
120 .iSetRange()
121 .UpdateScroll()
122 }
123 }
124
125 /* Свойство str vPanel.AutoScroll - Get Set
126 Усотанавливает или получает заколовок панели
127 */
128 property uint vScrollBox.AutoScroll
129 {
130 return this.pAutoScroll
131 }
132
133 property vScrollBox.AutoScroll( uint val )
134 {
135 if this.pAutoScroll != val
136 {
137 this.pAutoScroll = val
138 if val
139 {
140 evparEvent ev
141 .mChildPosChanged( ev )
142 }
143 // ShowScrollBar( .hwnd, $SB_VERT | $SB_HORZ, 0 )
144 }
145 }
146
147
148 /* Свойство uint Border - Get Set
149 Усотанавливает или определяет рамку панели
150 Возможны следующие варианты:
151 brdNone - нет рамки,
152 brdLowered - рамка вдавлена,
153 brdDblRaised - рамка выпуклая,
154 brdDblLowered - рамка двойная выпуклая
155 */
156 property uint vScrollBox.Border()
157 {
158 return this.pBorder
159 }
160
161 property vScrollBox.Border( uint val )
162 {
163 uint style
164
165 if this.pBorder != val
166 {
167 this.pBorder = val
168 style = GetWindowLong( this.hwnd, $GWL_EXSTYLE )
169 style &= ~( $WS_EX_STATICEDGE | $WS_EX_WINDOWEDGE | $WS_EX_CLIENTEDGE |
170 $WS_EX_DLGMODALFRAME)
171 switch val
172 {
173 case $brdLowered : style |= $WS_EX_STATICEDGE
174 case $brdDblRaised : style |= $WS_EX_DLGMODALFRAME
175 case $brdDblLowered : style |= $WS_EX_CLIENTEDGE
176 }
177 SetWindowLong( this.hwnd, $GWL_EXSTYLE, style )
178 SetWindowPos( this.hwnd, 0, 0, 0, 0, 0, $SWP_FRAMECHANGED |
179 $SWP_NOACTIVATE | $SWP_NOZORDER | $SWP_NOMOVE | $SWP_NOSIZE )
180 }
181 }
182
183 method vScrollBox.UpdateScroll()
184 {
185 SCROLLINFO si
186 si.cbSize = sizeof(SCROLLINFO)
187 si.fMask = $SIF_POS | $SIF_RANGE | $SIF_PAGE
188 GetScrollInfo( .hwnd, $SB_VERT, si )
189 uint newtop = si.nPos
190 //print( "update scroll \(.Name) 1 \( newtop ) \(si.nMax) \(si.nPage) \n" )
191 GetScrollInfo( .hwnd, $SB_HORZ, si )
192 uint newleft = si.nPos
193
194 //print( "update scroll \(.Name) 2 \( newleft ) \(si.nMax) \(si.nPage) \n" )
195 uint i
196 uint offx = newleft - this.clloc.left
197 uint offy = newtop - this.clloc.top
198 if offx || offy
199 {
200 evparQuery pq
201
202 .OnBeforeScroll.run( pq )
203 if !pq.flgCancel
204 {
205 .flgScrolling = 1
206 //print( "Scroll \(offx) \(offy)\n" )
207 this.clloc.top = newtop
208 this.clloc.left = newleft
209
210 /*uint r = CreateRectRgn( 0, 0, 1, 1 )
211 uint a = CreateRectRgn( 0, 0, 1, 1 )
212 fornum i = 0, .pCtrls
213 {
214
215 //.Comps[i]->vCtrl.Top = .Comps[i]->vCtrl.Top
216 if .Comps[i]->vCtrl.HorzAlign != $alhLeft || .Comps[i]->vCtrl.VertAlign != $alvTop
217 {
218 GetWindowRgn( .Comps[i]->vCtrl.hwnd, a )
219 //.Comps[i]->vCtrl.Visible = 0
220 CombineRgn( r, r, a, $RGN_OR )
221 }
222 //.Comps[i]->vCtrl.hwnd )
223 //RedrawWindow( this.hwnd, 0->RECT, 0, 0x507)
224 //win_move( .Comps[i]->vCtrl.hwnd, ep.loc.left, ep.loc.top )
225 }*/
226 UpdateWindow( this.hwnd )
227 ScrollWindowEx( this.hwnd, -offx, -offy, 0, 0, 0, 0, 7 )
228 //DeleteObject( r )
229 //UpdateWindow( this.hwnd )
230 //Sleep( 1000 )
231 //for i = .pCtrls-1, i >= 0, i--
232 /*fornum i = 0, .pCtrls
233 {
234
235 //.Comps[i]->vCtrl.Top = .Comps[i]->vCtrl.Top
236 if .Comps[i]->vCtrl.HorzAlign != $alhLeft || .Comps[i]->vCtrl.VertAlign != $alvTop
237 {
238 print( "SCROLL \(.Comps[i]->vComp.Name ) \(.Comps[i]->vComp.TypeName )\n" )
239 eventpos ep
240 ep.loc = .Comps[i]->vCtrl.loc
241 ep.loc.left = ep.loc.left
242 ep.loc.top = ep.loc.top
243 //ep.loc.left -= offx
244 //ep.loc.top -= offy
245 ep.move = 1
246 ep.code = $e_poschanging
247 .Comps[i]->vCtrl.Virtual( $mPosChanging, ep )
248 //.Comps[i]->vCtrl.Visible = 1
249 }
250 //UpdateWindow( this.hwnd )//.Comps[i]->vCtrl.hwnd )
251 //RedrawWindow( this.hwnd, 0->RECT, 0, 0x507)
252 //win_move( .Comps[i]->vCtrl.hwnd, ep.loc.left, ep.loc.top )
253 }*/
254 .flgScrolling = 0
255 .OnAfterScroll.run( )
256 }
257
258 }
259
260 /*else
261 {
262 if this.clloc.left != newpos
263 {
264 this.clloc.left = newpos
265 fornum i = 0, .pCtrls
266 {
267 .Comps[i]->vCtrl.Left = .Comps[i]->vCtrl.Left
268 }
269 }
270 } */
271 }
272
273 method uint vScrollBox.wmscroll <alias=vScrollBox_wmscroll> ( winmsg wmsg )
274 {
275
276 uint flag = ?( wmsg.msg == $WM_VSCROLL, $SB_VERT, $SB_HORZ )
277 int newpos
278 SCROLLINFO si
279 si.cbSize = sizeof(SCROLLINFO)
280 si.fMask = $SIF_POS | $SIF_PAGE | $SIF_RANGE |$SIF_TRACKPOS
281 GetScrollInfo( .hwnd, flag, si )
282 newpos = si.nPos
283 switch wmsg.wpar & 0xFFFF
284 {
285 case $SB_LINEUP : newpos -= 10
286 case $SB_LINEDOWN : newpos += 10
287 case $SB_PAGEUP : newpos -= si.nPage
288 case $SB_PAGEDOWN : newpos += si.nPage
289 case $SB_TOP : newpos = si.nMax
290 case $SB_BOTTOM : newpos = si.nMin
291 case $SB_THUMBPOSITION, $SB_THUMBTRACK
292 {
293 newpos = si.nTrackPos
294 }
295 default : return 0
296 }
297 si.fMask = $SIF_POS
298 newpos = max( si.nMin, min( newpos, si.nMax ) )
299 // print( "newpos = \(newpos)\n" )
300 si.nPos = newpos
301 SetScrollInfo( .hwnd, flag, si, 1 )
302
303 .UpdateScroll()
304
305 wmsg.flags = 1
306
307 return 0
308 }
309
310 method vScrollBox.mPosChanged <alias=vScrollBox_mPosChanged>( evparEvent ev )
311 {
312 //print( "PAGE \(.Name) \(this.clloc.height + 1) \(this.clloc.width + 1)\n" )
313 .iSetRange()
314 /*SCROLLINFO si
315 si.cbSize = sizeof(SCROLLINFO)
316 si.fMask = $SIF_PAGE
317 si.nPage = this.clloc.height + 1//min( this.clloc.height + 1, this.pVertRange + 2 )
318 SetScrollInfo( .hwnd, $SB_VERT, si, 1 )
319
320 si.fMask = $SIF_PAGE
321 si.nPage = this.clloc.width + 1//min( this.clloc.width + 1, this.pHorzRange + 2 ) //?( .pHorzRange, this.clloc.width + 1, 0 )
322 SetScrollInfo( .hwnd, $SB_HORZ, si, 1 )*/
323 //print( "poschanged \(this.clloc.height) \(this.clloc.width)\n" )
324 this->vCtrl.mPosChanged( ev )
325 //print( "poschanged\n" )
326 .UpdateScroll()
327 //print( "poschanged end\n" )
328 }
329
330 method vScrollBox.mChildPosChanged <alias=vScrollBox_mChildPosChanged>( evparEvent ev )
331 {
332
333 if .pAutoScroll && !.flgScrolling
334 {
335 uint i
336 int maxwidth, maxheight
337 fornum i = 0, .pCtrls
338 {
339 if .Comps[i]->vCtrl.HorzAlign == $alhLeft
340 {
341 maxwidth = max( maxwidth, .Comps[i]->vCtrl.Left + .Comps[i]->vCtrl.Width )
342 }
343 if .Comps[i]->vCtrl.VertAlign == $alvTop
344 {
345 maxheight = max( maxheight, .Comps[i]->vCtrl.Top + .Comps[i]->vCtrl.Height )
346 }
347 }
348 .pHorzRange = maxwidth
349 .pVertRange = maxheight
350 .iSetRange()
351 //print( "Childpos 2\n" )
352 /*SCROLLINFO si
353 si.cbSize = sizeof(SCROLLINFO)
354 si.fMask = $SIF_RANGE
355 si.nMin = 0
356 si.nMax = maxheight
357 SetScrollInfo( .hwnd, $SB_VERT, si, 1 )
358 si.nMax = maxwidth
359 SetScrollInfo( .hwnd, $SB_HORZ, si, 1 )*/
360 .UpdateScroll()
361 }
362 }
363
364 method vScrollBox vScrollBox.mCreateWin <alias=vScrollBox_mCreateWin>()
365 {
366 uint style = $WS_CHILD | $WS_CLIPCHILDREN | $WS_CLIPSIBLINGS |
367 $WS_OVERLAPPED //| $WS_VSCROLL | $WS_HSCROLL
368 .CreateWin( /*"GvScrollBox".ustr()*/"GvForm".ustr(), 0, style )
369 /*SCROLLINFO si
370 si.cbSize = sizeof(SCROLLINFO)
371 si.fMask = $SIF_RANGE
372 si.nMin = 0
373 si.nMax = 500
374 SetScrollInfo( .hwnd, $SB_VERT, si, 1 )
375 si.nMax = 800
376 SetScrollInfo( .hwnd, $SB_HORZ, si, 1 )*/
377 this.prevwndproc = -1
378 this->vCtrl.mCreateWin()
379 if this.pBorder
380 {
381 uint border = this.pBorder
382 this.pBorder = 0
383 this.Border = border
384 }
385 .iSetRange()
386 .UpdateScroll()
387 //.panel.Owner = this
388 return this
389 }
390
391
392
393 /*------------------------------------------------------------------------------
394 Registration
395 */
396 method vScrollBox vScrollBox.init( )
397 {
398 this.pTypeId = vScrollBox
399 this.pCanContain = 1
400 //this.pBorder = $brdLowered
401 this.loc.width = 100
402 this.loc.height = 100
403 //this.panel.pAlign = $alhClient | $alvClient
404 this.pBorder = $brdLowered
405 return this
406 }
407
408
409
410
411 func init_vScrollBox <entry>()
412 {
413 /*WNDCLASSEX visclass
414 ustr classname = "GvScrollBox"
415 with visclass
416 {
417 .cbSize = sizeof( WNDCLASSEX )
418 //.style = $CS_HREDRAW | $CS_VREDRAW
419 .lpfnWndProc = callback( &myproc, 4 )
420 .hInstance = GetModuleHandle( 0 )
421 .hCursor = LoadCursor( 0, $IDC_ARROW )
422 .hbrBackground = 1
423 .lpszClassName = classname.ptr()
424 }
425 uint hclass = RegisterClassEx( &visclass )
426 */
427 regcomp( vScrollBox, "vScrollBox", vCtrl, $vCtrl_last,
428 %{ %{$mCreateWin, vScrollBox_mCreateWin },
429 %{$mPosChanged, vScrollBox_mPosChanged },
430 %{$mChildPosChanged, vScrollBox_mChildPosChanged }
431 },
432 %{ %{$WM_VSCROLL, vScrollBox_wmscroll },
433 %{$WM_HSCROLL, vScrollBox_wmscroll }
434 } )
435
436 ifdef $DESIGNING {
437 cm.AddComp( vScrollBox, 1, "Windows", "scrollbox" )
438 cm.AddProps( vScrollBox, %{
439 "Caption" , ustr, 0,
440 "Border", uint, 0,
441 "AutoScroll", uint, 0,
442 "HorzRange", uint, 0,
443 "VertRange", uint, 0
444 })
445 cm.AddPropVals( vScrollBox, "Border", %{
446 "brdNone" , $brdNone ,
447 "brdLowered" , $brdLowered ,
448 "brdDblRaised" , $brdDblRaised ,
449 "brdDblLowered" , $brdDblLowered
450 })
451 }
452
453 }
454
455