1
|
SESSION:SYSTEM-ALERT-BOXES = TRUE.
|
2
|
/* scope defined pre-processors mapping OXC attributes to FWD versions */
|
3
|
&IF DEFINED(FWD-VERSION) = 0 &THEN /* NOT FWD */
|
4
|
&Scoped-define COMPONENT-HANDLE COMPONENT-HANDLE
|
5
|
&Scoped-define HIT-TEST hitTest
|
6
|
&ELSE /* FWD */
|
7
|
&Scoped-define COMPONENT-HANDLE HANDLE
|
8
|
&Scoped-define HIT-TEST hitTestFwd
|
9
|
&ENDIF
|
10
|
|
11
|
DEFINE VARIABLE hNode AS COMPONENT-HANDLE NO-UNDO.
|
12
|
DEFINE VARIABLE hNode1 AS COMPONENT-HANDLE NO-UNDO.
|
13
|
DEFINE VARIABLE hNode2 AS COMPONENT-HANDLE NO-UNDO.
|
14
|
DEFINE VARIABLE hNode3 AS COMPONENT-HANDLE NO-UNDO.
|
15
|
DEFINE VARIABLE nodes AS COMPONENT-HANDLE NO-UNDO.
|
16
|
|
17
|
DEFINE VARIABLE i AS INTEGER.
|
18
|
DEFINE VARIABLE j AS INTEGER.
|
19
|
DEFINE VARIABLE k AS INTEGER.
|
20
|
DEFINE VARIABLE l AS INTEGER.
|
21
|
|
22
|
DEFINE BUTTON bCreateNode LABEL "Create Selected Node Child".
|
23
|
DEFINE BUTTON bCreateNodeByIndex LABEL "Create Node by Index Child".
|
24
|
|
25
|
DEFINE BUTTON bClearAll LABEL "ClearAll".
|
26
|
DEFINE BUTTON bPrintFocused LABEL "Print focused".
|
27
|
DEFINE BUTTON bNodeBold LABEL "Toggle node bold".
|
28
|
DEFINE BUTTON bSetNodeTag LABEL "Set Node Tag".
|
29
|
|
30
|
/** Change currently focused cell string value */
|
31
|
DEFINE BUTTON bNodeText LABEL "Node Text".
|
32
|
DEFINE BUTTON bReloadNodes LABEL "Reload nodes".
|
33
|
DEFINE BUTTON bSetFont LABEL "Set Font".
|
34
|
DEFINE BUTTON bCollapseNodeByIndex LABEL "Collapse Node With Absolute Index".
|
35
|
DEFINE BUTTON bEnsureNodeVisible LABEL "Ensure node visible".
|
36
|
DEFINE BUTTON bDeleteNode LABEL "Delete selected node".
|
37
|
DEFINE BUTTON bDeleteNodeByIndex LABEL "Delete node by node index".
|
38
|
DEFINE BUTTON bDeleteNodeByKey LABEL "Delete node by node key".
|
39
|
DEFINE BUTTON bExpandSubtree LABEL "Expand subtree".
|
40
|
DEFINE BUTTON bCollapseSubtree LABEL "Collapse subtree".
|
41
|
|
42
|
DEFINE VARIABLE fillIn AS CHARACTER NO-UNDO VIEW-AS FILL-IN.
|
43
|
|
44
|
DEFINE FRAME f
|
45
|
bCreateNode AT COLUMN 1 ROW 16
|
46
|
bCreateNodeByIndex
|
47
|
bClearAll
|
48
|
bPrintFocused
|
49
|
bNodeText
|
50
|
bNodeBold
|
51
|
SKIP
|
52
|
bSetNodeTag
|
53
|
fillIn NO-LABEL
|
54
|
bReloadNodes
|
55
|
bSetFont
|
56
|
bEnsureNodeVisible
|
57
|
bDeleteNode
|
58
|
bDeleteNodeByIndex
|
59
|
SKIP
|
60
|
bDeleteNodeByKey
|
61
|
bCollapseNodeByIndex
|
62
|
bExpandSubtree
|
63
|
bCollapseSubtree
|
64
|
WITH SIZE 140 BY 40 TITLE "TreeView Demo".
|
65
|
|
66
|
DEFINE VARIABLE TreeView AS WIDGET-HANDLE NO-UNDO.
|
67
|
DEFINE VARIABLE chTreeView AS COMPONENT-HANDLE NO-UNDO.
|
68
|
|
69
|
DEFINE VARIABLE Image AS WIDGET-HANDLE NO-UNDO.
|
70
|
DEFINE VARIABLE chImage AS COMPONENT-HANDLE NO-UNDO.
|
71
|
|
72
|
DEFINE VARIABLE treeView1 AS COMPONENT-HANDLE NO-UNDO.
|
73
|
|
74
|
CREATE CONTROL-FRAME TreeView ASSIGN
|
75
|
FRAME = FRAME f:HANDLE
|
76
|
HEIGHT = 15
|
77
|
WIDTH = 135
|
78
|
ROW = 1
|
79
|
COLUMN = 1
|
80
|
WIDGET-ID = 2
|
81
|
HIDDEN = NO
|
82
|
SENSITIVE = YES.
|
83
|
|
84
|
TreeView:NAME = "TreeView".
|
85
|
|
86
|
CREATE CONTROL-FRAME Image ASSIGN
|
87
|
FRAME = FRAME f:HANDLE
|
88
|
HEIGHT = 1
|
89
|
WIDTH = 1
|
90
|
ROW = 30 // Make it invisible this way
|
91
|
COLUMN = 4
|
92
|
WIDGET-ID = 4
|
93
|
TAB-STOP = YES
|
94
|
HIDDEN = YES
|
95
|
SENSITIVE = NO.
|
96
|
|
97
|
Image:NAME = "Image".
|
98
|
|
99
|
DEFINE VARIABLE OCXFile AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
100
|
OCXFile = SEARCH( "Z:/Projects/test3820/abl/treeview.wrx":U ).
|
101
|
//OCXFile = SEARCH( "U:\\treeview.wrx" ).
|
102
|
ASSIGN
|
103
|
chTreeView = TreeView:COMPONENT-HANDLE.
|
104
|
chImage = Image:COM-HANDLE.
|
105
|
|
106
|
chImage:LoadControls(OCXFile, "Image").
|
107
|
chTreeView:LoadControls(OCXFile, "TreeView").
|
108
|
|
109
|
&IF DEFINED(FWD-VERSION) &THEN /* FWD */
|
110
|
ASSIGN
|
111
|
treeView1 = chTreeView:TreeView
|
112
|
//treeView1:FONT:SIZE = MLiniGetFontSize() /* Default font size */
|
113
|
treeView1:ImageList = chImage:ImageList
|
114
|
.
|
115
|
|
116
|
treeView1:OLEDragMode = 1.
|
117
|
treeView1:OLEDropMode = 1.
|
118
|
|
119
|
&ELSE /* OE */
|
120
|
|
121
|
ASSIGN
|
122
|
treeView1 = chTreeView:Controls:Item(1)
|
123
|
treeView1:Style = 7. // It is the default value
|
124
|
treeView1:Indentation = 0. // Default IS 38?
|
125
|
// treeView1:FONT:SIZE = MLiniGetFontSize() /* Default font size */
|
126
|
// chTreeView:POPUP-MENU = MENU mnPopUp:HANDLE
|
127
|
treeView1:ImageList = chImage:Controls:Item(1)
|
128
|
.
|
129
|
|
130
|
// RUN GetDC(INPUT treeView1:HWND, OUTPUT giDevice).
|
131
|
// RUN GetDeviceCaps(OUTPUT giXpix, giDevice, {&LOGPIXELSX} ).
|
132
|
// RUN GetDeviceCaps(OUTPUT giYpix, giDevice, {&LOGPIXELSY} ).
|
133
|
// RUN ReleaseDC(INPUT treeView1:HWND, INPUT giDevice).
|
134
|
|
135
|
/* Compute conversion factor pixels to twips
|
136
|
** Hittest LIKES twips (=1/1440 inch) */
|
137
|
// ASSIGN
|
138
|
// gdeXscale = 1440.0 / DECIMAL(giXpix)
|
139
|
// gdeYscale = 1440.0 / DECIMAL(giYpix).
|
140
|
&ENDIF
|
141
|
|
142
|
DEFAULT-WINDOW:WIDTH = 160.
|
143
|
DEFAULT-WINDOW:HEIGHT = 30.
|
144
|
|
145
|
ENABLE ALL WITH FRAME f.
|
146
|
|
147
|
DEFINE VARIABLE img1 AS INTEGER.
|
148
|
DEFINE VARIABLE img2 AS INTEGER.
|
149
|
DEFINE VARIABLE img3 AS INTEGER.
|
150
|
DEFINE VARIABLE img4 AS INTEGER.
|
151
|
DEFINE VARIABLE img5 AS INTEGER.
|
152
|
DEFINE VARIABLE img6 AS INTEGER.
|
153
|
|
154
|
ASSIGN
|
155
|
img1 = 1.
|
156
|
img2 = 2.
|
157
|
img3 = 3.
|
158
|
img4 = 4.
|
159
|
img5 = 5.
|
160
|
img6 = 6.
|
161
|
|
162
|
DEFINE VARIABLE images AS COMPONENT-HANDLE NO-UNDO.
|
163
|
DEFINE VARIABLE listimages AS COMPONENT-HANDLE NO-UNDO.
|
164
|
|
165
|
ASSIGN
|
166
|
&IF DEFINED(FWD-VERSION) &THEN /* FWD */
|
167
|
images = chImage:ImageList
|
168
|
&ELSE /* OE */
|
169
|
images = chImage:Controls:Item(1)
|
170
|
&ENDIF
|
171
|
listimages = images:ListImages
|
172
|
.
|
173
|
|
174
|
&IF DEFINED(FWD-VERSION) &THEN
|
175
|
listimages:Add(img1, "image1", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-angry.png")).
|
176
|
listimages:Add(img2, "image2", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-cool.png")).
|
177
|
listimages:Add(img3, "image3", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-crying.png")).
|
178
|
listimages:Add(img5, "image4", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-glasses.png")).
|
179
|
listimages:Add(img5, "image5", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-laugh.png")).
|
180
|
listimages:Add(img6, "image6", LOAD-PICTURE("/usr/share/icons/Adwaita/16x16/emotes/face-devilish.png")).
|
181
|
&ELSE
|
182
|
listimages:Add(img1, "image1", LOAD-PICTURE("C:\\images\\face-angry.bmp")).
|
183
|
listimages:Add(img2, "image2", LOAD-PICTURE("C:\\images\\face-cool.bmp")).
|
184
|
listimages:Add(img3, "image3", LOAD-PICTURE("C:\\images\\face-crying.bmp")).
|
185
|
listimages:Add(img5, "image4", LOAD-PICTURE("C:\\images\\face-glasses.bmp")).
|
186
|
listimages:Add(img5, "image5", LOAD-PICTURE("C:\\images\\face-laugh.bmp")).
|
187
|
listimages:Add(img6, "image6", LOAD-PICTURE("C:\\images\\face-devilish.bmp")).
|
188
|
&ENDIF
|
189
|
|
190
|
ASSIGN nodes = treeView1:Nodes.
|
191
|
|
192
|
PROCEDURE reloadNodes .
|
193
|
&IF DEFINED(FWD-VERSION) &THEN
|
194
|
treeView1:BuildingTree = TRUE.
|
195
|
&ENDIF
|
196
|
|
197
|
nodes:CLEAR.
|
198
|
|
199
|
DEFINE VARIABLE hRoot AS COMPONENT-HANDLE NO-UNDO.
|
200
|
|
201
|
hRoot = nodes:Add(?, 4, "Root", "Root", img1, img2).
|
202
|
|
203
|
DO i = 1 TO 5:
|
204
|
DEFINE VARIABLE key AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
205
|
key = ENTRY(i, "quick,brown,fox,jumps,over").
|
206
|
hNode = nodes:Add(hRoot:Index, 4, key, "Node " + key, img1, img2).
|
207
|
|
208
|
DO j = 1 TO 5:
|
209
|
DEFINE VARIABLE key2 AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
210
|
key2 = key + "." + ENTRY(j, "six,little,boys,playing,with,hive").
|
211
|
hNode2 = nodes:Add(hNode:Index, 4, key2, "Node " + key2, img2, img3).
|
212
|
|
213
|
DO k = 1 TO 5:
|
214
|
DEFINE VARIABLE key3 AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
215
|
key3 = key2 + "." + ENTRY(k, "moe,and,dogged,him,catch").
|
216
|
hNode3 = nodes:Add(hNode2:Index, 4, key3, "Node " + key3, img3, img4).
|
217
|
|
218
|
DO l = 1 TO 5:
|
219
|
DEFINE VARIABLE key4 AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
220
|
key4 = key3 + "." + ENTRY(l, "tiger,squeals,snout,knee,if").
|
221
|
nodes:Add(hNode3:Index, 4, key4, "Node " + key4, img5, img6).
|
222
|
END.
|
223
|
END.
|
224
|
END.
|
225
|
END.
|
226
|
&IF DEFINED(FWD-VERSION) &THEN
|
227
|
treeView1:BuildingTree = FALSE.
|
228
|
&ENDIF
|
229
|
END PROCEDURE.
|
230
|
|
231
|
RUN reloadNodes.
|
232
|
|
233
|
PROCEDURE TreeView.TreeView.OnActivate .
|
234
|
MESSAGE "OnActivate".
|
235
|
END PROCEDURE.
|
236
|
|
237
|
PROCEDURE TreeView.TreeView.OnChangeNode .
|
238
|
DEFINE INPUT PARAMETER p-FromNodeKey AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
239
|
DEFINE INPUT PARAMETER p-FromNodePtr AS INTEGER NO-UNDO.
|
240
|
DEFINE INPUT PARAMETER p-ToNodeKey AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
241
|
DEFINE INPUT PARAMETER p-ToNodePtr AS INTEGER NO-UNDO.
|
242
|
|
243
|
MESSAGE "OnChangeNode" p-FromNodeKey p-FromNodePtr p-ToNodeKey p-ToNodePtr.
|
244
|
END PROCEDURE.
|
245
|
|
246
|
PROCEDURE TreeView.TreeView.OnClick .
|
247
|
MESSAGE "OnClick".
|
248
|
END PROCEDURE.
|
249
|
|
250
|
PROCEDURE TreeView.TreeView.OnDblClick .
|
251
|
MESSAGE "OnDblClick".
|
252
|
END PROCEDURE.
|
253
|
|
254
|
PROCEDURE TreeView.TreeView.OnCreate .
|
255
|
MESSAGE "OnCreate".
|
256
|
END PROCEDURE.
|
257
|
|
258
|
PROCEDURE TreeView.TreeView.OnDeactivate .
|
259
|
MESSAGE "OnDeactivate".
|
260
|
END PROCEDURE.
|
261
|
|
262
|
PROCEDURE TreeView.TreeView.OnDestroy .
|
263
|
MESSAGE "OnDestroy".
|
264
|
END PROCEDURE.
|
265
|
|
266
|
PROCEDURE TreeView.TreeView.OnKeyPress .
|
267
|
DEFINE INPUT PARAMETER p-Key AS INTEGER NO-UNDO.
|
268
|
MESSAGE "OnKeyPress" p-Key.
|
269
|
END PROCEDURE.
|
270
|
|
271
|
PROCEDURE TreeView.TreeView.OnDragDrop .
|
272
|
MESSAGE "OnDragDrop".
|
273
|
END PROCEDURE.
|
274
|
|
275
|
PROCEDURE TreeView.TreeView.OnDragOver .
|
276
|
MESSAGE "OnDragOver".
|
277
|
END PROCEDURE.
|
278
|
|
279
|
PROCEDURE TreeView.TreeView.OnEndDrag .
|
280
|
MESSAGE "OnEndDrag".
|
281
|
END PROCEDURE.
|
282
|
|
283
|
PROCEDURE TreeView.TreeView.OnEnter .
|
284
|
MESSAGE "OnEnter".
|
285
|
END PROCEDURE.
|
286
|
|
287
|
PROCEDURE TreeView.TreeView.OnExit .
|
288
|
MESSAGE "OnExit".
|
289
|
END PROCEDURE.
|
290
|
|
291
|
PROCEDURE TreeView.TreeView.OnExpanding .
|
292
|
DEFINE INPUT PARAMETER p-NodePtr AS INTEGER NO-UNDO.
|
293
|
DEFINE INPUT PARAMETER p-NodeKey AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
294
|
DEFINE INPUT-OUTPUT PARAMETER Allowed AS LOGICAL NO-UNDO.
|
295
|
|
296
|
MESSAGE "OnExpanding" p-NodePtr p-NodeKey Allowed.
|
297
|
Allowed = TRUE.
|
298
|
END PROCEDURE.
|
299
|
|
300
|
PROCEDURE TreeView.TreeView.OnCollapsing .
|
301
|
DEFINE INPUT PARAMETER p-NodePtr AS INTEGER NO-UNDO.
|
302
|
DEFINE INPUT PARAMETER p-NodeKey AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
303
|
DEFINE INPUT-OUTPUT PARAMETER Allowed AS LOGICAL NO-UNDO.
|
304
|
|
305
|
MESSAGE "OnCollapsing" p-NodePtr p-NodeKey Allowed.
|
306
|
Allowed = TRUE.
|
307
|
END PROCEDURE.
|
308
|
|
309
|
PROCEDURE TreeView.TreeView.OnKeyUp .
|
310
|
DEFINE INPUT PARAMETER key AS INTEGER NO-UNDO.
|
311
|
DEFINE INPUT PARAMETER p-ShiftState AS INTEGER NO-UNDO.
|
312
|
|
313
|
MESSAGE "OnKeyUp" key p-ShiftState.
|
314
|
END PROCEDURE.
|
315
|
|
316
|
PROCEDURE menuAction .
|
317
|
MESSAGE "Hello, world!" VIEW-AS ALERT-BOX.
|
318
|
END PROCEDURE.
|
319
|
|
320
|
DEFINE VARIABLE ghMenu AS HANDLE NO-UNDO.
|
321
|
|
322
|
&IF DEFINED(FWD-VERSION) eq 0 &THEN
|
323
|
PROCEDURE SendMessageA EXTERNAL "user32" :
|
324
|
DEFINE INPUT PARAMETER hwnd AS LONG.
|
325
|
DEFINE INPUT PARAMETER umsg AS LONG.
|
326
|
DEFINE INPUT PARAMETER wparam AS LONG.
|
327
|
DEFINE INPUT PARAMETER lparam AS LONG.
|
328
|
DEFINE RETURN PARAMETER ReturnValue AS LONG.
|
329
|
END PROCEDURE.
|
330
|
&ENDIF
|
331
|
|
332
|
/**
|
333
|
* Create popup menu.
|
334
|
*/
|
335
|
DEFINE VARIABLE hMenuItem AS HANDLE NO-UNDO.
|
336
|
|
337
|
CREATE MENU ghMenu
|
338
|
ASSIGN POPUP-ONLY = TRUE.
|
339
|
|
340
|
CREATE MENU-ITEM hMenuItem
|
341
|
ASSIGN PARENT = ghMenu
|
342
|
LABEL = 'Expand subtree'
|
343
|
SENSITIVE = TRUE
|
344
|
TRIGGERS:
|
345
|
ON CHOOSE
|
346
|
PERSISTENT RUN expandSubtree IN THIS-PROCEDURE.
|
347
|
END TRIGGERS.
|
348
|
|
349
|
CREATE MENU-ITEM hMenuItem
|
350
|
ASSIGN PARENT = ghMenu
|
351
|
LABEL = 'Collapse subtree'
|
352
|
SENSITIVE = TRUE
|
353
|
TRIGGERS:
|
354
|
ON CHOOSE
|
355
|
PERSISTENT RUN collapseSubtree IN THIS-PROCEDURE.
|
356
|
END TRIGGERS.
|
357
|
|
358
|
CREATE MENU-ITEM hMenuItem
|
359
|
ASSIGN PARENT = ghMenu
|
360
|
LABEL = 'Delete subtree'
|
361
|
SENSITIVE = TRUE
|
362
|
TRIGGERS:
|
363
|
ON CHOOSE
|
364
|
PERSISTENT RUN deleteSubtree IN THIS-PROCEDURE.
|
365
|
END TRIGGERS.
|
366
|
|
367
|
CREATE MENU-ITEM hMenuItem
|
368
|
ASSIGN PARENT = ghMenu
|
369
|
LABEL = 'Remove node'
|
370
|
SENSITIVE = TRUE
|
371
|
TRIGGERS:
|
372
|
ON CHOOSE
|
373
|
PERSISTENT RUN deleteNode IN THIS-PROCEDURE.
|
374
|
END TRIGGERS.
|
375
|
|
376
|
PROCEDURE TreeView.TreeView.OnMouseRightUp .
|
377
|
DEFINE INPUT PARAMETER p-ShiftState AS INTEGER NO-UNDO.
|
378
|
DEFINE INPUT PARAMETER p-X AS INTEGER NO-UNDO.
|
379
|
DEFINE INPUT PARAMETER p-Y AS INTEGER NO-UNDO.
|
380
|
MESSAGE "OnMouseRightUp" p-ShiftState p-X p-Y.
|
381
|
|
382
|
&IF DEFINED(FWD-VERSION) eq 0 &THEN
|
383
|
DEFINE VARIABLE iretval AS INTEGER NO-UNDO.
|
384
|
RUN SendMessageA (INPUT FRAME f:HWND,
|
385
|
INPUT 516,
|
386
|
INPUT 2,
|
387
|
INPUT 0,
|
388
|
OUTPUT iretval).
|
389
|
RUN SendMessageA (INPUT FRAME f:HWND,
|
390
|
INPUT 517,
|
391
|
INPUT 0,
|
392
|
INPUT 0,
|
393
|
OUTPUT iretval).
|
394
|
&ELSE
|
395
|
ASSIGN FRAME f:POPUP-MENU = ghMenu.
|
396
|
f:OPEN-POPUP().
|
397
|
ASSIGN FRAME f:POPUP-MENU = ?.
|
398
|
&ENDIF
|
399
|
END PROCEDURE.
|
400
|
|
401
|
PROCEDURE TreeView.TreeView.OnPaint .
|
402
|
MESSAGE "OnPaint".
|
403
|
END PROCEDURE.
|
404
|
|
405
|
PROCEDURE TreeView.TreeView.OnStartDrag .
|
406
|
MESSAGE "OnStartDrag".
|
407
|
END PROCEDURE.
|
408
|
|
409
|
PROCEDURE TreeView.TreeView.OnChangeNodeDirect .
|
410
|
DEFINE INPUT PARAMETER p-FromNodeKey AS CHARACTER NO-UNDO.
|
411
|
DEFINE INPUT PARAMETER p-FromNodePtr AS INTEGER NO-UNDO.
|
412
|
DEFINE INPUT PARAMETER p-ToNodeKey AS CHARACTER NO-UNDO.
|
413
|
DEFINE INPUT PARAMETER p-ToNodePtr AS INTEGER NO-UNDO.
|
414
|
MESSAGE "OnChangeNodeDirect" p-FromNodeKey p-FromNodePtr p-ToNodeKey p-ToNodePtr.
|
415
|
END PROCEDURE.
|
416
|
|
417
|
PROCEDURE TreeView.TreeView.OnChangeTopVisibleNode .
|
418
|
DEFINE INPUT PARAMETER p-PreviousId AS CHARACTER NO-UNDO.
|
419
|
DEFINE INPUT PARAMETER p-CurrentId AS CHARACTER NO-UNDO.
|
420
|
DEFINE INPUT PARAMETER p-ScrollNodeCount AS INTEGER NO-UNDO.
|
421
|
MESSAGE "OnChangeTopVisibleNode" p-PreviousId p-CurrentId p-ScrollNodeCount.
|
422
|
END PROCEDURE.
|
423
|
|
424
|
PROCEDURE TreeView.TreeView.OnCollapsed .
|
425
|
DEFINE INPUT PARAMETER p-NodePtr AS INTEGER NO-UNDO.
|
426
|
DEFINE INPUT PARAMETER p-nodeId AS CHARACTER NO-UNDO.
|
427
|
MESSAGE "OnCollapsed" p-NodePtr p-nodeId.
|
428
|
END PROCEDURE.
|
429
|
|
430
|
PROCEDURE TreeView.TreeView.OnExpanded .
|
431
|
DEFINE INPUT PARAMETER p-Key AS CHARACTER NO-UNDO.
|
432
|
MESSAGE "OnExpanded" p-Key.
|
433
|
END PROCEDURE.
|
434
|
|
435
|
PROCEDURE TreeView.TreeView.OnKeyDown .
|
436
|
DEFINE INPUT PARAMETER p-key AS INTEGER NO-UNDO.
|
437
|
DEFINE INPUT PARAMETER p-ShiftState AS INTEGER NO-UNDO.
|
438
|
MESSAGE "OnKeyDown" p-key p-ShiftState.
|
439
|
END PROCEDURE.
|
440
|
|
441
|
PROCEDURE TreeView.TreeView.OnMouseLeftDown .
|
442
|
DEFINE INPUT PARAMETER p-ShiftState AS INTEGER NO-UNDO.
|
443
|
DEFINE INPUT PARAMETER p-X AS INTEGER NO-UNDO.
|
444
|
DEFINE INPUT PARAMETER p-Y AS INTEGER NO-UNDO.
|
445
|
MESSAGE "OnMouseLeftDown" p-ShiftState p-X p-Y.
|
446
|
END PROCEDURE.
|
447
|
|
448
|
PROCEDURE TreeView.TreeView.OnMouseLeftUp .
|
449
|
DEFINE INPUT PARAMETER p-ShiftState AS INTEGER NO-UNDO.
|
450
|
DEFINE INPUT PARAMETER p-X AS INTEGER NO-UNDO.
|
451
|
DEFINE INPUT PARAMETER p-Y AS INTEGER NO-UNDO.
|
452
|
MESSAGE "OnMouseLeftUp" p-ShiftState p-X p-Y.
|
453
|
END PROCEDURE.
|
454
|
|
455
|
PROCEDURE TreeView.TreeView.OnTreeDragDrop .
|
456
|
DEFINE INPUT PARAMETER p-DraggedNodeId AS CHARACTER NO-UNDO.
|
457
|
DEFINE INPUT PARAMETER p-NodeIdAtMousePos AS CHARACTER NO-UNDO.
|
458
|
MESSAGE "OnTreeDragDrop" p-DraggedNodeId p-NodeIdAtMousePos.
|
459
|
END PROCEDURE.
|
460
|
|
461
|
PROCEDURE TreeView.TreeView.OnTreeDragOver .
|
462
|
DEFINE INPUT PARAMETER p-DraggedNodeId AS CHARACTER NO-UNDO.
|
463
|
DEFINE INPUT PARAMETER p-NodeIdAtMousePos AS CHARACTER NO-UNDO.
|
464
|
DEFINE INPUT-OUTPUT PARAMETER p-Accept AS LOGICAL NO-UNDO.
|
465
|
MESSAGE "OnTreeDragOver" p-DraggedNodeId p-NodeIdAtMousePos p-Accept.
|
466
|
END PROCEDURE.
|
467
|
|
468
|
PROCEDURE TreeView.TreeView.OnTreeDragStart .
|
469
|
DEFINE INPUT PARAMETER p-DraggedNodeId AS CHARACTER NO-UNDO.
|
470
|
MESSAGE "OnTreeDragStart" p-DraggedNodeId.
|
471
|
END PROCEDURE.
|
472
|
|
473
|
|
474
|
ON CHOOSE OF bCreateNode DO:
|
475
|
DEFINE VARIABLE nodeText AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
476
|
hNode = treeView1:SelectedItem.
|
477
|
IF hNode = 0 THEN RETURN.
|
478
|
MESSAGE "Enter node label/key" SET nodeText.
|
479
|
IF nodeText = ? THEN RETURN.
|
480
|
IF LENGTH(TRIM(nodeText)) = 0 THEN RETURN.
|
481
|
nodes:Add(hNode:Index, 4, nodeText, nodeText, img2, img2).
|
482
|
END.
|
483
|
|
484
|
ON CHOOSE OF bCreateNodeByIndex DO:
|
485
|
DEFINE VARIABLE nodeText AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
486
|
DEFINE VARIABLE parentIndex AS INTEGER NO-UNDO.
|
487
|
|
488
|
MESSAGE "Parent Node Index or blank to create a root node" SET parentIndex.
|
489
|
IF parentIndex = 0 THEN parentIndex = ?.
|
490
|
MESSAGE "Enter node label/key" SET nodeText.
|
491
|
IF nodeText = ? THEN RETURN.
|
492
|
IF LENGTH(TRIM(nodeText)) = 0 THEN RETURN.
|
493
|
nodes:Add(parentIndex, 4, nodeText, nodeText, img2, img2).
|
494
|
END.
|
495
|
|
496
|
/** If a node is selected, remove it */
|
497
|
PROCEDURE deleteNode .
|
498
|
hNode = treeView1:SelectedItem.
|
499
|
IF hNode = 0 THEN RETURN.
|
500
|
nodes:Remove(hNode:INDEX).
|
501
|
END.
|
502
|
|
503
|
ON CHOOSE OF bClearAll DO:
|
504
|
nodes:Clear.
|
505
|
END.
|
506
|
|
507
|
ON CHOOSE OF bPrintFocused DO:
|
508
|
hNode = treeView1:SelectedItem.
|
509
|
IF hNode = 0 THEN RETURN.
|
510
|
MESSAGE "Node:" hNode
|
511
|
SKIP "FullPath:" hNode:FullPath
|
512
|
SKIP "Tag:" hNode:Tag
|
513
|
SKIP "Text:" hNode:Text
|
514
|
SKIP "Checked:" hNode:Checked
|
515
|
SKIP "Child:" hNode:Child
|
516
|
SKIP "FirstSibling:" hNode:FirstSibling
|
517
|
SKIP "Children:" hNode:Children
|
518
|
SKIP "Index:" hNode:Index
|
519
|
SKIP "LastSibling:" hNode:LastSibling
|
520
|
SKIP "Next:" hNode:Next
|
521
|
SKIP "Parent:" hNode:Parent
|
522
|
SKIP "Previous:" hNode:Previous
|
523
|
SKIP "Root:" hNode:Root
|
524
|
SKIP "ExpandedImage:" hNode:ExpandedImage
|
525
|
SKIP "Image:" hNode:Image
|
526
|
SKIP "SelectedImage:" hNode:SelectedImage
|
527
|
VIEW-AS ALERT-BOX INFORMATION.
|
528
|
END.
|
529
|
|
530
|
ON CHOOSE OF bSetNodeTag DO:
|
531
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
532
|
theNode = treeView1:SelectedItem.
|
533
|
IF theNode <> ? THEN
|
534
|
DO:
|
535
|
DEFINE VARIABLE tag AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
536
|
tag = theNode:Tag.
|
537
|
MESSAGE "New Tag:" UPDATE tag.
|
538
|
theNode:Tag = tag.
|
539
|
MESSAGE "New tag" theNode:Tag.
|
540
|
END.
|
541
|
END.
|
542
|
|
543
|
ON CHOOSE OF bNodeText DO:
|
544
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
545
|
theNode = treeView1:SelectedItem.
|
546
|
IF theNode <> ? THEN
|
547
|
DO:
|
548
|
DEFINE VARIABLE nodeText AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
549
|
MESSAGE "String Value:" SET nodeText.
|
550
|
theNode:Text = nodeText.
|
551
|
END.
|
552
|
END.
|
553
|
|
554
|
ON CHOOSE OF bNodeBold DO:
|
555
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
556
|
theNode = treeView1:SelectedItem.
|
557
|
IF theNode <> ? THEN
|
558
|
DO:
|
559
|
DEFINE VARIABLE nodeBold AS LOGICAL NO-UNDO.
|
560
|
nodeBold = theNode:Bold.
|
561
|
MESSAGE "Node bold" nodeBold.
|
562
|
theNode:Bold = NOT nodeBold.
|
563
|
END.
|
564
|
END.
|
565
|
|
566
|
PROCEDURE deleteSubtree.
|
567
|
// TODO: the TreeView does NOT support anything like DeleteChildNodes
|
568
|
// IF treeView1:SelectedItem <> 0 THEN DO:
|
569
|
// treeView1:DeleteChildNodes(treeView1:SelectedItem).
|
570
|
// END.
|
571
|
END.
|
572
|
|
573
|
ON CHOOSE OF bReloadNodes DO:
|
574
|
RUN reloadNodes.
|
575
|
END.
|
576
|
|
577
|
/* TODO This currently does not work: need to know how to create Windows-compatible font in 4gl */
|
578
|
ON CHOOSE OF bSetFont DO:
|
579
|
DEFINE VARIABLE fontName AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
580
|
fontName = treeView1:Font.
|
581
|
MESSAGE "Font:" UPDATE fontName.
|
582
|
treeView1:Font = fontName.
|
583
|
END.
|
584
|
|
585
|
ON CHOOSE OF bCollapseNodeByIndex DO:
|
586
|
DEFINE VARIABLE nodeIndex AS INTEGER NO-UNDO FORMAT ">>>>>>>>>>9".
|
587
|
MESSAGE "Node Index" SET nodeIndex.
|
588
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
589
|
theNode = nodes:Item(nodeIndex).
|
590
|
theNode:Expanded = FALSE.
|
591
|
// FIXME: the following is converted incorrectly
|
592
|
// nodes:Item(nodeIndex):Expanded = FALSE.
|
593
|
END.
|
594
|
|
595
|
ON CHOOSE OF bEnsureNodeVisible DO:
|
596
|
DEFINE VARIABLE nodeIndex AS INTEGER NO-UNDO.
|
597
|
|
598
|
MESSAGE "Node Index" SET nodeIndex.
|
599
|
IF nodeIndex = 0 THEN RETURN.
|
600
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
601
|
theNode = nodes:Item(nodeIndex).
|
602
|
theNode:EnsureVisible.
|
603
|
// FIXME: the following is converted incorrectly
|
604
|
// nodes:Item(nodeIndex):EnsureVisible.
|
605
|
END.
|
606
|
|
607
|
ON CHOOSE OF bDeleteNode DO:
|
608
|
RUN deleteNode.
|
609
|
END.
|
610
|
|
611
|
ON CHOOSE OF bDeleteNodeByIndex DO:
|
612
|
DEFINE VARIABLE nodeIndex AS INTEGER NO-UNDO FORMAT ">>>>>>>>>>9".
|
613
|
MESSAGE "Node ID" SET nodeIndex.
|
614
|
nodes:Remove(nodeIndex).
|
615
|
END.
|
616
|
|
617
|
ON CHOOSE OF bDeleteNodeByKey DO:
|
618
|
DEFINE VARIABLE nodeKey AS CHARACTER FORMAT "x(128)" NO-UNDO.
|
619
|
MESSAGE "Node Key" SET nodeKey.
|
620
|
nodes:Remove(nodeKey).
|
621
|
END.
|
622
|
|
623
|
ON CHOOSE OF bExpandSubtree DO:
|
624
|
RUN expandSubtree.
|
625
|
END.
|
626
|
|
627
|
ON CHOOSE OF bCollapseSubtree DO:
|
628
|
RUN collapseSubtree.
|
629
|
END.
|
630
|
|
631
|
PROCEDURE expandSubtree.
|
632
|
RUN expandNodeRecursively (treeView1:SelectedItem).
|
633
|
END PROCEDURE.
|
634
|
|
635
|
PROCEDURE expandNodeRecursively.
|
636
|
DEFINE INPUT PARAMETER nodeIndex AS INTEGER NO-UNDO.
|
637
|
IF nodeIndex = 0 THEN
|
638
|
RETURN.
|
639
|
|
640
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
641
|
theNode = nodes:Item(nodeIndex).
|
642
|
theNode:Expanded = TRUE.
|
643
|
// FIXME: the following is converted incorrectly
|
644
|
// nodes:Item(nodeIndex):Expanded = FALSE.
|
645
|
|
646
|
DEFINE VARIABLE childPtr AS INTEGER NO-UNDO.
|
647
|
DEFINE VARIABLE childKey AS CHARACTER NO-UNDO.
|
648
|
treeView1:GetFirstChildNode(nodeIndex, OUTPUT childPtr, OUTPUT childKey).
|
649
|
|
650
|
DO WHILE childPtr <> 0:
|
651
|
RUN expandNodeRecursively(childPtr).
|
652
|
treeView1:GetNextSiblingNode(childPtr, OUTPUT childPtr, OUTPUT childKey).
|
653
|
END.
|
654
|
END PROCEDURE.
|
655
|
|
656
|
PROCEDURE collapseSubtree.
|
657
|
RUN collapseNodeRecursively (treeView1:SelectedItem).
|
658
|
END PROCEDURE.
|
659
|
|
660
|
PROCEDURE collapseNodeRecursively.
|
661
|
DEFINE INPUT PARAMETER nodeIndex AS INTEGER NO-UNDO.
|
662
|
IF nodeIndex = 0 THEN
|
663
|
RETURN.
|
664
|
DEFINE VARIABLE theNode AS COMPONENT-HANDLE NO-UNDO.
|
665
|
theNode = nodes:Item(nodeIndex).
|
666
|
theNode:Expanded = FALSE.
|
667
|
// FIXME: the following is converted incorrectly
|
668
|
// nodes:Item(nodeIndex):Expanded = FALSE.
|
669
|
|
670
|
DEFINE VARIABLE childPtr AS INTEGER NO-UNDO.
|
671
|
DEFINE VARIABLE childKey AS CHARACTER NO-UNDO.
|
672
|
treeView1:GetFirstChildNode(nodeIndex, OUTPUT childPtr, OUTPUT childKey).
|
673
|
|
674
|
DO WHILE childPtr <> 0:
|
675
|
RUN collapseNodeRecursively(childPtr).
|
676
|
treeView1:GetNextSiblingNode(childPtr, OUTPUT childPtr, OUTPUT childKey).
|
677
|
END.
|
678
|
END PROCEDURE.
|
679
|
|
680
|
WAIT-FOR CLOSE OF THIS-PROCEDURE.
|