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: