The latest version of this document can be found at www.broad.ology.org.uk/amiga/sketchblock/maketext_rexx.html
1: /* Create Path from text and render to a new layer*/
2:
3: OPTIONS RESULTS
4:
5: /* Parse command line argumwents */
6: prjid = ""
7: parse arg argstring,prjid
8:
9: if argstring = "NOGUI" then nogui = 1
10: else nogui = 0
11:
12: /* defaults */
13:
14: text.string = "Text"
15: font.file = "FONTS:_TrueType/DejaVuSans.ttf"
16: fill.on = 1
17: stroke.on = 0
18: glyphheight.pixels = 200
19: baseline.pixels = 200
20: align.alignment = 0
21:
22: /* retrieve settings from previous session */
23:
24: clip = getclip('sketchblock_text')
25: if clip ~= "" then do
26: text.string = clip
27: end
28:
29: clip = getclip('sketchblock_font')
30: if clip ~= "" then do
31: font.file = clip
32: end
33:
34: clip = getclip('sketchblock_fill')
35: if clip ~= "" then do
36: fill.on = clip
37: end
38:
39: clip = getclip('sketchblock_stroke')
40: if clip ~= "" then do
41: stroke.on = clip
42: end
43:
44: clip = getclip('sketchblock_glyphheight')
45: if clip ~= "" then do
46: glyphheight.pixels = clip
47: end
48:
49: clip = getclip('sketchblock_baseline')
50: if clip ~= "" then do
51: baseline.pixels = clip
52: end
53:
54: clip = getclip('sketchblock_align')
55: if clip ~= "" then do
56: align.alignment = clip
57: end
58:
59:
60: align.0 = "LEFT"
61: align.1 = "RIGHT"
62: align.2 = "CENTRE"
63:
64: ADDRESS SKETCHBLOCK
65:
66: PUBSCREEN = ""
67: PUBSCREENNAME = ""
68:
69: GETAPPLICATIONINFO ATTR SCREENNAME
70:
71: if RC = 0 then do
72: if result ~= "" then do
73: PUBSCREEN = 'PUBSCREEN "' || Result || '" '
74: PUBSCREENNAME = Result
75: end
76: end
77: GETAPPLICATIONINFO ATTR VERSION
78: IF RC = 5 THEN DO
79: /* if VERSION failed above then we know that SETAPPLIACTIONBUSY isn't there either */
80: SETBUSY = ""
81: UNSETBUSY = ""
82: END
83: ELSE DO
84: SETBUSY = "SETAPPLICATIONBUSY"
85: UNSETBUSY = "UNSETAPPLICATIONBUSY"
86: END
87:
88: if(prjid = "") then do
89: GETAPPLICATIONINFO ATTR ACTIVEPROJECT
90: prjid = result
91: end
92:
93: /* We need proaction for the GUI */
94:
95: PORTS = SHOW('P')
96: IF POS('PROACTION',PORTS) = 0 THEN DO
97: ADDRESS COMMAND "RUN >NIL: APPDIR:ProAction"
98: ADDRESS COMMAND "WAITFORPORT PROACTION"
99: PORTS = SHOW('P')
100: IF POS('PROACTION',PORTS) = 0 THEN DO
101: ADDRESS COMMAND 'REQUESTCHOICE "Make Text" "Unable to start the ProAction GUIServer" "OK" TYPE ERROR TIMEOUTSECS 30'
102: EXIT
103: END
104: END
105:
106: /* Set up the charset */
107:
108: if open('CS',"Env:Charset") then do
109: charset = readln('CS')
110: call close('CS')
111: end
112: else do
113: charset = "iso-8859-15"
114: end
115:
116: /* guiless version for calling from other scripts */
117: /* arguments for GUI calling are passed via the rexx clip */
118:
119: if nogui then do
120: call MakeText()
121: exit
122: end
123:
124: /* Full GUI version */
125:
126: if DoGUI() then do
127:
128: call MakeText()
129:
130: /* Save the current state to the rexx clip */
131:
132: call setclip('sketchblock_text', text.string)
133: call setclip('sketchblock_font', font.file)
134: call setclip('sketchblock_fill', fill.on)
135: call setclip('sketchblock_stroke',stroke.on)
136: call setclip('sketchblock_glyphheight', glyphheight.pixels)
137: call setclip('sketchblock_baseline', baseline.pixels)
138: call setclip('sketchblock_align',align.alignment)
139: end
140: exit
141:
142: MakeText:
143: procedure expose text. font. baseline. glyphheight. fill. stroke. align. charset prjid
144:
145: a = align.alignment
146: 'PATHFROMTEXT NAME "glyphs" FONT "' || font.file || '" CHARSET "' || charset || '" TEXT "' || dosescape(text.string) || '" ' || align.a || ' BASELINE ' || baseline.pixels || ' GLYPHHEIGHT ' || glyphheight.pixels
147:
148: if rc = 0 then do
149: PG = result
150: 'GETPATHINFO PATHID ' PG ' ATTR X'
151: px = result
152:
153: 'GETPATHINFO PATHID ' PG ' ATTR Y'
154: py = result
155:
156: 'GETPATHINFO PATHID ' PG ' ATTR LIMITS'
157:
158: parse var result left top width height
159:
160: mx = 10
161: if left < 0 then mx = mx - left
162: my = 10
163: if top < 0 then my = my - top
164:
165: 'MOVEPATH PATHID ' PG ' X ' mx ' Y ' my
166:
167: width = width + 20
168: if left < 0 then width = width - left
169: height = height + 20
170: if top < 0 then height = height - top
171: 'NEWLAYER PRJID ' prjid ' NAME "' || dosstrip(left(text.string,10)) || '" WIDTH ' || width || ' HEIGHT ' || height || ' RED 255 GREEN 255 BLUE 255 ALPHA 0 HASALPHA '
172: if fill.on = 1 then do
173: 'FILLPATH PATHID ' PG
174: end
175: if stroke.on = 1 then do
176: 'SWAPCOLORS'
177: 'STROKEPATH PATHID ' PG
178: 'SWAPCOLORS'
179: end
180: 'DISPLAYPROJECT PRJID ' prjid
181:
182: 'DELETEPATH PATHID ' PG
183: end
184:
185:
186: return
187:
188: /*
189: limits:
190: procedure expose minX maxX minY maxY
191:
192: parse arg x,y
193:
194: if x > maxX then maxX = x
195: if y > maxY then maxY = y
196:
197: if x < minX then minX = x
198: if y < minY then minY = y
199:
200:
201: return
202: */
203:
204: DoGUI:
205: PROCEDURE EXPOSE PUBSCREENNAME font. text. GlyphHeight. BaseLine. fill. stroke. align.
206:
207: OK = 1
208: NOTOK = 0
209:
210: SUCCESS = NOTOK
211:
212: /* This script requires at least ProAction 1.7 fotr texteditor support */
213:
214: address command "VERSION VERSION 1 REVISION 7 Appdir:PROACTION >NIL:"
215:
216: if RC > 0 then do
217: SAY "ProAction 1.7or greater requred "
218: return NOTOK
219: end
220:
221: /*Add rexxsupport.library if it isn't already open.*/
222:
223: IF ~ SHOW('L', "rexxsupport.library" ) THEN DO
224:
225: IF ADDLIB('rexxsupport.library', 0, -30,0) THEN NOP
226: ELSE DO
227: SAY 'ARexx support library not available, exiting'
228: EXIT 10 /*Exit if ADDLIB() failed*/
229: END
230: END
231:
232:
233: SCRIPTPORT = "MAKETEXT"
234:
235: if ~OPENPORT(SCRIPTPORT) THEN DO
236: ADDRESS COMMAND 'REQUESTCHOICE "Make Text" "Unable to create the script arexx port" "OK" TYPE ERROR TIMEOUTSECS 30'
237: exit 10
238: END
239:
240: /* tag definitions */
241: /* Window Tags */
242:
243: guitags.0 = 11
244: guitags.1.TAGNAME = "WA_Width"
245: guitags.1.TAGVALUE = 400
246: guitags.2.TAGNAME = "WA_Height"
247: guitags.2.TAGVALUE = 100
248: guitags.3.TAGNAME = "WA_DragBar"
249: guitags.3.TAGVALUE = 1
250: guitags.4.TAGNAME = "WA_DepthGadget"
251: guitags.4.TAGVALUE = 1
252: guitags.5.TAGNAME = "WA_SizeGadget"
253: guitags.5.TAGVALUE = 1
254: guitags.6.TAGNAME = "WA_CloseGadget"
255: guitags.6.TAGVALUE = 1
256: guitags.7.TAGNAME = "WA_Activate"
257: guitags.7.TAGVALUE = 1
258: guitags.8.TAGNAME = "WA_Title"
259: guitags.8.TAGVALUE ="Text Tool"
260: guitags.9.TAGNAME = "WA_PubScreenName"
261: guitags.9.TAGVALUE = PUBSCREENNAME
262: guitags.10.TAGNAME = "WA_PubScreenFallBack"
263: guitags.10.TAGVALUE = 1
264: guitags.11.TAGNAME = "WINDOW_Position"
265: guitags.11.TAGVALUE = "WPOS_CENTERSCREEN"
266:
267:
268: confirmlayouttag.0 = 1
269: confirmlayouttag.1.TAGNAME = "LAYOUT_Orientation"
270: confirmlayouttag.1.TAGVALUE = "LAYOUT_ORIENT_HORIZ"
271:
272: getFile.0 = 6
273: getFile.1.TAGNAME = "GETFILE_TitleText"
274: getFile.1.TAGVALUE = "Select Font File"
275: getFile.2.TAGNAME = "GETFILE_DoSaveMode"
276: getFile.2.TAGVALUE = "1"
277: getFile.3.TAGNAME = "GA_RelVerify"
278: getFile.3.TAGVALUE = "1"
279: getFile.4.TAGNAME = "GETFILE_ReadOnly"
280: getFile.4.TAGVALUE = "1"
281: getFile.5.TAGNAME = "GETFILE_DoMultiSelect"
282: getFile.5.TAGVALUE = "0"
283: getFile.6.TAGNAME = "GETFILE_FullFile"
284: getFile.6.TAGVALUE = font.file
285:
286:
287:
288: ADDRESS PROACTION
289:
290: /* Create and initaialse our GUI */
291:
292: 'CREATEGUI PORTNAME "' || SCRIPTPORT || '" TAGSTEM guitags'
293: IF RC = 0 THEN GUIKEY = RESULT
294: ELSE RETURN NOTOK
295:
296: /* Add a top level layout */
297: 'ADDLAYOUT GUIID ' GUIKEY ' TAGSTRING "LAYOUT_Orientation,LAYOUT_ORIENT_VERT,TAG_DONE"'
298: CURRENTLAYOUT = RESULT
299:
300: /* This select clause simplifies setup of the GA_TEXTEDITOR_Flow tag */
301:
302: SELECT
303: WHEN align.alignment = 0 THEN align = "Left"
304: WHEN align.alignment = 1 THEN align = "Right"
305: WHEN align.alignment = 2 THEN align = "Center"
306: OTHERWISE NOP
307: END
308:
309: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "texteditor.gadget" TAGSTRING "GA_TEXTEDITOR_Contents,' || dosescape(Text.string) || ',GA_TEXTEDITOR_Flow,GV_TEXTEDITOR_Flow_' || align || ',TAG_DONE"'
310:
311: Text.GID = RESULT
312:
313: /* This image will be added to layout as a label so will be autodisposed when the layout is disposed*/
314: /* So we set NODISPOSE */
315: 'NEWIMAGE GUIID ' GUIKEY ' IMAGECLASS "label.image" NODISPOSE TAGSTRING "LABEL_Text,Text:,TAG_DONE"'
316: IMGID = RESULT
317:
318: /* Set the label we need to specify LAYOUT_ModifyChild as its a seperate call */
319: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || Text.GID || ',CHILD_Label,' || IMGID || ',TAG_DONE"'
320:
321: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "getfile.gadget" TAGSTEM getFile'
322: font.GID = RESULT
323: 'NEWIMAGE GUIID ' GUIKEY ' IMAGECLASS "label.image" NODISPOSE TAGSTRING "LABEL_Text,Font:,TAG_DONE"'
324: IMGID = RESULT
325: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || font.GID || ',CHILD_Label,' || IMGID || ',TAG_DONE"'
326:
327:
328: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "integer.gadget" TAGSTRING "INTEGER_Number,' || GlyphHeight.pixels || ',GA_ReadOnly,0,TAG_DONE"'
329: GlyphHeight.GID = RESULT
330: 'NEWIMAGE GUIID ' GUIKEY ' IMAGECLASS "label.image" NODISPOSE TAGSTRING "LABEL_Text,Height:,TAG_DONE"'
331: IMGID = RESULT
332: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || GlyphHeight.GID || ',CHILD_Label,' || IMGID || ',TAG_DONE"'
333:
334: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "integer.gadget" TAGSTRING "INTEGER_Number,' || BaseLine.pixels || ',GA_ReadOnly,0,TAG_DONE"'
335: BaseLine.GID = RESULT
336: 'NEWIMAGE GUIID ' GUIKEY ' IMAGECLASS "label.image" NODISPOSE TAGSTRING "LABEL_Text,BaseLine:,TAG_DONE"'
337: IMGID = RESULT
338: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || BaseLine.GID || ',CHILD_Label,' || IMGID || ',TAG_DONE"'
339:
340: align.rbn = MakeRBNList()
341:
342: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "radiobutton.gadget" TAGSTRING "RADIOBUTTON_Labels,' || align.rbn || ',RADIOBUTTON_Selected,' || align.alignment || ',GA_ReadOnly,0,GA_RelVerify,1,TAG_DONE"'
343: align.GID = RESULT
344: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || align.GID || ',CHILD_WeightedHeight,0,TAG_DONE"'
345:
346: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "checkbox.gadget" TAGSTRING "GA_Text,Stroke Text,GA_Selected,'|| Stroke.on || ',TAG_DONE"'
347: Stroke.GID = RESULT
348:
349: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "checkbox.gadget" TAGSTRING "GA_Text,Fill Text,GA_Selected,'|| Fill.on || ',TAG_DONE"'
350: Fill.GID = RESULT
351:
352: 'ADDLAYOUT GUIID ' GUIKEY ' TAGSTEM confirmlayouttag'
353: CONFIRMLAYOUT = RESULT
354: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "button.gadget" TAGSTRING "GA_Text,Make Text,GA_RelVerify,1,TAG_DONE"'
355: MAKEGID = RESULT
356: 'ADDGADGET GUIID ' GUIKEY ' GADGETCLASS "button.gadget" TAGSTRING "GA_Text,Cancel,GA_RelVerify,1,TAG_DONE"'
357: CANCELGID = RESULT
358:
359: 'SETATTRS GUIID ' GUIKEY ' OBJECTID ' CURRENTLAYOUT ' TAGSTRING "LAYOUT_ModifyChild,' || CONFIRMLAYOUT || ',CHILD_WeightedHeight,0,TAG_DONE"'
360:
361: 'ENDLAYOUT GUIID ' GUIKEY
362:
363:
364: /* The GUI is now set up so open it */
365:
366: 'OPENGUIWINDOW GUIID ' || GUIKEY
367:
368: /* Main execution loop */
369:
370: DO LOOPS = 1 BY 1
371: GOTMSG = WAITPKT(SCRIPTPORT) /* Wait for ProAction to sart sending us messages */
372: IF GOTMSG THEN DO
373: PKT = GETPKT(SCRIPTPORT)
374: DO WHILE PKT ~= '0000 0000'x
375: CMD = GETARG(PKT)
376: CALL REPLY(PKT)
377: IF CMD = "QUIT" THEN LEAVE LOOPS
378: PARSE VAR CMD COM " GUIID " SENTGUIKEY .
379: SELECT
380: WHEN CMD = "QUIT" THEN LEAVE LOOPS
381: WHEN COM = "CLOSE" THEN LEAVE LOOPS
382: WHEN COM = "GADGETUP" THEN DO
383: PARSE VAR CMD JUNK 'GADGETID ' GADID ' CODE ' CODE .
384: SELECT
385: WHEN GADID = CANCELGID THEN LEAVE LOOPS
386: WHEN GADID = MAKEGID THEN DO
387:
388: /* Extract the text from the editor gadget using the TEXTEXPORT menthod. */
389:
390: 'TEXTEDITOREXPORTTEXT GUIID ' || GUIKEY || ' TEDID ' || Text.GID
391: if RC = 0 then Text.String = RESULT
392:
393: /* get the status of all the gadgets */
394: 'GETATTR GUIID ' || GUIKEY || ' OBJECTID ' || font.GID || ' TAGNAME "GETFILE_FullFile"'
395: if RC = 0 then font.file = RESULT
396:
397: 'GETATTR GUIID ' || GUIKEY || ' OBJECTID ' || GlyphHeight.GID || ' TAGNAME "INTEGER_Number"'
398: if RC = 0 then GlyphHeight.pixels = RESULT
399:
400: 'GETATTR GUIID ' || GUIKEY || ' OBJECTID ' || BaseLine.GID || ' TAGNAME "INTEGER_Number"'
401: if RC = 0 then BaseLine.pixels = RESULT
402:
403: 'GETATTR GUIID ' || GUIKEY || ' OBJECTID ' || Stroke.GID || ' TAGNAME "GA_Selected"'
404: if RC = 0 then Stroke.ON = RESULT
405:
406: 'GETATTR GUIID ' || GUIKEY || ' OBJECTID ' || Fill.GID || ' TAGNAME "GA_Selected"'
407: if RC = 0 then Fill.ON = RESULT
408:
409: SUCCESS = OK
410: LEAVE LOOPS
411: END
412: WHEN GADID = align.GID then do
413: align.alignment = code
414: SELECT
415: WHEN code = 0 THEN align = "Left"
416: WHEN code = 1 THEN align = "Right"
417: WHEN code = 2 THEN align = "Center"
418: OTHERWISE NOP
419: END
420: 'SETATTRS GUIID ' || GUIKEY || ' OBJECTID ' || Text.GID || ' TAGSTRING "GA_TEXTEDITOR_Flow,GV_TEXTEDITOR_Flow_' || align || ',TAG_DONE"'
421: 'RETHINKGUIWINDOW GUIID ' GUIKEY
422: end
423: WHEN GADID = font.GID then do
424: "REQUESTFILE GUIID " || GUIKEY || " OBJECTID " || font.GID
425: end
426: OTHERWISE NOP
427: END
428: END
429: OTHERWISE SAY CMD
430: END
431:
432: PKT = GETPKT(SCRIPTPORT)
433: END
434:
435: END
436: END
437:
438: 'CLOSEGUIWINDOW GUIID ' || GUIKEY
439:
440: /* Free the RadioButton Node list *before* the GUI */
441: /* (An earlier version did it the wrong way round!) */
442:
443: call FreeRBNList(align.rbn)
444:
445: 'DESTROYGUI GUIID ' || GUIKEY
446:
447:
448: return SUCCESS
449:
450: /* Routine to escape any newlines (*N) quotes (*") or * with * */
451:
452: dosescape:
453: procedure
454:
455: parse arg instring
456: outstring = ""
457:
458: do while pos("*",instring) > 0
459: outstring = outstring || left(instring,pos("*",instring))
460: outstring = outstring || "*"
461: instring = right(instring, length(instring) - pos("*",instring))
462:
463: end
464:
465: outstring = outstring || instring
466:
467: instring = outstring
468:
469: outstring = ""
470:
471: do while pos('"',instring) > 0
472: outstring = outstring || left(instring,pos('"',instring)-1)
473: outstring = outstring || "*"""
474: instring = right(instring, length(instring) - pos('"',instring))
475: end
476:
477: outstring = outstring || instring
478:
479:
480: instring = outstring
481:
482: outstring = ""
483:
484: nl = x2c("0A")
485:
486: do while pos(nl,instring) > 0
487: outstring = outstring || left(instring,pos(nl,instring) -1)
488: outstring = outstring || "*N"
489: instring = right(instring, length(instring) - pos(nl,instring) )
490: end
491:
492: outstring = outstring || instring
493:
494: return outstring
495:
496: /* Strip an does escaping (only) and newlines etc, used for the layer title */
497:
498: dosstrip:
499: procedure
500:
501: parse arg instring
502: outstring = ""
503:
504:
505: do while pos('*',instring) > 0
506: outstring = outstring || left(instring,pos('*',instring)-1)
507: instring = right(instring, length(instring) - pos('*',instring))
508: end
509:
510: outstring = outstring || instring
511:
512:
513: instring = outstring
514: outstring = ""
515:
516:
517: do while pos('"',instring) > 0
518: outstring = outstring || left(instring,pos('"',instring)-1)
519: instring = right(instring, length(instring) - pos('"',instring))
520: end
521:
522: outstring = outstring || instring
523:
524:
525: instring = outstring
526:
527: outstring = ""
528:
529: nl = x2c("0A")
530:
531: do while pos(nl,instring) > 0
532: outstring = outstring || left(instring,pos(nl,instring) -1)
533: instring = right(instring, length(instring) - pos(nl,instring) )
534: end
535:
536: outstring = outstring || instring
537:
538: return outstring
539:
540:
541: MakeRBNList:
542: procedure expose GuiKey
543:
544: rbnlist = 0
545:
546: ADDRESS PROACTION
547:
548: /* create a list object */
549: /*
550: * the exec list is stored on the GUIs object list and cleaned up for us on exit
551: * so we only need to care about creating it. The contents are *not* cleaned up
552: * however, so we must pat attantiont disposing of the objects we place there!
553: */
554:
555: 'NEWGUIOBJECT GUIID ' || GUIKEY || ' OBJECTTYPE "GUIOBJ_List" '
556:
557: if rc = 0 then do
558: rbnlist = result
559:
560: /* Now we create the radiobutton nodes and add them to our list */
561: rbntags.0 = 3
562: rbntags.1.TAGNAME = "RBNA_Label"
563: rbntags.1.TAGVALUE = "Left Justify"
564: rbntags.2.TAGNAME = "RBNA_HintInfo"
565: rbntags.2.TAGVALUE = "Align Text Left"
566: rbntags.3.TAGNAME = "RBNA_Disabled"
567: rbntags.3.TAGVALUE = 0
568:
569: 'ALLOCRADIOBUTTONNODE GUIID ' || GUIKEY || ' TAGSTEM rbntags'
570:
571: if rc = 0 then do
572: rbn = result
573: 'ADDTAIL GUIID ' || GUIKEY || ' LISTID ' || rbnlist || ' NODEID ' || rbn
574: end
575:
576: rbntags.1.TAGNAME = "RBNA_Label"
577: rbntags.1.TAGVALUE = "Right Justify"
578: rbntags.2.TAGNAME = "RBNA_HintInfo"
579: rbntags.2.TAGVALUE = "Align Text Right"
580: rbntags.3.TAGNAME = "RBNA_Disabled"
581: rbntags.3.TAGVALUE = 0
582:
583: 'ALLOCRADIOBUTTONNODE GUIID ' || GUIKEY || ' TAGSTEM rbntags'
584:
585: if rc = 0 then do
586: rbn = result
587: 'ADDTAIL GUIID ' || GUIKEY || ' LISTID ' || rbnlist || ' NODEID ' || rbn
588: end
589:
590: rbntags.1.TAGNAME = "RBNA_Label"
591: rbntags.1.TAGVALUE = "Centre Justify"
592: rbntags.2.TAGNAME = "RBNA_HintInfo"
593: rbntags.2.TAGVALUE = "Centre text"
594: rbntags.3.TAGNAME = "RBNA_Disabled"
595: rbntags.3.TAGVALUE = 0
596:
597: 'ALLOCRADIOBUTTONNODE GUIID ' || GUIKEY || ' TAGSTEM rbntags'
598:
599: if rc = 0 then do
600: rbn = result
601: 'ADDTAIL GUIID ' || GUIKEY || ' LISTID ' || rbnlist || ' NODEID ' || rbn
602: end
603: end
604: return rbnlist
605:
606: FreeRBNList:
607: procedure expose GUIKEY
608:
609: parse arg rbnlist
610:
611: /* we remove each node and free it using the dedicated FREERADIOBUTTONNODE call */
612:
613: do nodes = 1
614: 'REMTAIL GUIID ' || GUIKEY || ' LISTID ' || rbnlist
615: if rc ~= 0 then leave nodes
616: rbn = result
617: 'FREERADIOBUTTONNODE GUIID ' || GUIKEY || ' NODEID ' rbn
618: if rc ~= 0 then say "Problem Freeing RadioButtonNode id " rbn
619: end
620:
621:
622: return
623: