home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 February / PCWK0296.iso / sharewar / os2 / program / liberty / ffexp.bas < prev    next >
BASIC Source File  |  1995-02-02  |  60KB  |  1,856 lines

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