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.treeviewitem 25.09.07 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 extern
17 {
18 property TVItem TVItem.Parent
19 property TVItem TVItem.Next
20 property TVItem TVItem.Prev
21 property TVItem TVItem.LastChild
22 }
23
24
25 method TVItem.iItemUpdate( uint mask )
26 {
27 TVITEM item
28 uint state
29 item.mask = mask
30 item.hItem = .param->treedata.handle
31
32
33
34 if .getuint( "bold" ) : state |= $TVIS_BOLD
35
36 item.iImage = -1
37 item.iSelectedImage = -1
38 if .param->treedata.treeview && .param->treedata.treeview->vTreeView.ptrImageList
39 {
40 uint tname
41 ustr imgname
42 tname as .get( "image" )
43 if &tname
44 {
45 imgname.fromutf8( tname )
46 //print( "zzzz \(uint( .get( "disabled", "" ))) \n" )
47 item.iImage = .param->treedata.treeview->vTreeView.ptrImageList->ImageList.GetImageIdx( .param->treedata.treeview->vTreeView.iNumIml, imgname, uint( .get( "disabled", "" ) ) )
48 }
49 tname as .get( "selectedimage" )
50 if &tname
51 {
52 imgname.fromutf8( tname )
53 item.iSelectedImage = .param->treedata.treeview->vTreeView.ptrImageList->ImageList.GetImageIdx( .param->treedata.treeview->vTreeView.iNumIml, imgname, uint( .get( "disabled", "" ) ) )
54 }
55 }
56
57 if item.iImage != -1 && item.iSelectedImage = -1
58 {
59 item.iSelectedImage = item.iImage
60 }
61
62 //print( "image \( item.iImage ) \( item.iSelectedImage )\n" )
63 //if .param->treedata.inselections { state |= $TVIS_SELECTED//$TVIS_DROPHILITED //| $TVIS_CUT
64 //item.state = state | $TVIS_EXPANDPARTIAL
65 item.stateMask = $TVIS_BOLD //| $TVIS_EXPANDEDONCE /*| $TVIS_BOLD |/ $TVIS_SELECTED //|$TVIS_DROPHILITED//| $TVIS_CUT | $TVIS_EXPANDPARTIAL*/
66 //print( "l0 \n")
67
68 //.Label
69 item.pszText = .Label->locustr.Text( .param->treedata.treeview->vTreeView ).ptr()
70
71 .param->treedata.treeview->vTreeView.WinMsg( $TVM_SETITEMW, 0, &item )
72
73 if mask & $TVIF_STATE
74 {
75 //state |= $TVIS_EXPANDEDONCE
76 .param->treedata.treeview->vTreeView.WinMsg( $TVM_EXPAND, ?( .getuint( "expanded" ), $TVE_EXPAND, $TVE_COLLAPSE ), .param->treedata.handle )
77 }
78 }
79
80 method TVItem.iItemInsert( TVItem child )
81 {
82 TVINSERTSTRUCT ti
83
84 uint thisdata as .param->treedata
85
86 uint sorttype = .getuint( "sorttype" )
87 if sorttype & $TVSORT_SORT
88 {
89 ti.hInsertAfter = $TVI_SORT
90 }
91 else
92 {
93 uint prev as child.Prev
94 ti.hInsertAfter = ?( &prev, prev.param->treedata.handle, $TVI_FIRST )
95 //ti.hInsertAfter = ?( &after, ?( &after==0xFFFFFFFF, $TVI_LAST, after.param->treedata.handle ), $TVI_FIRST )
96 }
97 ti.hParent = thisdata.handle
98 ti.item.mask = $TVIF_PARAM | $TVIF_TEXT
99 ti.item.lParam = &child
100 //print( "Label \(.Label->locustr.Text( .param->treedata.treeview->vTreeView ).str())\n" )
101 ti.item.pszText = child.Label->locustr.Text( .param->treedata.treeview->vTreeView ).ptr()
102 child.param->treedata.handle = thisdata.treeview->vTreeView.WinMsg( $TVM_INSERTITEMW, 0, &ti )
103 // child.iItemUpdate( $TVIF_STATE | $TVIF_TEXT | $TVIF_SELECTEDIMAGE | $TVIF_IMAGE)
104 }
105
106
107 property gtitem TVItem.Children
108 {
109 return .findrel( "/children" )
110 }
111
112
113 method TVItem.Release()
114 {
115 /*if this.InSelections
116 {
117 this.InSelections = 0
118 }*/
119 if .param
120 {
121 uint children as .Children
122 if &children
123 {
124 uint prev as children.lastchild()->TVItem
125 while &prev
126 {
127 prev.Release()
128 prev as prev.Prev
129 }
130 //fornum i = 0, children
131 /*foreach child, children
132 {
133 child->TVItem.Release()
134 }*/
135 }
136 if &this && .param->treedata.treeview
137 {
138 if &this == .param->treedata.treeview->vTreeView.pSelected
139 {
140 uint next
141 if ( (next = &this.Next) && next->TVItem.param ) ||
142 ( (next = &this.Prev) && next->TVItem.param ) ||
143 ( next = &this.Parent )
144 {
145 }
146 .param->treedata.treeview->vTreeView.Selected = next->TVItem
147 }
148 .param->treedata.treeview->vTreeView.WinMsg( $TVM_DELETEITEM, 0, .param->treedata.handle )
149 }
150 if &this != &.param->treedata.treeview->vTreeView.gttree.root()
151 {
152 destroy( .param )
153 .param = 0
154 }
155 }
156 }
157
158 method TVItem.Del()
159 {
160 this.Release()
161 this.del()
162 /*if this.InSelections
163 {
164 this.InSelections = 0
165 }*/
166 /* if .param
167 {
168 if &this == .param->treedata.treeview->vTreeView.pSelected
169 {
170 .param->treedata.treeview->vTreeView.pSelected = 0
171 }
172 uint children as .Children
173 if &children
174 {
175 foreach child, children
176 {
177 child->TVItem.Del()
178 }
179 }
180 if &this && .param->treedata.treeview
181 {
182 .param->treedata.treeview->vTreeView.WinMsg( $TVM_DELETEITEM, 0, .param->treedata.handle )
183 }
184
185 if &this != &.param->treedata.treeview->vTreeView.gttree.root()
186 {
187 destroy( .param )
188 this.del()
189 }
190 }*/
191 }
192
193 /* Свойство ustr Label - Get Set
194 Устанавливает или определяет заголовок элемента дерева
195 */
196 property ustr TVItem.Label <result>
197 {
198 uint name as .get( "label" )
199 result.clear()
200 if &name
201 {
202 result.fromutf8( name ).ptr()
203 }
204 }
205
206 property TVItem.Label( ustr val )
207 {
208 .set( "label", val.toutf8( "" ) )
209 .iItemUpdate( $TVIF_TEXT )
210 }
211
212 /* Свойство ustr vToolBarItem.ImageId - Get Set
213 Устанавливает или получает картинку
214 */
215 property ustr TVItem.ImageId <result>
216 {
217 result.fromutf8( .get( "image" ) ).ptr()
218 }
219
220 property TVItem.ImageId( ustr val )
221 {
222 //if val != "".ustr().fromutf8( .get( "image" ) )
223 {
224 .set( "image", val.toutf8( "" ) )
225 .iItemUpdate( $TVIF_IMAGE | $TVIF_SELECTEDIMAGE )
226 }
227 }
228
229
230
231 method TVItem TVItem.InsertChild( ustr name, uint tag, ustr image, TVItem after )
232 {
233
234 if &this && .param->treedata.treeview
235 {
236 //uint children as .findrel( "\children" )
237 uint children as .Children
238 if !&children : children as .insertchild( "children", 0->gtitem )
239
240 uint thisdata as .param->treedata
241 uint child as children.insertchild( "", after )->TVItem
242 uint childdata as new( treedata )->treedata
243 childdata.treeview = thisdata.treeview
244 child.param = &childdata
245 child.set( "label", name.toutf8( "" ) )
246 child.setuint( "tag", tag )
247 if &image && *image
248 {
249 child.set( "image", image.toutf8( "" ) )
250 }
251 //print( "add \(&this) \(&child)\n" )
252 //TVINSERTSTRUCT ti
253 //ti.item.pszText = name.ptr()
254 uint sorttype = .getuint( "sorttype" )
255 if sorttype & $TVSORT_SORT
256 {
257 //ti.hInsertAfter = $TVI_SORT
258 if sorttype == $TVSORT_SORTRECURSE
259 {
260 child.setuint( "sorttype", sorttype )
261 }
262 }
263 .iItemInsert( child )
264 child.iItemUpdate( $TVIF_STATE | $TVIF_TEXT | $TVIF_SELECTEDIMAGE | $TVIF_IMAGE)
265 if !&.param->treedata.treeview->vTreeView.Selected
266 {
267 .param->treedata.treeview->vTreeView.Selected = child
268 }
269 /*else
270 {
271 ti.hInsertAfter = ?( &after, ?( &after==0xFFFFFFFF, $TVI_LAST, after.param->treedata.handle ), $TVI_FIRST )
272 }
273 ti.hParent = thisdata.handle
274 ti.item.mask = $TVIF_TEXT | $TVIF_PARAM// | $TVIF_SELECTEDIMAGE | $TVIF_IMAGE
275 //ti.item.stateMask = $TVIS_STATEIMAGEMASK
276 //ti.item.state = 0x2000
277 ti.item.lParam = &child
278 ti.item.iImage = -1
279 ti.item.iSelectedImage = -1
280 childdata.handle = thisdata.treeview->vTreeView.WinMsg( $TVM_INSERTITEMW, 0, &ti )*/
281 return child->TVItem
282 }
283 return 0->TVItem
284 }
285
286 method TVItem TVItem.InsertFirstChild( ustr name, uint tag, ustr image )
287 {
288 return this.InsertChild( name, tag, image, 0->TVItem )
289 }
290
291 method TVItem TVItem.AppendChild( ustr name, uint tag, ustr image )
292 {
293 return this.InsertChild( name, tag, image, 0xFFFFFFFF->TVItem )
294 }
295
296 method TVItem TVItem.InsertFirstChild( ustr name, uint tag )
297 {
298 return this.InsertChild( name, tag, 0->ustr, 0->TVItem )
299 }
300
301 method TVItem TVItem.AppendChild( ustr name, uint tag )
302 {
303 return this.InsertChild( name, tag, 0->ustr, 0xFFFFFFFF->TVItem )
304 }
305
306 /*operator uint *( TVItem item )
307 {
308 uint count
309 if &item && item.TreeView
310 {
311 uint tv as item.TreeView->vTreeView
312 uint cur = tv.WinMsg( $TVM_GETNEXTITEM, $TVGN_CHILD, item.handle )
313 while cur
314 {
315 count++
316 tv.WinMsg( $TVM_GETNEXTITEM, $TVGN_NEXT, cur )
317 }
318 }
319 return count
320 return *item->gtitem
321 }*/
322
323 method TVItem TVItem.index( uint idx )
324 {
325 /*uint count
326 if &this && .TreeView
327 {
328 uint tv as .TreeView->vTreeView
329 uint cur = tv.WinMsg( $TVM_GETNEXTITEM, $TVGN_CHILD, this.handle )
330 while cur
331 {
332 if count == idx
333 {
334 TVITEM item
335 item.mask = $TVIF_PARAM
336 item.hItem = cur
337 if tv.WinMsg( $TVM_GETITEMW, 0, &item )
338 {
339 return tv.items[ item.lParam ]
340 }
341 break
342 }
343 count++
344 tv.WinMsg( $TVM_GETNEXTITEM, $TVGN_NEXT, cur )
345 }
346 }*/
347 return 0->TVItem
348 }
349
350
351
352 /* Свойство uint Expand - Get Set
353 Устанавливает или определяет открытие ветки
354 0 - ветка закрыта
355 1 - ветка открыта
356 */
357 property uint TVItem.Expanded
358 {
359 return .getuint( "expanded" )
360 }
361
362 property TVItem.Expanded( uint val )
363 {
364 if .getuint( "expanded" ) != val
365 {
366 //.param->treedata.treeview->vTreeView.WinMsg( $TVM_EXPAND, ?( val, $TVE_EXPAND, $TVE_COLLAPSE ), .param->treedata.handle )
367 .setuint( "expanded", val )
368 .iItemUpdate( $TVIF_STATE )
369 }
370 //.iItemUpdate( $TVIF_STATE )
371 }
372
373
374 /* Свойство uint Tag - Get Set
375 Устанавливает или определяет пользовательский параметр элемента дерева
376 */
377 property uint TVItem.Tag
378 {
379 return .getuint( "tag" )
380 }
381
382 property TVItem.Tag( uint val )
383 {
384 .setuint( "tag", val )
385 }
386
387 /* Свойство uint Bold - Get Set
388 Устанавливает или определяет пользовательский параметр элемента дерева
389 */
390 property uint TVItem.Bold
391 {
392 return .getuint( "bold" )
393 }
394
395 property TVItem.Bold( uint val )
396 {
397 .setuint( "bold", val )
398 .iItemUpdate( $TVIF_STATE )
399 }
400
401 /* Свойство uint Checked - Get Set
402 Устанавливает или определяет пользовательский параметр элемента дерева
403 */
404 property uint TVItem.Checked
405 {
406 return .getuint( "checked" )
407 }
408
409 property TVItem.Checked( uint val )
410 {
411 .setuint( "checked", val )
412 //.iItemUpdate( $TVIF_STATE )
413 }
414
415 /* Свойство uint SortTYpe - Get Set
416 Устанавливает или определяет пользовательский параметр элемента дерева
417 */
418 property uint TVItem.SortType
419 {
420 return .getuint( "sorttype" )
421 }
422
423 property TVItem.SortType( uint val )
424 {
425 .setuint( "sorttype", ?( val & $TVSORT_SORT, val, $TVSORT_NONE ))
426 if val & $TVSORT_SORT
427 {
428 .param->treedata.treeview->vTreeView.WinMsg( $TVM_SORTCHILDREN, 0, .param->treedata.handle )
429 }
430 if val & $TVSORT_RECURSE
431 {
432 uint children as .Children
433 if &children
434 {
435 foreach child, children
436 {
437 child->TVItem.SortType = val
438 }
439 }
440 }
441
442 //.iItemUpdate( $TVIF_STATE )
443 }
444
445 /* Свойство uint Parent - Get
446 Определяет хозяина данной ветки, если ветка в корне то корень, если корень то 0
447 */
448 property TVItem TVItem.Parent
449 {
450 return this->gtitem.parent().parent()->TVItem
451
452 // return this->gtitem.parent()->TVItem
453 }
454
455 /* Свойство uint Prev - Get
456 Определяет предыдущий элемент, если он есть, иначе 0
457 */
458 property TVItem TVItem.Prev
459 {
460 uint x = &(this->gtitem.getprev())
461 //print( "TVItem.Prev \(x)\n" )
462 return x->TVItem
463 //return this->gtitem.getprev()->TVItem
464 }
465
466 /* Свойство uint Next - Get
467 Определяет следующий элемент, если он есть, иначе 0
468 */
469 property TVItem TVItem.Next
470 {
471 return this->gtitem.getnext()->TVItem
472 }
473
474 /* Свойство uint NextInList - Get
475 Определяет следующий элемент в глобальном списке или 0 если больше нет
476 */
477 property TVItem TVItem.NextInList
478 {
479 uint item
480 uint parent
481
482 item as this.Child
483 if &item : return item
484 parent as this
485 do
486 {
487 item as parent.Next
488 if &item : return item
489 if &parent == &(.param->treedata.treeview->vTreeView.Root())
490 {
491 return 0->TVItem
492 }
493 parent as parent.Parent
494 } while &parent
495 return 0->TVItem
496 }
497
498 /* Свойство uint LastChild - Get
499 Определяет последний дочерний элемент, если он есть, иначе 0
500 */
501 property TVItem TVItem.LastChild
502 {
503 uint children as .Children
504 if &children : return children.lastchild()->TVItem
505 return 0->TVItem
506 //return this->gtitem.lastchild()->TVItem
507 }
508
509 /* Свойство uint Child - Get
510 Определяет первый дочерний элемент данной ветки, если ветка не имеет дочерних элементов, то 0
511 */
512 property TVItem TVItem.Child
513 {
514 uint children as .Children
515 if &children : return children.child()->TVItem
516 return 0->TVItem
517 /*
518 uint res as this.child()
519 return res->TVItem*/
520 }
521
522
523
524 method TVItem.Reinsert()
525 {
526 uint owner as this.Parent()
527
528 owner.iItemInsert( this )
529 uint children as .Children
530 if &children
531 {
532 foreach child, children
533 {
534 child->TVItem.Reinsert()
535 }
536 }
537 this.iItemUpdate( $TVIF_STATE | $TVIF_TEXT | $TVIF_SELECTEDIMAGE | $TVIF_IMAGE)
538 }
539
540 method TVItem.Update()
541 {
542 this.iItemUpdate( $TVIF_IMAGE | $TVIF_SELECTEDIMAGE | $TVIF_TEXT | $TVIF_STATE )
543 uint children as .Children
544 if &children
545 {
546 foreach child, children
547 {
548 child->TVItem.Update()
549 }
550 }
551 if .getuint( "sorttype" ) & $TVSORT_SORT
552 {
553 .param->treedata.treeview->vTreeView.WinMsg( $TVM_SORTCHILDREN, 0, .param->treedata.handle )
554 }
555 }
556
557 method TVItem.MoveTo( TVItem dest, uint flag )
558 {
559 uint root as .param->treedata.treeview->vTreeView.Root
560 //print( "owner= \(?(&this.Parent()!=&root,this.Parent.Label.str(),"")) prev= \(?(&this.Prev(),this.Prev.Label.str(),"")) next= \(?(&this.Next(),this.Next.Label.str(),"")) dest= \(?(&dest,dest.Label.str(),""))\n" )
561 if &this.Next() != &dest
562 {
563 uint tv as .param->treedata.treeview->vTreeView
564 this.move( dest, flag )
565 //print( "owner= \(?(&this.Parent()!=&root,this.Parent.Label.str(),"")) prev= \(?(&this.Prev(),this.Prev.Label.str(),"")) next= \(?(&this.Next(),this.Next.Label.str(),"")) \n" )
566 tv.WinMsg( $TVM_DELETEITEM, 0, .param->treedata.handle )
567 this.Reinsert()
568 evparItemMoved evpIM
569 evpIM.SrcItem = &this
570 evpIM.DestItem = &dest
571 evpIM.Flag = flag
572 tv.OnItemMoved.run( evpIM )
573 }
574 }
575
576 /* Свойство uint Selected - Get Set
577 Устанавливает или определяет пользовательский параметр элемента дерева
578 */
579 /*property uint TVItem.Selected
580 {
581 return .getuint( "Selected" )
582 }
583
584 property TVItem.Selected( uint val )
585 {
586 .setuint( "Selected", ?( val & $TVSORT_SORT, val, $TVSORT_NONE ))
587 if val & $TVSORT_SORT
588 {
589 .param->treedata.treeview->vTreeView.WinMsg( $TVM_SORTCHILDREN, 0, .param->treedata.handle )
590 }
591 if val & $TVSORT_RECURSE
592 {
593 foreach child, this
594 {
595 child.Selected = val
596 }
597 }
598
599 //.iItemUpdate( $TVIF_STATE )
600 }*/