home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 22 / CD_ASCQ_22_0695.iso / win / prg / lb11wi / ffexp.bas < prev    next >
BASIC Source File  |  1995-02-02  |  60KB  |  1,887 lines

  1.  
  2.     'Freeform Lite for Liberty BASIC
  3.  
  4.     'Copyright 1995, Shoptalk Systems
  5.     'All Rights Reserved
  6.  
  7.     'This program lets you graphically lay out
  8.     'windows and their controls, and then converts
  9.     'this visual layout to Liberty BASIC source code
  10.     'that you can paste into your Liberty BASIC
  11.     'programming session.  This current version is
  12.     'for the Windows version of Liberty BASIC
  13.     'but with only a little modification, it can be
  14.     'made to work with the OS/2 version
  15.  
  16.     'This program REQUIRES Liberty BASIC for Windows v1.1
  17.     'or better
  18.  
  19.     'set up an arrays to hold control specs
  20.  
  21.  
  22.     dim type$(100)
  23.     dim label$(100)
  24.     dim names$(100)
  25.     dim xOrg(100)
  26.     dim yOrg(100)
  27.     dim width(100)
  28.     dim height(100)
  29.     dim corner$(100)
  30.     dim branchLabel$(100)
  31.     dim segment(100)
  32.     dim handle$(100)
  33.     dim bmpName$(100)
  34.     dim arrayName$(100)
  35.     dim menu$(20)
  36.     dim menuItem$(20, 30)
  37.     dim menuItemLocal$(30)
  38.     dim menuItemCount(20)
  39.     dim winType$(20)
  40.     index = 0
  41.     resizeable$ = " combobox textbox listbox groupbox windowframe "   'add more as you go
  42.     newControlNumber = 0  'increment by one each time a new control is added
  43.     qu$ = chr$(34)
  44.     controlsThatBranch$ = " button listbox combobox bmpbutton checkbox radiobutton "
  45.     snapOn = 1
  46.     xInterval = 8
  47.     yInterval = 5
  48.  
  49.     one = 1 ' use this to counter a compile-time bug in LB 1.1
  50.     'Wherever you see an expression: ??? - one   or  ??? - (2*one)
  51.  
  52.  
  53.     formName$ = "untitled.fre"
  54.     windowXOrigin = 70
  55.     windowYOrigin = 10
  56.     windowXExtent = 550
  57.     windowYExtent = 410
  58.     windowLabel$ = "untitled"
  59.     windowType$ = "dialog"
  60.     winHandle$ = "#main"
  61.     menuCount = 0
  62.  
  63.     loadbmp "systemBox", "systembx.bmp"
  64.     loadbmp "minBox", "minbx.bmp"
  65.     loadbmp "maxBox", "maxbx.bmp"
  66.     loadbmp "comboButton", "cmbobttn.bmp"
  67.     loadbmp "radioButton", "radibttn.bmp"
  68.     loadbmp "checkBox", "checkbox.bmp"
  69.     loadbmp "scrollUp", "scrlup.bmp"
  70.     loadbmp "scrollDown", "scrldown.bmp"
  71.     loadbmp "scrollRight", "scrlrght.bmp"
  72.     loadbmp "scrollLeft", "scrlleft.bmp"
  73.  
  74.     winType$(0) = "window"
  75.     winType$(1) = "window_nf"
  76.     winType$(2) = "dialog"
  77.     winType$(3) = "dialog_nf"
  78.  
  79. [setUpWindowAndOpenIt]
  80.  
  81.     nomainwin
  82.  
  83.     menu #form, "&Files", "&New", [newFile], "&Open", [openFile], "&Save", [saveFile]
  84.     menu #form, "&Control", "&Inspect", [inspectControl], "&Delete", [deleteControl], |, "Move to &front", [moveToFront], "Move to &back", [moveToBack]
  85.     menu #form, "&Output", "&Produce Code", [produceCode], "Produce Code + Outline", [produceCodeAndOutline]
  86.     menu #form, "&Window", "&Title", [changeTitle], "T&ype", [changeWindowType], "&Handle", [changeHandle]
  87.     menu #form, "O&ptions", "&Auto Snap to Grid", [gridDialog]
  88.     menu #form, "&Menu", "&Add a Menu", [addAMenu], "&Remove a Menu", [removeMenu], "&Edit Menus", [editMenus]
  89.     bmpbutton #form, "textbttn.bmp", [addStaticText], UL, 5, 40
  90.     bmpbutton #form, "efldbttn.bmp", [addField], UL, 35, 40
  91.     bmpbutton #form, "bttnbttn.bmp", [addButton], UL, 5, 70
  92.     bmpbutton #form, "usrdbttn.bmp", [addBmpButton], UL, 35, 70
  93.     bmpbutton #form, "lboxbttn.bmp", [addListBox], UL, 5, 100
  94.     bmpbutton #form, "cboxbttn.bmp", [addComboBox], UL, 35, 100
  95.     bmpbutton #form, "rdiobttn.bmp", [addRadioButton], UL, 5, 130
  96.     bmpbutton #form, "chbxbttn.bmp", [addCheckBox], UL, 35, 130
  97.     bmpbutton #form, "gboxbttn.bmp", [addGroupBox], UL, 5, 160
  98.  
  99.     open "FreeForm v1.0 for Liberty BASIC" for graphics_fs_nsb as #form
  100.     print #form, "font fixedsys 8 15";
  101.     print #form, "trapclose [quit]";
  102.  
  103.  
  104. [drawTheWindow]
  105.  
  106.     gosub [renderWindow]
  107.     gosub [addWindowFrame]
  108.  
  109.     goto [setForSelection]
  110.  
  111.  
  112. [addWindowFrame]    'add the window frame as the first object
  113.  
  114.     objectCount = objectCount + 1
  115.     idx = objectCount
  116.     xOrg(idx) = 70
  117.     yOrg(idx) = 10
  118.     width(idx) = 550
  119.     height(idx) = 410
  120.     type$(idx) = "windowframe"
  121.     return
  122.  
  123.  
  124. [addButton]     'add a new button to the form
  125.  
  126.     text$ = ""
  127.     prompt "Please enter text for this button"; text$
  128.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  129.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  130.     if text$ = "" then [inputLoop]
  131.  
  132.     newControlNumber = newControlNumber + 1
  133.     objectCount = objectCount + 1
  134.     idx = objectCount
  135.     xOrg(idx) = 80
  136.     yOrg(idx) = 40
  137.     type$(idx) = "button"
  138.     names$(idx) = "button"+str$(newControlNumber)
  139.     corner$(idx) = "UL"
  140.     label$(idx) = text$
  141.     branchLabel$(idx) = "["+names$(idx)+"Click]"
  142.     gosub [renderButton]
  143.     goto [inputLoop]
  144.  
  145.  
  146. [addBmpButton]     'add a new bmpButton to the form
  147.  
  148.     bmp$ = ""
  149.     filedialog "Select a bitmap for this button", "*.bmp", bmp$
  150.     if bmp$ = "" then [inputLoop]
  151.  
  152.     newControlNumber = newControlNumber + 1
  153.     objectCount = objectCount + 1
  154.     idx = objectCount
  155.     xOrg(idx) = 100
  156.     yOrg(idx) = 50
  157.     type$(idx) = "bmpbutton"
  158.     names$(idx) = "bmpbutton"+str$(newControlNumber)
  159.     corner$(idx) = "UL"
  160.     bmpName$(idx) = bmp$
  161.     loadbmp bmp$, bmp$
  162.     branchLabel$(idx) = "["+names$(idx)+"Click]"
  163.     gosub [renderBmpButton]
  164.     goto [inputLoop]
  165.  
  166.  
  167. [addField]     'add a new field (textBox) to the form
  168.  
  169.     newControlNumber = newControlNumber + 1
  170.     objectCount = objectCount + 1
  171.     idx = objectCount
  172.     xOrg(idx) = 100
  173.     yOrg(idx) = 50
  174.     width(idx) = 100
  175.     height(idx) = 25
  176.     type$(idx) = "textbox"
  177.     names$(idx) = "textbox"+str$(newControlNumber)
  178.     gosub [renderTextBox]
  179.     goto [inputLoop]
  180.  
  181.  
  182. [addComboBox]     'add a new combobox to the form
  183.  
  184.     newControlNumber = newControlNumber + 1
  185.     objectCount = objectCount + 1
  186.     idx = objectCount
  187.     xOrg(idx) = 100
  188.     yOrg(idx) = 50
  189.     width(idx) = 100
  190.     height(idx) = 100
  191.     type$(idx) = "combobox"
  192.     names$(idx) = "combobox"+str$(newControlNumber)
  193.     branchLabel$(idx) = "["+names$(idx)+"DoubleClick]"
  194.     arrayName$(idx) = "array$("
  195.     gosub [renderComboBox]
  196.     goto [inputLoop]
  197.  
  198.  
  199. [addListBox]     'add a new listbox to the form
  200.  
  201.     newControlNumber = newControlNumber + 1
  202.     objectCount = objectCount + 1
  203.     idx = objectCount
  204.     xOrg(idx) = 100
  205.     yOrg(idx) = 50
  206.     width(idx) = 100
  207.     height(idx) = 100
  208.     type$(idx) = "listbox"
  209.     names$(idx) = "listbox"+str$(newControlNumber)
  210.     branchLabel$(idx) = "["+names$(idx)+"DoubleClick]"
  211.     arrayName$(idx) = "array$("
  212.     gosub [renderListBox]
  213.     goto [inputLoop]
  214.  
  215.  
  216. [addStaticText]     'add statictext to the form
  217.  
  218.     text$ = ""
  219.     prompt "Please enter the text you would like to add:"; text$
  220.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  221.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  222.     if text$ = "" then [inputLoop]
  223.  
  224.     newControlNumber = newControlNumber + 1
  225.     objectCount = objectCount + 1
  226.     idx = objectCount
  227.     xOrg(idx) = 100
  228.     yOrg(idx) = 50
  229.     type$(idx) = "statictext"
  230.     names$(idx) = "statictext"+str$(newControlNumber)
  231.     corner$(idx) = ""
  232.     label$(idx) = text$
  233.     gosub [renderStaticText]
  234.     goto [inputLoop]
  235.  
  236.  
  237. [addGroupBox]     'add groupbox to the form
  238.  
  239.     text$ = "No Text"
  240.     prompt "Please enter the text this GroupBox :"; text$
  241.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  242.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  243.     if text$ = "" then [inputLoop]
  244.     if text$ = "No Text" then text$ = ""
  245.  
  246.     newControlNumber = newControlNumber + 1
  247.     objectCount = objectCount + 1
  248.     idx = objectCount
  249.     xOrg(idx) = 100
  250.     yOrg(idx) = 50
  251.     width(idx) = 100
  252.     height(idx) = 100
  253.     type$(idx) = "groupbox"
  254.     names$(idx) = "groupbox"+str$(newControlNumber)
  255.     corner$(idx) = ""
  256.     label$(idx) = text$
  257.     gosub [renderGroupBox]
  258.     goto [inputLoop]
  259.  
  260.  
  261. [addRadioButton]     'add radiobutton to the form
  262.  
  263.     text$ = ""
  264.     prompt "Please enter a label for the radiobutton:"; text$
  265.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  266.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  267.     if text$ = "" then [inputLoop]
  268.  
  269.     newControlNumber = newControlNumber + 1
  270.     objectCount = objectCount + 1
  271.     idx = objectCount
  272.     xOrg(idx) = 100
  273.     yOrg(idx) = 50
  274.     type$(idx) = "radiobutton"
  275.     names$(idx) = "radiobutton"+str$(newControlNumber)
  276.     corner$(idx) = "UL"
  277.     label$(idx) = text$
  278.     branchLabel$(idx) = "["+names$(idx)+"Set] ["+names$(idx)+"Reset]"
  279.     gosub [renderRadioButton]
  280.     goto [inputLoop]
  281.  
  282.  
  283. [addCheckBox]     'add checkbox to the form
  284.  
  285.     text$ = ""
  286.     prompt "Please enter a label for the checkbox"; text$
  287.     if left$(text$, 1) = qu$ then text$ = mid$(text$, 2)
  288.     if right$(text$, 1) = qu$ then text$ = left$(text$, len(text$) - 1)
  289.     if text$ = "" then [inputLoop]
  290.  
  291.     newControlNumber = newControlNumber + 1
  292.     objectCount = objectCount + 1
  293.     idx = objectCount
  294.     xOrg(idx) = 100
  295.     yOrg(idx) = 50
  296.     type$(idx) = "checkbox"
  297.     names$(idx) = "checkbox"+str$(newControlNumber)
  298.     corner$(idx) = "UL"
  299.     label$(idx) = text$
  300.     branchLabel$(idx) = "["+names$(idx)+"CheckboxSet] ["+names$(idx)+"CheckboxReset]"
  301.     gosub [renderCheckBox]
  302.     goto [inputLoop]
  303.  
  304.  
  305. [inputLoop]
  306.  
  307.     input r$
  308.     goto [inputLoop]
  309.  
  310.  
  311. [renderWindow]
  312.  
  313.     'render the window depending on the value of windowType$
  314.  
  315.     xOrg = windowXOrigin
  316.     yOrg = windowYOrigin
  317.     xExt = windowXExtent
  318.     yExt = windowYExtent
  319.  
  320.     print #form, "cls";
  321.     print #form, "backcolor white ; color black ; down ; size 1";
  322.     print #form, "place "; xOrg + 4; " "; yOrg + 4;
  323.     print #form, "boxfilled "; xOrg + xExt - 4; " "; yOrg + yExt - 4;
  324.     if instr(windowType$, "_nf") > 0 then [noResizingFrame]
  325.  
  326.     'draw resizing frame
  327.     print #form, "color lightgray ; size 3";
  328.     if windowType$ = "dialog" then print #form, "color darkgray";
  329.     print #form, "place "; xOrg + 2; " "; yOrg + 2;
  330.     print #form, "box "; xOrg + xExt - 2; " "; yOrg + yExt - 2;
  331.     print #form, "color black ; size 1";
  332.     print #form, "place "; xOrg; " "; yOrg;
  333.     print #form, "box "; xOrg + xExt; " "; yOrg + yExt;
  334.  
  335.   [noResizingFrame]
  336.     'draw titlebar
  337.     print #form, "color black ; backcolor darkblue";
  338.     if left$(windowType$, 6) = "dialog" then print #form, "backcolor darkgray";
  339.     print #form, "place "; 4 + xOrg; " "; 4 + yOrg;
  340.     print #form, "boxfilled "; xOrg + xExt - 4; " "; 4 + yOrg + 20;
  341.     print #form, "place "; int(xExt/2) + xOrg - len(windowLabel$) * 4; " "; 18 + yOrg;
  342.     print #form, "color white";
  343.     print #form, "\"; windowLabel$;
  344.  
  345.     'draw buttons
  346.     print #form, "drawbmp systemBox "; xOrg + 4; " "; 4 + yOrg;
  347.     print #form, "backcolor white ; color black ; down ; size 1";
  348.     if windowType$ = "dialog" then print #form, "color white" ;
  349.     print #form, "place "; xOrg + 4; " "; yOrg + 4;
  350.     print #form, "box "; xOrg + xExt - 4; " "; yOrg + yExt - 4;
  351.     if left$(windowType$, 6) = "dialog" then [drawMenus]
  352.     if instr(windowType$, "_nf") then print #form, "drawbmp minBox "; xOrg + xExt - 24; " "; 4 + yOrg; : goto [drawMenus]
  353.     print #form, "drawbmp minBox "; xOrg + xExt - 43; " "; 4 + yOrg;
  354.     print #form, "drawbmp maxBox "; xOrg + xExt - 24; " "; 4 + yOrg;
  355.  
  356.   [drawMenus]
  357.     if menuCount = 0 then [dontDrawMenus]
  358.     print #form, "color black ; backcolor white" ;
  359.     print #form, "place "; 4 + xOrg; " "; 23 + yOrg;
  360.     print #form, "box "; xOrg + xExt - 4; " "; 24 + yOrg + 20 ;
  361.     string$ = ""
  362.     underline$ = ""
  363.     for x = 0 to menuCount - 1
  364.         item$ = menu$(x)
  365.         hkIndex = instr(menu$(x), "&")
  366.         if hkIndex = 0 then [noHotKey]
  367.         item$ = left$(item$, hkIndex - 1) + mid$(item$, hkIndex + 1)
  368.         underline$ = underline$ + chr$(len(string$)+hkIndex)
  369.       [noHotKey]
  370.         string$ = string$ + item$ + "  "
  371.     next x
  372.     print #form, "color black ; backcolor white" ;
  373.     print #form, "place "; xOrg + 10; " "; 38 + yOrg ;
  374.     print #form, "\"; string$;
  375.     if len(underline$) = 0 then [dontDrawMenus]
  376.     for x = 1 to len(underline$)
  377.         print #form, "place "; xOrg + 10 + (asc(mid$(underline$, x, 1)) - 1) * 8; " "; yOrg + 40 ;
  378.         print #form, "north ; turn 90 ; go 8";
  379.     next x
  380.  
  381.   [dontDrawMenus]
  382.     print #form, "flush" ;
  383.  
  384.     return
  385.  
  386.  
  387. [changeTitle]
  388.  
  389.     'change the window's title
  390.     prompt "Specify the window's title"; windowLabel$
  391.     gosub [redrawAll]
  392.     goto [inputLoop]
  393.  
  394.  
  395. [changeWindowType]
  396.  
  397.     WindowWidth = 380
  398.     WindowHeight = 200
  399.  
  400.     'change the window's type
  401.     statictext #type.statictext1, "Select the type of window desired:", 14, 11, 272, 20
  402.     combobox #type.types, winType$(, [selectWinType], 22, 36, 256, 115
  403.     button #type, "Accept", [acceptWinType], UL, 302, 36
  404.     button #type, "Cancel", [cancelWinType], UL, 302, 71
  405.     open "Select Window Type" for dialog as #type
  406.     print #type.types, "select "; windowType$ 
  407.     print #type, "trapclose [cancelWinType]"
  408.     defaultType$ = windowType$
  409.  
  410.     goto [inputLoop]
  411.  
  412.  
  413. [selectWinType]   'Perform action for the combobox named 'types'
  414.  
  415.     'select the type of window desired
  416.     print #type.types, "selection?";
  417.     input #type.types, defaultType$
  418.  
  419.     goto [inputLoop]
  420.  
  421.  
  422. [acceptWinType]   'Perform action for the button named 'acceptWinType'
  423.  
  424.     'accept the selected window type
  425.     windowType$ = defaultType$
  426.     close #type
  427.     gosub [redrawAll]
  428.     goto [inputLoop]
  429.  
  430.  
  431. [cancelWinType]   'Perform action for the button named 'cancelWinType'
  432.  
  433.     'close the window, don't accept type change
  434.     close #type
  435.     goto [inputLoop]
  436.  
  437.  
  438. [changeHandle]
  439.  
  440.     'change the window's handle
  441.     prompt "Specify the window's handle (starts with a #)"; result$
  442.     if result$ = "" then [inputLoop]
  443.     winHandle$ = result$
  444.     if left$(winHandle$, 1) <> "#" then winHandle$ = "#" + winHandle$ : notice "Window handle defaults to: " + winHandle$
  445.     goto [inputLoop]
  446.  
  447.  
  448. [renderButton]
  449.  
  450.     'render the statictext at idx.
  451.     'assume an font 8 bits wide
  452.     type$(idx) = "button"
  453.     width(idx) = 8 * (len(label$(idx))) + 10
  454.     height(idx) = 15 + 10
  455.     xOrgIdx = xOrg(idx)
  456.     yOrgIdx = yOrg(idx)
  457.     print #form, "place "; xOrgIdx; " "; yOrgIdx ;
  458.     print #form, "place "; xOrgIdx; " "; yOrgIdx ;
  459.     print #form, "color black ; backcolor lightgray ; size 1" ;
  460.     print #form, "down ; boxfilled "; xOrgIdx+width(idx); " "; yOrgIdx+height(idx) ;
  461.     print #form, "size 2 ; color darkgray ; place "; xOrgIdx+2; " "; yOrgIdx+2 ;
  462.     print #form, "box "; xOrgIdx+width(idx)-1; " "; yOrgIdx+height(idx)-1 ;
  463.     print #form, "color white" ;
  464.     print #form, "place  "; xOrgIdx+2; " "; yOrgIdx+height(idx)-3 ;
  465.     print #form, "goto "; xOrgIdx+2; " "; yOrgIdx+2 ;
  466.     print #form, "goto "; xOrgIdx+width(idx)-3; " "; yOrgIdx+2 ;
  467.     print #form, "color black ; backcolor lightgray ; size 1" ;
  468.     print #form, "place "; xOrgIdx+4; " "; yOrgIdx+17 ;
  469.     print #form, "\"; label$(idx);
  470.     print #form, "up ; flush" ;
  471.     print #form, "segment" : input #form, id
  472.     segment(idx) = id
  473.  
  474.     return
  475.  
  476.  
  477. [renderStaticText]
  478.  
  479.     'render the statictext at idx.
  480.     'assume an font 8 bits wide, 15 high
  481.     type$(idx) = "statictext"
  482.     width(idx) = 8 * len(label$(idx))
  483.     height(idx) = 20
  484.     print #form, "place "; xOrg(idx); " "; yOrg(idx)+15-3 ; " ; place "; xOrg(idx); " "; yOrg(idx)+15-3 ;
  485.     print #form, "down ; color black ; backcolor white" ;
  486.     print #form, "\"; label$(idx);
  487.     print #form, "up ; flush" ;
  488.     print #form, "segment" : input #form, id
  489.     segment(idx) = id
  490.  
  491.     return
  492.  
  493.  
  494. [renderRadioButton]
  495.  
  496.     'render the radiobutton at idx.
  497.     'assume an font 8 bits wide, 15 high
  498.     type$(idx) = "radiobutton"
  499.     width(idx) = 8 * len(label$(idx)) + 16
  500.     height(idx) = 15
  501.     print #form, "down" ;
  502.     print #form, "place "; xOrg(idx); " "; yOrg(idx);
  503.     print #form, "drawbmp radioButton "; xOrg(idx); " "; yOrg(idx);
  504.     print #form, "color black ; backcolor white" ;
  505.     print #form, "place "; xOrg(idx)+16; " "; yOrg(idx)+15-3 ;
  506.     print #form, "\"; label$(idx);
  507.     print #form, "up ; flush" ;
  508.     print #form, "segment" : input #form, id
  509.     segment(idx) = id
  510.  
  511.     return
  512.  
  513.  
  514. [renderCheckBox]
  515.  
  516.     'render the checkbox at idx.
  517.     'assume an font 8 bits wide, 15 high
  518.     type$(idx) = "checkbox"
  519.     width(idx) = 8 * len(label$(idx)) + 16
  520.     height(idx) = 15
  521.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  522.     print #form, "down" ;
  523.     print #form, "drawbmp checkBox "; xOrg(idx); " "; yOrg(idx);
  524.     print #form, "color black ; backcolor white" ;
  525.     print #form, "place "; xOrg(idx)+16; " "; yOrg(idx)+15-3 ;
  526.     print #form, "\"; label$(idx);
  527.     print #form, "up ; flush" ;
  528.     print #form, "segment" : input #form, id
  529.     segment(idx) = id
  530.  
  531.     return
  532.  
  533.  
  534. [renderBmpButton]
  535.  
  536.     'render the bmpbutton at idx.
  537.     'assume an font 8 bits wide
  538.     type$(idx) = "bmpbutton"
  539.     width(idx) = 20
  540.     height(idx) = 20
  541.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  542.     print #form, "drawbmp "; bmpName$(idx); " "; xOrg(idx); " "; yOrg(idx);
  543.     print #form, "flush" ;
  544.     print #form, "segment" : input #form, id
  545.     segment(idx) = id
  546.  
  547.     return
  548.  
  549.  
  550. [renderComboBox]
  551.  
  552.     'render the comboBox at idx.
  553.     type$(idx) = "combobox"
  554.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  555.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  556.     print #form, "color black ; backcolor white ; size 1" ;
  557.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx)-24; " "; yOrg(idx)+22 ;
  558.     print #form, "drawbmp comboButton "; xOrg(idx)+width(idx)-16 ; " "; yOrg(idx) ;
  559.     print #form, "up ; flush" ;
  560.     print #form, "segment" : input #form, id
  561.     segment(idx) = id
  562.  
  563.     return
  564.  
  565. [renderTextBox]
  566.  
  567.     'render the textbox at idx.
  568.     type$(idx) = "textbox"
  569.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ; " ; place "; xOrg(idx); " "; yOrg(idx) ;
  570.     print #form, "color black ; backcolor white ; size 1" ;
  571.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  572.     print #form, "up ; flush" ;
  573.     print #form, "segment" : input #form, id
  574.     segment(idx) = id
  575.  
  576.     return
  577.  
  578.  
  579. [renderListBox]
  580.  
  581.     'render the listbox at idx.
  582.     type$(idx) = "listbox"
  583.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  584.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  585.     print #form, "color black ; backcolor white ; size 1" ;
  586.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  587.     print #form, "color black ; backcolor lightgray" ;
  588.     print #form, "place "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  589.     print #form, "boxfilled "; xOrg(idx)+width(idx); " "; yOrg(idx)+height(idx) ;
  590.     print #form, "drawbmp scrollUp "; xOrg(idx)+width(idx)-17; " "; yOrg(idx);
  591.     print #form, "drawbmp scrollDown "; xOrg(idx)+width(idx)-17; " "; yOrg(idx)+height(idx)-17;
  592.     print #form, "up ; flush" ;
  593.     print #form, "segment" : input #form, id
  594.     segment(idx) = id
  595.  
  596.     return
  597.  
  598.  
  599. [renderGroupBox]
  600.  
  601.     'render the groupbox at idx.  assume a font 8x15.
  602.     type$(idx) = "groupbox"
  603.     print #form, "place "; xOrg(idx); " "; yOrg(idx) ;
  604.     print #form, "place "; xOrg(idx)+4 ; " "; yOrg(idx)+8 ;
  605.     print #form, "color black ; backcolor white ; size 1" ;
  606.     print #form, "down ; boxfilled "; xOrg(idx)+width(idx)-4; " "; yOrg(idx)+height(idx)-7 ;
  607.     print #form, "place "; xOrg(idx)+8; " "; yOrg(idx)+15 ;
  608.     print #form, "\"; label$(idx);
  609.     print #form, "up ; flush" ;
  610.     print #form, "segment" : input #form, id
  611.     segment(idx) = id
  612.  
  613.     return
  614.  
  615.  
  616. [inspectControl]
  617.  
  618.     'pop up a dialog for displaying/modifying control
  619.     'properties
  620.  
  621.     if index < 2 then [inputLoop]
  622.  
  623.     if inspectIsOpen = 1 then close #inspect
  624.  
  625.     WindowHeight = 200
  626.     WindowWidth = 430
  627.  
  628.     textbox #inspect.labelField, 140, 15, 168, 25
  629.     textbox #inspect.nameField, 140, 46, 168, 25
  630.     textbox #inspect.branchLabelField, 140, 77, 168, 25
  631.     textbox #inspect.arrayNameField, 140, 108, 168, 25
  632.     statictext #inspect.type, "Label:", 17, 21, 200, 20
  633.     statictext #inspect.type, "Name:", 17, 52, 200, 20
  634.     statictext #inspect.statictext2, "Branch Label(s):", 17, 83, 200, 20
  635.     statictext #inspect.statictext4, "Array:", 17, 113, 114, 20
  636.     button #inspect, "Accept", [acceptInspect], UL, 320, 16
  637.     button #inspect, "Cancel", [cancelInspect], UL, 320, 46
  638.     statictext #inspect.statictext15, "n/a =", 322, 79, 40, 20
  639.     statictext #inspect.statictext16, "not applicable", 322, 95, 112, 20
  640.     open "Modify Control" for dialog as #inspect
  641.     print #inspect, "trapclose [cancelInspect]";
  642.     inspectIsOpen = 1
  643.  
  644.     print #inspect.labelField, label$(index)
  645.     print #inspect.type, type$(index) + " name:"
  646.     print #inspect.nameField, names$(index)
  647.     print #inspect.branchLabelField, branchLabel$(index)
  648.     if instr(" button statictext checkbox radiobutton groupbox ", type$(index)) = 0 then print #inspect.labelField, "n/a"
  649.     if instr(controlsThatBranch$, type$(index)) = 0 then print #inspect.branchLabelField, "n/a"
  650.     if instr(" listbox combobox ", type$(index)) > 0 then print #inspect.arrayNameField, arrayName$(index) else print #inspect.arrayNameField, "n/a"
  651.  
  652.     goto [inputLoop]
  653.  
  654.  
  655. [acceptInspect]
  656.  
  657.     'set the properties as modified by the user
  658.     isModified = 1  'the form has been modified
  659.     hasLabel =  instr(" button statictext checkbox radiobutton groupbox ", type$(index))
  660.     if hasLabel > 0 then print #inspect.labelField, "!contents?" : input #inspect.labelField, label$ : label$(index) = label$
  661.     print #inspect.nameField, "!contents?" : input #inspect.nameField, names$ : names$(index) = names$
  662.     branches = instr(controlsThatBranch$, type$(index))
  663.     if branches > 0 then print #inspect.branchLabelField, "!contents?" : input #inspect.branchLabelField, bLabel$ : branchLabel$(index) = bLabel$
  664.     usesArray = instr(" listbox combobox ", type$(index))
  665.     if usesArray > 0 then print #inspect.arrayNameField, "!contents?" : input #inspect.arrayNameField, aName$ : arrayName$(index) = aName$
  666.     close #inspect
  667.     inspectIsOpen = 0
  668.  
  669.     if hasLabel > 0 then gosub [redrawAll]
  670.  
  671.     goto [inputLoop]
  672.  
  673.  
  674. [cancelInspect]
  675.  
  676.     'close the inspector window
  677.     close #inspect
  678.     inspectIsOpen = 0
  679.  
  680.     goto [inputLoop]
  681.  
  682.  
  683. [setForSelection]
  684.  
  685.     'set up event handling for the default behavior (selection)
  686.     print #form, "when leftButtonDown [selectControl]";
  687.     print #form, "when leftButtonDouble [inspectControl]";
  688.     print #form, "when leftButtonMove" ;
  689.     print #form, "when leftButtonUp" ;
  690.  
  691.     goto [inputLoop]
  692.  
  693.  
  694. [selectControl]
  695.  
  696.     'set up event handling
  697.     print #form, "when leftButtonUp [setForSelection]" ;
  698.     print #form, "when leftButtonDown" ;
  699.  
  700.     'highlight the control at the mouse click position
  701.     x = MouseX : y = MouseY
  702.  
  703.     if index = 0 then [dontDeselect]
  704.  
  705.     'check to see if the resize handle has been clicked on, if applicable
  706.     if instr(resizeable$, type$(index)) = 0 then [deselect]
  707.     if x < xOrg(index)+width(index)-3 or x > xOrg(index)+width(index)+3 then [deselect]
  708.     if y < yOrg(index)+height(index)-3 or y > yOrg(index)+height(index)+3 then [deselect]
  709.     goto [resizeControl]
  710.  
  711. [deselect]
  712.     print #form, "delsegment "; selectId -1 ;
  713.     gosub [selectDeselect]
  714.     index = 0
  715.     print #form, "delsegment "; selectId - 1 ;
  716.  
  717. [dontDeselect]
  718.     gosub [determineControl]
  719.     if newIndex = 0 then [setUpMovementEvent]
  720.  
  721.     index = newIndex
  722.     gosub [selectDeselect]
  723.     lastMouseX = MouseX
  724.     lastMouseY = MouseY
  725.  
  726. [setUpMovementEvent]
  727.  
  728.     if type$(newIndex) = "windowframe" then [inputLoop]
  729.     print #form, "when leftButtonMove [beginObjectMove]" ;
  730.     goto [inputLoop]
  731.  
  732.  
  733. [determineControl]
  734.  
  735.     'based on x/y, determine which control is selected
  736.     'set newIndex to point to this control, if found
  737.     'otherwise set newIndex to 0
  738.  
  739.     if objectCount = 0 then return
  740.  
  741.     newIndex = 0
  742.     for i = objectCount to 1 step -1
  743.         if newIndex > 0 then [skipControl]
  744.         if type$(i) = "" then [skipControl]
  745.         if x < xOrg(i) or x > xOrg(i)+width(i) then [skipControl]
  746.         if y < yOrg(i) or y > yOrg(i)+height(i) then [skipControl]
  747.         newIndex = i
  748.         i = 1
  749. [skipControl]
  750.     next i
  751.  
  752.     return
  753.  
  754.  
  755. [selectDeselect]
  756.  
  757.     'select or deselect the object at index by drawing handles
  758.     xOrgIdx = xOrg(index)
  759.     yOrgIdx = yOrg(index)
  760.     xow = xOrgIdx+width(index)
  761.     yoh = yOrgIdx+height(index)
  762.     print #form, "rule xor ; down";
  763.     if type$(index) = "windowframe" then [drawSizingHandle]
  764.     print #form, "color darkgray ; backcolor white" ;
  765.     print #form, "place "; xOrgIdx-3; " "; yOrgIdx-3 ;
  766.     print #form, "boxfilled "; xOrgIdx+3; " "; yOrgIdx+3 ;
  767.     print #form, "place "; xow-3; " "; yOrgIdx-3 ;
  768.     print #form, "boxfilled "; xow+3; " "; yOrgIdx+3 ;
  769.     print #form, "place "; xOrgIdx-3; " "; yoh-3 ;
  770.     print #form, "boxfilled "; xOrgIdx+3; " "; yoh+3 ;
  771.  
  772.   [drawSizingHandle]
  773.     if instr(resizeable$, type$(index)) > 0 then print #form, "backcolor black" ;
  774.     print #form, "place "; xow-3; " "; yoh-3 ;
  775.     print #form, "boxfilled "; xow+3; " "; yoh+3 ;
  776.     print #form, "rule over ; flush" ;
  777.     print #form, "segment" ;
  778.     input #form, selectId
  779.  
  780.  
  781.     return
  782.  
  783.  
  784. [beginObjectMove]
  785.  
  786.     'if the mouse has only slightly moved, ignore the event
  787.     if abs(MouseX - x) < 3 and abs(MouseY - y) < 3 then [inputLoop]
  788.  
  789.     'set up to begin moving the selected object
  790.     print #form, "delsegment "; selectId - 1 ;
  791.     print #form, "when leftButtonMove [additionalObjectMoves]" ;
  792.     print #form, "when leftButtonUp [acceptMovement]" ;
  793.  
  794.  
  795. [additionalObjectMoves]
  796.  
  797.     'adjust the position of the selected object, then draw an object frame the size of the
  798.     'selected object at that new position using xor rule.  set event handling to manage
  799.     'additional movements or termination of this object's movement.
  800.  
  801.  
  802.     gosub [eraseObjectFrame]
  803.  
  804.     gosub [snapMouse]
  805.     xOrg(index) = xOrg(index) + (MouseX - lastMouseX)
  806.     yOrg(index) = yOrg(index) + (MouseY - lastMouseY)
  807.     gosub [snapXY]
  808.     lastMouseX = MouseX
  809.     lastMouseY = MouseY
  810.  
  811.     print #form, "color black ; backcolor white ; size 1" ;
  812.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  813.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  814.     print #form, "rule over ; up ; flush" ;
  815.     print #form, "segment" : input #form, id
  816.     print #form, "delsegment "; id - 1 ;
  817.  
  818.     goto [inputLoop]
  819.  
  820.  
  821. [eraseObjectFrame]
  822.  
  823.     'erase the object frame (for movement)
  824.     print #form, "color black ; backcolor white ; size 1" ;
  825.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  826.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  827.     print #form, "rule over ; up ; flush" ;
  828.     print #form, "segment" : input #form, id
  829.     print #form, "delsegment "; id - 1 ;
  830.  
  831.     return
  832.  
  833.  
  834. [acceptResizing]
  835.  
  836.     if width(index) < 25 then width(index) = 25
  837.     if height(index) < 25 then height(index) = 25
  838.  
  839.     if type$(index) <> "windowframe" then [acceptMovement]
  840.     if width(index) < 100 then width(index) = 100
  841.     if height(index) < 50 then height(index) = 50
  842.     windowXExtent = width(index)
  843.     windowYExtent = height(index)
  844.  
  845.  
  846. [acceptMovement]
  847.  
  848.     'end the movement phase, and redraw all objects
  849.     print #form, "delsegment "; segment(index) - 1 ;
  850.     gosub [redrawAll]
  851.     'index = 0
  852.     gosub [selectDeselect]
  853.     firstObjectMove = false
  854.     goto [setForSelection]
  855.  
  856.  
  857. [resizeControl]
  858.  
  859.     'set up to begin resizing the selected object
  860.     firstObjectMove = true
  861.     print #form, "delsegment "; selectId - 1 ;
  862.     print #form, "when leftButtonMove [additionalResizes]" ;
  863.     print #form, "when leftButtonUp [acceptResizing]" ;
  864.     gosub [snapMouse]
  865.     lastMouseX = MouseX
  866.     lastMouseY = MouseY
  867.  
  868. [additionalResizes]
  869.  
  870.     'adjust the position of the selected object, then draw an object frame the size of the
  871.     'selected object at that new position using xor rule.  set event handling to manage
  872.     'additional movements or termination of this object's movement.
  873.  
  874.     if firstObjectMove = false then gosub [eraseObjectFrame]
  875.  
  876.     gosub [snapMouse]
  877.     width(index) = width(index) + (MouseX - lastMouseX)
  878.     height(index) = height(index) + (MouseY - lastMouseY)
  879.     gosub [snapWH]
  880.     lastMouseX = MouseX
  881.     lastMouseY = MouseY
  882.  
  883.     print #form, "color black ; backcolor white ; size 1" ;
  884.     print #form, "place "; xOrg(index); " "; yOrg(index) ;
  885.     print #form, "down ; rule xor ; box "; xOrg(index)+width(index); " "; yOrg(index)+height(index) ;
  886.     print #form, "rule over ; up ; flush" ;
  887.     print #form, "segment" : input #form, id
  888.     print #form, "delsegment "; id - 1 ;
  889.  
  890.     goto [inputLoop]
  891.  
  892.  
  893. [snapMouse]  'if snapOn is selected, then snap the mouse to grid
  894.  
  895.     if snapOn = 0 then return
  896.  
  897.     MouseX = int((MouseX + int(xInterval / 2)) / xInterval) * xInterval
  898.     MouseY = int((MouseY + int(yInterval / 2)) / yInterval) * yInterval
  899.     return
  900.  
  901.  
  902. [snapWH]  'if snapOn is selected, then snap the width & height to grid
  903.  
  904.     if snapOn = 0 then return
  905.  
  906.     width(index) = int((width(index) + int(xInterval / 2)) / xInterval) * xInterval
  907.     height(index) = int((height(index) + int(yInterval / 2)) / yInterval) * yInterval
  908.     return
  909.  
  910.  
  911. [snapXY]  'if snapOn is selected, then snap the x,y position to grid
  912.  
  913.     if snapOn = 0 then return
  914.  
  915.     xOrg(index) = int((xOrg(index) + int(xInterval / 2)) / xInterval) * xInterval
  916.     yOrg(index) = int((yOrg(index) + int(yInterval / 2)) / yInterval) * yInterval
  917.     return
  918.  
  919.  
  920. [redrawAll]
  921.  
  922.     'redraw all controls
  923.     isModified = 1  'the form has been modified
  924.     print #form, "cls";
  925.     index = 0
  926.     gosub [renderWindow]
  927.     if objectCount = 0 then return
  928.     for idx = 1 to objectCount
  929.         typeIdx$ = type$(idx)
  930.         if typeIdx$ = "textbox" then gosub [renderTextBox] : goto [redrawNext]
  931.         if typeIdx$ = "statictext" then gosub [renderStaticText] : goto [redrawNext]
  932.         if typeIdx$ = "button" then gosub [renderButton] : goto [redrawNext]
  933.         if typeIdx$ = "combobox" then gosub [renderComboBox] : goto [redrawNext]
  934.         if typeIdx$ = "listbox" then gosub [renderListBox] : goto [redrawNext]
  935.         if typeIdx$ = "bmpbutton" then gosub [renderBmpButton] : goto [redrawNext]
  936.         if typeIdx$ = "radiobutton" then gosub [renderRadioButton] : goto [redrawNext]
  937.         if typeIdx$ = "checkbox" then gosub [renderCheckBox] : goto [redrawNext]
  938.         if typeIdx$ = "groupbox" then gosub [renderGroupBox]
  939.       [redrawNext]
  940.     next idx
  941.  
  942.     return
  943.  
  944. [moveToBack]
  945.  
  946.     'move the selected control to the back (first item drawn)
  947.     if index < 2 or objectCount < 2 then [inputLoop]
  948.     if index = 2 then gosub [redrawAll] : goto [inputLoop]
  949.  
  950.     tmpType$ = type$(index)
  951.     tmpLabel$ = label$(index)
  952.     tmpNames$ = names$(index)
  953.     tmpXOrigin = xOrg(index)
  954.     tmpYOrigin = yOrg(index)
  955.     tmpWidth = width(index)
  956.     tmpHeight = height(index)
  957.     tmpCorner$ = corner$(index)
  958.     tmpBranchLabel$ = branchLabel$(index)
  959.     tmpSegment = segment(index)
  960.     tmpHandle$ = handle$(index)
  961.     tmpBmpName$ = bmpName$(index)
  962.  
  963.     for idx = index - 1 to 2 step -1
  964.         type$(idx+1) = type$(idx)
  965.         label$(idx+1) = label$(idx)
  966.         names$(idx+1) = names$(idx)
  967.         xOrg(idx+1) = xOrg(idx)
  968.         yOrg(idx+1) = yOrg(idx)
  969.         width(idx+1) = width(idx)
  970.         height(idx+1) = height(idx)
  971.         corner$(idx+1) = corner$(idx)
  972.         branchLabel$(idx+1) = branchLabel$(idx)
  973.         segment(idx+1) = segment(idx)
  974.         handle$(idx+1) = handle$(idx)
  975.         bmpName$(idx+1) = bmpName$(idx)
  976.     next idx
  977.  
  978.     type$(2) = tmpType$
  979.     label$(2) = tmpLabel$
  980.     names$(2) = tmpNames$
  981.     xOrg(2) = tmpXOrigin
  982.     yOrg(2) = tmpYOrigin
  983.     width(2) = tmpWidth
  984.     height(2) = tmpHeight
  985.     corner$(2) = tmpCorner$
  986.     branchLabel$(2) = tmpBranchLabel$
  987.     segment(2) = tmpSegment
  988.     handle$(2) = tmpHandle$
  989.     bmpName$(2) = tmpBmpName$
  990.  
  991.     gosub [redrawAll]
  992.     index = 0 'necessary here
  993.  
  994.     goto [inputLoop]
  995.  
  996.  
  997. [moveToFront]
  998.  
  999.     'move the selected control to the front (last item drawn)
  1000.     if index < 2 or objectCount < 2 then [inputLoop]
  1001.     if index = objectCount then gosub [redrawAll] : goto [inputLoop]
  1002.  
  1003.     tmpType$ = type$(index)
  1004.     tmpLabel$ = label$(index)
  1005.     tmpNames$ = names$(index)
  1006.     tmpXOrigin = xOrg(index)
  1007.     tmpYOrigin = yOrg(index)
  1008.     tmpWidth = width(index)
  1009.     tmpHeight = height(index)
  1010.     tmpCorner$ = corner$(index)
  1011.     tmpBranchLabel$ = branchLabel$(index)
  1012.     tmpSegment = segment(index)
  1013.     tmpHandle$ = handle$(index)
  1014.     tmpBmpName$ = bmpName$(index)
  1015.  
  1016.     for idx = index to objectCount - 1
  1017.         type$(idx) = type$(idx+1)
  1018.         label$(idx) = label$(idx+1)
  1019.         names$(idx) = names$(idx+1)
  1020.         xOrg(idx) = xOrg(idx+1)
  1021.         yOrg(idx) = yOrg(idx+1)
  1022.         width(idx) = width(idx+1)
  1023.         height(idx) = height(idx+1)
  1024.         corner$(idx) = corner$(idx+1)
  1025.         branchLabel$(idx) = branchLabel$(idx+1)
  1026.         segment(idx) = segment(idx+1)
  1027.         handle$(idx) = handle$(idx+1)
  1028.         bmpName$(idx) = bmpName$(idx+1)
  1029.     next idx
  1030.  
  1031.     type$(objectCount) = tmpType$
  1032.     label$(idx) = tmpLabel$
  1033.     names$(objectCount) = tmpNames$
  1034.     xOrg(objectCount) = tmpXOrigin
  1035.     yOrg(objectCount) = tmpYOrigin
  1036.     width(objectCount) = tmpWidth
  1037.     height(objectCount) = tmpHeight
  1038.     corner$(objectCount) = tmpCorner$
  1039.     branchLabel$(objectCount) = tmpBranchLabel$
  1040.     segment(objectCount) = tmpSegment
  1041.     handle$(objectCount) = tmpHandle$
  1042.     bmpName$(objectCount) = tmpBmpName$
  1043.  
  1044.     gosub [redrawAll]
  1045.     gosub [selectDeselect]
  1046.  
  1047.     goto [inputLoop]
  1048.  
  1049.  
  1050. [deleteControl]
  1051.  
  1052.     'delete the selected control
  1053.     if index < 2 then [inputLoop]
  1054.  
  1055.     'delete graphical segments and clean up display
  1056.     print #form, "delsegment "; selectId -1 ;
  1057.     gosub [selectDeselect]
  1058.     print #form, "delsegment "; selectId - 1 ;
  1059.  
  1060.     for idx = index to objectCount
  1061.         type$(idx) = type$(idx+1)
  1062.         label$(idx) = label$(idx+1)
  1063.         names$(idx) = names$(idx+1)
  1064.         xOrg(idx) = xOrg(idx+1)
  1065.         yOrg(idx) = yOrg(idx+1)
  1066.         width(idx) = width(idx+1)
  1067.         height(idx) = height(idx+1)
  1068.         corner$(idx) = corner$(idx+1)
  1069.         branchLabel$(idx) = branchLabel$(idx+1)
  1070.         segment(idx) = segment(idx+1)
  1071.         handle$(idx) = handle$(idx+1)
  1072.         bmpName$(idx) = bmpName$(idx+1)
  1073.         arrayName$(idx) = arrayName$(idx+1)
  1074.     next idx
  1075.  
  1076.     objectCount = objectCount - 1
  1077.  
  1078.     gosub [redrawAll]
  1079.     index = 0
  1080.  
  1081.     goto [inputLoop]
  1082.  
  1083.  
  1084. [produceCodeAndOutline]
  1085.  
  1086.     'set a flag so that an outline will be added
  1087.     produceOutline = 1
  1088.  
  1089. [produceCode]
  1090.  
  1091.     'produce code for the controls in the form
  1092.     if objectCount < 2 then notice "No objects.  Code not produced" : goto [inputLoop]
  1093.  
  1094.     if codeIsOpen = 1 then close #code
  1095.  
  1096.     open "Free Form output window" for text as #code
  1097.     codeIsOpen = 1
  1098.  
  1099.  
  1100.  
  1101.     print #code, ""
  1102.     print #code, ""
  1103.     print #code, "    WindowWidth = "; windowXExtent
  1104.     print #code, "    WindowHeight = "; windowYExtent
  1105.     print #code, ""
  1106.  
  1107.     for x = 2 to objectCount
  1108.         if type$(x) = "button" then gosub [codeForButton]
  1109.         if type$(x) = "combobox" then gosub [codeForComboBox]
  1110.         if type$(x) = "textbox" then gosub [codeForTextBox]
  1111.         if type$(x) = "listbox" then gosub [codeForListBox]
  1112.         if type$(x) = "bmpbutton" then gosub [codeForBmpButton]
  1113.         if type$(x) = "statictext" then gosub [codeForStaticText]
  1114.         if type$(x) = "radiobutton" then gosub [codeForRadioButton]
  1115.         if type$(x) = "checkbox" then gosub [codeForCheckBox]
  1116.         if type$(x) = "groupbox" then gosub [codeForGroupBox]
  1117.         print #code, code$
  1118.     next x
  1119.  
  1120.     if menuCount = 0 then [noMenuCode]
  1121.  
  1122.     if left$(windowType$, 6) = "dialog" then print #code, "    '*** menus are not supported in windows of type "; windowType$; " ***"
  1123.  
  1124.     for x = 0 to menuCount - 1
  1125.         print #code, "    menu "; winHandle$; ", "; qu$; menu$(x); qu$;
  1126.         if menuItemCount(x) = 0 then print #code, ", "; chr$(34); "&FixMe"; chr$(34); ", [fixMe]  ' <-- this menu has no items!" : goto [produceNextMenu]
  1127.         for y = 0 to menuItemCount(x) - 1
  1128.             print #code, ", ";
  1129.             mi$ = menuItem$(x, y)
  1130.             print #code, qu$; left$(mi$, instr(mi$, chr$(0)) - 1) ; qu$;
  1131.             print #code, ", "; mid$(mi$, instr(mi$, chr$(0)) + 1) ;
  1132.         next y
  1133.         print #code, ""
  1134.       [produceNextMenu]
  1135.     next x
  1136.  
  1137.  
  1138. [noMenuCode] 'don't produce menu code
  1139.  
  1140.     print #code, "    open "; qu$; windowLabel$; qu$; " for "; windowType$; " as "; winHandle$
  1141.  
  1142.     if produceOutline = 0 then [doneProducingCode]
  1143.  
  1144.  
  1145. [produceOutline]
  1146.  
  1147.     produceOutline = 0
  1148.     branchLabels$ = ""
  1149.  
  1150.     for x = 2 to objectCount
  1151.         if left$(trim$(branchLabel$(x)), 1) <> "[" then [nextOutlineObject]
  1152.         if instr(trim$(branchLabel$(x)), " ") > 0 then gosub [handleMultiBranchLabels] : goto [nextOutlineObject]
  1153.         if instr(branchLabels$, branchLabel$(x)) > 0 then [nextOutlineObject]
  1154.         branchLabels$ = branchLabels$ + " " + branchLabel$(x)
  1155.         print #code, ""
  1156.         print #code, ""
  1157.         print #code, branchLabel$(x); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1158.         print #code, ""
  1159.         print #code, "    'Insert your own code here"
  1160.       [nextOutlineObject]
  1161.     next x
  1162.  
  1163.     if menuCount = 0 then [doneProducingCode]
  1164.  
  1165.     for x = 0 to menuCount - 1
  1166.         for y = 0 to menuItemCount(x) - 1
  1167.             mi$ = menuItem$(x, y)
  1168.             bl$ = mid$(mi$, instr(mi$, chr$(0)) + 1)
  1169.             if instr(branchLabels$, bl$) > 0 then [writeNextMenuItem]
  1170.             branchLabels$ = branchLabels$ + " " + bl$
  1171.             print #code, ""
  1172.             print #code, ""
  1173.             print #code, bl$; "   'Perform action for menu "; menu$(x); ", item "; left$(mi$, instr(mi$, chr$(0)) - 1)
  1174.             print #code, ""
  1175.             print #code, "    'Insert your own code here"
  1176.           [writeNextMenuItem]
  1177.         next y
  1178.     next x
  1179.  
  1180.  
  1181. [doneProducingCode]
  1182.  
  1183.     notice "Done.  Copy this code into your program."
  1184.  
  1185.     goto [inputLoop]
  1186.  
  1187.  
  1188. [handleMultiBranchLabels]   'handle the case where a control has more than 1 branching option
  1189.  
  1190.     if instr(branchLabels$, word$(branchLabel$(x), 1)) > 0 then [nextMultiBranchLabel]
  1191.     print #code, ""
  1192.     print #code, ""
  1193.     print #code, word$(branchLabel$(x), 1); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1194.     print #code, ""
  1195.     print #code, "    'Insert your own code here"
  1196.     branchLabels$ = branchLabels$ + " " + word$(branchLabel$(x), 1)
  1197.  
  1198.   [nextMultiBranchLabel]
  1199.  
  1200.     if instr(branchLabels$, word$(branchLabel$(x), 2)) > 0 then [doneMultiBranchLabel]
  1201.     print #code, ""
  1202.     print #code, ""
  1203.     print #code, word$(branchLabel$(x), 2); "   'Perform action for the "; type$(x); " named '"; names$(x); "'"
  1204.     print #code, ""
  1205.     print #code, "    'Insert your own code here"
  1206.     branchLabels$ = branchLabels$ + " " + word$(branchLabel$(x), 2)
  1207.  
  1208.   [doneMultiBranchLabel]
  1209.  
  1210.     return
  1211.  
  1212.  
  1213. [codeForButton]
  1214.  
  1215.     'produce code for a text button
  1216.     code$ = "    button "+winHandle$+", "+qu$+label$(x)+qu$+", "+branchLabel$(x)+", "+corner$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)
  1217.     return
  1218.  
  1219.  
  1220. [codeForBmpButton]
  1221.  
  1222.     'produce code for a bmp button
  1223.     code$ = "    bmpbutton "+winHandle$+", "+qu$+bmpName$(x)+qu$+", "+branchLabel$(x)+", "+corner$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)
  1224.     return
  1225.  
  1226.  
  1227. [codeForTextBox]
  1228.  
  1229.     'produce code for a text box
  1230.     code$ = "    textbox "+winHandle$+"."+names$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1231.     return
  1232.  
  1233.  
  1234. [codeForStaticText]
  1235.  
  1236.     'produce code for a static text
  1237.     code$ = "    statictext "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1238.     return
  1239.  
  1240.  
  1241. [codeForGroupBox]
  1242.  
  1243.     'produce code for a group box
  1244.     code$ = "    groupbox "+winHandle$+", "+qu$+label$(x)+qu$+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1245.     return
  1246.  
  1247.  
  1248. [codeForListBox]
  1249.  
  1250.     'produce code for a listbox
  1251.     code$ = "    listbox "+winHandle$+"."+names$(x)+", "+arrayName$(x)+", "+branchLabel$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1252.     return
  1253.  
  1254.  
  1255. [codeForComboBox]
  1256.  
  1257.     'produce code for a listbox
  1258.     code$ = "    combobox "+winHandle$+"."+names$(x)+", "+arrayName$(x)+", "+branchLabel$(x)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1259.     return
  1260.  
  1261.  
  1262. [codeForRadioButton]
  1263.  
  1264.     'produce code for a radiobutton
  1265.     code$ = "    radiobutton "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+word$(branchLabel$(x), 1)+", "+word$(branchLabel$(x), 2)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1266.     return
  1267.  
  1268.  
  1269. [codeForCheckBox]
  1270.  
  1271.     'produce code for a checkbox
  1272.     code$ = "    checkbox "+winHandle$+"."+names$(x)+", "+qu$+label$(x)+qu$+", "+word$(branchLabel$(x), 1)+", "+word$(branchLabel$(x), 2)+", "+str$(xOrg(x)-xOrg-4)+", "+str$(yOrg(x)-yOrg-20-4)+", "+str$(width(x))+", "+str$(height(x))
  1273.     return
  1274.  
  1275.  
  1276. [newFile]
  1277.  
  1278.     'clear the contents of the form editor and start over
  1279.  
  1280.     if isModified = 1 then gosub [formIsModified]
  1281.  
  1282.     newControlNumber = 0
  1283.     windowLabel$ = "untitled"
  1284.     windowType$ = "window"
  1285.     objectCount = 0
  1286.     winHandle$ = "#main"
  1287.     windowXExtent = 550
  1288.     windowYExtent = 410
  1289.  
  1290.     gosub [clearMenuData]
  1291.     gosub [addWindowFrame]
  1292.     gosub [redrawAll]
  1293.  
  1294.     isModified = 0
  1295.  
  1296.     goto [inputLoop]
  1297.  
  1298.  
  1299. [saveFile]
  1300.  
  1301.     'abort if no controls
  1302.     if objectCount < 2 then notice "No controls.  Save aborted" : goto [inputLoop]
  1303.  
  1304.     'save the form into a *.fre file
  1305.     if formName$ = "" then formName$ = "untitled.fre"
  1306.     filedialog "Save form", "*.fre", formName$
  1307.     if formName$ = "" then [inputLoop]
  1308.  
  1309.     gosub [saveFormSubroutine]
  1310.  
  1311.     notice "Done.  File saved as " + formName$
  1312.     goto [inputLoop]
  1313.  
  1314.  
  1315. [saveFormSubroutine]   'the subroutine portion of the save routine
  1316.  
  1317.     open formName$ for output as #formOut
  1318.     print #formOut, newControlNumber
  1319.     print #formOut, windowLabel$
  1320.     print #formOut, windowType$
  1321.     print #formOut, objectCount
  1322.     print #formOut, winHandle$
  1323.     print #formOut, snapOn
  1324.     print #formOut, xInterval
  1325.     print #formOut, yInterval
  1326.     print #formOut, menuCount
  1327.     print #formOut, windowXExtent
  1328.     print #formOut, windowYExtent
  1329.  
  1330.     for i = 2 to objectCount
  1331.         print #formOut, type$(i)
  1332.         print #formOut, label$(i)
  1333.         print #formOut, names$(i)
  1334.         print #formOut, xOrg(i)
  1335.         print #formOut, yOrg(i)
  1336.         print #formOut, width(i)
  1337.         print #formOut, height(i)
  1338.         print #formOut, corner$(i)
  1339.         print #formOut, branchLabel$(i)
  1340.         print #formOut, segment(i)
  1341.         print #formOut, handle$(i)
  1342.         print #formOut, bmpName$(i)
  1343.         print #formOut, arrayName$(i)
  1344.     next i
  1345.  
  1346.     'Now write the menu information
  1347.     if menuCount = 0 then [noMenusToSave]
  1348.  
  1349.     for i = 0 to menuCount - 1
  1350.         print #formOut, menu$(i)
  1351.         print #formOut, menuItemCount(i)
  1352.         if menuItemCount(i) = 0 then [noMenuItemsToSave]
  1353.         for j = 0 to menuItemCount(i) - 1
  1354.             print #formOut, menuItem$(i, j)
  1355.         next j
  1356.       [noMenuItemsToSave]
  1357.     next i
  1358.  
  1359.  
  1360. [noMenusToSave]
  1361.  
  1362.     close #formOut
  1363.  
  1364.     return
  1365.  
  1366.  
  1367. [openFile]
  1368.  
  1369.     'load the form from a *.fre file
  1370.  
  1371.     if isModified = 1 then gosub [formIsModified]
  1372.  
  1373.     filedialog "Load form", "*.fre", formName$
  1374.     if formName$ = "" then [inputLoop]
  1375.  
  1376.     gosub [clearMenuData]
  1377.     objectCount = 0
  1378.     gosub [addWindowFrame]
  1379.  
  1380.     open formName$ for input as #formIn
  1381.     input #formIn, newControlNumber
  1382.     input #formIn, windowLabel$
  1383.     input #formIn, windowType$
  1384.     input #formIn, objectCount
  1385.     input #formIn, winHandle$
  1386.     input #formIn, snapOn
  1387.     input #formIn, xInterval
  1388.     input #formIn, yInterval
  1389.     input #formIn, menuCount
  1390.     input #formIn, windowXExtent
  1391.     input #formIn, windowYExtent
  1392.  
  1393.     width(1) = windowXExtent
  1394.     height(1) = windowYExtent
  1395.  
  1396.     for i = 2 to objectCount
  1397.         input #formIn, tmp$ : type$(i) = tmp$
  1398.         input #formIn, tmp$ : label$(i) = tmp$
  1399.         input #formIn, tmp$ : names$(i) = tmp$
  1400.         input #formIn, tmp : xOrg(i) = tmp
  1401.         input #formIn, tmp : yOrg(i) = tmp
  1402.         input #formIn, tmp : width(i) = tmp
  1403.         input #formIn, tmp : height(i) = tmp
  1404.         input #formIn, tmp$ : corner$(i) = tmp$
  1405.         input #formIn, tmp$ : branchLabel$(i) = tmp$
  1406.         input #formIn, tmp : segment(i) = tmp
  1407.         input #formIn, tmp$ : handle$(i) = tmp$
  1408.         input #formIn, tmp$ : bmpName$(i) = tmp$
  1409.         if trim$(tmp$) > "" then loadbmp tmp$, tmp$
  1410.         input #formIn, tmp$ : arrayName$(i) = tmp$
  1411.     next i
  1412.  
  1413.     if menuCount = 0 then [noMenusToRead]
  1414.  
  1415.     for i = 0 to menuCount - 1
  1416.         input #formIn, tmp$ : menu$(i)=tmp$
  1417.         input #formIn, tmp : menuItemCount(i) = tmp
  1418.         if menuItemCount(i) = 0 then [noMenuItemsToRead]
  1419.         for j = 0 to menuItemCount(i) - 1
  1420.             input #formIn, tmp$ : menuItem$(i, j) = tmp$
  1421.         next j
  1422.       [noMenuItemsToRead]
  1423.     next i
  1424.  
  1425. [noMenusToRead]
  1426.  
  1427.     close #formIn
  1428.     gosub [redrawAll]
  1429.  
  1430.     isModified = 0
  1431.  
  1432.     goto [inputLoop]
  1433.  
  1434.  
  1435.  
  1436.  
  1437. [gridDialog]  'open a dialog box for selecting & adjusting snap to grid
  1438.  
  1439.     WindowWidth = 350
  1440.     WindowHeight = 225
  1441.  
  1442.     if gridDialogIsOpen = 1 then close #gridDialog
  1443.  
  1444.     statictext #gridDialog.statictext2, "Select here whether control positions will", 26, 16, 336, 20
  1445.     statictext #gridDialog.statictext5, "automatically snap to gridded positions,", 26, 35, 320, 20
  1446.     statictext #gridDialog.statictext6, "and what the interval will be.", 26, 54, 240, 20
  1447.     checkbox #gridDialog.snapOnOff, "Snap to Grid", [snapOn], [snapOff], 26, 85, 120, 20
  1448.     statictext #gridDialog.statictext7, "X interval:", 34, 112, 70, 20
  1449.     textbox #gridDialog.xIntrvl, 111, 106, 38, 25
  1450.     statictext #gridDialog.statictext9, "Y interval:", 178, 112, 70, 20
  1451.     textbox #gridDialog.yIntrvl, 255, 106, 38, 25
  1452.     button #gridDialog, "OK", [acceptGridDialog], UL, 99, 149
  1453.     button #gridDialog, "Cancel", [cancelGridDialog], UL, 29, 149
  1454.     open "Snap to Grid" for dialog as #gridDialog
  1455.     print #gridDialog, "trapclose [cancelGridDialog]"
  1456.     gridDialogIsOpen = 1
  1457.  
  1458.     if snapOn = 1 then snapOnSelected = 1 : print #gridDialog.snapOnOff, "set"
  1459.     print #gridDialog.xIntrvl, xInterval
  1460.     print #gridDialog.yIntrvl, yInterval
  1461.  
  1462.     goto [inputLoop]
  1463.  
  1464.  
  1465. [snapOn]   'Perform on action for the checkbox named 'snapOnOff'
  1466.  
  1467.     snapOnSelected = 1
  1468.     goto [inputLoop]
  1469.  
  1470.  
  1471. [snapOff]   'Perform off action for the checkbox named 'snapOnOff'
  1472.  
  1473.     snapOnSelected = 0
  1474.     goto [inputLoop]
  1475.  
  1476.  
  1477. [acceptGridDialog]
  1478.  
  1479.     snapOn = snapOnSelected
  1480.     print #gridDialog.xIntrvl, "!contents?"
  1481.     input #gridDialog.xIntrvl, xInterval
  1482.     print #gridDialog.yIntrvl, "!contents?"
  1483.     input #gridDialog.yIntrvl, yInterval
  1484.  
  1485.  
  1486. [cancelGridDialog]
  1487.  
  1488.     gridDialogIsOpen = 0
  1489.     close #gridDialog
  1490.     goto [inputLoop]
  1491.  
  1492.  
  1493. [addAMenu]    'add a new menu item
  1494.  
  1495.  
  1496.     if addMenuIsOpen = 1 then close #newMenu
  1497.  
  1498.     WindowWidth = 400
  1499.     WindowHeight = 230
  1500.     listbox #newMenu.menuNames, menu$(, [inputLoop], 14, 36, 120, 120
  1501.     statictext #newMenu.statictext2, "Defined Menus", 14, 16, 104, 20
  1502.     statictext #newMenu.statictext3, "Enter new menu name here:", 150, 16, 200, 20
  1503.     textbox #newMenu.newMenuName, 150, 36, 208, 25
  1504.     button #newMenu, "Accept", [acceptNewMenu], UL, 302, 131
  1505.     button #newMenu, "Cancel", [cancelNewMenu], UL, 302, 101
  1506.     open "Add a Menu" for dialog as #newMenu
  1507.     print #newMenu, "trapclose [cancelNewMenu]";
  1508.     addMenuIsOpen = 1
  1509.     goto [inputLoop]
  1510.  
  1511.  
  1512. [cancelNewMenu]   'Perform action for the button named 'cancelNewMenu'
  1513.  
  1514.     'close the dialog box
  1515.     close #newMenu
  1516.     addMenuIsOpen = 0
  1517.     goto [inputLoop]
  1518.  
  1519.  
  1520. [clearMenuData]     'reset menu data arrays and indices
  1521.  
  1522.     for x = 0 to 20
  1523.         menu$(x) = ""
  1524.         for y = 0 to 30
  1525.             menuItem$(x, y) = ""
  1526.         next y
  1527.     next x
  1528.     menuCount = 0
  1529.     return
  1530.  
  1531.  
  1532. [acceptNewMenu]   'Perform action for the button named 'acceptNewMenu'
  1533.  
  1534.     'add this menu onto the list of menus, and update the display as needed
  1535.     print #newMenu.newMenuName, "!contents?";
  1536.     input #newMenu.newMenuName, result$
  1537.     if result$ = "" then notice "Please type a name for a new menu." : goto [inputLoop]
  1538.     close #newMenu
  1539.     menu$(menuCount) = result$
  1540.     menuCount = menuCount + 1
  1541.     if menuCount > 1 then gosub [redrawAll] : goto [inputLoop]
  1542.  
  1543.     'since this is the first menu added, reposition all controls 20 pixels down
  1544.     if objectCount < 2 then gosub [redrawAll] : goto [inputLoop]
  1545.     for x = 2 to objectCount
  1546.         yOrg(x) = yOrg(x) + 20
  1547.     next x
  1548.     gosub [redrawAll]
  1549.     addMenuIsOpen = 0
  1550.     goto [inputLoop]
  1551.  
  1552.  
  1553.  
  1554. [removeMenu]   'remove a menu from the list of menus
  1555.  
  1556.     if menuCount = 0 then notice "No menus to remove." : goto [inputLoop]
  1557.  
  1558.     if removeMenuIsOpen = 1 then close #removeMenu
  1559.  
  1560.     WindowWidth = 330
  1561.     WindowHeight = 195
  1562.     statictext #removeMenu.statictext1, "Select a menu to remove:", 26, 16, 192, 20
  1563.     listbox #removeMenu.menusToRemove, menu$(, [acceptRemoveMenu], 22, 41, 208, 100
  1564.     button #removeMenu, "Accept", [acceptRemoveMenu], UL, 246, 81
  1565.     button #removeMenu, "Cancel", [cancelRemoveMenu], UL, 246, 111
  1566.     open "Remove a Menu" for dialog as #removeMenu
  1567.     print #removeMenu, "trapclose [cancelRemoveMenu]";
  1568.     removeMenuIsOpen = 1
  1569.  
  1570.     goto [inputLoop]
  1571.  
  1572.  
  1573. [acceptRemoveMenu]   'get the name of the selected item, and remove it
  1574.  
  1575.     print #removeMenu.menusToRemove, "selectionIndex?"
  1576.     input #removeMenu.menusToRemove, result
  1577.     close #removeMenu
  1578.     removeMenuIsOpen = 0
  1579.     if result = 0 then notice "No item selected.  Menu not removed." : goto [inputLoop]
  1580.  
  1581.     menuCount = menuCount - 1
  1582.     result = result - 1
  1583.  
  1584.     if result = menuCount then menu$(result) = "" : goto [checkForEmptyMenuBar]
  1585.  
  1586.     for x = result to menuCount
  1587.         menu$(x) = menu$(x+1)
  1588.     next x
  1589.  
  1590.   [checkForEmptyMenuBar]  'if there are no more menus, shift controls up 20 pixels
  1591.  
  1592.     if menuCount > 0 then gosub [redrawAll] : goto [inputLoop]
  1593.  
  1594.     for x = 2 to objectCount
  1595.         yOrg(x) = yOrg(x) - 20
  1596.     next x
  1597.  
  1598.     gosub [redrawAll]
  1599.  
  1600.     goto [inputLoop]
  1601.  
  1602.  
  1603. [cancelRemoveMenu]   'close the remove menu dialog
  1604.  
  1605.     close #removeMenu
  1606.     removeMenuIsOpen = 0
  1607.     goto [inputLoop]
  1608.  
  1609.  
  1610. [editMenus]     'edit menu order and menu contents
  1611.  
  1612.     if menuCount = 0 then notice "No menus to edit." : goto [inputLoop]
  1613.  
  1614.     if editMenuIsOpen = 1 then close #editMenu
  1615.  
  1616.     WindowWidth = 450
  1617.     WindowHeight = 375
  1618.  
  1619.     listbox #editMenu.menuList, menu$(, [selectMenuToEdit], 14, 31, 112, 105
  1620.     listbox #editMenu.menuItems, menuItemLocal$(, [selectMenuItemToEdit], 14, 166, 288, 145
  1621.     statictext #editMenu.statictext6, "Menus:", 14, 11, 48, 20
  1622.     statictext #editMenu.statictext14, "Menu line items -> Branch labels:", 14, 146, 240, 20
  1623.     button #editMenu, "&Close", [closeMenuEdit], UL, 326, 21
  1624.     button #editMenu, "&New Item", [addNewMenuItem], UL, 310, 166
  1625.     button #editMenu, "&Edit", [editMenuItem], UL, 310, 196
  1626.     button #editMenu, "Move &Up", [moveMenuItemUp], UL, 310, 226
  1627.     button #editMenu, "&Move Dn", [moveMenuItemDown], UL, 310, 256
  1628.     button #editMenu, "&Delete", [deleteMenuItem], UL, 310, 286
  1629.     button #editMenu, "&To Top", [moveMenuToTop], UL, 134, 41
  1630.     open "Edit Menus" for dialog as #editMenu
  1631.     print #editMenu, "trapclose [closeMenuEdit]";
  1632.     print #editMenu.menuList, "singleclickselect";
  1633.     print #editMenu.menuItems, "singleclickselect";
  1634.  
  1635.     editMenuIsOpen = 1
  1636.     menuItemIndex = 0
  1637.     result = 0
  1638.  
  1639.     goto [inputLoop]
  1640.  
  1641.  
  1642. [selectMenuToEdit]   'Perform action for the listbox named 'menuList'
  1643.  
  1644.     'populate the listbox named menuItems
  1645.     print #editMenu.menuList, "selectionIndex?"
  1646.     input #editMenu.menuList, result
  1647.  
  1648.     for x = 0 to 29
  1649.         mil$ = menuItem$(result - one, x)
  1650.         if mil$ <> "" then mil$ = left$(mil$, instr(mil$, chr$(0)) - 1) + " -> " + mid$(mil$, instr(mil$, chr$(0)) + 1)
  1651.         menuItemLocal$(x) = mil$
  1652.     next x
  1653.     print #editMenu.menuItems, "reload"
  1654.  
  1655.     menuItemIndex = 0
  1656.  
  1657.     goto [inputLoop]
  1658.  
  1659.  
  1660. [moveMenuToTop]   'move the selected menu to the top of the list
  1661.  
  1662.     'if there is no selection, or if the selected item is already on top, do nothing
  1663.     if result = 0 or result = 1 then [inputLoop]
  1664.  
  1665.     menu$(20) = menu$(result - one)
  1666.     for x = 0 to 29
  1667.         menuItem$(20, x) = menuItem$(result - one, x)
  1668.     next x
  1669.  
  1670.     for x = result - 1 to 1 step -1
  1671.         menu$(x) = menu$(x - one)
  1672.         for y = 0 to 29
  1673.             menuItem$(x, y) = menuItem$(x - one, y)
  1674.         next y
  1675.     next x
  1676.  
  1677.     menu$(0) = menu$(20)
  1678.     menu$(20) = ""
  1679.     for x = 0 to 29
  1680.         menuItem$(0, x) = menuItem$(20, x)
  1681.         menuItem$(20, x) = ""
  1682.     next x
  1683.  
  1684.     print #editMenu.menuList, "reload"
  1685.     print #editMenu.menuList, "selectIndex 1"
  1686.     result = 1
  1687.  
  1688.     'now continue on to the next routine!
  1689.  
  1690.  
  1691. [selectMenuItemToEdit]   'Perform action for the listbox named 'menuItems'
  1692.  
  1693.     'set the selection index for the menu item to edit
  1694.     print #editMenu.menuItems, "selectionIndex?"
  1695.     input #editMenu.menuItems, menuItemIndex
  1696.     goto [inputLoop]
  1697.  
  1698.  
  1699. [addNewMenuItem]   'Perform action for the button named 'newItemButton'
  1700.  
  1701.     'Insert your own code here
  1702.     if result = 0 then [inputLoop]
  1703.  
  1704.     if editMenuItemIsOpen = 1 then gosub [closeEditMenuItem]
  1705.  
  1706.     menuItemCount(result - one) = menuItemCount(result - one) + 1
  1707.     menuItemIndex = menuItemCount(result - one)
  1708.     editMenuItemAction$ = "ADD"
  1709.     goto [editMenuItemProperties]
  1710.  
  1711.  
  1712. [editMenuItem]   'Perform action for the button named 'editMenuItem'
  1713.  
  1714.     'Insert your own code here
  1715.     if menuItemIndex = 0 then [inputLoop]
  1716.  
  1717.     if editMenuItemIsOpen = 1 then gosub [closeEditMenuItem]
  1718.  
  1719.     editMenuItemAction$ = "EDIT"
  1720.     goto [editMenuItemProperties]
  1721.  
  1722.  
  1723. [moveMenuItemUp]   'Perform action for the button named 'moveMenuItemUp'
  1724.  
  1725.     'Insert your own code here
  1726.     if menuItemIndex = 1 or menuItemIndex = 0 then [inputLoop]
  1727.  
  1728.     tmpMi$ = menuItem$(result - one, menuItemIndex - one)
  1729.     menuItem$(result - one, menuItemIndex - one) = menuItem$(result - one, menuItemIndex - (2 * one))
  1730.     menuItem$(result - one, menuItemIndex - (2 * one)) = tmpMi$
  1731.  
  1732.     gosub [reloadLocalMenuItems]
  1733.  
  1734.     menuItemIndex = menuItemIndex - 1
  1735.     print #editMenu.menuItems, "selectIndex "; menuItemIndex
  1736.  
  1737.     goto [inputLoop]
  1738.  
  1739.  
  1740. [moveMenuItemDown]   'Perform action for the button named 'moveMenuItemDown'
  1741.  
  1742.     'Insert your own code here
  1743.     if result = 0 then [inputLoop]
  1744.     if menuItemIndex = menuItemCount(result - one) or menuItemIndex = 0 then [inputLoop]
  1745.  
  1746.     tmpMi$ = menuItem$(result - one, menuItemIndex - one)
  1747.     menuItem$(result - one, menuItemIndex - one) = menuItem$(result - one, menuItemIndex)
  1748.     menuItem$(result - one, menuItemIndex) = tmpMi$
  1749.  
  1750.     gosub [reloadLocalMenuItems]
  1751.  
  1752.     menuItemIndex = menuItemIndex + 1
  1753.     print #editMenu.menuItems, "selectIndex "; menuItemIndex
  1754.  
  1755.     goto [inputLoop]
  1756.  
  1757.  
  1758. [deleteMenuItem]   'Perform action for the button named 'deleteMenuItem'
  1759.  
  1760.     'Insert your own code here
  1761.     if result = 0 then [inputLoop]
  1762.     if menuItemCount(result - one) = 0 or menuItemIndex = 0 then [inputLoop]
  1763.  
  1764.     for x = menuItemIndex to 30
  1765.         menuItem$(result - one, x - one) = menuItem$(result - one, x)
  1766.     next x
  1767.  
  1768.     gosub [reloadLocalMenuItems]
  1769.  
  1770.     menuItemIndex = 0
  1771.  
  1772.     return
  1773.  
  1774.  
  1775. [reloadLocalMenuItems]  'reload the contents of the menu items listbox
  1776.  
  1777.     for x = 0 to 29
  1778.         mil$ = menuItem$(result - one, x)
  1779.         if mil$ <> "" then mil$ = left$(mil$, instr(mil$, chr$(0)) - 1) + " -> " + mid$(mil$, instr(mil$, chr$(0)) + 1)
  1780.         menuItemLocal$(x) = mil$
  1781.     next x
  1782.     print #editMenu.menuItems, "reload"
  1783.  
  1784.     return
  1785.  
  1786.  
  1787. [closeMenuEdit]   'Perform action for the button named 'closeMenuEdit'
  1788.  
  1789.     'close the menu editing dialog and redraw the form
  1790.     for x = 0 to 29 : menuItemLocal$(x) = "" : next x
  1791.     close #editMenu
  1792.     editMenuIsOpen = 0
  1793.     'gosub [redrawAll]
  1794.  
  1795.     goto [inputLoop]
  1796.  
  1797.  
  1798. [editMenuItemProperties]    'open a dialog for editing menu item properties
  1799.  
  1800.  
  1801.     WindowWidth = 350
  1802.     WindowHeight = 150
  1803.  
  1804.     textbox #menuItems.name, 134, 16, 184, 25
  1805.     textbox #menuItems.branchLabel, 134, 51, 184, 25
  1806.     statictext #menuItems.statictext6, "Name:", 22, 21, 40, 20
  1807.     statictext #menuItems.statictext7, "Branch Label:", 22, 56, 104, 20
  1808.     button #menuItems, "Accept", [acceptMenuItemProps], UL, 198, 86
  1809.     button #menuItems, "Cancel", [cancelMenuItemProps], UL, 262, 86
  1810.     open "Menu Item Properties" for dialog as #menuItems
  1811.     editMenuItemIsOpen = 1
  1812.  
  1813.     print #menuItems.name, "???"
  1814.     print #menuItems.branchLabel, "[???]"
  1815.  
  1816.     if menuItem$(result - one, menuItemIndex - one) = "" then [inputLoop]
  1817.  
  1818.     mi$ = menuItem$(result - one, menuItemIndex - one)
  1819.     print #menuItems.name, left$(mi$, instr(mi$, chr$(0)) - one)
  1820.     print #menuItems.branchLabel, mid$(mi$, instr(mi$, chr$(0)) + 1)
  1821.  
  1822.     goto [inputLoop]
  1823.  
  1824.  
  1825. [acceptMenuItemProps]   'Perform action for the button named 'acceptMenuItemProps'
  1826.  
  1827.     'accept the edited menu item
  1828.     print #menuItems.name, "!contents?";
  1829.     input #menuItems.name, nResult$
  1830.     print #menuItems.branchLabel, "!contents?";
  1831.     input #menuItems.branchLabel, blResult$
  1832.  
  1833.     if nResult$ = "" or blResult$ = "" then notice "Bad menu item properties." : goto [inputLoop]
  1834.  
  1835.     blr$ = blResult$
  1836.     if left$(blResult$, 1) <> "[" then blResult$ = "[" + blResult$
  1837.     if right$(blResult$, 1) <> "]" then blResult$ = blResult$ + "]"
  1838.  
  1839.     if blr$ <> blResult$ then notice "Branch Label was " + blr$ + ", defaulting to " + blResult$
  1840.  
  1841.     menuItem$(result - one, menuItemIndex - one) = nResult$ + chr$(0) + blResult$
  1842.     menuItemLocal$(menuItemIndex - one) = nResult$ + " -> " + blResult$
  1843.  
  1844.     close #menuItems
  1845.     editMenuItemIsOpen = 0
  1846.  
  1847.     print #editMenu.menuItems, "reload"
  1848.  
  1849.     goto [inputLoop]
  1850.  
  1851.  
  1852. [cancelMenuItemProps]   'Perform action for the button named 'cancelMenuItemProps'
  1853.  
  1854.     'close the window
  1855.     gosub [closeEditMenuItem]
  1856.     goto [inputLoop]
  1857.  
  1858.  
  1859. [closeEditMenuItem]   'close the window before opening it again
  1860.  
  1861.     'close the window
  1862.     close #menuItems
  1863.     if editMenuItemAction$ = "ADD" then menuItemCount(result - one) = menuItemCount(result - one) - 1
  1864.     editMenuItemIsOpen = 0
  1865.     return
  1866.  
  1867.  
  1868. [formIsModified]    'the form has been modified, offer to save
  1869.  
  1870.     isModified = 0 ' set the isModified flag to be 0
  1871.     if objectCount < 2 then return  ' if there are no objects, don't offer to save form
  1872.     confirm "Save changes to " + formName$ + "?"; answer$
  1873.     if answer$ = "yes" then gosub [saveFormSubroutine]
  1874.  
  1875.     return
  1876.  
  1877.  
  1878. [quit]   'exit Freeform
  1879.  
  1880.     if isModified = 1 then gosub [formIsModified]
  1881.  
  1882.     'quit freeform
  1883.     close #form
  1884.     if codeIsOpen then close #code
  1885.  
  1886. end
  1887.