The latest version of this document can be found at www.broad.ology.org.uk/amiga/sketchblock/maketext_rexx.html

SketchBlock 2.8 - SketchBlock (SVN: 133:364M)

Example Code - maketext.rexx

Download Source
     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: