home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 February / PCWK0297.iso / envelop / envelop.3 / Program / envelop.eto < prev    next >
Text File  |  1996-07-08  |  395KB  |  12,981 lines

  1. Begin Code
  2.   ModuleManager.PublishObjectDLL("evdev.dll")
  3. End Code
  4.  
  5. Type SampleMasterFormHelpMenu From PopupMenu
  6. End Type
  7.  
  8. Type Envelop From Application
  9.   Type Help From HelpFile
  10.  
  11.     ' METHODS for object: Envelop.Help
  12.     Sub ShowMethodHelp(method As String, obj As Object)
  13.       If Not ShowTopicHelp(method & "_Method_" & FieldDefiner(obj, method)) Then 
  14.         ' Try to look for help for an Event by this name
  15.         dim eventName as string
  16.         dim i as integer
  17.         Dim s as String
  18.         dim o as Object
  19.         eventName = method
  20.         ' If there is an "_" if name (e.g. Button1_Click), take last part as event name
  21.         i = Instr(method, "_")
  22.         If i Then 
  23.           ' Since we are looking for an event with the "host-defined" syntax (i.e. Button1_Click)
  24.           ' we need to find the name of the object referred to by the first component of the name
  25.           ' (i.e. "Button1")
  26.           eventName = Mid(method, i + 1)
  27.           obj = FindEmbed(obj, Left(method, i - 1))
  28.         End If
  29.     
  30.         ' Since we don't know where Event may be defined look on each Object up parent chain.
  31.         s = obj
  32.         While (s <> "")
  33.           If ShowTopicHelp(eventName & "_Event_" & s) Then Exit Sub
  34.           o = FindObject(s)
  35.           s = RootName(o)
  36.         Wend
  37.     
  38.         InfoBox.Message("Missing Help", "No help available for Method: " & method)
  39.       End If
  40.     End Sub
  41.  
  42.     Sub ShowObjectHelp(obj As Object)
  43.       Dim s as String
  44.       dim o as Object
  45.       s = obj
  46.       While (s <> "")
  47.         If ShowTopicHelp(s & "_Object") Then Exit Sub
  48.         ' Show Help for parent object if not available for self.
  49.         o = FindObject(s)
  50.         s = RootName(o)
  51.       Wend
  52.       InfoBox.Message("Missing Help", "No help available for Object: " & obj)
  53.     End Sub
  54.  
  55.     Sub ShowPropertyHelp(prop As String, obj As Object)
  56.       ShowTopicHelp(prop & "_Property_" & FieldDefiner(obj, prop))
  57.     End Sub
  58.  
  59.     Function ShowTopicHelp(topicName As String) As Integer
  60.       dim helpIndex as long
  61.       If EnvelopHelpTable.FindValue(topicName, helpIndex) Then 
  62.         GotoContext(helpIndex)
  63.         ShowTopicHelp = True
  64.       Else 
  65.         ShowTopicHelp = False
  66.       End If
  67.     End Function
  68.  
  69.   End Type
  70.   Type EBOOpen From OpenDialog
  71.  
  72.     ' METHODS for object: Envelop.EBOOpen
  73.     Function BrowseForModule As ObjectModule
  74.       static lastFilterIndex As Integer
  75.     
  76.       FileMustExist = True
  77.       FileName = ""
  78.       DefaultExtension = ""
  79.       InitialDir = Envelop.FileDialogDir
  80.       NoChangeDir = True
  81.       If (lastFilterIndex = 0) Then lastFilterIndex = 1 ' Default initialization
  82.       FilterIndex = lastFilterIndex
  83.     
  84.       If Execute = 1 Then 
  85.         ' Make busy cursor show immediately
  86.         If App Then App.ShowBusySignal
  87.         ' Note: "FileName" may refer to a Text-based Module (.eto)
  88.         If True Then 
  89.           ' Allow trapping of exceptions from code run as a result of loading
  90.           Dim suspend As New SuspendIgnoreExceptions
  91.           BrowseForModule = ModuleManager.LoadModule(FileName, False)
  92.         End If
  93.         ' Remember what last type of file was user loaded.
  94.         lastFilterIndex = FilterIndex
  95.         Envelop.FileDialogDir = FileName
  96.       Else 
  97.         BrowseForModule = Nothing
  98.       End If
  99.     End Function
  100.  
  101.   End Type
  102.   Type ETOOpen From OpenDialog
  103.  
  104.     ' METHODS for object: Envelop.ETOOpen
  105.     Sub MergeEto()
  106.       FileMustExist = True
  107.       FileName = ""
  108.       DefaultExtension = ""
  109.       InitialDir = Envelop.FileDialogDir
  110.       NoChangeDir = True
  111.       FilterIndex = 1
  112.       If Execute = 1 Then 
  113.         ' Make busy cursor show immediately
  114.         If App Then App.ShowBusySignal
  115.         If True Then 
  116.           ' Allow trapping of exceptions from code run as a result of loading
  117.           Dim suspend As New SuspendIgnoreExceptions
  118.           ObjectTools.LoadTextObject(FileName)
  119.         End If
  120.         ObjectViewer.Reset
  121.         Envelop.FileDialogDir = FileName
  122.       End If
  123.     End Sub
  124.  
  125.   End Type
  126.   Type SADlg From SaveAsDialog
  127.  
  128.     ' METHODS for object: Envelop.SADlg
  129.     Function DisplayDialog(m as ObjectModule) As Boolean
  130.       ' Return FALSE only if user cancels
  131.       DisplayDialog = True
  132.     
  133.       InitialDir = Envelop.FileDialogDir
  134.       NoChangeDir = True
  135.     
  136.       ' Display the dialog and react
  137.       If Execute = IDOK Then 
  138.         Dim AsText As Boolean
  139.         AsText = TypeFileName(m.IsText)
  140.     
  141.         ' Make busy cursor show immediately
  142.         If App Then App.ShowBusySignal
  143.     
  144.         ' Save Module and Reset object viewer
  145.         m.SaveAs(FileName, AsText)
  146.         ObjectViewer.ResetModuleString(m)
  147.         Envelop.FileDialogDir = FileName
  148.       Else 
  149.         DisplayDialog = False
  150.       End If
  151.     
  152.     End Function
  153.  
  154.     Function SaveAs(m As ObjectModule) As Boolean
  155.       ' Return FALSE only if user cancels
  156.       Dim f as new File
  157.     
  158.       f.FileName = m.FileName
  159.       If m.IsUntitled Then 
  160.         FileName = "mod" & m.UntitledSerialNum
  161.         Title = "Save Module " & m.DisplayName & " As"
  162.       Else 
  163.         FileName = f.Name
  164.         Title = "Save Module As"
  165.       End If
  166.     
  167.       ' Setup the filter based on current save mode.
  168.       Filter = "Envelop binary (*.ebo)|*.ebo|Envelop text (*.eto)|*.eto|"
  169.       If (m.IsText) Then 
  170.         FilterIndex = 2
  171.       Else 
  172.         FilterIndex = 1
  173.       End If
  174.       DefaultExtension = ""
  175.     
  176.       ' Display the dialog and react
  177.       SaveAs = DisplayDialog(m)
  178.     
  179.     End Function
  180.  
  181.     Function SaveModule(m as ObjectModule) As Boolean
  182.       ' Return FALSE only if user cancels an untitled save
  183.       SaveModule = True
  184.     
  185.       ' Leave if there's nothing to save
  186.       If m.ReadOnly || Not m.IsModified Then Exit Function
  187.     
  188.       ' Prompt for a file, if necessary
  189.       If m.IsUntitled Then 
  190.         FileName = "mod" & m.UntitledSerialNum
  191.         Title = "Select file for module " & m.DisplayName
  192.         Filter = "Envelop binary (*.ebo)|*.ebo|Envelop text (*.eto)|*.eto|"
  193.         FilterIndex = 1
  194.         DefaultExtension = ""
  195.     
  196.         ' Display the dialog and react
  197.         SaveModule = DisplayDialog(m)
  198.     
  199.       Else 
  200.         ' Make busy cursor show immediately
  201.         If App Then App.ShowBusySignal
  202.     
  203.         m.Save
  204.       End If
  205.     
  206.     End Function
  207.  
  208.     Function TypeFileName(ByVal AsText as Boolean) As Boolean
  209.       ' Type file based on extension and filter selection
  210.       Dim f as New File
  211.       f.FileName = FileName
  212.       If (f.Extension = "") Then 
  213.         If FilterIndex = 1 Then 
  214.           AsText = False
  215.           FileName = f.FileName & ".ebo"
  216.         Else 
  217.           AsText = True
  218.           FileName = f.FileName & ".eto"
  219.         End If
  220.       Else 
  221.         ' Recognize a couple of suffixes and force save mode
  222.         If (StrComp(Right(FileName, 3), "ebo") = 0) Then AsText = False
  223.         If (StrComp(Right(FileName, 3), "eto") = 0) Then AsText = True
  224.       End If
  225.       TypeFileName = AsText
  226.     End Function
  227.  
  228.     Sub WriteObjectAsText(obj as Object)
  229.       If HostObject(obj) Then 
  230.         Dim mb As New MessageBox
  231.         mb.SetIconExclamation
  232.         mb.Message("Invalid object", "Embedded objects cannot be saved as standalone text objects.")
  233.         Exit Sub
  234.       End If
  235.     
  236.       FileName = ""
  237.       Title = "Save object: " & obj & " to text as"
  238.     
  239.       ' Setup the filter to specify .eto files
  240.       Filter = "Envelop text (*.eto)|*.eto|"
  241.       FilterIndex = 1
  242.       DefaultExtension = ""
  243.       NoChangeDir = True
  244.       InitialDir = Envelop.FileDialogDir
  245.     
  246.       If Execute = 1 Then 
  247.         ' Type file based on extension and filter selection
  248.         Dim f as New File
  249.         f.FileName = FileName
  250.         If (f.Extension = "") Then FileName = f.FileName & ".eto"
  251.         ' Make busy cursor show immediately
  252.         App.ShowBusySignal
  253.         ObjectTools.SaveTextObject(FileName, False, obj)
  254.         Envelop.FileDialogDir = FileName
  255.       End If
  256.     End Sub
  257.  
  258.   End Type
  259.   Dim FileDialogDir_ As String
  260.   Property FileDialogDir Get getFileDialogDir Set setFileDialogDir As String
  261.   Dim SamplesPath As String
  262.  
  263.   ' METHODS for object: Envelop
  264.   Function CanClose() As Integer
  265.     Dim m As ObjectModule
  266.     Dim p As Project
  267.     Dim i, n, r As Integer
  268.     Dim ync As New YesNoCancelBox
  269.     Dim CANCEL_EXIT, OK_TO_EXIT, REVERT_ON_EXIT As Integer
  270.   
  271.     CANCEL_EXIT = 0
  272.     OK_TO_EXIT = 1
  273.     REVERT_ON_EXIT = 2
  274.     ync.title = "Quit"
  275.     CanClose = OK_TO_EXIT
  276.   
  277.     ' Check to see if there are any changes at all.
  278.     If Not ObjectViewer.SaveAll_Enable Then 
  279.       CanClose = OK_TO_EXIT
  280.       Exit Function
  281.     End If
  282.   
  283.     ' Ask user if he wants to save any changes
  284.     r = ync.Msg("Do you want to save changes? (No = revert to last save)")
  285.     If r = IDCANCEL Then 
  286.       CanClose = CANCEL_EXIT
  287.       Exit Function
  288.     ElseIf r = IDNO Then 
  289.       CanClose = REVERT_ON_EXIT
  290.       Exit Function
  291.     End If
  292.   
  293.     ' Save any projects that user wants. If user cancels anything, then
  294.     ' CheckAndSaveProject returns FALSE and we abort the exit.
  295.     n = ProjectManager.ProjectCount - 1
  296.     For i = 0 To n
  297.       If Not ObjectViewer.CheckAndSaveProject(ProjectManager.Project(i)) Then 
  298.         CanClose = CANCEL_EXIT
  299.         Exit Function
  300.       End If
  301.     Next i
  302.   
  303.     ' The 0th module is always the intrinsic module, so skip it.
  304.     n = ModuleManager.ModuleCount - 1
  305.     For i = 1 To n
  306.       m = ModuleManager.Module(i)
  307.       If m.ReadOnly = False && m.IsModified Then 
  308.         r = ync.Msg("Save changes to module " & m.DisplayName & "?")
  309.         If r = IDCANCEL Then 
  310.           CanClose = CANCEL_EXIT
  311.           Exit Function
  312.         ElseIf r = IDYES Then 
  313.           If Not Envelop.SADlg.SaveModule(m) Then 
  314.             CanClose = CANCEL_EXIT
  315.             Exit Function
  316.           End If
  317.         End If
  318.       End If
  319.     Next i
  320.   End Function
  321.  
  322.   Function getFileDialogDir() As String
  323.     Dim Dir as New Directory
  324.     Dir.Path = FileDialogDir_
  325.     If Dir.Exists Then 
  326.       getFileDialogDir = FileDialogDir_
  327.     Else 
  328.       getFileDialogDir = ""
  329.     End If
  330.   End Function
  331.  
  332.   Sub setFileDialogDir(newValue As String)
  333.     ' FileDialogDir is configured to accept either a directory or a file.
  334.     ' If it gets a file, it will extract the path from it.
  335.     If Instr(newValue, ".") > 0 Then 
  336.       Dim f as New File
  337.       f.FileName = newValue
  338.       FileDialogDir_ = f.Path
  339.     Else 
  340.       FileDialogDir_ = newValue
  341.     End If
  342.     ProjectStartupOptions.FileDialogDir = FileDialogDir_
  343.     ModuleManager.ModuleContaining(ProjectStartupOptions).Save
  344.   End Sub
  345.  
  346.   Sub Shutdown
  347.     Help.Quit
  348.   End Sub
  349.  
  350.   Sub Startup
  351.     ' Secure this object to prevent deletion.
  352.     ' TODO: Need to specify can't delete or rename security, can't use general, because
  353.     ' then methods and properties can't be changed either.
  354.     ' SecureObject(Me, ACL)
  355.   
  356.     ' Initialize paths to help and samples
  357.     Help.FileName = App.Path & "..\help\envelop.hlp"
  358.     SamplesPath = "..\Examples"
  359.   
  360.     ' Define Application Main Form
  361.     MainForm = EnvelopForm
  362.   
  363.     ' Show startup dialog according to options
  364.     ProjectStartupDialog.Execute
  365.   End Sub
  366.  
  367.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  368.     ' Write our parent's properties, but none of ours.
  369.     TextUnload = False
  370.   End Function
  371.  
  372. End Type
  373.  
  374. Type ProjectStartupOptionsDialog From Form
  375.   Type BtnOK From Button
  376.  
  377.     ' METHODS for object: ProjectStartupOptionsDialog.BtnOK
  378.     Sub Click()
  379.       Parent.ModalResult IDOK
  380.       Parent.Hide
  381.     End Sub
  382.  
  383.   End Type
  384.   Type BtnCancel From Button
  385.  
  386.     ' METHODS for object: ProjectStartupOptionsDialog.BtnCancel
  387.     Sub Click()
  388.       Parent.ModalResult IDCANCEL
  389.       Parent.Hide
  390.     End Sub
  391.  
  392.   End Type
  393.   Dim OptDefaultProj As New OptionButton
  394.   Dim OptShowDialog As New OptionButton
  395.   Dim OptNewProj As New OptionButton
  396.   Dim OptOpenProj As New OptionButton
  397.   Dim OptNoProj As New OptionButton
  398.  
  399.   ' METHODS for object: ProjectStartupOptionsDialog
  400.   Sub Execute
  401.     LoadForm
  402.     Center
  403.     SyncOptions
  404.     If ShowModal = IDOK Then 
  405.       With ProjectStartupOptions
  406.         If OptShowDialog.Value Then 
  407.           .AskOnStartup = True
  408.         Else 
  409.           .AskOnStartup = False
  410.           If OptNoProj.Value Then 
  411.             .StartupAction = .ACTION_NO_PROJECT
  412.           ElseIf OptOpenProj.Value Then 
  413.             .StartupAction = .ACTION_OPEN_PROJECT
  414.           ElseIf OptNewProj.Value Then 
  415.             .StartupAction = .ACTION_NEW_PROJECT
  416.           Else 
  417.             .StartupAction = .ACTION_DEFAULT_PROJECT
  418.           End If
  419.         End If
  420.       End With
  421.       ModuleManager.ModuleContaining(ProjectStartupOptions).Save
  422.     End If
  423.   End Sub
  424.  
  425.   Sub Resize()
  426.     Dim m, mm, l, t, w, h, effWidth As Single
  427.     m = BtnOK.Top
  428.     mm = m * 2
  429.     effWidth = IIf(ScaleWidth < 4000, 4000, ScaleWidth)
  430.     w = BtnOK.Width
  431.     l = effWidth - m - w
  432.     t = m
  433.     h = BtnOK.Height
  434.     BtnOK.Move(l, t, w, h)
  435.     t = t + h + m
  436.     BtnCancel.Move(l, t, w, h)
  437.     w = l - OptNoProj.Left - m
  438.     OptDefaultProj.Width = w
  439.     OptShowDialog.Width = w
  440.     OptNewProj.Width = w
  441.     OptOpenProj.Width = w
  442.     OptNoProj.Width = w
  443.   End Sub
  444.  
  445.   Sub SyncOptions
  446.     OptDefaultProj.Value = False
  447.     OptShowDialog.Value = False
  448.     OptNewProj.Value = False
  449.     OptOpenProj.Value = False
  450.     OptNoProj.Value = False
  451.     With ProjectStartupOptions
  452.       If .AskOnStartup Then 
  453.         OptShowDialog.Value = True
  454.       Else 
  455.         Select Case .StartupAction
  456.           Case .ACTION_NO_PROJECT
  457.             OptNoProj.Value = True
  458.           Case .ACTION_OPEN_PROJECT
  459.             OptOpenProj.Value = True
  460.           Case .ACTION_NEW_PROJECT
  461.             OptNewProj.Value = True
  462.           Case Else ' Includes .ACTION_DEFAULT_PROJECT
  463.             OptDefaultProj.Value = True
  464.         End Select
  465.       End If
  466.     End With
  467.   End Sub
  468.  
  469. End Type
  470.  
  471. Type GadgetConfigWizard From WizardMaster.Wizard
  472.   Type ToolName From WizardMaster.FrmStep
  473.     Dim TBName As New TextBox
  474.   End Type
  475.   Type ToolHintText From WizardMaster.FrmStep
  476.     Dim TBHintText As New TextBox
  477.   End Type
  478.   Type ToolBitmap From WizardMaster.FrmStep
  479.     Dim LblBitmap As New Label
  480.     Dim TBBitmap As New TextBox
  481.     Type BTNBrowse From Button
  482.  
  483.       ' METHODS for object: GadgetConfigWizard.ToolBitmap.BTNBrowse
  484.       Sub BtnBrowse_Click()
  485.         Dim open as New OpenDialog
  486.       
  487.         ' Set the title of the open dialog just before we display it.
  488.         open.Title = "Configure Tool Gadget"
  489.       
  490.         ' Set the filter to look for bitmaps
  491.         open.Filter = "Bitmap files|*.bmp|"
  492.       
  493.         ' If a filename was picked, then remember it
  494.         ' Let the picture on this wizard preview it
  495.         If open.Execute <> IDCANCEL Then 
  496.           TBBitmap.Text = open.FileName
  497.         End If
  498.       End Sub
  499.  
  500.     End Type
  501.     Type SampleBox From ObjectBox
  502.       Dim PreviewTool As New ToolGadget
  503.  
  504.       ' METHODS for object: GadgetConfigWizard.ToolBitmap.SampleBox
  505.       Sub Reposition
  506.         dim l,t,w,h as long
  507.         PreviewTool.bitmap.SetPicture Parent.wizard.TempGadget.bitmap.GetPicture
  508.       
  509.         PreviewTool.HintText = Parent.wizard.TempGadget.HintText
  510.         w = (PreviewTool.bitmap.Width + 4) * 15
  511.         If w > 4125 Then w = 4125
  512.         If w < 150 Then w = 150
  513.         h = (PreviewTool.bitmap.Height + 4) * 15
  514.         If h > 1575 Then h = 1575
  515.         If h < 150 Then h = 150
  516.         l = 2850 + ((4125 - w) / 2)
  517.         t = 2175 + ((1575 - h) / 2)
  518.         Move(l, t, w, h)
  519.         PreviewTool.Refresh
  520.         ForceLayout(True)
  521.       End Sub
  522.  
  523.     End Type
  524.     Dim BTNPreview As New Button
  525.  
  526.     ' METHODS for object: GadgetConfigWizard.ToolBitmap
  527.     Sub BTNBrowse_Click()
  528.       Dim length As Integer
  529.       Dim open as New OpenDialog
  530.     
  531.       ' Set the title of the open dialog just before we display it.
  532.       open.Title = "Configure Tool Gadget"
  533.     
  534.       ' Set the filter to look for bitmaps
  535.       open.Filter = "Bitmap files|*.bmp|"
  536.     
  537.       ' Let this selection cause a directory change
  538.       open.NoChangeDir = False
  539.     
  540.       ' If a filename was picked, then remember it
  541.       ' Let the picture on this wizard preview it
  542.       If open.Execute <> IDCANCEL Then 
  543.         TBBitmap.Text = open.FileName
  544.         BTNPreview_Click
  545.       End If
  546.     End Sub
  547.  
  548.     Sub BTNPreview_Click()
  549.       wizard.TempGadget.bitmap.LoadType = "FileBased"
  550.       wizard.TempGadget.bitmap.FileName = TBBitmap.Text
  551.       wizard.TempGadget.bitmap.LoadType = "MemoryBased"
  552.       SampleBox.Reposition
  553.     End Sub
  554.  
  555.   End Type
  556.   Dim OriginalGadget As ButtonGadget
  557.   Type TempGadget From ToolGadget
  558.     Dim PsuedoName As String
  559.   End Type
  560.   Dim BlankBitmap As New Bitmap
  561.  
  562.   ' METHODS for object: GadgetConfigWizard
  563.   Sub FinishTool
  564.     Try
  565.       OriginalGadget.HintText = TempGadget.HintText
  566.     Catch AccessDenied
  567.     End Try
  568.     If TempGadget.bitmap.ImageSize <= 0 Then 
  569.       OriginalGadget.bitmap.SetPicture BlankBitmap.GetPicture
  570.     Else 
  571.       OriginalGadget.bitmap.SetPicture TempGadget.bitmap.GetPicture
  572.     End If
  573.     OriginalGadget.Name = TempGadget.PsuedoName
  574.     OriginalGadget.Refresh
  575.     OriginalGadget.Parent.ForceLayout(True)
  576.   End Sub
  577.  
  578.   Sub InitTempGadget
  579.     TempGadget.bitmap.SetPicture OriginalGadget.bitmap.GetPicture
  580.     TempGadget.HintText = OriginalGadget.HintText
  581.     TempGadget.PsuedoName = OriginalGadget.Name
  582.     TempGadget.Refresh
  583.   End Sub
  584.  
  585.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  586.     ' Write our parent's properties, but none of ours.
  587.     TextUnload = False
  588.   End Function
  589.  
  590.   Sub ToolBitmap_ValidateDisplay(ok As Boolean)
  591.     ToolBitmap.TBBitmap.Text = TempGadget.bitmap.FileName
  592.     ToolBitmap.SampleBox.Reposition
  593.     ToolBitmap.SampleBox.ForceLayout(True)
  594.   End Sub
  595.  
  596.   Sub ToolBitmap_ValidateFinish(ok As Boolean)
  597.     dim OKToFinish as boolean
  598.     ToolBitmap_ValidateNext(OKToFinish)
  599.     If OKToFinish Then FinishTool
  600.   End Sub
  601.  
  602.   Sub ToolBitmap_ValidateNext(ok As Boolean)
  603.     TempGadget.bitmap.LoadType = "FileBased"
  604.     TempGadget.bitmap.FileName = ToolBitmap.TBBitmap.Text
  605.     TempGadget.bitmap.LoadType = "MemoryBased"
  606.   
  607.     ok = True
  608.   End Sub
  609.  
  610.   Sub ToolHintText_ValidateDisplay(ok As Boolean)
  611.     ToolHintText.TBHintText.Text = TempGadget.HintText
  612.   End Sub
  613.  
  614.   Sub ToolHintText_ValidateFinish(ok As Boolean)
  615.     dim OKToFinish as Boolean
  616.     ToolHintText_ValidateNext(OKToFinish)
  617.     If OKToFinish Then FinishTool
  618.   End Sub
  619.  
  620.   Sub ToolHintText_ValidateNext(ok As Boolean)
  621.     TempGadget.HintText = ToolHintText.TBHintText.Text
  622.     ok = True
  623.   End Sub
  624.  
  625.   Sub ToolName_ValidateDisplay(ok As Boolean)
  626.     If OriginalGadget = Nothing Then 
  627.       MessageBox.Msg("Error in GadgetConfigWizard, OriginalGadget is not connected")
  628.       ok = False
  629.     Else 
  630.       ' If not initialized yet, set the TempGadget to match the original
  631.       If Not ToolName.initialized Then 
  632.         InitTempGadget
  633.         ToolName.initialized = True
  634.       End If
  635.       ToolName.TBName.Text = TempGadget.PsuedoName
  636.       ToolName.TBName.SelStart = 0
  637.       ToolName.TBName.SelLength = 1000
  638.     End If
  639.   End Sub
  640.  
  641.   Sub ToolName_ValidateFinish(ok As Boolean)
  642.     Dim OKToFinish as Boolean
  643.     ToolName_ValidateNext(OKToFinish)
  644.     If OKToFinish Then FinishTool
  645.   End Sub
  646.  
  647.   Sub ToolName_ValidateNext(ok As Boolean)
  648.     If ToolName.TBName.Text = "" Then 
  649.       MessageBox.Msg("You must supply a name before continuing")
  650.       ok = False
  651.     Else 
  652.       TempGadget.PsuedoName = ToolName.TBName.Text
  653.       ok = True
  654.     End If
  655.   End Sub
  656.  
  657. End Type
  658.  
  659. Type ObjectEditor From ObjectEditor
  660. End Type
  661.  
  662. Type MethodEditor From MethodEditor
  663.  
  664.   ' METHODS for object: MethodEditor
  665.   Sub Help()
  666.     Envelop.Help.ShowMethodHelp(MethodName, CurObject)
  667.   End Sub
  668.  
  669. End Type
  670.  
  671. Type ObjectEditorMgr From ObjectEditorMgr
  672. End Type
  673.  
  674. Type SamplesBrowser From Form
  675.   Dim ChkBasicTraining As New CheckBox
  676.   Dim ChkAdvancedTraining As New CheckBox
  677.   Dim ChkConceptsTraining As New CheckBox
  678.   Dim ChkComponents As New CheckBox
  679.   Dim ChkApplications As New CheckBox
  680.   Dim ChkTools As New CheckBox
  681.   Dim ChkKeywordSearch As New CheckBox
  682.   Dim Label1 As New Label
  683.   Dim TxtKeySearch As New TextBox
  684.   Dim BtnShowTopics As New Button
  685.   Dim LstKeywords As New ListBox
  686.   Dim Label2 As New Label
  687.   Dim BtnLoadSample As New Button
  688.   Dim BtnHelp As New Button
  689.   Dim LstTopics As New ListBox
  690.   Dim CurrentSampleModule As ObjectModule
  691.   Dim CurrentSecondModule As ObjectModule
  692.   Dim LstSearchMaster As New ListBox
  693.   Dim DirBasicTraining As String
  694.   Dim DirAdvancedTraining As String
  695.   Dim DirConceptsTraining As String
  696.   Dim DirComponents As String
  697.   Dim DirApplications As String
  698.   Dim DirTools As String
  699.   Dim ScanCategory As String
  700.   Dim LstSampleNameIndex As New ListBox
  701.   Dim LblTopics As New Label
  702.   Dim helpfile As New HelpFile
  703.   Dim initializing As Long
  704.   Dim PopulateMasterListPunchOut As Long
  705.   Dim BtnUpdate As New Button
  706.  
  707.   ' METHODS for object: SamplesBrowser
  708.   Sub BtnHelp_Click()
  709.     ' If we have a topic selected, load it
  710.     If (LstTopics.ListIndex <> -1) Then 
  711.       Dim samplename As String
  712.       samplename = Mid(LstTopics.Text, Instr(LstTopics.Text, ":") + 1)
  713.       LoadHelp(samplename)
  714.     End If
  715.   End Sub
  716.  
  717.   Sub BtnLoadSample_Click()
  718.     ' If we have a topic selected, load it
  719.     If (LstTopics.ListIndex <> -1) Then 
  720.       Dim samplename As String
  721.       samplename = Mid(LstTopics.Text, Instr(LstTopics.Text, ":") + 1)
  722.       LoadSample(samplename)
  723.     End If
  724.   End Sub
  725.  
  726.   Sub BtnShowTopics_Click()
  727.     PopulateTopicsList(LstKeywords.Text)
  728.   End Sub
  729.  
  730.   Sub BtnUpdate_Click()
  731.     PopulateMasterList
  732.   End Sub
  733.  
  734.   Sub ChkAdvancedTraining_Click()
  735.     BtnUpdate.Enabled = True
  736.   End Sub
  737.  
  738.   Sub ChkApplications_Click()
  739.     BtnUpdate.Enabled = True
  740.   End Sub
  741.  
  742.   Sub ChkBasicTraining_Click()
  743.     BtnUpdate.Enabled = True
  744.   End Sub
  745.  
  746.   Sub ChkComponents_Click()
  747.     BtnUpdate.Enabled = True
  748.   End Sub
  749.  
  750.   Sub ChkConceptsTraining_Click()
  751.     BtnUpdate.Enabled = True
  752.   End Sub
  753.  
  754.   Sub ChkKeywordSearch_Click()
  755.     If ChkKeywordSearch.Value Then 
  756.       LblTopics.Caption = "<topic>:<sample>"
  757.       TxtKeySearch.Enabled = True
  758.       BtnShowTopics.Enabled = True
  759.       LstKeywords.Enabled = True
  760.       TxtKeySearch.SetFocus
  761.     Else 
  762.       LblTopics.Caption = "<category>:<sample>"
  763.       TxtKeySearch.Enabled = False
  764.       BtnShowTopics.Enabled = False
  765.       LstKeywords.Enabled = False
  766.     End If
  767.   
  768.     ' Need to enable the Update button
  769.     BtnUpdate.Enabled = True
  770.   End Sub
  771.  
  772.   Sub ChkTools_Click()
  773.     BtnUpdate.Enabled = True
  774.   End Sub
  775.  
  776.   Sub DoHelpEnabling()
  777.     Dim item, comma1, comma2 As Integer
  778.     Dim itemstr, filename, path, samplename, sample As String
  779.     Dim file As New File
  780.   
  781.     ' If we have a topic selected, load it
  782.     If (LstTopics.ListIndex <> -1) Then 
  783.       sample = Mid(LstTopics.Text, Instr(LstTopics.Text, ":") + 1)
  784.     Else 
  785.       Exit Sub
  786.     End If
  787.   
  788.     ' Locate the corresponding sample
  789.     For item = 0 To LstSampleNameIndex.ListCount - 1
  790.       itemstr = LstSampleNameIndex.List(item)
  791.       comma1 = Instr(itemstr, ",")
  792.       samplename = Trim(Left(itemstr, comma1 - 1))
  793.       If (samplename = sample) Then 
  794.         comma2 = Instr(comma1 + 1, itemstr, ",")
  795.         filename = Trim(Mid(itemstr, comma1 + 1, comma2 - comma1 - 1))
  796.         path = Trim(Mid(itemstr, comma2 + 1))
  797.         Exit For
  798.       End If
  799.     Next item
  800.   
  801.     ' Determine which is the most current file
  802.     ' between the ebo and eto sample files
  803.     file.FileName = path & "\" & filename & ".hlp"
  804.   
  805.     ' If the help file exists, enable the button
  806.     BtnHelp.Enabled = file.Exists
  807.   End Sub
  808.  
  809.   Function getDateTime(filename as File) As String
  810.     getDateTime = Right(filename.Date, 4) & Left(filename.Date, 6) & filename.Time
  811.   End Function
  812.  
  813.   Sub InitSampleSpy
  814.     initializing = True
  815.   
  816.     ' Set the search directories and strip off leading (..)
  817.     DirBasicTraining = Envelop.Path & "..\bootcamp\basic"
  818.     DirAdvancedTraining = Envelop.Path & "..\bootcamp\advanced"
  819.     DirConceptsTraining = Envelop.Path & "..\bootcamp\concepts"
  820.     DirComponents = Envelop.Path & "..\arsenal\parts"
  821.     DirApplications = Envelop.Path & "..\arsenal\apps"
  822.     DirTools = Envelop.Path & "..\arsenal\tools"
  823.   
  824.     ' Set all the category checkboxes to false
  825.     ChkBasicTraining.Value = 0
  826.     ChkAdvancedTraining.Value = 0
  827.     ChkConceptsTraining.Value = 0
  828.     ChkComponents.Value = 0
  829.     ChkTools.Value = 0
  830.     ChkApplications.Value = 0
  831.   
  832.     ChkKeywordSearch.Value = 0
  833.   
  834.     ' Clear the master and keyword lists
  835.     LstSearchMaster.Clear()
  836.     LstSampleNameIndex.Clear()
  837.     LstKeywords.Clear()
  838.     LstTopics.Clear()
  839.     TxtKeySearch.Text = ""
  840.   
  841.     initializing = False
  842.   
  843.   End Sub
  844.  
  845.   Sub Load
  846.     ' set the initial directories for various types of samples
  847.     InitSampleSpy
  848.     CurrentSampleModule = Nothing
  849.     PopulateMasterList
  850.   End Sub
  851.  
  852.   Sub LoadHelp(sample As String)
  853.     Dim item, comma1, comma2 As Integer
  854.     Dim itemstr, filename, path, samplename As String
  855.     Dim file As New File
  856.   
  857.     ' Locate the corresponding sample
  858.     For item = 0 To LstSampleNameIndex.ListCount - 1
  859.       itemstr = LstSampleNameIndex.List(item)
  860.       comma1 = Instr(itemstr, ",")
  861.       samplename = Trim(Left(itemstr, comma1 - 1))
  862.       If (samplename = sample) Then 
  863.         comma2 = Instr(comma1 + 1, itemstr, ",")
  864.         filename = Trim(Mid(itemstr, comma1 + 1, comma2 - comma1 - 1))
  865.         path = Trim(Mid(itemstr, comma2 + 1))
  866.         Exit For
  867.       End If
  868.     Next item
  869.   
  870.     ' Determine which is the most current file
  871.     ' between the ebo and eto sample files
  872.     path = IIf((Right(path, 1) = "\"), path, path & "\")
  873.     file.FileName = path & filename & ".hlp"
  874.   
  875.     ' Load the file if it exists, otherwise disable the button
  876.     If Not file.Exists Then 
  877.       BtnHelp.Enabled = False
  878.     Else 
  879.       helpfile.FileName = file.FileName
  880.       helpfile.Contents
  881.     End If
  882.   End Sub
  883.  
  884.   Function LoadNewer(ByVal path as string, ByVal filename as string) As Object
  885.     ' Determine which is the most current file
  886.     ' between the ebo and eto sample files
  887.     dim file As New File
  888.     dim ebodatetime As String
  889.     path = IIf((Right(path, 1) = "\"), path, path & "\")
  890.     file.FileName = path & filename & ".ebo"
  891.     If file.Exists Then 
  892.       ebodatetime = getDateTime(file)
  893.       file.FileName = path & filename & ".eto"
  894.       If file.Exists && (getDateTime(file) < ebodatetime) Then 
  895.         file.FileName = path & filename & ".ebo"
  896.       End If
  897.     Else 
  898.       file.FileName = path & filename & ".eto"
  899.     End If
  900.     LoadNewer = ModuleManager.LoadModule(file.FileName, True)
  901.   End Function
  902.  
  903.   Sub LoadSample (sample As String)
  904.     Dim item, comma1, comma2 As Integer
  905.     Dim itemstr, filename, path, samplename As String
  906.     Dim ebodatetime As String
  907.     Dim file As New File
  908.   
  909.     ' Locate the corresponding sample
  910.     For item = 0 To LstSampleNameIndex.ListCount - 1
  911.       itemstr = LstSampleNameIndex.List(item)
  912.       comma1 = Instr(itemstr, ",")
  913.       samplename = Trim(Left(itemstr, comma1 - 1))
  914.       If (samplename = sample) Then 
  915.         comma2 = Instr(comma1 + 1, itemstr, ",")
  916.         filename = Trim(Mid(itemstr, comma1 + 1, comma2 - comma1 - 1))
  917.         path = Trim(Mid(itemstr, comma2 + 1))
  918.         Exit For
  919.       End If
  920.     Next item
  921.   
  922.     ' Make sure we find a sample
  923.     If path = "" Or filename = "" Then 
  924.       InfoBox.Message("Not Found", "Sample " & sample & " not found in index.")
  925.       Exit Sub
  926.     End If
  927.   
  928.     file.FileName = path & filename & ".eto"
  929.   
  930.     ' Unload Previous Sample(s)
  931.     If CurrentSecondModule Then 
  932.       CurrentSecondModule.Unload
  933.       CurrentSecondModule = Nothing
  934.     End If
  935.     If CurrentSampleModule Then 
  936.       CurrentSampleModule.Unload
  937.       CurrentSampleModule = Nothing
  938.     End If
  939.   
  940.     If file.Exists Then 
  941.       Dim curMod as ObjectModule
  942.       curMod = ModuleManager.CurrentModule
  943.       CurrentSampleModule = LoadNewer(file.Path, file.Name)
  944.       file.FileName = file.Path & "s" & Left$(file.Name, 7) & file.Extension
  945.       If file.Exists Then 
  946.         CurrentSecondModule = LoadNewer(file.Path, file.Name)
  947.       Else 
  948.         CurrentSecondModule = Nothing
  949.       End If
  950.       ModuleManager.CurrentModule = curMod
  951.       ObjectViewer.Reset
  952.     Else 
  953.       InfoBox.Message("File not found", "Unable to load sample " & sample)
  954.     End If
  955.   
  956.   End Sub
  957.  
  958.   Sub LstKeywords_DblClick()
  959.     BtnShowTopics_Click
  960.   End Sub
  961.  
  962.   Sub LstTopics_Click()
  963.     DoHelpEnabling
  964.   End Sub
  965.  
  966.   Sub LstTopics_DblClick()
  967.     BtnLoadSample_Click
  968.   End Sub
  969.  
  970.   Sub PopulateMasterList()
  971.   
  972.     ' Clear the master and keyword lists
  973.     LstSearchMaster.Clear()
  974.     LstSampleNameIndex.Clear()
  975.     LstKeywords.Clear()
  976.     LstTopics.Clear()
  977.     TxtKeySearch.Text = ""
  978.   
  979.     ' Depending on which option is selected, populate the master list with
  980.     ' corresponding sample information
  981.     ScanCategory = ""
  982.     If ChkBasicTraining.Value Then 
  983.       ScanCategory = "Basic Training"
  984.       ScanSamples DirBasicTraining
  985.     End If
  986.     If ChkAdvancedTraining.Value Then 
  987.       ScanCategory = "Advanced Training"
  988.       ScanSamples DirAdvancedTraining
  989.     End If
  990.     If ChkConceptsTraining.Value Then 
  991.       ScanCategory = "Concepts Training"
  992.       ScanSamples DirConceptsTraining
  993.     End If
  994.     If ChkComponents.Value Then 
  995.       ScanCategory = "Components"
  996.       ScanSamples DirComponents
  997.     End If
  998.     If ChkApplications.Value Then 
  999.       ScanCategory = "Applications"
  1000.       ScanSamples DirApplications
  1001.     End If
  1002.     If ChkTools.Value Then 
  1003.       ScanCategory = "Tools"
  1004.       ScanSamples DirTools
  1005.     End If
  1006.   
  1007.     If ChkKeywordSearch.Value && LstKeywords.ListCount = 0 && ScanCategory <> "" Then 
  1008.       PostNotFoundMessage ScanCategory
  1009.     End If
  1010.   
  1011.     ' Disable the Update button to signify that no update is needed
  1012.     BtnUpdate.Enabled = False
  1013.   
  1014.   End Sub
  1015.  
  1016.   Sub PopulateTopicsList (key as string)
  1017.     Dim item, comma1, comma2, comma3 As Integer
  1018.     Dim itemstr, keypart, topicname, samplename As String
  1019.   
  1020.     ' clear the current topics list
  1021.     LstTopics.Clear()
  1022.   
  1023.     For item = 0 To LstSearchMaster.ListCount - 1
  1024.       itemstr = LstSearchMaster.List(item)
  1025.       comma1 = Instr(itemstr, ",")
  1026.       keypart = Trim(Left(itemstr, comma1 - 1))
  1027.       If (keypart = key) Then 
  1028.         comma2 = Instr(comma1 + 1, itemstr, ",")
  1029.         comma3 = Instr(comma2 + 1, itemstr, ",")
  1030.         topicname = Trim(Mid(itemstr, comma1 + 1, comma2 - comma1 - 1))
  1031.         samplename = Trim(Mid(itemstr, comma2 + 1, comma3 - comma2 - 1))
  1032.         LstTopics.AddItem(topicname & ":" & samplename)
  1033.       End If
  1034.       If (LCase(keypart) > LCase(key)) Then 
  1035.         Exit Sub
  1036.       End If
  1037.     Next item
  1038.   End Sub
  1039.  
  1040.   Sub PostNotFoundMessage (message As String)
  1041.     ' Display a message if no samples were found
  1042.     InfoBox.Message("Not Found", "No samples were found in the " & message & " category.")
  1043.   End Sub
  1044.  
  1045.   Sub ScanKwdFile(ByVal filename As String, attr As Long)
  1046.     Dim file As New TextFile
  1047.     Dim contents, samplename, key, part1, part2 As String
  1048.     Dim i, pos As Integer
  1049.   
  1050.     ' Use a TextFile object to parse path name into parts, as well
  1051.     ' as to read the contents and manipulate them into the index lists.
  1052.     file.FileName = filename
  1053.     contents = file.ContentsAsString
  1054.     samplename = ""
  1055.     Do
  1056.       pos = Instr(contents, "^M")
  1057.       If pos = 0 Then pos = Len(contents) + 1
  1058.       key = Trim$(Left$(contents, pos - 1))
  1059.       contents = Mid$(contents, pos + 2)
  1060.       If (Len(key) > 0) Then 
  1061.         ' look for colon separators in each line entry
  1062.         pos = Instr(key, ":")
  1063.         part1 = Trim(Left(key, pos - 1))
  1064.         part2 = Trim(Mid(key, pos + 1))
  1065.         If part1 = "SampleName" Then 
  1066.           LstSampleNameIndex.AddItem(part2 & "," & file.Name & "," & file.Path)
  1067.           If ChkKeywordSearch.Value Then 
  1068.             samplename = part2
  1069.           Else 
  1070.             LstTopics.AddItem(ScanCategory & ":" & part2)
  1071.             Exit Do
  1072.           End If
  1073.         Else 
  1074.           If samplename = "" Then 
  1075.             InfoBox.Message("Not Found", "Could not identify SampleName entry in keyword file: " & filename)
  1076.             Exit Sub
  1077.           End If
  1078.           If ChkKeywordSearch.Value Then 
  1079.             LstSearchMaster.AddItem(part2 & "," & part1 & "," & samplename & "," & file.Path)
  1080.             If (LstKeywords.ItemIndex(part2) = -1) Then LstKeywords.AddItem(part2)
  1081.           End If
  1082.         End If
  1083.       End If
  1084.     Loop While Len(contents) > 0
  1085.   End Sub
  1086.  
  1087.   Sub ScanSamples (path As String)
  1088.     Dim dir As New Directory
  1089.     dir.Path = path
  1090.     dir.EnumContents(Me, "ScanKwdFile", "*.kwd", True)
  1091.   End Sub
  1092.  
  1093.   Sub TxtKeySearch_Change()
  1094.     Dim newselection as Integer
  1095.   
  1096.     If TxtKeySearch.Text = "" Then 
  1097.       LstKeywords.ListIndex = -1
  1098.     Else 
  1099.       ' Search for the keyword in the keyword list and select it
  1100.       newselection = LstKeywords.FindString(TxtKeySearch.Text, -1)
  1101.   
  1102.       If (newselection <> -1) Then 
  1103.         ' Suppress keystroke that generated new selection
  1104.         LstKeywords.ListIndex = newselection
  1105.       End If
  1106.     End If
  1107.   End Sub
  1108.  
  1109. End Type
  1110.  
  1111. Type MenuSelector From Form
  1112.   Dim Label1 As New Label
  1113.   Dim btnOK As New Button
  1114.   Dim btnCancel As New Button
  1115.   Dim Label2 As New Label
  1116.   Dim optMbar As New OptionButton
  1117.   Dim optPopup As New OptionButton
  1118.   Dim cboMenus As New ObjectCombo
  1119.  
  1120.   ' METHODS for object: MenuSelector
  1121.   Sub btnCancel_Click()
  1122.     ModalResult(IDCANCEL)
  1123.     Hide
  1124.   End Sub
  1125.  
  1126.   Sub btnOK_Click()
  1127.     ModalResult(IDOK)
  1128.     Hide
  1129.   End Sub
  1130.  
  1131.   Sub optMbar_Click()
  1132.     Populate
  1133.   End Sub
  1134.  
  1135.   Sub optPopup_Click()
  1136.     Populate
  1137.   End Sub
  1138.  
  1139.   Sub Populate
  1140.     Dim name As String
  1141.     Dim i As Integer
  1142.   
  1143.     cboMenus.Clear
  1144.     If optMbar.Value = True Then 
  1145.       cboMenus.RootObject = FindObject("MenuBar")
  1146.     Else 
  1147.       cboMenus.RootObject = FindObject("PopupMenu")
  1148.     End If
  1149.   
  1150.     ' Filter out 'MenuBar' , 'PopupMenu', 'MenuTester.*'
  1151.     ' work our way up from the bottom of the list so that
  1152.     ' the indices won't be disturbed by any removals
  1153.     For i = cboMenus.ListCount - 1 To 0 Step -1
  1154.       name = cboMenus.List(i)
  1155.       If name = "MenuBar" || name = "PopupMenu" || Left$(name, 11) = "MenuTester." Then cboMenus.RemoveItem(i)
  1156.     Next i
  1157.   End Sub
  1158.  
  1159.   Sub Preload()
  1160.     LoadForm
  1161.   End Sub
  1162.  
  1163.   Sub Resize()
  1164.     Dim l As Integer
  1165.   
  1166.     cboMenus.Width = ScaleWidth - 2 * cboMenus.Left
  1167.   
  1168.     l = ScaleWidth - 60 - btnOK.Width
  1169.     btnCancel.Left = l
  1170.     btnOK.Left = l
  1171.   End Sub
  1172.  
  1173. End Type
  1174.  
  1175. Type EnvelopFont From Font
  1176. End Type
  1177.  
  1178. Type ProjectAndModuleView From IndentedList
  1179.   Dim dirty As Boolean
  1180.   Dim bitmap As New Bitmap
  1181.   Dim kIconProject As Integer
  1182.   Dim kIconModule As Integer
  1183.   Dim kIconObject As Integer
  1184.   Dim kLevelProject As Integer
  1185.   Dim kLevelModule As Integer
  1186.   Dim kLevelObject As Integer
  1187.   Property SelModule Get getSelModule Set setSelModule As ObjectModule
  1188.   Property SelObject Get getSelObject Set setSelObject As Object
  1189.  
  1190.   ' METHODS for object: ProjectAndModuleView
  1191.   Sub Click()
  1192.     If SelObject Then ObjectEditorMgr.Selection SelObject
  1193.   End Sub
  1194.  
  1195.   Sub Collapsed(ByVal itemIndex as Integer, ByVal itemData as Long, itemObj as Object)
  1196.     Dim level As Integer
  1197.     level = ItemLevel(itemIndex)
  1198.     If level = kLevelProject Then  ' Project
  1199.       SetItemIcon(itemIndex, IIf(itemObj.IsCurrent, kIconProject + 1, kIconProject))
  1200.     ElseIf level = kLevelModule Then  ' Module
  1201.       SetItemIcon(itemIndex, IIf(itemObj.IsCurrent, kIconModule + 1, kIconModule))
  1202.     End If
  1203.   End Sub
  1204.  
  1205.   Sub DblClick()
  1206.     ObjectViewer.DblClickObject getSelObject
  1207.   End Sub
  1208.  
  1209.   Sub DestroySelectedObject()
  1210.     DestroyObject(SelObject)
  1211.     ResetObjectDestroyed(ListIndex)
  1212.   End Sub
  1213.  
  1214.   Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  1215.     Parent.DragAndDrop(source, x, y, state, effect)
  1216.   End Sub
  1217.  
  1218.   Sub DragStart(o as XferData, x,y as single)
  1219.     o.ObjectRef = SelObject
  1220.     o.Drag(1)
  1221.     ' Drag and drop ends up eating the mouse up event.  Since we
  1222.     ' are doing left mouse dnd, this leaves the list in a state where it
  1223.     ' is expecting a mouse up.  
  1224.     ' We will explicitly send a lbutton up message to the list's hwnd
  1225.     ' to fix the problem.
  1226.     SendMessage(hWnd, User32.WM_LBUTTONUP, 0, 0)
  1227.   End Sub
  1228.  
  1229.   Sub Expand(ByVal itemIndex as Integer, ByVal itemData as Long, itemObj as Object)
  1230.     Dim level, oldCount As Integer
  1231.     level = ItemLevel(itemIndex)
  1232.     oldCount = ListCount
  1233.     If level = kLevelProject Then  ' Project
  1234.       ExpandProject(itemIndex, itemObj)
  1235.       If oldCount < ListCount Then 
  1236.         SetItemIcon(itemIndex, IIf(itemObj.IsCurrent, kIconProject + 3, kIconProject + 2))
  1237.       End If
  1238.     ElseIf level = kLevelModule Then  ' Module
  1239.       ExpandModule(itemIndex, itemObj)
  1240.       If oldCount < ListCount Then 
  1241.         SetItemIcon(itemIndex, IIf(itemObj.IsCurrent, kIconModule + 3, kIconModule + 2))
  1242.       End If
  1243.     End If
  1244.   End Sub
  1245.  
  1246.   Sub ExpandModule(ByVal index as Integer, m as ObjectModule)
  1247.     Dim i, i1, n as integer
  1248.     dim o as Object
  1249.     dim idx as Integer
  1250.     dim icon as Integer
  1251.     dim pstr as String
  1252.   
  1253.     ' Add in all the module's objects
  1254.     i1 = index + 1
  1255.     n = m.StaticCount - 1
  1256.     Sorted = True
  1257.     For i = 0 To n
  1258.       o = m.StaticObject(i)
  1259.       pstr = o
  1260.       icon = IIf(IsPrototype(o), kIconObject + 1, kIconObject)
  1261.       idx = InsertItem(pstr, icon, kLevelObject, i1)
  1262.       SetItemObject(idx, o)
  1263.     Next i
  1264.     Sorted = False
  1265.   
  1266.   End Sub
  1267.  
  1268.   Function firstEntryInSet(ByVal idx as Integer) As Integer
  1269.     Dim i, level, targetLevel as Integer
  1270.     targetLevel = ItemLevel(idx)
  1271.   
  1272.     For i = idx - 1 To 0 Step -1
  1273.       level = ItemLevel(i)
  1274.       If level <> targetLevel Then 
  1275.         firstEntryInSet = i + 1
  1276.         Exit Function
  1277.       End If
  1278.     Next i
  1279.     firstEntryInSet = 0
  1280.   
  1281.   End Function
  1282.  
  1283.   Function getSelModule As ObjectModule
  1284.     Dim m as ObjectModule
  1285.     Dim i, l as long
  1286.     Dim o as Object
  1287.     i = ListIndex
  1288.     If (i >= 0) Then 
  1289.       l = ItemLevel(i)
  1290.       o = ItemObject(i)
  1291.       If l = kLevelModule Then 
  1292.         m = o
  1293.       ElseIf l = kLevelObject Then 
  1294.         m = ModuleManager.ModuleContaining(o)
  1295.       Else  ' Project
  1296.         m = o.CurrentModule
  1297.       End If
  1298.     Else 
  1299.       m = ModuleManager.CurrentModule
  1300.     End If
  1301.     getSelModule = m
  1302.   End Function
  1303.  
  1304.   Function getSelObject As Object
  1305.     Dim i as long
  1306.     i = ListIndex
  1307.     If (i >= 0) && (ItemLevel(i) = kLevelObject) Then 
  1308.       getSelObject = ItemObject(i)
  1309.     Else 
  1310.       getSelObject = Nothing
  1311.     End If
  1312.   End Function
  1313.  
  1314.   Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  1315.     Dim idx, i, letter, stopidx As Integer
  1316.     If (keyCode = VK_F1) Then 
  1317.       ObjectViewer.Help
  1318.     ElseIf (keyCode = VK_DELETE) Then 
  1319.       Dim level As Integer
  1320.       idx = ListIndex
  1321.       If idx = -1 Then Exit Sub ' bail if nothing selected in my list.
  1322.       level = ItemLevel(idx)
  1323.       If level = kLevelProject Then  ' Close Project
  1324.         ObjectViewer.CloseProject_Click
  1325.       ElseIf level = kLevelModule Then  ' Unload Module
  1326.         ObjectViewer.UnloadModule_Click
  1327.       Else ' assume delete of object
  1328.         EnvelopForm.DeleteObject_Click
  1329.       End If
  1330.     End If
  1331.   
  1332.     ' If not on object, bail
  1333.     If ListIndex = -1 Or ItemLevel(ListIndex) <> kLevelObject Then 
  1334.       Exit Sub
  1335.     End If
  1336.   
  1337.     ' If the next guy is not also an object, go to first object in
  1338.     ' this module.
  1339.     If ItemLevel(ListIndex + 1) <> kLevelObject Then 
  1340.       idx = firstEntryInSet(ListIndex)
  1341.     Else 
  1342.       idx = ListIndex + 1
  1343.     End If
  1344.   
  1345.     ' If the next guy in the list starts with our target, we're
  1346.     ' done. If he starts with a letter less than our target, look
  1347.     ' down in the list. If he starts with a letter greater than
  1348.     ' our target, look up.
  1349.     letter = Asc(UCase(Left(ItemString(idx), 1)))
  1350.     If letter = keyCode Then 
  1351.       ListIndex = idx
  1352.       Exit Sub
  1353.     ElseIf letter < keyCode Then 
  1354.       idx = idx + 1
  1355.     ElseIf letter > keyCode Then 
  1356.       idx = firstEntryInSet(ListIndex)
  1357.     End If
  1358.   
  1359.     ' Look through the list
  1360.     stopidx = ListCount - 1
  1361.     For i = idx To stopidx
  1362.       letter = Asc(UCase(Left(ItemString(i), 1)))
  1363.       If letter = keyCode Then 
  1364.         ListIndex = i
  1365.         Exit Sub
  1366.       ElseIf letter > keyCode Then 
  1367.         Exit Sub
  1368.       End If
  1369.     Next i
  1370.   
  1371.   End Sub
  1372.  
  1373.   Sub MoveSelectedObject()
  1374.     Dim o as Object
  1375.     o = SelObject
  1376.     If o Then 
  1377.       AttachObject(o)
  1378.       RemoveItem(ListIndex)
  1379.       SelectObject(o, True)
  1380.     End If
  1381.   End Sub
  1382.  
  1383.   Sub RenameSelectedObject(nm as String)
  1384.     Dim o as Object
  1385.     o = SelObject
  1386.     If o Then 
  1387.       If TypeOf o Is Form Then 
  1388.         ' This will keep the Caption in sync.
  1389.         o.Name = nm
  1390.       Else 
  1391.         RenameObject(o, nm)
  1392.       End If
  1393.       SetItemObject(ListIndex, o)
  1394.       SetItemString(ListIndex, o)
  1395.     End If
  1396.   End Sub
  1397.  
  1398.   Sub ResetItemIcons
  1399.     Dim i, n, l as long
  1400.     Dim icon as integer
  1401.     Dim o as Object
  1402.   
  1403.     n = ListCount - 1
  1404.     For i = 0 To n
  1405.       l = ItemLevel(i)
  1406.       o = ItemObject(i)
  1407.       If l = kLevelObject Then 
  1408.         icon = IIf(IsPrototype(o), kIconObject + 1, kIconObject)
  1409.         SetItemIcon(i, icon)
  1410.       Else 
  1411.         icon = IIf(ItemIsExpanded(i), 2, 0) + IIf(o.IsCurrent, 1, 0)
  1412.         If l = kLevelProject Then 
  1413.           SetItemIcon(i, icon + kIconProject)
  1414.         ElseIf l = kLevelModule Then 
  1415.           SetItemIcon(i, icon + kIconModule)
  1416.         End If
  1417.       End If
  1418.     Next i
  1419.   End Sub
  1420.  
  1421.   Sub ResetModuleString(m as ObjectModule)
  1422.     Dim i, n as Integer
  1423.     Dim o As Object
  1424.   
  1425.     ' Find the module entry in question (all if m = Nothing)
  1426.     n = ListCount - 1
  1427.     For i = 0 To n
  1428.       o = ItemObject(i)
  1429.       If ItemLevel(i) = kLevelModule && (Not m || o = m) Then 
  1430.         ' Set the item to show the correct module name
  1431.         SetItemString(i, o.DisplayName)
  1432.         If m Then Exit Sub
  1433.       End If
  1434.     Next i
  1435.   End Sub
  1436.  
  1437.   Sub ResetNewObject(newObj As Object)
  1438.     SelectObject(newObj, True)
  1439.   End Sub
  1440.  
  1441.   Sub ResetObjectDestroyed(ByVal selIndex As Integer)
  1442.     ' Cull items whose object has been destroyed, while trying to keep the
  1443.     ' selected item "near" where it was.
  1444.     Dim i, oldCount As Integer
  1445.   
  1446.     ' Remove items whose object no longer exists
  1447.     i = 0
  1448.     While i < ListCount ' Can't cache list count for this loop
  1449.       If ItemObject(i) = Nothing Then 
  1450.         oldCount = ListCount
  1451.         If ItemIsExpanded(i) Then CollapseItem(i)
  1452.         RemoveItem(i)
  1453.         ' Adjust selIndex if removed items were above here.
  1454.         If i < selIndex Then selIndex = selIndex - (oldCount - ListCount)
  1455.       Else 
  1456.         ' Only increment i when we don't remove any items
  1457.         i = i + 1
  1458.       End If
  1459.     Wend
  1460.   
  1461.     ' Ok, fix up the selection now. If selIndex is past the end of the list,
  1462.     ' just make it the last item. Otherwise leave it.
  1463.     If selIndex >= ListCount Then selIndex = ListCount - 1
  1464.     ListIndex = selIndex
  1465.   End Sub
  1466.  
  1467.   Sub SelectObject(o As Object, ByVal collapse As Boolean)
  1468.     Dim i, n as Integer
  1469.     Dim m as ObjectModule
  1470.   
  1471.     If hWnd = 0 Then Exit Sub
  1472.     If Not o Then 
  1473.       ListIndex = -1
  1474.       Exit Sub
  1475.     End If
  1476.     m = ModuleManager.ModuleContaining(o)
  1477.   
  1478.     ' Find list entry for the module header, bail if not found.
  1479.     i = FindModuleIndex(m, False)
  1480.     If i = -1 Then 
  1481.       ListIndex = -1
  1482.       Exit Sub
  1483.     End If
  1484.   
  1485.     ' If given the hint, collapse before expanding.
  1486.     If collapse Then CollapseItem(i)
  1487.   
  1488.     ' Expand the module -- may change ListCount, so update cached 'n'
  1489.     ExpandItem(i) : n = ListCount
  1490.   
  1491.     ' Paw through them to find the object in question
  1492.     i = i + 1 ' advance off of module header
  1493.     While ItemObject(i) <> o And i < n
  1494.       i = i + 1
  1495.     Wend
  1496.     ListIndex = IIf(i < n, i, -1)
  1497.   End Sub
  1498.  
  1499.   Sub setSelModule(m As ObjectModule)
  1500.     ListIndex = FindModuleIndex(m, True)
  1501.   End Sub
  1502.  
  1503.   Sub setSelObject(o As Object)
  1504.     SelectObject(o, False)
  1505.   End Sub
  1506.  
  1507.   Sub setSelProject(p As Project)
  1508.     ListIndex = FindProjectIndex(p)
  1509.   End Sub
  1510.  
  1511.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  1512.     cmds = cmds & TextFieldUnload(Me, indent, "kIconProject")
  1513.     cmds = cmds & TextFieldUnload(Me, indent, "kIconModule")
  1514.     cmds = cmds & TextFieldUnload(Me, indent, "kIconObject")
  1515.     cmds = cmds & TextFieldUnload(Me, indent, "kLevelProject")
  1516.     cmds = cmds & TextFieldUnload(Me, indent, "kLevelModule")
  1517.     cmds = cmds & TextFieldUnload(Me, indent, "kLevelObject")
  1518.     TextUnload = False
  1519.   End Function
  1520.  
  1521. End Type
  1522.  
  1523. Type Debug From Debug
  1524.  
  1525.   ' METHODS for object: Debug
  1526.   Sub Help()
  1527.     Envelop.Help.ShowTopicHelp("Debug_Window")
  1528.   End Sub
  1529.  
  1530. End Type
  1531.  
  1532. Type SourceIterator From SourceIterator
  1533. End Type
  1534.  
  1535. Type ApplicationEditor From ObjectEditor
  1536.   Property Visible Get getVisible Set setVisible As Boolean
  1537.   Type form From Form
  1538.     Dim LblApp As New Label
  1539.     Dim CBApps As New ObjectCombo
  1540.     Dim BtnNewApp As New Button
  1541.     Dim LblMainForm As New Label
  1542.     Dim CBForms As New ObjectCombo
  1543.     Dim LblEXE As New Label
  1544.     Dim TEEXE As New TextBox
  1545.     Dim BtnBrowseEXE As New Button
  1546.     Dim LblSplash As New Label
  1547.     Dim TESplash As New TextBox
  1548.     Dim BtnBrowseSplash As New Button
  1549.     Dim LblModules As New Label
  1550.     Dim LstModules As New ListBox
  1551.     Dim BtnWriteEXE As New Button
  1552.     Dim ChkNoMainForm As New CheckBox
  1553.     Dim BtnAddModule As New Button
  1554.     Dim BtnDelModule As New Button
  1555.  
  1556.     ' METHODS for object: ApplicationEditor.form
  1557.     Sub BtnAddModule_Click()
  1558.       Dim r as long
  1559.       r = InputDialog.Execute("Add Module", "Enter name of module to load:", "")
  1560.       If r = IDOK Then 
  1561.         Dim i as integer
  1562.         i = LstModules.InsertItem(InputDialog.Text, LstModules.ListIndex + 1)
  1563.         LstModules.SetFocus
  1564.         LstModules.ListIndex = i
  1565.       End If
  1566.     End Sub
  1567.  
  1568.     Sub BtnBrowseEXE_Click()
  1569.       Dim a as Application
  1570.       a = CBApps.SelObject
  1571.       If a Then 
  1572.         Dim openDlg as new OpenDialog
  1573.         openDlg.DefaultExtension = "exe"
  1574.         openDlg.FileMustExist = False
  1575.         openDlg.FileName = a.EXEName
  1576.         openDlg.Filter = "EXE files (*.exe)|*.exe|All files (*.*)|*.*|"
  1577.         openDlg.InitialDir = a.Path
  1578.         openDlg.NoChangeDir = True
  1579.         openDlg.Title = "Choose application EXE file"
  1580.         If openDlg.Execute = IDOK Then 
  1581.           TEEXE.Text = openDlg.FileName
  1582.         End If
  1583.       End If
  1584.     End Sub
  1585.  
  1586.     Sub BtnBrowseSplash_Click()
  1587.       Dim a as Application
  1588.       a = CBApps.SelObject
  1589.       If a Then 
  1590.         Dim openDlg as new OpenDialog
  1591.         openDlg.DefaultExtension = "bmp"
  1592.         openDlg.FileMustExist = True
  1593.         openDlg.FileName = ""
  1594.         openDlg.Filter = "Bitmap files (*.bmp)|*.bmp|All files (*.*)|*.*|"
  1595.         openDlg.InitialDir = a.Path
  1596.         openDlg.NoChangeDir = True
  1597.         openDlg.Title = "Choose splash-screen bitmap file"
  1598.         If openDlg.Execute = IDOK Then 
  1599.           TESplash.Text = openDlg.FileName
  1600.         End If
  1601.       End If
  1602.     End Sub
  1603.  
  1604.     Sub BtnDelModule_Click()
  1605.       Dim i, n as integer
  1606.       i = LstModules.ListIndex
  1607.       If i >= 0 Then 
  1608.         n = LstModules.RemoveItem(i)
  1609.         If i = n Then i = i - 1
  1610.         LstModules.ListIndex = i
  1611.       End If
  1612.     End Sub
  1613.  
  1614.     Sub BtnNewApp_Click()
  1615.       Dim a as Application
  1616.       Dim r as long
  1617.       r = InputDialog.Execute("New Application", "Enter name for new application:", UniqueObjectNameFromString("Application"))
  1618.       If r = IDOK Then 
  1619.         a = CopyObject(Application, InputDialog.Text)
  1620.         CBApps.Reset
  1621.         CBApps.SelObject = a
  1622.         CBForms.SetFocus
  1623.       End If
  1624.     End Sub
  1625.  
  1626.     Sub BtnWriteEXE_Click()
  1627.       Dim a as Application
  1628.       a = CBApps.SelObject
  1629.       If a Then 
  1630.         a.MainForm = CBForms.SelObject
  1631.         a.EXEFileName = TEEXE.Text
  1632.         a.SplashFileName = TESplash.Text
  1633.         a.ModulePath = FormatModulePath()
  1634.         a.WriteEXE
  1635.       End If
  1636.     End Sub
  1637.  
  1638.     Sub CBApps_Click()
  1639.       Dim a as Application
  1640.       Dim appName as String
  1641.       a = CBApps.SelObject
  1642.       appName = a
  1643.       If Len(appName) = 0 || a = Application Then 
  1644.         Caption = "Application"
  1645.       Else 
  1646.         Caption = "Application: " & appName
  1647.       End If
  1648.     
  1649.       If a Then 
  1650.         CBForms.Reset
  1651.         CBForms.SelObject = a.MainForm
  1652.         TEEXE.Text = a.EXEFileName
  1653.         TESplash.Text = a.SplashFileName
  1654.         InitModulePath(a)
  1655.       Else 
  1656.         CBForms.SelObject = Nothing
  1657.         TEEXE.Text = ""
  1658.         TESplash.Text = ""
  1659.         LstModules.Clear
  1660.       End If
  1661.     
  1662.       If CBForms.SelObject = Nothing Then 
  1663.         ChkNoMainForm.Value = 1
  1664.       Else 
  1665.         ChkNoMainForm.Value = 0
  1666.       End If
  1667.     End Sub
  1668.  
  1669.     Sub CBApps_DropDown()
  1670.       Dim a As Object
  1671.       a = CBApps.SelObject
  1672.       CBApps.Reset
  1673.       CBApps.SelObject = a
  1674.     End Sub
  1675.  
  1676.     Sub CBForms_Click()
  1677.       If CBForms.SelObject Then 
  1678.         ChkNoMainForm.Value = 0
  1679.       Else 
  1680.         ChkNoMainForm.Value = 1
  1681.       End If
  1682.     End Sub
  1683.  
  1684.     Sub CBForms_DropDown()
  1685.       Dim f As Object
  1686.       f = CBForms.SelObject
  1687.       CBForms.Reset
  1688.       CBForms.SelObject = f
  1689.     End Sub
  1690.  
  1691.     Sub ChkNoMainForm_Click()
  1692.       If ChkNoMainForm.Value && CBForms.SelObject Then 
  1693.         CBForms.SelObject = Nothing
  1694.       ElseIf ChkNoMainForm.Value = False && CBForms.SelObject = Nothing Then 
  1695.         CBForms.ListIndex = 0
  1696.       End If
  1697.     End Sub
  1698.  
  1699.     Function DetailedEdit(a As Object) As Long
  1700.       If a Then 
  1701.         LoadForm
  1702.         CBApps.Reset
  1703.         CBForms.Reset
  1704.         CBApps.SelObject = a
  1705.         BringToTop
  1706.       End If
  1707.       DetailedEdit = 0
  1708.     End Function
  1709.  
  1710.     Function FormatModulePath() As String
  1711.       Dim i, n as integer
  1712.       Dim ml as string
  1713.     
  1714.       ml = ""
  1715.       n = LstModules.ListCount - 1
  1716.       For i = 0 To n
  1717.         If i Then ml = ml & ";"
  1718.         ml = ml & LstModules.List(i)
  1719.       Next i
  1720.     
  1721.       FormatModulePath = ml
  1722.     
  1723.     End Function
  1724.  
  1725.     Sub InitModulePath(a as Application)
  1726.       Dim i, pos as integer
  1727.       Dim m, ml as string
  1728.       LstModules.Clear
  1729.       ml = a.ModulePath
  1730.       Do
  1731.         pos = Instr(ml, ";")
  1732.         If pos > 0 Then 
  1733.           m = Left(ml, pos - 1)
  1734.           ml = Mid(ml, pos + 1)
  1735.         Else 
  1736.           m = ml
  1737.         End If
  1738.         If Len(m) > 0 Then LstModules.AddItem m
  1739.       Loop While pos > 0
  1740.     End Sub
  1741.  
  1742.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  1743.       If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Application_Editor")
  1744.     End Sub
  1745.  
  1746.     Sub Load
  1747.       CBApps.Height = 1500
  1748.       CBApps.ListIndex = 0
  1749.       CBForms.Height = 1500
  1750.       CBApps.Reset
  1751.       CBForms.Reset
  1752.     End Sub
  1753.  
  1754.     Sub LstModules_KeyDown(keyCode As Integer, ByVal shift As Integer)
  1755.       If keyCode = VK_BACK Then 
  1756.         BtnDelModule_Click
  1757.       ElseIf keyCode = VK_INSERT Then 
  1758.         BtnAddModule_Click
  1759.       End If
  1760.     End Sub
  1761.  
  1762.     Sub Resize
  1763.       dim swidth, sheight as single
  1764.       dim m, mm, w, lh, x1, x2, y as single
  1765.       swidth = LblApp.Width + (2 * BtnNewApp.Width) + 300 ' m5 = 300
  1766.       If swidth < ScaleWidth Then swidth = ScaleWidth
  1767.       m = 60 : mm = 120
  1768.       x1 = LblApp.Width + mm
  1769.       x2 = swidth - BtnNewApp.Width - m
  1770.       w = x2 - x1 - mm
  1771.       CBApps.Width = w
  1772.       BtnNewApp.Left = x2
  1773.     
  1774.       CBForms.Width = w
  1775.       ChkNoMainForm.Left = x2
  1776.     
  1777.       TEEXE.Width = w
  1778.       BtnBrowseEXE.Left = x2
  1779.     
  1780.       TESplash.Width = w
  1781.       BtnBrowseSplash.Left = x2
  1782.     
  1783.       y = TESplash.Top + TESplash.Height + mm
  1784.       sheight = y + 1200
  1785.       If sheight < ScaleHeight Then sheight = ScaleHeight
  1786.       lh = sheight - y - m
  1787.       LstModules.Move(x1, y, w, lh)
  1788.       BtnAddModule.Left = x2
  1789.       BtnDelModule.Left = x2
  1790.     
  1791.       y = sheight - BtnWriteEXE.Height - m
  1792.       BtnWriteEXE.Move(x2, y, BtnWriteEXE.Width, BtnWriteEXE.Height)
  1793.       Refresh
  1794.     End Sub
  1795.  
  1796.   End Type
  1797.  
  1798.   ' METHODS for object: ApplicationEditor
  1799.   Sub BringToTop
  1800.     form.BringToTop
  1801.   End Sub
  1802.  
  1803.   Function DetailedEdit(a As Object) As Long
  1804.     If Not a || (TypeOf a Is Application) Then 
  1805.       DetailedEdit = form.DetailedEdit(a)
  1806.     End If
  1807.   End Function
  1808.  
  1809.   Function getVisible As Boolean
  1810.     getVisible = form.Visible
  1811.   End Function
  1812.  
  1813.   Sub Hide
  1814.     form.Hide
  1815.   End Sub
  1816.  
  1817.   Sub setVisible(vis As Boolean)
  1818.     form.Visible = vis
  1819.   End Sub
  1820.  
  1821.   Sub Show
  1822.     form.Show
  1823.   End Sub
  1824.  
  1825. End Type
  1826.  
  1827. Type EnvelopScreenLayout From ScreenLayout
  1828.  
  1829.   ' METHODS for object: EnvelopScreenLayout
  1830.   Sub SaveExplicitWindows()
  1831.     ' This method is overridden to get certain windows saved explicitly.
  1832.     SaveExplicitWindow("Form")
  1833.     SaveExplicitWindow("EnvelopForm")
  1834.     SaveExplicitWindow("MethodEditor")
  1835.     SaveExplicitWindow("PropertyEditor")
  1836.     SaveExplicitWindow("Debug")
  1837.     SaveExplicitWindow("ObjectViewer")
  1838.     SaveExplicitWindow("SourceSearcher")
  1839.     SaveExplicitWindow("MenuEdit")
  1840.     SaveExplicitWindow("ApplicationEditor.form")
  1841.     SaveExplicitWindow("WorkSet.WorkSetForm")
  1842.     SaveExplicitWindow("GroupEditor.EditorForm")
  1843.     SaveExplicitWindow("ToolPalette")
  1844.     SaveExplicitWindow("ControlTools.Palette")
  1845.     SaveExplicitWindow("ObjectBoxEditor.ObjBoxForm")
  1846.     SaveExplicitWindow("SamplesBrowser")
  1847.   End Sub
  1848.  
  1849. End Type
  1850.  
  1851. Type WinDebug From WinDebug
  1852. End Type
  1853.  
  1854. Type ObjectViewer From Form
  1855.   Type ProjectView From ProjectAndModuleView
  1856.     Property CurrProjIndex Get getCurrProjIndex As Long
  1857.     Property SelProject Get getSelProject Set setSelProject As Project
  1858.  
  1859.     ' METHODS for object: ObjectViewer.ProjectView
  1860.     Sub ExpandProject(ByVal index as Integer, p as Project)
  1861.       Dim i, n as integer
  1862.       dim m, cm as ObjectModule
  1863.       dim idx as Integer
  1864.       dim icon as Integer
  1865.       dim pstr as String
  1866.     
  1867.       ' Add in all the project's modules
  1868.       idx = index
  1869.       n = p.ModuleCount - 1
  1870.       cm = ModuleManager.CurrentModule
  1871.       For i = 0 To n
  1872.     
  1873.         m = p.Module(i)
  1874.         If m = cm Then 
  1875.           icon = kIconModule + 1
  1876.         Else 
  1877.           icon = kIconModule
  1878.         End If
  1879.         pstr = m.DisplayName
  1880.         idx = InsertItem(pstr, icon, kLevelModule, idx + 1)
  1881.     
  1882.         SetItemCanExpand(idx, 1)
  1883.         SetItemObject(idx, m)
  1884.       Next i
  1885.     
  1886.     End Sub
  1887.  
  1888.     Function FindModuleIndex(m As ObjectModule, ByVal collapse As Boolean) As Long
  1889.       Dim p As Project
  1890.       Dim m_i, p_i, n, l As Long
  1891.     
  1892.       ' First, try to find the module in the current project.
  1893.       p = ProjectManager.CurrentProject
  1894.       If Not p Then p = ProjectManager.FirstProjectContainingModule(m)
  1895.     
  1896.       If p Then 
  1897.         m_i = p.ModuleIndex(m)
  1898.         If m_i >= 0 Then 
  1899.           p_i = FindProjectIndex(p)
  1900.           If collapse Then CollapseItem(p_i)
  1901.           If Not ItemIsExpanded(p_i) Then ExpandItem(p_i)
  1902.           m_i = p_i + m_i + 1
  1903.           ' m_i is now a lower-bound for where we might find the module.
  1904.           ' If not collapsing/expanding the project, we have to search.
  1905.           If collapse Then 
  1906.             FindModuleIndex = m_i
  1907.             Exit Function
  1908.           End If
  1909.           n = ListCount
  1910.           While (m_i < n)
  1911.             l = ItemLevel(m_i)
  1912.             If l = kLevelProject Then  ' left the project we were searching
  1913.               FindModuleIndex = -1
  1914.               Exit Function
  1915.             ElseIf l = kLevelModule && ItemObject(m_i) = m Then  ' found it
  1916.               FindModuleIndex = m_i
  1917.               Exit Function
  1918.             End If
  1919.             m_i = m_i + 1
  1920.           Wend
  1921.         End If
  1922.       End If
  1923.       FindModuleIndex = -1
  1924.     End Function
  1925.  
  1926.     Function FindProjectIndex(p As Project) As Long
  1927.       If p Then 
  1928.         Dim i, n as long
  1929.         n = ListCount - 1
  1930.         For i = 0 To n
  1931.           If ItemLevel(i) = kLevelProject && ItemObject(i) = p Then 
  1932.             FindProjectIndex = i
  1933.             Exit Function
  1934.           End If
  1935.         Next i
  1936.       End If
  1937.       FindProjectIndex = -1
  1938.     End Function
  1939.  
  1940.     Function getCurrProjIndex As Long
  1941.       Dim i, n as long
  1942.       Dim cp as Project
  1943.     
  1944.       cp = ProjectManager.CurrentProject
  1945.       n = ListCount - 1
  1946.     
  1947.       For i = 0 To n
  1948.         If ItemLevel(i) = kLevelProject && ItemObject(i) = cp Then 
  1949.           getCurrProjIndex = i
  1950.           Exit Function
  1951.         End If
  1952.       Next i
  1953.     
  1954.     End Function
  1955.  
  1956.     Function getSelProject As Project
  1957.       Dim p as Project
  1958.       Dim i as long
  1959.       i = ListIndex
  1960.       If (i >= 0) Then 
  1961.         While (ItemLevel(i) > kLevelProject) : i = i - 1 : Wend
  1962.         p = ItemObject(i)
  1963.       End If
  1964.       getSelProject = p
  1965.     End Function
  1966.  
  1967.     Sub MakeSelItemCurrent()
  1968.       Dim p as Project
  1969.       p = SelProject
  1970.       If p Then 
  1971.         Dim m as ObjectModule
  1972.         ProjectManager.CurrentProject = p
  1973.         m = SelModule
  1974.         If m Then p.CurrentModule = m
  1975.         ResetItemIcons
  1976.       End If
  1977.     End Sub
  1978.  
  1979.     Sub Reset()
  1980.       Dim i as Integer
  1981.       Dim inherited Strictly As IndentedList
  1982.       inherited = Me
  1983.     
  1984.       ' Clear out the list
  1985.       Clear
  1986.     
  1987.       ' Add in all the open projects
  1988.       For i = 0 To ProjectManager.ProjectCount - 1
  1989.         dim p as Project
  1990.         dim index as Integer
  1991.         dim icon as Integer
  1992.         dim pstr as String
  1993.     
  1994.         p = ProjectManager.Project(i)
  1995.         If p = ProjectManager.CurrentProject Then 
  1996.           icon = kIconProject + 1
  1997.         Else 
  1998.           icon = kIconProject
  1999.         End If
  2000.         pstr = p & IIf(p.ProjectFileName <> "", " (" & p.ProjectFileName & ")", "")
  2001.         index = InsertItem(pstr, icon, 0, i)
  2002.     
  2003.         SetItemCanExpand(index, 1)
  2004.         SetItemObject(index, p)
  2005.       Next i
  2006.     
  2007.       ' Select the current project and expand it
  2008.       SelProject = ProjectManager.CurrentProject
  2009.       ExpandItem(ListIndex)
  2010.     
  2011.       ' Invoke my inherited reset method.
  2012.       inherited.Reset
  2013.     
  2014.       ObjectViewer.ViewProject_Enable = ListCount > 0
  2015.     
  2016.       dirty = False
  2017.     End Sub
  2018.  
  2019.     Sub ResetProject(p As Project, expandCurrMod As Boolean)
  2020.       Reset
  2021.       SelProject = p
  2022.       CollapseItem(ListIndex)
  2023.       ExpandItem(ListIndex)
  2024.       If expandCurrMod Then 
  2025.         SelModule = p.CurrentModule
  2026.         ExpandItem(ListIndex)
  2027.       End If
  2028.     End Sub
  2029.  
  2030.     Sub ResetProjectString(p as Project)
  2031.       Dim i, n as Integer
  2032.       Dim o As Object
  2033.     
  2034.       ' Find the project entry in question (all if p = Nothing)
  2035.       n = ListCount - 1
  2036.       For i = 0 To n
  2037.         o = ItemObject(i)
  2038.         If ItemLevel(i) = kLevelProject && (Not p || o = p) Then 
  2039.           ' Set the item to show the correct project information
  2040.           SetItemString(i, o & IIf(o.ProjectFileName <> "", " (" & o.ProjectFileName & ")", ""))
  2041.           If p Then Exit Sub
  2042.         End If
  2043.       Next i
  2044.     End Sub
  2045.  
  2046.     Sub setSelProject(p As Project)
  2047.       ListIndex = FindProjectIndex(p)
  2048.     End Sub
  2049.  
  2050.     Function TextUnload(ByVal indent As String, cmds As String) As Integer
  2051.       ' Write our parent's properties, but none of ours.
  2052.       TextUnload = False
  2053.     End Function
  2054.  
  2055.   End Type
  2056.   Type HierView From ObjectHierarchy
  2057.     Dim dirty As Boolean
  2058.  
  2059.     ' METHODS for object: ObjectViewer.HierView
  2060.     Sub Click()
  2061.       If SelObject Then ObjectEditorMgr.Selection SelObject
  2062.     End Sub
  2063.  
  2064.     Sub DblClick()
  2065.       ObjectViewer.DblClickObject SelObject
  2066.     End Sub
  2067.  
  2068.     Sub DragAndDrop(source As XferData, x,y As Single, state As OleDropState, effect As OleDropEffect)
  2069.       Parent.DragAndDrop(source, x, y, state, effect)
  2070.     End Sub
  2071.  
  2072.     Sub DragStart(o as XferData, x,y as single)
  2073.       o.ObjectRef = SelObject
  2074.       o.Drag(1)
  2075.       ' Drag and drop ends up eating the mouse up event.  Since we
  2076.       ' are doing left mouse dnd, this leaves the list in a state where it
  2077.       ' is expecting a mouse up.  
  2078.       ' We will explicitly send a lbutton up message to the list's hwnd
  2079.       ' to fix the problem.
  2080.       SendMessage(hWnd, User32.WM_LBUTTONUP, 0, 0)
  2081.     End Sub
  2082.  
  2083.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  2084.       If (keyCode = VK_F1) Then 
  2085.         ObjectViewer.Help
  2086.       ElseIf (keyCode = VK_DELETE) Then 
  2087.         EnvelopForm.DeleteObject_Click
  2088.       End If
  2089.     End Sub
  2090.  
  2091.     Sub MakeSelItemCurrent()
  2092.       If SelObject Then 
  2093.         ModuleManager.CurrentModule = ModuleManager.ModuleContaining(SelObject)
  2094.       End If
  2095.     End Sub
  2096.  
  2097.     Sub MoveSelectedObject()
  2098.       Dim o as Object
  2099.       o = SelObject
  2100.       If o Then AttachObject(o)
  2101.     End Sub
  2102.  
  2103.     Sub RenameSelectedObject(nm as String)
  2104.       Dim o as Object
  2105.       o = SelObject
  2106.       If TypeOf o Is Form Then 
  2107.         ' This will keep the Caption in sync.
  2108.         o.Name = nm
  2109.       Else 
  2110.         RenameObject(o, nm)
  2111.       End If
  2112.       Refresh
  2113.     End Sub
  2114.  
  2115.     Sub Reset()
  2116.       Dim P Strictly As ObjectHierarchy
  2117.       P = Me
  2118.       P.Reset
  2119.       dirty = False
  2120.     End Sub
  2121.  
  2122.     Sub ResetNewObject(newObj As Object)
  2123.       Reset
  2124.       SelObject = newObj
  2125.     End Sub
  2126.  
  2127.   End Type
  2128.   Property SelObject Get getSelObject Set setSelObject As Object
  2129.   Property SelModule Get getSelModule As ObjectModule
  2130.   Dim viewer As Object
  2131.   Type ModuleView From ProjectAndModuleView
  2132.  
  2133.     ' METHODS for object: ObjectViewer.ModuleView
  2134.     Function FindModuleIndex(m As ObjectModule, ByVal collapse As Boolean) As Long
  2135.       Dim i, n As Integer
  2136.       n = ListCount - 1
  2137.       For i = 0 To n
  2138.         If ItemLevel(i) = kLevelModule && ItemObject(i) = m Then 
  2139.           FindModuleIndex = i
  2140.           Exit Function
  2141.         End If
  2142.       Next i
  2143.     End Function
  2144.  
  2145.     Sub MakeSelItemCurrent()
  2146.       ModuleManager.CurrentModule = SelModule
  2147.       ResetCurrentModuleIcon
  2148.     End Sub
  2149.  
  2150.     Sub Reset()
  2151.       Dim i, n, icon as Integer
  2152.       Dim m, currModule as ObjectModule
  2153.       Dim inherited Strictly As IndentedList
  2154.       Dim idx as Integer
  2155.       inherited = Me
  2156.     
  2157.       ' Clear out the list
  2158.       Clear
  2159.     
  2160.       ' Add in all the modules
  2161.       n = ModuleManager.ModuleCount - 1
  2162.       currModule = ModuleManager.CurrentModule
  2163.       For i = 0 To n
  2164.         m = ModuleManager.Module(i)
  2165.         icon = IIf(m = currModule, kIconModule + 1, kIconModule)
  2166.         idx = InsertItem(m.DisplayName, icon, 0, i)
  2167.         SetItemCanExpand(idx, 1)
  2168.         SetItemObject(idx, m)
  2169.       Next i
  2170.     
  2171.       ' Forward reset to parent and clear dirty flag
  2172.       inherited.Reset
  2173.       dirty = False
  2174.     End Sub
  2175.  
  2176.     Sub ResetCurrentModuleIcon()
  2177.       Dim i, n, currIcon as Integer
  2178.       n = ListCount - 1
  2179.       currIcon = kIconModule + 1
  2180.       For i = 0 To n
  2181.         If ItemLevel(i) = 0 Then 
  2182.           SetItemIcon(i, IIf(ItemObject(i).IsCurrent, currIcon, kIconModule))
  2183.         End If
  2184.       Next i
  2185.     End Sub
  2186.  
  2187.   End Type
  2188.   Property ActiveView Get getActiveView Set setActiveView As Object
  2189.   Type AlphaView From ObjectList
  2190.     Dim dirty As Boolean
  2191.  
  2192.     ' METHODS for object: ObjectViewer.AlphaView
  2193.     Sub Click()
  2194.       If SelObject Then ObjectEditorMgr.Selection SelObject
  2195.     End Sub
  2196.  
  2197.     Sub DblClick()
  2198.       ObjectViewer.DblClickObject SelObject
  2199.     End Sub
  2200.  
  2201.     Sub DestroySelectedObject
  2202.       DestroyObject(SelObject)
  2203.       Reset
  2204.     End Sub
  2205.  
  2206.     Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  2207.       Parent.DragAndDrop(source, x, y, state, effect)
  2208.     End Sub
  2209.  
  2210.     Sub DragStart(o as XferData, x,y as single)
  2211.       o.ObjectRef = SelObject
  2212.       o.Drag(1)
  2213.       ' Drag and drop ends up eating the mouse up event.  Since we
  2214.       ' are doing left mouse dnd, this leaves the list in a state where it
  2215.       ' is expecting a mouse up.  
  2216.       ' We will explicitly send a lbutton up message to the list's hwnd
  2217.       ' to fix the problem.
  2218.       SendMessage(hWnd, User32.WM_LBUTTONUP, 0, 0)
  2219.     End Sub
  2220.  
  2221.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  2222.       If (keyCode = VK_F1) Then 
  2223.         ObjectViewer.Help
  2224.       ElseIf (keyCode = VK_DELETE) Then 
  2225.         EnvelopForm.DeleteObject_Click
  2226.       End If
  2227.     End Sub
  2228.  
  2229.     Sub MakeSelItemCurrent()
  2230.       If SelObject Then 
  2231.         ModuleManager.CurrentModule = ModuleManager.ModuleContaining(SelObject)
  2232.       End If
  2233.     End Sub
  2234.  
  2235.     Sub MoveSelectedObject()
  2236.       Dim o as Object
  2237.       o = SelObject
  2238.       If o Then AttachObject(o)
  2239.     End Sub
  2240.  
  2241.     Sub RenameSelectedObject(nm as String)
  2242.       Dim o as Object
  2243.       o = SelObject
  2244.       If TypeOf o Is Form Then 
  2245.         ' This will keep the Caption in sync.
  2246.         o.Name = nm
  2247.       Else 
  2248.         RenameObject(o, nm)
  2249.       End If
  2250.       Reset
  2251.       SelObject = o
  2252.     End Sub
  2253.  
  2254.     Sub Reset()
  2255.       Dim P Strictly As ObjectList
  2256.       dim oldIndex As Integer
  2257.       P = Me
  2258.     
  2259.       oldIndex = ListIndex
  2260.       ' Forward reset to our parent
  2261.       P.Reset
  2262.     
  2263.       ' If oldIndex is now too big, select last item in list
  2264.       If oldIndex >= ListCount Then oldIndex = ListCount - 1
  2265.       ListIndex = oldIndex
  2266.     
  2267.       ' Reset dirty flag
  2268.       dirty = False
  2269.     End Sub
  2270.  
  2271.     Sub ResetNewObject(newObj As Object)
  2272.       Reset
  2273.       SelObject = newObj
  2274.     End Sub
  2275.  
  2276.     Function TextUnload(ByVal indent As String, cmds As String) As Integer
  2277.       ' Write our parent's properties, but none of ours.
  2278.       TextUnload = False
  2279.     End Function
  2280.  
  2281.   End Type
  2282.   Type toolbar From ObjectBox
  2283.     Dim ViewProject As New ToolGadget
  2284.     Dim ViewModule As New ToolGadget
  2285.     Dim ViewAlphabetical As New ToolGadget
  2286.     Dim ViewHierarchical As New ToolGadget
  2287.     Dim MakeCurrent As New ToolGadget
  2288.     Dim AddModule As New ToolGadget
  2289.     Dim NewModule As New ToolGadget
  2290.     Dim LoadModule As New ToolGadget
  2291.     Dim SaveModule As New ToolGadget
  2292.     Dim UnloadModule As New ToolGadget
  2293.  
  2294.     ' METHODS for object: ObjectViewer.toolbar
  2295.     Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  2296.       effect = 0
  2297.     End Sub
  2298.  
  2299.   End Type
  2300.   Type ObjectEditorHook From ObjectEditor
  2301.  
  2302.     ' METHODS for object: ObjectViewer.ObjectEditorHook
  2303.     Sub Refresh(ByVal reason As RefreshReason)
  2304.       If reason = "ModuleLoaded" || reason = "ModuleUnloaded" Then 
  2305.         ObjectViewer.Reset
  2306.       End If
  2307.     End Sub
  2308.  
  2309.   End Type
  2310.   Dim ViewProject_Enable As Integer
  2311.   Dim ObjectPopup As New PopupMenu
  2312.   Dim ModulePopup As New PopupMenu
  2313.   Dim ProjectPopup As New PopupMenu
  2314.  
  2315.   ' METHODS for object: ObjectViewer
  2316.   Sub AddModule_Click()
  2317.     Dim p as Project
  2318.     p = ProjectManager.CurrentProject
  2319.     If p Then 
  2320.       Dim i, n as integer
  2321.       Dim m as ObjectModule
  2322.       Dim exclude as New Group
  2323.   
  2324.       ' Make a group of the modules already in the project, to be excluded.
  2325.       ' Always exclude the intrinsic module (never a project member).
  2326.       exclude.Append(ObjectModule)
  2327.       n = p.ModuleCount - 1
  2328.       For i = 0 To n
  2329.         exclude.Append(p.Module(i))
  2330.       Next i
  2331.   
  2332.       m = SelectModuleForm.ExecuteExcluding(exclude, "Select module to add")
  2333.       If m Then 
  2334.         Dim i as integer
  2335.         i = IIf(p.CurrentIndex >= 0, p.CurrentIndex + 1, -1)
  2336.         p.InsertModule(m, i)
  2337.         p.CurrentModule = m
  2338.         ResetProject(p, False)
  2339.       End If
  2340.   
  2341.     End If ' ProjectManager.CurrentProject
  2342.   End Sub
  2343.  
  2344.   Function AddModule_Enable As Integer
  2345.     Dim p As Project
  2346.     p = ProjectManager.CurrentProject
  2347.     If p Then 
  2348.       toolbar.AddModule.HintText = "Add module to project: " & p
  2349.       AddModule_Enable = True
  2350.     Else 
  2351.       toolbar.AddModule.HintText = "Add module to current project"
  2352.       AddModule_Enable = False
  2353.     End If
  2354.   End Function
  2355.  
  2356.   Sub AlphaView_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
  2357.     If button = 2 Then 
  2358.       With AlphaView
  2359.         dim i as integer
  2360.         i = .FindIndexUnderPoint(x, y)
  2361.         If i >= 0 Then 
  2362.       .ListIndex = i
  2363.       PopupMenu = ObjectPopup
  2364.       EnvelopForm.CBSelectedObject.Text = .List(.ListIndex)
  2365.         Else
  2366.           PopupMenu = FindObject("PopupMenu")
  2367.         End If
  2368.       End With
  2369.     End If
  2370.   End Sub
  2371.  
  2372.   Sub AlphaView_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  2373.     PopupMenu = FindObject("PopupMenu")
  2374.   End Sub
  2375.  
  2376.   Function CheckAndSaveProject(p As Project) As Boolean
  2377.     ' Return FALSE only if user cancels something
  2378.     CheckAndSaveProject = True
  2379.     If ProjectIsModified(p) Then 
  2380.       Dim ync as New YesNoCancelBox
  2381.       Dim answer as Integer
  2382.       ync.title = "Close modified project"
  2383.       ync.message = "The project " & p & " is modified.^M^M"
  2384.       ync.message = ync.message & "Save project before closing?"
  2385.       answer = ync.Execute
  2386.       If answer = IDCANCEL Then 
  2387.         CheckAndSaveProject = False
  2388.       ElseIf answer = IDYES Then 
  2389.         CheckAndSaveProject = SaveProject(p)
  2390.       End If
  2391.     End If
  2392.   End Function
  2393.  
  2394.   Sub CloseProject_Click()
  2395.     Dim p as Project
  2396.     p = ProjectManager.CurrentProject
  2397.     If CheckAndSaveProject(p) Then  ' user did not cancel anything
  2398.       ProjectManager.CloseCurrentProject
  2399.       ProjectView.Reset
  2400.       If ProjectManager.ProjectCount > 0 Then 
  2401.         ActiveView = ProjectView
  2402.       Else  ' no more projects
  2403.         ActiveView = ModuleView
  2404.       End If
  2405.       DamageInactiveViews
  2406.     End If
  2407.   End Sub
  2408.  
  2409.   Function CloseProject_Enable() As Integer
  2410.     CloseProject_Enable = ProjectManager.CurrentProject <> Nothing
  2411.   End Function
  2412.  
  2413.   Function CopyObjectQuick(o As Object, ByVal quick As Boolean) As Boolean
  2414.     Dim o As Object
  2415.     o = ObjectEditorMgr.SelectedObject
  2416.     SelObject = o
  2417.     If SelObject = o Then 
  2418.       Dim uniqName As String
  2419.       uniqName = UniqueObjectName(o)
  2420.       If quick Then 
  2421.         DoCopyObject(o, uniqName)
  2422.       Else 
  2423.         If InputDialog.Execute("Copy Object", "Enter name for new copy of " & o & ":", uniqName) = IDOK Then 
  2424.           DoCopyObject(o, InputDialog.Text)
  2425.         End If
  2426.       End If
  2427.       CopyObjectQuick = True
  2428.     Else 
  2429.       CopyObjectQuick = False
  2430.     End If
  2431.   End Function
  2432.  
  2433.   Sub DamageInactiveViews
  2434.     If ActiveView <> ProjectView Then ProjectView.dirty = True
  2435.     If ActiveView <> ModuleView Then ModuleView.dirty = True
  2436.     If ActiveView <> AlphaView Then AlphaView.dirty = True
  2437.     If ActiveView <> HierView Then HierView.dirty = True
  2438.   End Sub
  2439.  
  2440.   Sub DblClickObject(o As Object)
  2441.     If o Then 
  2442.       ' Special case the EnvelopForm to turn Form-Editing off (avoids confusing state)
  2443.       If (o = EnvelopForm) Then FormEditor.Editing = False
  2444.       ObjectEditorMgr.Edit(o)
  2445.   
  2446.       ' If object is a form then bring it to top
  2447.       If TypeOf o Is Form Then o.Show : o.BringToTop
  2448.   
  2449.     End If
  2450.   End Sub
  2451.  
  2452.   Function DestroySelectedObject(o As Object) As Boolean
  2453.     SelObject = o
  2454.     If SelObject = o Then 
  2455.       ActiveView.DestroySelectedObject
  2456.       DamageInactiveViews
  2457.       ObjectEditorMgr.Selection SelObject
  2458.       DestroySelectedObject = True
  2459.     Else 
  2460.       DestroySelectedObject = False
  2461.     End If
  2462.   End Function
  2463.  
  2464.   Sub DoCopyObject(o As Object, ByVal newName As String)
  2465.     Dim sameNameObj, newObj As Object
  2466.     If IsIdentifierValid(newName) = 0 Then 
  2467.       Dim mb As New MessageBox
  2468.       mb.SetIconExclamation
  2469.       mb.Message("Invalid identifier", """" & newName & """ is not a valid object name")
  2470.       Exit Sub
  2471.     End If
  2472.   
  2473.     sameNameObj = FindObject(newName)
  2474.     If sameNameObj Then 
  2475.       If ModuleManager.ModuleContaining(sameNameObj) = ModuleManager.CurrentModule Then 
  2476.         MessageBox.Message("Object exists", """" & newName & """ already exists in the current module.")
  2477.         Exit Sub
  2478.       Else 
  2479.         If YesNoCancelBox.Message("Object exists", """" & newName & """ already exists in a different module, ^J^M^J^MOk to continue?") <> IDYES Then 
  2480.           Exit Sub
  2481.         End If
  2482.       End If
  2483.     End If
  2484.   
  2485.     newObj = CopyObject(o, newName)
  2486.     If (o && TypeOf o Is Form && StrComp(o, o.Caption) = 0) Then 
  2487.       ' Try to keep title and object name in sync, if src object was.
  2488.       newObj.Caption = newObj
  2489.     End If
  2490.   
  2491.     ActiveView.ResetNewObject(newObj)
  2492.     DamageInactiveViews
  2493.     ObjectEditorMgr.Edit newObj
  2494.   End Sub
  2495.  
  2496.   Function DoProjectSave(p As Project, ByVal saveAs As Boolean) As Boolean
  2497.     Dim resetString As Boolean
  2498.     Dim projModule As ObjectModule
  2499.   
  2500.     ' Return FALSE only if user cancels a dialog
  2501.     DoProjectSave = True
  2502.   
  2503.     ' Fix up the module list of the project, since user may have
  2504.     ' just renamed (saved-as) some module(s)
  2505.     p.SyncModulePath
  2506.     projModule = ModuleManager.ModuleContaining(p)
  2507.     projModule.Save
  2508.   
  2509.     resetString = False
  2510.     ' Write the project file and EXE, as necessary.
  2511.     If p.ProjectFileName = "" || saveAs Then 
  2512.       If SaveProjectFileAs(p) = IDCANCEL Then 
  2513.         DoProjectSave = False
  2514.         Exit Function
  2515.       End If
  2516.       resetString = True
  2517.     End If
  2518.   
  2519.     If Not p.ProjectFileMatchesMe Then p.WriteProjectFile
  2520.   
  2521.     ' If we did a save-as on the project file,
  2522.     ' then update the project view.
  2523.     If resetString Then ProjectView.ResetProjectString(p)
  2524.   
  2525.     If TypeOf p Is Application Then 
  2526.       If p.EXEFileName = "" || saveAs Then 
  2527.         If SaveProjectEXEAs(p) = IDCANCEL Then 
  2528.           DoProjectSave = False
  2529.           Exit Function
  2530.         End If
  2531.         resetString = True
  2532.       End If
  2533.       If Not p.EXEMatchesMe Then p.WriteEXE
  2534.     End If
  2535.   
  2536.     ' If we did a save-as on the project file or EXE file,
  2537.     ' then re-save the project module.
  2538.     If resetString Then projModule.Save
  2539.   
  2540.   End Function
  2541.  
  2542.   Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  2543.     dim s,s2 as string
  2544.     dim p as integer
  2545.   
  2546.     If state = 4 Then 
  2547.       ' TODO: re-visit this code for ebo/eto names. Also, maybe it shouldn't be driven by
  2548.       ' name for binary modules (we could implement a test for a valid binary module).
  2549.       ' (Dez 3/12/95)
  2550.       s = source.File
  2551.       p = Instr(1, s, "ebo", 1)
  2552.       If Instr(1, s, ".ebo", 1) Then 
  2553.         ModuleManager.LoadModule(s, False)
  2554.         DamageInactiveViews
  2555.         ActiveView.Reset
  2556.       ElseIf p > 0 Then 
  2557.         s2 = Mid(s, p)
  2558.         If Instr(1, s2, ".tmp", 1) Then 
  2559.           ModuleManager.LoadModule(s, False)
  2560.           DamageInactiveViews
  2561.           ActiveView.Reset
  2562.         End If
  2563.       ElseIf Instr(1, s, ".eto", 1) Then 
  2564.         ObjectTools.LoadTextObject(s)
  2565.         DamageInactiveViews
  2566.         ActiveView.Reset
  2567.       End If
  2568.     End If
  2569.   End Sub
  2570.  
  2571.   Function getActiveView() As Object
  2572.     If Not viewer Then ActiveView = ProjectView
  2573.     getActiveView = viewer
  2574.   End Function
  2575.  
  2576.   Function getSelModule() As ObjectModule
  2577.     Dim m As ObjectModule
  2578.     Try
  2579.       dim r as long
  2580.       If PropertyExists(ActiveView, "SelModule", r) Then m = ActiveView.SelModule
  2581.     Catch
  2582.     End Try
  2583.     If Not m Then 
  2584.       ' OK, either we don't have an active view, or active view doesn't
  2585.       ' have a selected module, so take the current module as selected.
  2586.       m = ModuleManager.CurrentModule
  2587.     End If
  2588.     getSelModule = m
  2589.   End Function
  2590.  
  2591.   Function getSelObject() As Object
  2592.     getSelObject = ActiveView.SelObject
  2593.   End Function
  2594.  
  2595.   Sub Help
  2596.     If SelObject Then Envelop.Help.ShowObjectHelp(SelObject)
  2597.   End Sub
  2598.  
  2599.   Sub HierView_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
  2600.     If button = 2 Then 
  2601.       With HierView
  2602.         dim i as integer
  2603.         i = .FindIndexUnderPoint(x, y)
  2604.         If i >= 0 Then 
  2605.       .ListIndex = i
  2606.       PopupMenu = ObjectPopup
  2607.       EnvelopForm.CBSelectedObject.Text = .List(.ListIndex)
  2608.         Else
  2609.           PopupMenu = FindObject("PopupMenu")
  2610.         End If
  2611.       End With
  2612.     End If
  2613.   End Sub
  2614.  
  2615.   Sub HierView_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  2616.     PopupMenu = FindObject("PopupMenu")
  2617.   End Sub
  2618.  
  2619.   Sub LoadModule(m As ObjectModule)
  2620.     If m Then 
  2621.       Dim p as Project
  2622.       p = ProjectManager.CurrentProject
  2623.       If p Then 
  2624.         Dim i as integer
  2625.         i = IIf(p.CurrentIndex >= 0, p.CurrentIndex + 1, -1)
  2626.         p.InsertModule(m, i)
  2627.         p.CurrentModule = m
  2628.         ResetProject(p, False)
  2629.       Else 
  2630.         ResetModule(m)
  2631.       End If
  2632.     End If
  2633.   End Sub
  2634.  
  2635.   Sub LoadModule_Click()
  2636.     LoadModule(Envelop.EBOOpen.BrowseForModule)
  2637.   End Sub
  2638.  
  2639.   Sub MakeCurrent_Click()
  2640.     ActiveView.MakeSelItemCurrent
  2641.     DamageInactiveViews
  2642.   End Sub
  2643.  
  2644.   Sub ModAddToProj_Click()
  2645.     Dim p as Project
  2646.     p = ProjectManager.CurrentProject
  2647.     p.InsertModule(SelModule, p.ModuleCount)
  2648.     ProjectView.Reset
  2649.   End Sub
  2650.  
  2651.   Function ModAddToProj_Enable() As Integer
  2652.     Dim i as Boolean
  2653.     If ProjectManager.CurrentProject Then
  2654.       i = (ProjectManager.CurrentProject.ModuleIndex(SelModule) = -1)
  2655.       ModAddToProj_Enable = i
  2656.       ModulePopup.SetCaption(ModulePopup.ItemPosition("ModAddToProj"), "Add to " & IIf(i, "&Project: " & ProjectManager.CurrentProject.ProjectFileProjectName, "Current &Project"))
  2657.     Else
  2658.       ModAddToProj_Enable = False
  2659.     End If
  2660.   End Function
  2661.  
  2662.   Sub ModRemoveFromProj_Click()
  2663.     Dim i as Boolean
  2664.     Dim M as ObjectModule
  2665.     M = SelModule
  2666.     i = M.CanUnload
  2667.     M.CanUnload = False
  2668.     Try
  2669.       ProjectManager.CurrentProject.RemoveModule(M)
  2670.     Catch ModuleUnloadFailed
  2671.       ' We expect this catch, since we just set M's Unload to False. We don't
  2672.       ' want to unload the module, just remove it from the project. TODO:
  2673.       ' fix the code for RemoveModule so that it doesn't always try to Unload
  2674.       ' the module --DEG
  2675.     End Try
  2676.     ProjectView.Reset
  2677.     M.CanUnload = i
  2678.   End Sub
  2679.  
  2680.   Function ModRemoveFromProj_Enable() As Integer
  2681.     Dim i as Boolean
  2682.     If ProjectManager.CurrentProject Then
  2683.       i = Not ModAddToProj_Enable
  2684.       If i then
  2685.     ' We also want to make sure that the project's application object
  2686.     ' is not in the Selected Module
  2687.     If ModuleManager.ModuleContaining(FindObject(ProjectManager.CurrentProject.ProjectFileProjectName)) = SelModule Then 
  2688.       ModRemoveFromProj_Enable = False
  2689.     Else
  2690.       ' ModAddToProj_Enable is False (It's in the project) and the Project's
  2691.       ' application is not in the selected Module...We're cool
  2692.       ModRemoveFromProj_Enable = True
  2693.     End If
  2694.       Else
  2695.     ' We can add the module to the project, so the module isn't in the 
  2696.     ' project...therefore we can't remove it
  2697.     ModRemoveFromProj_Enable = False
  2698.       End If
  2699.     Else
  2700.       ' We don't have a current project, so we can't remove anything from it
  2701.       ModRemoveFromProj_Enable = False
  2702.     End If
  2703.   End Function
  2704.  
  2705.   Sub ModSaveAs_Click()
  2706.     SaveModuleAs_Click
  2707.   End Sub
  2708.  
  2709.   Function ModSaveAs_Enable() As Integer
  2710.     ModSaveAs_Enable = EnvelopForm.SaveModuleAs_Enable
  2711.   End Function
  2712.  
  2713.   Sub ModSave_Click()
  2714.     SaveModule_Click
  2715.   End Sub
  2716.  
  2717.   Function ModSave_Enable() As Integer
  2718.     ModSave_Enable = EnvelopForm.SaveModule_Enable
  2719.   End Function
  2720.  
  2721.   Sub ModuleView_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
  2722.     If button = 2 Then 
  2723.       With ModuleView
  2724.         dim i as integer
  2725.         i = .FindIndexUnderPoint(x, y)
  2726.         If i >= 0 Then 
  2727.       .ListIndex = i
  2728.       Select Case .ItemLevel(.ListIndex)
  2729.         Case 0 ' Module
  2730.           PopupMenu = ModulePopup
  2731.         Case 1 ' Object
  2732.           PopupMenu = ObjectPopup
  2733.           EnvelopForm.CBSelectedObject.Text = .ItemString(.ListIndex)
  2734.         Case Else
  2735.           Throw MenuError
  2736.       End Select
  2737.         Else
  2738.           PopupMenu = FindObject("PopupMenu")
  2739.         End If
  2740.       End With
  2741.     End If
  2742.   End Sub
  2743.  
  2744.   Sub ModuleView_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  2745.     PopupMenu = FindObject("PopupMenu")
  2746.   End Sub
  2747.  
  2748.   Sub ModUnload_Click()
  2749.     UnloadModule_Click
  2750.   End Sub
  2751.  
  2752.   Function ModUnload_Enable() As Integer
  2753.     ModUnload_Enable = EnvelopForm.UnloadModule_Enable
  2754.   End Function
  2755.  
  2756.   Sub MoveObject_Click()
  2757.     Dim o As Object
  2758.     o = ObjectEditorMgr.SelectedObject
  2759.     SelObject = o
  2760.     If (SelObject <> o) Then 
  2761.       InfoBox.Message("Move Failed", "Unable to move object: " & o)
  2762.       Exit Sub
  2763.     End If
  2764.     ActiveView.MoveSelectedObject
  2765.     DamageInactiveViews
  2766.   End Sub
  2767.  
  2768.   Function MoveObject_Enable() As Integer
  2769.     Dim o As Object
  2770.     o = ObjectEditorMgr.SelectedObject
  2771.     MoveObject_Enable = (o && ModuleManager.ModuleContaining(o) <> ModuleManager.CurrentModule)
  2772.   End Function
  2773.  
  2774.   Sub NewModule_Click()
  2775.     LoadModule(ModuleManager.LoadModule("", False))
  2776.   End Sub
  2777.  
  2778.   Sub NewObject_Click()
  2779.     If InputDialog.Execute("New Object", "Enter name for new object:", "") = IDOK Then 
  2780.       DoCopyObject(Nothing, InputDialog.Text)
  2781.     End If
  2782.   End Sub
  2783.  
  2784.   Sub NewProject_Click()
  2785.     Dim p As Project
  2786.     p = NewProjectForm.Execute
  2787.     If p Then ResetProject(p, True)
  2788.   End Sub
  2789.  
  2790.   Sub ObjAbstract_Click()
  2791.     EnvelopForm.AbstractObject_Click
  2792.   End Sub
  2793.  
  2794.   Function ObjAbstract_Enable() As Integer
  2795.     ObjAbstract_Enable = EnvelopForm.AbstractObject_Enable
  2796.   End Function
  2797.  
  2798.   Sub ObjCopy_Click()
  2799.     EnvelopForm.CopyObject_Click
  2800.   End Sub
  2801.  
  2802.   Function ObjCopy_Enable() As Integer
  2803.     ObjCopy_Enable = EnvelopForm.CopyObject_Enable
  2804.     ObjectPopup.SetCaption(ObjectPopup.ItemPosition("ObjCopy"), "&Copy Object: " & SelObject & "...")
  2805.   End Function
  2806.  
  2807.   Sub ObjDestroy_Click()
  2808.     EnvelopForm.DeleteObject_Click
  2809.   End Sub
  2810.  
  2811.   Function ObjDestroy_Enable() As Integer
  2812.     ObjDestroy_Enable = EnvelopForm.DeleteObject_Enable
  2813.   End Function
  2814.  
  2815.   Sub ObjMoveToModule_Click()
  2816.     MoveObject_Click
  2817.   End Sub
  2818.  
  2819.   Function ObjMoveToModule_Enable() As Integer
  2820.     Dim j as boolean
  2821.     j = EnvelopForm.MoveObject_Enable
  2822.     ObjMoveToModule_Enable = j
  2823.     ObjectPopup.SetCaption(ObjectPopup.ItemPosition("ObjMoveToModule"), "&Move to " & IIf(j, ModuleManager.CurrentModule.DisplayName, "Current Module"))
  2824.   End Function
  2825.  
  2826.   Sub ObjRename_Click()
  2827.     EnvelopForm.RenameObject_Click
  2828.   End Sub
  2829.  
  2830.   Sub OpenProject_Click()
  2831.     Dim dlg As New OpenDialog
  2832.   
  2833.     dlg.FileName = "*.epj"
  2834.     dlg.InitialDir = Envelop.FileDialogDir
  2835.     dlg.Title = "Open Project"
  2836.     dlg.Filter = "Envelop projects (*.epj)|*.epj|All files (*.*)|*.*|"
  2837.     dlg.DefaultExtension = "epj"
  2838.     dlg.FilterIndex = 1
  2839.     dlg.FileMustExist = True
  2840.     dlg.PathMustExist = True
  2841.     dlg.NoChangeDir = True
  2842.     If dlg.Execute = IDOK Then 
  2843.       Dim p as Project
  2844.       Envelop.FileDialogDir = dlg.FileName
  2845.       p = ProjectManager.OpenProject(dlg.FileName)
  2846.       ProjectView.Reset
  2847.       ActiveView = ProjectView
  2848.       DamageInactiveViews
  2849.       ProjectView.SelProject = p
  2850.       ProjectView.ExpandItem(ProjectView.ListIndex)
  2851.       If p && TypeOf p Is Application && p.MainForm Then 
  2852.         p.MainForm.Show
  2853.       End If
  2854.     End If
  2855.   End Sub
  2856.  
  2857.   Sub ProjAddModules_Click()
  2858.     AddModule_Click
  2859.   End Sub
  2860.  
  2861.   Function ProjAddModules_Enable() As Integer
  2862.     ProjAddModules_Enable = toolbar.AddModule.Enabled
  2863.   End Function
  2864.  
  2865.   Sub ProjClose_Click()
  2866.     CloseProject_Click
  2867.   End Sub
  2868.  
  2869.   Function ProjClose_Enable() As Integer
  2870.     ProjClose_Enable = EnvelopForm.CloseProject_Enable
  2871.   End Function
  2872.  
  2873.   Function ProjectIsModified(p As Project) As Boolean
  2874.   
  2875.     If Not p Then 
  2876.       ProjectIsModified = False
  2877.     Else 
  2878.   
  2879.       Dim i, n as integer
  2880.       Dim m as ObjectModule
  2881.   
  2882.       ' Check each module in the project; any modified and we can return.
  2883.       n = p.ModuleCount - 1
  2884.       For i = 0 To n
  2885.         m = p.Module(i)
  2886.         If m && (Not m.ReadOnly) && m.IsModified Then 
  2887.           ProjectIsModified = True
  2888.           Exit Function
  2889.         End If
  2890.       Next i
  2891.   
  2892.       ' Check the project file and EXE, as necessary.
  2893.       If Not p.ProjectFileMatchesMe Then 
  2894.         ProjectIsModified = True
  2895.         Exit Function
  2896.       End If
  2897.   
  2898.       If TypeOf p Is Application Then 
  2899.         If Not p.EXEMatchesMe Then 
  2900.           ProjectIsModified = True
  2901.           Exit Function
  2902.         End If
  2903.       End If
  2904.   
  2905.     End If ' Not p
  2906.   
  2907.   End Function
  2908.  
  2909.   Function ProjectNeedsSaved(p As Project) As Boolean
  2910.     ' Check the project file and EXE, as necessary.
  2911.     If p.ProjectFileName = "" || Not p.ProjectFileMatchesMe Then 
  2912.       ProjectNeedsSaved = True
  2913.       Exit Function
  2914.     End If
  2915.   
  2916.     If TypeOf p Is Application Then 
  2917.       If p.EXEFileName = "" || Not p.EXEMatchesMe Then 
  2918.         ProjectNeedsSaved = True
  2919.         Exit Function
  2920.       End If
  2921.     End If
  2922.   End Function
  2923.  
  2924.   Sub ProjectView_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
  2925.     If button = 2 Then 
  2926.       dim i as integer
  2927.       With ProjectView
  2928.         i = .FindIndexUnderPoint(x, y)
  2929.         If i >= 0 Then 
  2930.       .ListIndex = i
  2931.       Select Case .ItemLevel(.ListIndex)
  2932.         Case 0 ' Project
  2933.           PopupMenu = ProjectPopup
  2934.         Case 1 ' Module
  2935.           PopupMenu = ModulePopup
  2936.         Case 2 ' Object
  2937.           PopupMenu = ObjectPopup
  2938.           EnvelopForm.CBSelectedObject.Text = .ItemString(.ListIndex)
  2939.         Case Else
  2940.           Throw MenuError
  2941.       End Select
  2942.      Else
  2943.           PopupMenu = FindObject("PopupMenu")
  2944.         End If
  2945.       End With
  2946.     End If
  2947.   End Sub
  2948.  
  2949.   Sub ProjectView_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  2950.     PopupMenu = FindObject("PopupMenu")
  2951.   End Sub
  2952.  
  2953.   Function ProjFileMatchesEXE(p As Project) As Boolean
  2954.     If TypeOf p Is Application Then 
  2955.       Dim pf, xf As New File
  2956.       pf.FileName = p.ProjectFileName
  2957.       xf.FileName = p.EXEFileName
  2958.       ProjFileMatchesEXE = (pf.Name <> "") && (pf.Name = xf.Name)
  2959.     Else 
  2960.       ProjFileMatchesEXE = False
  2961.     End If
  2962.   End Function
  2963.  
  2964.   Sub ProjSaveAs_Click()
  2965.     SaveProjectAs_Click
  2966.   End Sub
  2967.  
  2968.   Function ProjSaveAs_Enable() As Integer
  2969.     ProjSaveAs_Enable = EnvelopForm.SaveProjectAs_Enable
  2970.   End Function
  2971.  
  2972.   Sub ProjSave_Click()
  2973.     SaveProject_Click
  2974.   End Sub
  2975.  
  2976.   Function ProjSave_Enable() As Integer
  2977.     ProjSave_Enable = EnvelopForm.SaveProject_Enable
  2978.   End Function
  2979.  
  2980.   Sub ProjWriteEXE_Click()
  2981.     Dim p as Project
  2982.     p = ProjectManager.CurrentProject
  2983.     If p Then 
  2984.       Dim i, n As Integer
  2985.       Dim m As ObjectModule
  2986.   
  2987.       ' Save each module in the project
  2988.       n = p.ModuleCount - 1
  2989.       For i = 0 To n
  2990.         m = p.Module(i)
  2991.         If m && (Not m.ReadOnly) && m.IsModified Then 
  2992.           If Envelop.SADlg.SaveModule(m) = False Then Exit Sub
  2993.         End If
  2994.       Next i
  2995.   
  2996.       ' Save the project files
  2997.       p.WriteEXE
  2998.   
  2999.     End If
  3000.   End Sub
  3001.  
  3002.   Function ProjWriteEXE_Enable() As Boolean
  3003.     Dim p as Project
  3004.     p = ProjectManager.CurrentProject
  3005.     If TypeOf p Is Application AND NOT p.EXEMatchesMe Then
  3006.       ProjWriteEXE_Enable = True
  3007.     Else
  3008.       ProjWriteEXE_Enable = False
  3009.     End If
  3010.   End Function
  3011.  
  3012.  
  3013.   Function RenameSelectedObject(o As Object, newName As String)
  3014.     SelObject = o
  3015.     If SelObject = o Then 
  3016.       Dim resetACL As Long
  3017.       resetACL = 0
  3018.   
  3019.       ' If object is a project object, then try to change permissions
  3020.       ' to allow rename to go through.
  3021.       If TypeOf o Is Project Then 
  3022.         Try
  3023.           resetACL = o.AccessControl.ObjectAccess
  3024.           o.AccessControl.ObjectAccess = "126 - R,W,C,D,M,P"
  3025.         Catch
  3026.         End Try
  3027.       End If
  3028.       Try
  3029.         ActiveView.RenameSelectedObject(newName)
  3030.         DamageInactiveViews
  3031.       Catch
  3032.         If resetACL Then o.AccessControl.ObjectAccess = resetACL
  3033.         Throw
  3034.       End Try
  3035.       If resetACL Then o.AccessControl.ObjectAccess = resetACL
  3036.       RenameSelectedObject = True
  3037.     Else 
  3038.       RenameSelectedObject = False
  3039.     End If
  3040.   End Function
  3041.  
  3042.   Sub Reset()
  3043.     ProjectView.dirty = True
  3044.     ModuleView.dirty = True
  3045.     AlphaView.dirty = True
  3046.     HierView.dirty = True
  3047.     ActiveView.Reset
  3048.   End Sub
  3049.  
  3050.   Sub ResetAbstract(abso As Object)
  3051.     ActiveView.Reset
  3052.     SelObject = abso
  3053.     If ActiveView = HierView Then HierView.ExpandItem(HierView.ListIndex)
  3054.   End Sub
  3055.  
  3056.   Sub ResetModule(m As ObjectModule)
  3057.     ModuleView.Reset
  3058.     ActiveView = ModuleView
  3059.     DamageInactiveViews
  3060.     ModuleView.SelModule = m
  3061.   End Sub
  3062.  
  3063.   Sub ResetModuleString(m as ObjectModule)
  3064.     ProjectView.ResetModuleString(m)
  3065.     ModuleView.ResetModuleString(m)
  3066.   End Sub
  3067.  
  3068.   Sub ResetNewObject(newObj As Object)
  3069.     ActiveView.ResetNewObject(newObj)
  3070.     DamageInactiveViews
  3071.   End Sub
  3072.  
  3073.   Sub ResetProject(p As Project, expandCurrMod As Boolean)
  3074.     ProjectView.ResetProject(p, expandCurrMod)
  3075.     ActiveView = ProjectView
  3076.     DamageInactiveViews
  3077.   End Sub
  3078.  
  3079.   Sub Resize()
  3080.     Dim l, t, w, h as Single
  3081.     l = -30
  3082.     w = ScaleWidth - l
  3083.     toolbar.Move(l, l, w, toolbar.Height)
  3084.     t = toolbar.Top + toolbar.Height
  3085.     h = ScaleHeight - toolbar.Height + 45
  3086.   
  3087.     ProjectView.Move(l, t, w, h)
  3088.     AlphaView.Move(l, t, w, h)
  3089.     HierView.Move(l, t, w, h)
  3090.     ModuleView.Move(l, t, w, h)
  3091.   End Sub
  3092.  
  3093.   Sub SaveAll_Click()
  3094.     Dim m as ObjectModule
  3095.     Dim p as Project
  3096.     Dim i, n as integer
  3097.   
  3098.     ' Display busy-signal immediately.
  3099.     App.ShowBusySignal
  3100.   
  3101.     ' First, save all modules.
  3102.     ' The 0th module is always the intrinsic module, so skip it.
  3103.     n = ModuleManager.ModuleCount - 1
  3104.     For i = 1 To n
  3105.       m = ModuleManager.Module(i)
  3106.       If Not m.ReadOnly && m.IsModified Then 
  3107.         If Not Envelop.SADlg.SaveModule(m) Then  ' user canceled
  3108.           Exit Sub
  3109.         End If
  3110.       End If
  3111.     Next i
  3112.   
  3113.     ' Now, for each open project, make sure it is properly saved, too.
  3114.     n = ProjectManager.ProjectCount - 1
  3115.     For i = 0 To n
  3116.       If Not DoProjectSave(ProjectManager.Project(i), False) Then  ' user canceled
  3117.         Exit Sub
  3118.       End If
  3119.     Next i
  3120.   End Sub
  3121.  
  3122.   Function SaveAll_Enable() As Integer
  3123.     Dim m as ObjectModule
  3124.     Dim i, n as integer
  3125.     n = ModuleManager.ModuleCount - 1
  3126.     For i = 1 To n
  3127.       m = ModuleManager.Module(i)
  3128.       If m.ReadOnly = False && m.IsModified Then 
  3129.         SaveAll_Enable = True
  3130.         Exit Function
  3131.       End If
  3132.     Next i
  3133.   
  3134.     n = ProjectManager.ProjectCount - 1
  3135.     For i = 0 To n
  3136.       If ProjectNeedsSaved(ProjectManager.Project(i)) Then 
  3137.         SaveAll_Enable = True
  3138.         Exit Function
  3139.       End If
  3140.     Next i
  3141.   
  3142.     SaveAll_Enable = False
  3143.   End Function
  3144.  
  3145.   Sub SaveModuleAs_Click
  3146.     Dim m As ObjectModule
  3147.     m = SelModule
  3148.     If m <> ObjectModule && Envelop.SADlg.SaveAs(m) Then 
  3149.       ModuleView.ResetModuleString m
  3150.       ProjectView.ResetModuleString m
  3151.     End If
  3152.   End Sub
  3153.  
  3154.   Function SaveModuleAs_Enable() As Integer
  3155.     SaveModuleAs_Enable = SelModule <> ObjectModule
  3156.   End Function
  3157.  
  3158.   Sub SaveModule_Click()
  3159.     Dim m As ObjectModule
  3160.     m = SelModule
  3161.     If Envelop.SADlg.SaveModule(m) Then 
  3162.       ModuleView.ResetModuleString m
  3163.       ProjectView.ResetModuleString m
  3164.     End If
  3165.   End Sub
  3166.  
  3167.   Function SaveModule_Enable() As Integer
  3168.     Dim m as ObjectModule
  3169.     Dim enable as Integer
  3170.     m = SelModule
  3171.     enable = (Not m.ReadOnly && m.IsModified)
  3172.     If enable Then 
  3173.       toolbar.SaveModule.HintText = "Save module: " & m.DisplayName
  3174.     Else 
  3175.       toolbar.SaveModule.HintText = "Save module"
  3176.     End If
  3177.     SaveModule_Enable = enable
  3178.   End Function
  3179.  
  3180.   Function SaveProject(p As Project) As Boolean
  3181.     ' Return FALSE only if user cancels any dialog
  3182.     SaveProject = True
  3183.     If p Then 
  3184.       Dim i, n As Integer
  3185.       Dim m As ObjectModule
  3186.   
  3187.       ' Save each module in the project
  3188.       n = p.ModuleCount - 1
  3189.       For i = 0 To n
  3190.         m = p.Module(i)
  3191.         If m && (Not m.ReadOnly) && m.IsModified Then 
  3192.           If Envelop.SADlg.SaveModule(m) = False Then 
  3193.             SaveProject = False
  3194.             Exit Function
  3195.           End If
  3196.         End If
  3197.       Next i
  3198.   
  3199.       ' Save the project files
  3200.       SaveProject = DoProjectSave(p, False)
  3201.   
  3202.     End If
  3203.   End Function
  3204.  
  3205.   Sub SaveProjectAs_Click()
  3206.     Dim p as Project
  3207.     p = ProjectManager.CurrentProject
  3208.     If p Then 
  3209.       Dim i, n As Integer
  3210.       Dim m As ObjectModule
  3211.   
  3212.       ' Ensure each module in the project is titled
  3213.       n = p.ModuleCount - 1
  3214.       For i = 0 To n
  3215.         m = p.Module(i)
  3216.         If m && m.IsUntitled Then 
  3217.           If Envelop.SADlg.SaveModule(m) = False Then  ' user canceled
  3218.             Exit Sub
  3219.           End If
  3220.         End If
  3221.       Next i
  3222.   
  3223.       DoProjectSave(p, True)
  3224.   
  3225.     End If ' ProjectManager.CurrentProject
  3226.   End Sub
  3227.  
  3228.   Function SaveProjectAs_Enable() As Integer
  3229.     SaveProjectAs_Enable = ProjectManager.CurrentProject <> Nothing
  3230.   End Function
  3231.  
  3232.   Function SaveProjectEXEAs(p as Project) As Integer
  3233.     Dim dlg As New SaveAsDialog
  3234.     Dim file As New File
  3235.     Dim name As String
  3236.   
  3237.     name = p.ProjectFileName
  3238.     If p.EXEFileName = "" && name <> "" Then 
  3239.       ' Sync the project file name and EXE file name.
  3240.       file.FileName = name
  3241.       name = file.Path & file.Name & ".exe"
  3242.     Else 
  3243.       name = p.EXEFileName
  3244.     End If
  3245.   
  3246.     If name <> "" Then 
  3247.       file.FileName = name
  3248.       dlg.FileName = file.Name & file.Extension
  3249.       dlg.InitialDir = file.Path
  3250.     Else 
  3251.       dlg.FileName = "*.exe"
  3252.       dlg.InitialDir = Envelop.FileDialogDir
  3253.     End If
  3254.   
  3255.     dlg.Title = "Save application EXE file as"
  3256.     dlg.Filter = "Executable files (*.exe)|*.exe|All files (*.*)|*.*|"
  3257.     dlg.DefaultExtension = "exe"
  3258.     dlg.FilterIndex = 1
  3259.     dlg.PathMustExist = True
  3260.     dlg.NoChangeDir = True
  3261.     SaveProjectEXEAs = IDCANCEL
  3262.     If dlg.Execute = IDOK Then 
  3263.       p.EXEFileName = dlg.FileName
  3264.       p.WriteEXE
  3265.       SaveProjectEXEAs = IDOK
  3266.       Envelop.FileDialogDir = dlg.FileName
  3267.     End If
  3268.   End Function
  3269.  
  3270.   Function SaveProjectFileAs(p as Project) As Integer
  3271.     Dim dlg As New SaveAsDialog
  3272.     Dim name As String
  3273.     name = p.ProjectFileName
  3274.     If name <> "" Then 
  3275.       Dim file As New File
  3276.       file.FileName = name
  3277.       dlg.FileName = file.Name & file.Extension
  3278.       dlg.InitialDir = IIf(Instr(name, ".") > 0, file.Path, Envelop.FlieDialogDir)
  3279.     Else 
  3280.       dlg.FileName = "*.epj"
  3281.       dlg.InitialDir = Envelop.FileDialogDir
  3282.     End If
  3283.     dlg.Title = "Save project file as"
  3284.     dlg.Filter = "Envelop projects (*.epj)|*.epj|All files (*.*)|*.*|"
  3285.     dlg.DefaultExtension = "epj"
  3286.     dlg.FilterIndex = 1
  3287.     dlg.PathMustExist = True
  3288.     dlg.NoChangeDir = True
  3289.     SaveProjectFileAs = IDCANCEL
  3290.     If dlg.Execute = IDOK Then 
  3291.       ' If project is an application, and the EXE name matches the project
  3292.       ' file name, then keep the EXE name in sync here.
  3293.       Dim syncEXE as Boolean
  3294.       syncEXE = ProjFileMatchesEXE(p)
  3295.       p.ProjectFileName = dlg.FileName
  3296.       p.WriteProjectFile
  3297.       If syncEXE Then 
  3298.         Dim pf, xf As New File
  3299.         pf.FileName = p.ProjectFileName
  3300.         xf.FileName = p.EXEFileName
  3301.         p.EXEFileName = IIf(xf.Path = "", pf.Path, xf.Path) & pf.Name & ".exe"
  3302.       End If
  3303.       Envelop.FileDialogDir = dlg.FileName
  3304.       SaveProjectFileAs = IDOK
  3305.     End If
  3306.   End Function
  3307.  
  3308.   Sub SaveProject_Click()
  3309.     SaveProject ProjectManager.CurrentProject
  3310.   End Sub
  3311.  
  3312.   Function SaveProject_Enable
  3313.     Dim p as Project
  3314.     p = ProjectManager.CurrentProject
  3315.     If p Then 
  3316.       Dim i, n as integer
  3317.       Dim m as ObjectModule
  3318.   
  3319.       ' Check each module in the project, bail if any modified
  3320.       n = p.ModuleCount - 1
  3321.       For i = 0 To n
  3322.         m = p.Module(i)
  3323.         If m && (Not m.ReadOnly) && m.IsModified Then 
  3324.           SaveProject_Enable = True
  3325.           Exit Function
  3326.         End If
  3327.       Next i
  3328.   
  3329.       SaveProject_Enable = ProjectNeedsSaved(p)
  3330.   
  3331.     End If ' ProjectManager.CurrentProject
  3332.   
  3333.     SaveProject_Enable = False
  3334.   End Function
  3335.  
  3336.   Sub setActiveView(o as Object)
  3337.     Dim selobj as Object
  3338.   
  3339.     If o = viewer Or Not o Then Exit Sub
  3340.   
  3341.     If viewer Then 
  3342.       selobj = viewer.SelObject
  3343.       viewer.Visible = False
  3344.     End If
  3345.     viewer = o
  3346.     If viewer.dirty Then viewer.Reset
  3347.     If o <> ProjectView Then viewer.SelObject = selobj
  3348.     viewer.Visible = True
  3349.     viewer.SetFocus
  3350.   
  3351.     SyncViewerGadget
  3352.   End Sub
  3353.  
  3354.   Sub setSelObject(o as Object)
  3355.     ActiveView.SelObject = o
  3356.   End Sub
  3357.  
  3358.   Sub Startup
  3359.     Dim p as Project
  3360.     With ProjectStartupOptions
  3361.       Select Case .StartupAction
  3362.         Case .ACTION_NO_PROJECT
  3363.           toolbar.ViewModule.State = 1
  3364.           ActiveView = ModuleView
  3365.         Case .ACTION_OPEN_PROJECT
  3366.           OpenProject_Click
  3367.           ActiveView = ProjectView
  3368.         Case .ACTION_NEW_PROJECT
  3369.           NewProject_Click
  3370.           ActiveView = ProjectView
  3371.         Case Else ' Includes .ACTION_DEFAULT_PROJECT
  3372.           p = NewProjectForm.MakeDefaultProject
  3373.           ActiveView = ProjectView
  3374.           ResetProject(p, True)
  3375.           ViewProject_Enable = -1
  3376.       End Select
  3377.       Show
  3378.       ActiveView.Reset
  3379.     End With
  3380.   End Sub
  3381.  
  3382.   Sub SyncViewerGadget
  3383.     Select Case viewer
  3384.       Case ProjectView
  3385.         toolbar.ViewProject.State = "Down"
  3386.       Case ModuleView
  3387.         toolbar.ViewModule.State = "Down"
  3388.       Case AlphaView
  3389.         toolbar.ViewAlphabetical.State = "Down"
  3390.       Case HierView
  3391.         toolbar.ViewHierarchical.State = "Down"
  3392.     End Select
  3393.   End Sub
  3394.  
  3395.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  3396.     ' Set to ProjectView before saving text
  3397.     ViewProject_Click
  3398.   
  3399.     ' Write our parent's properties, but none of ours.
  3400.     TextUnload = False
  3401.   End Function
  3402.  
  3403.   Sub UnloadModule_Click()
  3404.     Dim p As Project
  3405.     Dim m As ObjectModule
  3406.     Dim ync As New YesNoCancelBox
  3407.     Dim r As Integer
  3408.   
  3409.     ' Try first to remove the selected module from current project
  3410.     ' or first project that contains it.
  3411.     ' If no projects have the selected module, just unload it.
  3412.     m = SelModule
  3413.     p = ProjectManager.CurrentProject
  3414.     If p = Nothing || p.ModuleIndex(m) = -1 Then 
  3415.       p = ProjectManager.FirstProjectContainingModule(m)
  3416.     End If
  3417.     If p Then 
  3418.       ' Can't remove the module containing the project object
  3419.       If m = ModuleManager.ModuleContaining(p) Then 
  3420.         Dim mb As New MessageBox
  3421.         mb.title = "Unload module error"
  3422.         mb.message = "Module: " & m.DisplayName & " contains project: " & p & "^M^M"
  3423.         mb.message = mb.message & "Can't unload module that contains the project object"
  3424.         mb.Execute
  3425.         Exit Sub
  3426.       End If
  3427.   
  3428.       If (Not m.ReadOnly) && m.IsModified Then 
  3429.         ync.title = "Unload modified module"
  3430.         ync.message = "Module: " & m.DisplayName & " is modified.^M^MSave before unloading from project: " & p & "?"
  3431.         r = ync.Execute
  3432.         If r = IDCANCEL Then Exit Sub
  3433.         If r = IDYES Then 
  3434.           If Not Envelop.SADlg.SaveModule(m) Then  ' user canceled the save
  3435.             Exit Sub
  3436.           End If
  3437.         End If
  3438.       Else 
  3439.         Dim yn As New YesNoBox
  3440.         yn.title = "Unload module"
  3441.         yn.message = "Unload module: " & m.DisplayName & " from project: " & p & "?"
  3442.         If yn.Execute = IDNO Then Exit Sub
  3443.       End If
  3444.   
  3445.       ' Ignore unload failed exceptions.
  3446.       Try
  3447.         p.RemoveModule(m)
  3448.       Catch ModuleUnloadFailed
  3449.       End Try
  3450.       ResetProject(p, False)
  3451.     ElseIf m.CanUnload Then  ' no project w/ module, just unload.
  3452.       If (Not m.ReadOnly) && m.IsModified Then 
  3453.         ync.title = "Unload modified module"
  3454.         ync.message = "Module: " & m.DisplayName & " is modified.^M^MSave before unloading?"
  3455.         r = ync.Execute
  3456.         If r = IDCANCEL Then Exit Sub
  3457.         If r = IDYES Then 
  3458.           If Not Envelop.SADlg.SaveModule(m) Then  ' user canceled the save
  3459.             Exit Sub
  3460.           End If
  3461.         End If
  3462.       End If
  3463.       m.Unload
  3464.     End If
  3465.   End Sub
  3466.  
  3467.   Function UnloadModule_Enable As Integer
  3468.     Dim p As Project
  3469.     Dim m As ObjectModule
  3470.     m = SelModule
  3471.     p = ProjectManager.CurrentProject
  3472.     If p = Nothing || p.ModuleIndex(m) = -1 Then 
  3473.       p = ProjectManager.FirstProjectContainingModule(m)
  3474.     End If
  3475.   
  3476.     ' Can't remove the module containing the project object
  3477.     If p Then 
  3478.       If m = ModuleManager.ModuleContaining(p) Then 
  3479.         toolbar.UnloadModule.HintText = "Unload module"
  3480.         UnloadModule_Enable = False
  3481.       Else 
  3482.         toolbar.UnloadModule.HintText = "Unload module: " & m.DisplayName & " from project: " & p
  3483.         UnloadModule_Enable = True
  3484.       End If
  3485.     Else 
  3486.       If m.CanUnload Then 
  3487.         toolbar.UnloadModule.HintText = "Unload module: " & m.DisplayName
  3488.         UnloadModule_Enable = True
  3489.       Else 
  3490.         toolbar.UnloadModule.HintText = "Unload module"
  3491.         UnloadModule_Enable = False
  3492.       End If
  3493.     End If
  3494.   End Function
  3495.  
  3496.   Sub ViewAlphabetical_Click
  3497.     If ActiveView = AlphaView Then 
  3498.       AlphaView.Reset
  3499.     Else 
  3500.       ActiveView = AlphaView
  3501.     End If
  3502.   End Sub
  3503.  
  3504.   Sub ViewHierarchical_Click
  3505.     If ActiveView = HierView Then 
  3506.       HierView.Reset
  3507.     Else 
  3508.       ActiveView = HierView
  3509.     End If
  3510.   End Sub
  3511.  
  3512.   Sub ViewModule_Click
  3513.     If ActiveView = ModuleView Then 
  3514.       ModuleView.Reset
  3515.     Else 
  3516.       ActiveView = ModuleView
  3517.     End If
  3518.   End Sub
  3519.  
  3520.   Sub ViewProject_Click
  3521.     If ActiveView = ProjectView Then 
  3522.       ProjectView.Reset
  3523.     Else 
  3524.       ActiveView = ProjectView
  3525.     End If
  3526.   End Sub
  3527.  
  3528. End Type
  3529.  
  3530. Type SourceSearcher From Form
  3531.   Dim Search As New Button
  3532.   Dim ModuleCombo As New ComboBox
  3533.   Dim Label3 As New Label
  3534.   Dim SearchCombo As New ComboBox
  3535.   Dim MaxEntries As Integer
  3536.   Dim HitResults As New IndentedList
  3537.   Dim bitmap As New Bitmap
  3538.   Dim SearchModule As ObjectModule
  3539.   Dim ObjectsBtn As New Button
  3540.   Dim HitFilter As New CheckBox
  3541.   Dim AutoExpand As New CheckBox
  3542.   Dim Help As New Button
  3543.   Dim searchGroup As New Group
  3544.   Type ListObject
  3545.     Dim obj As Object
  3546.  
  3547.     ' METHODS for object: SourceSearcher.ListObject
  3548.     Function Create(o As Object) As SourceSearcher.ListObject
  3549.       dim newobj as New SourceSearcher.ListObject
  3550.       newobj.obj = o
  3551.       Create = newobj
  3552.     End Function
  3553.  
  3554.     Sub Expand(list As IndentedList, itemIndex As Integer)
  3555.       dim resetCurObject As New SourceSearcher.ResetCurObject
  3556.     
  3557.       ' Item is an object
  3558.       SourceIterator.CurObject = obj
  3559.       SourceIterator.CurMethod = ""
  3560.       While SourceIterator.NextMethod()
  3561.         ' Only add methods for which there is a hit.
  3562.         If (SourceIterator.NextHit()) Then 
  3563.           dim curIndex as integer
  3564.           curIndex = list.InsertItem(SourceIterator.CurMethod, 1, 1, itemIndex + 1)
  3565.           list.SetItemCanExpand(curIndex, 1)
  3566.           list.SetItemObject(curIndex, SourceSearcher.ListMethod.Create(obj, SourceIterator.CurMethod))
  3567.         End If
  3568.       Wend
  3569.     End Sub
  3570.  
  3571.   End Type
  3572.   Type ListMethod From SourceSearcher.ListObject
  3573.     Dim meth As String
  3574.  
  3575.     ' METHODS for object: SourceSearcher.ListMethod
  3576.     Function Create(o As Object, m As String) As SourceSearcher.ListMethod
  3577.       dim newobj as New SourceSearcher.ListMethod
  3578.       newobj.obj = o
  3579.       newobj.meth = m
  3580.       Create = newobj
  3581.     End Function
  3582.  
  3583.     Sub Expand(list As IndentedList, itemIndex As Integer)
  3584.       dim curIndex as integer
  3585.       dim resetCurObject As New SourceSearcher.ResetCurObject
  3586.     
  3587.       curIndex = itemIndex
  3588.     
  3589.       SourceIterator.CurObject = obj
  3590.       SourceIterator.CurMethod = meth
  3591.       While SourceIterator.NextHit()
  3592.         curIndex = list.InsertItem(SourceIterator.HitLine & ": " & SourceIterator.HitLineText, 2, 2, curIndex + 1)
  3593.         list.SetItemObject(curIndex, SourceSearcher.ListHit.Create(obj, meth, SourceIterator.HitStart, SourceIterator.HitLength))
  3594.         SourceIterator.HitStart = SourceIterator.HitStart + 1
  3595.       Wend
  3596.     End Sub
  3597.  
  3598.   End Type
  3599.   Type ListHit From SourceSearcher.ListMethod
  3600.     Dim hitStart As Integer
  3601.     Dim hitLength As Integer
  3602.  
  3603.     ' METHODS for object: SourceSearcher.ListHit
  3604.     Function Create(o As Object, m As String, ByVal hs, ByVal hl as integer) As SourceSearcher.ListHit
  3605.       dim newobj as New SourceSearcher.ListHit
  3606.       newobj.obj = o
  3607.       newobj.meth = m
  3608.       newobj.hitStart = hs
  3609.       newobj.hitLength = hl
  3610.       Create = newobj
  3611.     End Function
  3612.  
  3613.     Sub Expand(list As IndentedList, itemIndex As Integer)
  3614.       Throw InvalidExpand()
  3615.     End Sub
  3616.  
  3617.   End Type
  3618.   Type ResetCurObject
  3619.  
  3620.     ' METHODS for object: SourceSearcher.ResetCurObject
  3621.     Sub Destruct()
  3622.       SourceIterator.CurObject = Nothing
  3623.     End Sub
  3624.  
  3625.   End Type
  3626.  
  3627.   ' METHODS for object: SourceSearcher
  3628.   Sub addObjects()
  3629.     dim o as object
  3630.     dim i as integer
  3631.     For i = 0 To searchGroup.Count - 1
  3632.       dim curIndex as integer
  3633.       o = searchGroup(i)
  3634.       curIndex = HitResults.AddItem(o, 0)
  3635.       HitResults.SetItemCanExpand(curIndex, 1)
  3636.       HitResults.SetItemObject(curIndex, SourceSearcher.ListObject.Create(o))
  3637.     Next i
  3638.   End Sub
  3639.  
  3640.   Sub Help_Click()
  3641.     dim oldtrap as integer
  3642.     oldtrap = Debugger.TrapSystemExceptions
  3643.     Debugger.TrapSystemExceptions = 0
  3644.     Try
  3645.       dim helptext as string
  3646.       helptext = "^J1. Select a module (or all modules) to pick objects to search.^J"
  3647.       helptext = helptext & "2. Type a search string (regular expression).^J"
  3648.       helptext = helptext & "3. Click SEARCH button.^J"
  3649.   
  3650.       helptext = helptext & "^JUsing list:^J . Expand an object to show methods where search pattern is found.^J"
  3651.       helptext = helptext & " . Expand a method to show lines of source that match pattern.^J"
  3652.       helptext = helptext & " . Select a hit to view method source."
  3653.   
  3654.       helptext = helptext & "^J^JOptions:^J[ ] Only show hits - use this option to make search results only show hit strings.^J"
  3655.       helptext = helptext & "[ ] Auto expand - Use this option to force full expansion of search results.^J"
  3656.       helptext = helptext & "^JOBJECTS button - Seed list with objects from current module selection."
  3657.   
  3658.   
  3659.       InfoBox.Message("Using the Source Searcher", helptext)
  3660.     catch NotFound()
  3661.     End Try
  3662.     Debugger.TrapSystemExceptions = oldtrap
  3663.   End Sub
  3664.  
  3665.   Sub HitFilter_Click()
  3666.     If HitFilter.Value Then 
  3667.       AutoExpand.Value = 1
  3668.       AutoExpand.Enabled = False
  3669.     Else 
  3670.       AutoExpand.Enabled = True
  3671.     End If
  3672.   End Sub
  3673.  
  3674.   Sub HitResults_Click()
  3675.     dim o as Object
  3676.     o = HitResults.ItemObject(HitResults.ListIndex)
  3677.   
  3678.     ' If the object referred to by this item is now gone, remove the item
  3679.     If (Not o.obj) Then HitResults.RemoveItem(HitResults.ListIndex)
  3680.   
  3681.     If (TypeOf o Is SourceSearcher.ListHit) Then 
  3682.       If (MethodExists(o.obj, o.meth)) Then 
  3683.         MethodEditor.ChangeState(o.obj, o.meth)
  3684.         MethodEditor.SelStart = o.hitStart
  3685.         MethodEditor.SelLength = o.hitLength
  3686.         MethodEditor.SetFocus
  3687.       End If
  3688.     End If
  3689.   End Sub
  3690.  
  3691.   Sub HitResults_DblClick()
  3692.     dim o as Object
  3693.     o = HitResults.ItemObject(HitResults.ListIndex)
  3694.   
  3695.     ' If the object referred to by this item is now gone, remove the item
  3696.     If (Not o.obj) Then HitResults.RemoveItem(HitResults.ListIndex)
  3697.   
  3698.     If (TypeOf o Is SourceSearcher.ListObject) Then 
  3699.       ObjectEditorMgr.Edit o.obj
  3700.     End If
  3701.   End Sub
  3702.  
  3703.   Sub HitResults_Expand(ByVal itemIndex as Integer, ByVal itemData as Long, itemObj As Object)
  3704.     SourceIterator.SearchPattern = SearchCombo.Text
  3705.     itemObj.Expand(HitResults, itemIndex)
  3706.   End Sub
  3707.  
  3708.   Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  3709.     If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Source_Searcher")
  3710.   End Sub
  3711.  
  3712.   Sub Load()
  3713.     HitResults.IconBitmap = bitmap
  3714.   
  3715.     AutoExpand.Enabled = True
  3716.     AutoExpand.Value = "Checked"
  3717.   
  3718.     MakeModuleList()
  3719.     ModuleCombo.ListIndex = 1
  3720.   End Sub
  3721.  
  3722.   Sub MakeModuleList()
  3723.     dim i as integer
  3724.   
  3725.     ModuleCombo.Clear
  3726.     ModuleCombo.AddItem("All")
  3727.     ModuleCombo.AddItem("Open Module")
  3728.   
  3729.     For i = 0 To ModuleManager.ModuleCount - 1
  3730.       dim om as ObjectModule
  3731.       dim modname as string
  3732.       om = ModuleManager.Module(i)
  3733.       modname = "#" & i & " : " & IIf(om.FileName <> "", om.FileName, "<Detached>") & " (" & om.StaticCount & ")"
  3734.       ModuleCombo.AddItem(modname)
  3735.     Next i
  3736.   End Sub
  3737.  
  3738.   Sub ModuleCombo_Click()
  3739.   
  3740.     If (ModuleCombo.ListIndex = 0) Then 
  3741.       SearchModule = Nothing
  3742.     ElseIf (ModuleCombo.ListIndex = 1) Then 
  3743.       SearchModule = ModuleManager.CurrentModule
  3744.     Else 
  3745.       dim modnum as integer
  3746.       dim itemname as string
  3747.   
  3748.       itemname = ModuleCombo.List(ModuleCombo.ListIndex)
  3749.       modnum = Mid(itemname, 2, Instr(itemname, " ") - 2)
  3750.   
  3751.       SearchModule = ModuleManager.Module(modnum)
  3752.     End If
  3753.   
  3754.     HitResults.Clear()
  3755.   End Sub
  3756.  
  3757.   Sub ModuleCombo_DropDown()
  3758.     dim listIndex As Integer
  3759.   
  3760.     ' Remember the original selection before remaking list.
  3761.     listIndex = ModuleCombo.ListIndex
  3762.     MakeModuleList
  3763.   
  3764.     ' After list is remade, reset selection if it is no longer valid.
  3765.     If (listIndex >= ModuleCombo.ListCount) Then listIndex = 1
  3766.   
  3767.     ' Pick a module, tries to maintain original selection
  3768.     ModuleCombo.ListIndex = listIndex
  3769.   End Sub
  3770.  
  3771.   Sub ObjectsBtn_Click()
  3772.   
  3773.     ' Show the busy cursor, to indicate we are working.
  3774.     If App Then App.ShowBusySignal
  3775.   
  3776.     searchGroup.Clear()
  3777.     HitResults.Clear()
  3778.     If (SearchModule) Then 
  3779.       SearchModule.GetPrototypeObjects(searchGroup)
  3780.     Else 
  3781.       dim i as integer
  3782.   
  3783.       For i = 0 To ModuleManager.ModuleCount - 1
  3784.         dim om as ObjectModule
  3785.         om = ModuleManager.Module(i)
  3786.         om.GetPrototypeObjects(searchGroup)
  3787.       Next i
  3788.     End If
  3789.   
  3790.     addObjects()
  3791.   End Sub
  3792.  
  3793.   Sub Resize()
  3794.     HitResults.Width = ScaleWidth - (HitResults.Left * 2)
  3795.     HitResults.Height = ScaleHeight - (HitResults.Top + 45)
  3796.   End Sub
  3797.  
  3798.   Sub SearchCombo_KeyDown(keyCode As Integer, ByVal shift As Integer)
  3799.     If keyCode = VK_RETURN Then 
  3800.       SendEvent Search.Click()
  3801.     End If
  3802.   End Sub
  3803.  
  3804.   Sub Search_Click()
  3805.     dim og as new Group
  3806.     dim i,j, hitLevel as integer
  3807.     dim resetCurObject As New SourceSearcher.ResetCurObject
  3808.   
  3809.     ' Show the busy cursor, to indicate we are searching.
  3810.     If App Then App.ShowBusySignal
  3811.   
  3812.     ' Before doing a search, ensure the current module is still valid
  3813.     ' by doing what DropDown does, this may change the search module
  3814.     ModuleCombo_DropDown()
  3815.   
  3816.     searchGroup.Clear()
  3817.     ' Configure the group of objects to search
  3818.     If (SearchModule) Then 
  3819.       SearchModule.GetPrototypeObjects(searchGroup)
  3820.     Else 
  3821.       For i = 0 To ModuleManager.ModuleCount - 1
  3822.         dim om as ObjectModule
  3823.         om = ModuleManager.Module(i)
  3824.         om.GetPrototypeObjects(searchGroup)
  3825.       Next i
  3826.     End If
  3827.   
  3828.     SourceIterator.SearchPattern = SearchCombo.Text
  3829.     If (Not SourceIterator.RegExpValid) Then 
  3830.       Throw RegularExpressionInvalid()
  3831.     End If
  3832.   
  3833.     updateSearch(SearchCombo.Text)
  3834.   
  3835.     HitResults.Clear
  3836.   
  3837.     If (HitFilter.Value) Then hitLevel = 0 Else hitLevel = 2
  3838.   
  3839.     For i = 0 To searchGroup.Count - 1
  3840.       dim hitString as String
  3841.       dim done, curIndex, objIndex, firstObj, firstMethod as integer
  3842.       dim numhits as long
  3843.   
  3844.       curIndex = 0
  3845.   
  3846.       SourceIterator.CurObject = searchGroup(i)
  3847.       SourceIterator.CurMethod = ""
  3848.       firstObj = -1
  3849.       done = 0
  3850.       While SourceIterator.NextMethod() && (Not done)
  3851.         firstMethod = -1
  3852.         While SourceIterator.NextHit() && (Not done)
  3853.   
  3854.           ' Try to keep iterator from running out of memory, by restricting matches.
  3855.           numhits = numhits + 1
  3856.           If (numhits > 200) Then 
  3857.             InfoBox.Message("Too many matches", "The search criteria was too general, and too many matches were found.")
  3858.             Exit Sub
  3859.           End If
  3860.   
  3861.           If (firstObj && (Not (HitFilter.Value = 1))) Then 
  3862.             ' Always insert Objects at index=0, so they sort properly.
  3863.             curIndex = HitResults.InsertItem(SourceIterator.CurObject, 0, 0, 0)
  3864.             HitResults.SetItemCanExpand(curIndex, 1)
  3865.             HitResults.SetItemObject(curIndex, SourceSearcher.ListObject.Create(SourceIterator.CurObject))
  3866.             objIndex = curIndex
  3867.             firstObj = 0
  3868.             If (AutoExpand.Value = 0) Then done = -1 : Exit Do
  3869.           End If
  3870.   
  3871.           If (firstMethod && (Not (HitFilter.Value = 1))) Then 
  3872.             curIndex = HitResults.InsertItem(SourceIterator.CurMethod, 1, 1, objIndex + 1)
  3873.             HitResults.SetItemCanExpand(curIndex, 1)
  3874.             HitResults.SetItemObject(curIndex, SourceSearcher.ListMethod.Create(SourceIterator.CurObject, SourceIterator.CurMethod))
  3875.             firstMethod = 0
  3876.           End If
  3877.           If HitFilter.Value Then 
  3878.             hitString = SourceIterator.CurObject & "::" & SourceIterator.CurMethod & " "
  3879.           Else 
  3880.             hitString = ""
  3881.           End If
  3882.           curIndex = HitResults.InsertItem(hitString & SourceIterator.HitLine & ": " & SourceIterator.HitLineText, 2, hitLevel, curIndex + 1)
  3883.           HitResults.SetItemObject(curIndex, SourceSearcher.ListHit.Create(SourceIterator.CurObject, SourceIterator.CurMethod, SourceIterator.HitStart, SourceIterator.HitLength))
  3884.   
  3885.           SourceIterator.HitStart = SourceIterator.HitStart + 1
  3886.         Wend
  3887.       Wend
  3888.     Next i
  3889.   End Sub
  3890.  
  3891.   Sub updateSearch(s As String)
  3892.     ' Try to find existing item "s", if found don't add again.
  3893.     If SearchCombo.ItemIndex(s) >= 0 Then Exit Sub
  3894.   
  3895.     ' If we have max # of item already, remove oldest item in list.
  3896.     If SearchCombo.ListCount = MaxEntries Then 
  3897.       SearchCombo.RemoveItem(SearchCombo.ListCount - 1)
  3898.     End If
  3899.     ' Add an item at the top of the list
  3900.     SearchCombo.InsertItem(s, 0)
  3901.   End Sub
  3902.  
  3903. End Type
  3904.  
  3905. Type ObjectBoxEditor From ObjectEditor
  3906.   Type ObjBoxForm From Form
  3907.     Type Toolbox From ObjectBox
  3908.       Dim MovePrevious As New ToolGadget
  3909.       Dim MoveNext As New ToolGadget
  3910.       Dim NewGadget As New ToolGadget
  3911.       Type DelGadget From ToolGadget
  3912.         Property HintText Get getHintText As String
  3913.  
  3914.         ' METHODS for object: ObjectBoxEditor.ObjBoxForm.Toolbox.DelGadget
  3915.         Function getHintText As String
  3916.           If Enabled Then 
  3917.             getHintText = "Delete " & Parent.CurrentGadget.Name
  3918.           Else 
  3919.             getHintText = "Delete Selected Gadget"
  3920.           End If
  3921.         End Function
  3922.  
  3923.       End Type
  3924.       Type Configure From ToolGadget
  3925.         Property HintText Get getHintText As String
  3926.  
  3927.         ' METHODS for object: ObjectBoxEditor.ObjBoxForm.Toolbox.Configure
  3928.         Function getHintText As String
  3929.           If Enabled Then 
  3930.             dim EditObj as string
  3931.             EditObj = ObjectBoxEditor.ObjBoxForm.Caption
  3932.             EditObj = Right$(EditObj, Len(EditObj) - Instr(EditObj, ": ") - 1)
  3933.             getHintText = "Configure " & EditObj
  3934.           Else 
  3935.             getHintText = "Configure ObjectBox"
  3936.           End If
  3937.         End Function
  3938.  
  3939.       End Type
  3940.       Type ConfigureTool From ToolGadget
  3941.         Property HintText Get getHintText As String
  3942.  
  3943.         ' METHODS for object: ObjectBoxEditor.ObjBoxForm.Toolbox.ConfigureTool
  3944.         Function getHintText As String
  3945.           If Enabled Then 
  3946.             getHintText = "Configure " & Parent.CurrentGadget.Name
  3947.           Else 
  3948.             getHintText = "Configure Selected Gadget"
  3949.           End If
  3950.         End Function
  3951.  
  3952.       End Type
  3953.       Dim SlidePrevious As New ToolGadget
  3954.       Dim SlideNext As New ToolGadget
  3955.       Dim SeparatorInc As New ToolGadget
  3956.       Dim SeparatorDec As New ToolGadget
  3957.       Dim CurrentGadget As ButtonGadget
  3958.       Dim GadgetPrototype As ButtonGadget
  3959.       Dim ObjBox As ObjectBox
  3960.       Dim EditOnAdd As Boolean
  3961.  
  3962.       ' METHODS for object: ObjectBoxEditor.ObjBoxForm.Toolbox
  3963.       Sub ConfigureTool_Click()
  3964.         CurrentGadget.DetailedEdit
  3965.       End Sub
  3966.  
  3967.       Function ConfigureTool_Enable() as integer
  3968.         If ObjectBoxEditor.Enabled Then 
  3969.           If ObjBox <> Nothing Then 
  3970.             If CurrentGadget <> Nothing Then 
  3971.               ConfigureTool_Enable = True
  3972.             Else 
  3973.               ConfigureTool_Enable = False
  3974.             End If
  3975.           Else 
  3976.             ConfigureTool_Enable = False
  3977.           End If
  3978.         Else 
  3979.           ConfigureTool_Enable = False
  3980.         End If
  3981.       End Function
  3982.  
  3983.       Sub Configure_Click()
  3984.         ObjectBoxConfigWizard.OriginalBox = ObjBox
  3985.         ObjectBoxConfigWizard.Show
  3986.       End Sub
  3987.  
  3988.       Function Configure_Enable() as integer
  3989.         If ObjectBoxEditor.Enabled Then 
  3990.           If ObjBox <> Nothing Then 
  3991.             Configure_Enable = True
  3992.           Else 
  3993.             Configure_Enable = False
  3994.           End If
  3995.         Else 
  3996.           Configure_Enable = False
  3997.         End If
  3998.       End Function
  3999.  
  4000.       Sub DelGadget_Click()
  4001.         Dim YES as integer
  4002.         Dim YN as New YesNoBox
  4003.       
  4004.         YES = 6
  4005.       
  4006.         YN.title = "Verify Delete"
  4007.         YN.message = "Are you sure you want to delete " & CurrentGadget.Name
  4008.       
  4009.         YN.Execute
  4010.       
  4011.         If YN.result = YES Then 
  4012.           dim i as integer
  4013.           i = CurrentGadget.Position
  4014.           DestroyObject(CurrentGadget)
  4015.           If ObjBox.NumItems = 0 Then 
  4016.             CurrentGadget = Nothing
  4017.           Else 
  4018.             If i > ObjBox.NumItems Then 
  4019.               CurrentGadget = ObjBox.At(ObjBox.NumItems)
  4020.             Else 
  4021.               ObjBox.ForceLayout(False)
  4022.               CurrentGadget = ObjBox.At(i)
  4023.             End If
  4024.           End If
  4025.           With Parent.CBGadget
  4026.             If CurrentGadget Then 
  4027.               .Text = CurrentGadget.Name
  4028.             Else 
  4029.               .Text = ""
  4030.             End If
  4031.           End With
  4032.           ObjBox.ForceLayout(True)
  4033.         End If
  4034.       End Sub
  4035.  
  4036.       Function DelGadget_Enable() as integer
  4037.         If ObjectBoxEditor.Enabled Then 
  4038.           If ObjBox <> Nothing Then 
  4039.             If CurrentGadget <> Nothing Then 
  4040.               DelGadget_Enable = True
  4041.             Else 
  4042.               DelGadget_Enable = False
  4043.             End If
  4044.           Else 
  4045.             DelGadget_Enable = False
  4046.           End If
  4047.         Else 
  4048.           DelGadget_Enable = False
  4049.         End If
  4050.       End Function
  4051.  
  4052.       Sub MoveNext_Click()
  4053.         CurrentGadget = ObjBox.At(CurrentGadget.Position + 1)
  4054.         Parent.CBGadget.ListIndex = Parent.CBGadget.ItemIndex(CurrentGadget.Name)
  4055.       End Sub
  4056.  
  4057.       Function MoveNext_Enable() as integer
  4058.         If ObjectBoxEditor.Enabled Then 
  4059.           If ObjBox <> Nothing Then 
  4060.             If ObjBox.NumItems > 1 && CurrentGadget <> Nothing && CurrentGadget.Position < ObjBox.NumItems Then 
  4061.               MoveNext_Enable = True
  4062.             Else 
  4063.               MoveNext_Enable = False
  4064.             End If
  4065.           Else 
  4066.             MoveNext_Enable = False
  4067.           End If
  4068.         Else 
  4069.           MoveNext_Enable = False
  4070.         End If
  4071.       End Function
  4072.  
  4073.       Sub MovePrevious_Click()
  4074.         CurrentGadget = ObjBox.At(CurrentGadget.Position - 1)
  4075.         Parent.CBGadget.ListIndex = Parent.CBGadget.ItemIndex(CurrentGadget.Name)
  4076.       End Sub
  4077.  
  4078.       Function MovePrevious_Enable() as integer
  4079.         If ObjectBoxEditor.Enabled Then 
  4080.           If ObjBox <> Nothing Then 
  4081.             If ObjBox.NumItems > 1 && CurrentGadget <> Nothing && CurrentGadget.Position > 1 Then 
  4082.               MovePrevious_Enable = True
  4083.             Else 
  4084.               MovePrevious_Enable = False
  4085.             End If
  4086.           Else 
  4087.             MovePrevious_Enable = False
  4088.           End If
  4089.         Else 
  4090.           MovePrevious_Enable = False
  4091.         End If
  4092.       End Function
  4093.  
  4094.       Sub NewGadget_Click()
  4095.         CurrentGadget = EmbedObject(ObjBox, GadgetPrototype, UniqueEmbedName(ObjBox, "ToolGadget"))
  4096.         CurrentGadget.bitmap.SetPicture GadgetConfigWizard.BlankBitmap.GetPicture
  4097.         If EditOnAdd Then 
  4098.           dim o as long
  4099.           o = CurrentGadget.DetailedEdit
  4100.           If Not o Then 
  4101.             Dim YN as New YesNoBox
  4102.             YN.title = "Delete Cancelled Add Configuration"
  4103.             YN.message = "Would you like to Delete '" & CurrentGadget.Name & "'?"
  4104.             YN.Execute
  4105.             If YN.result = IDYES Then 
  4106.               DestroyObject(CurrentGadget)
  4107.               If ObjBox.NumItems > 0 Then 
  4108.                 CurrentGadget = ObjBox.At(1)
  4109.               Else 
  4110.                 CurrentGadget = Nothing
  4111.               End If
  4112.             End If
  4113.           End If
  4114.         End If
  4115.         ObjBox.ForceLayout(True)
  4116.       End Sub
  4117.  
  4118.       Function NewGadget_Enable() as integer
  4119.         If ObjectBoxEditor.Enabled Then 
  4120.           If ObjBox <> Nothing Then 
  4121.             NewGadget_Enable = True
  4122.           Else 
  4123.             NewGadget_Enable = False
  4124.           End If
  4125.         Else 
  4126.           NewGadget_Enable = False
  4127.         End If
  4128.       End Function
  4129.  
  4130.       Sub SeparatorDec_Click()
  4131.         If CurrentGadget.Separator > 1 Then 
  4132.           CurrentGadget.Separator = CurrentGadget.Separator - 1
  4133.         Else 
  4134.           CurrentGadget.Separator = 0
  4135.         End If
  4136.       End Sub
  4137.  
  4138.       Sub SeparatorDec_DblClick()
  4139.         If CurrentGadget.Separator > 10 Then 
  4140.           CurrentGadget.Separator = CurrentGadget.Separator - 10
  4141.         Else 
  4142.           CurrentGadget.Separator = 0
  4143.         End If
  4144.       End Sub
  4145.  
  4146.       Function SeparatorDec_Enable() as integer
  4147.         If ObjectBoxEditor.Enabled Then 
  4148.           If ObjBox <> Nothing && ObjBox.LayoutStyle = "ToolBar" && CurrentGadget <> Nothing && CurrentGadget.Separator > 0 Then 
  4149.             SeparatorDec_Enable = True
  4150.           Else 
  4151.             SeparatorDec_Enable = False
  4152.           End If
  4153.         Else 
  4154.           SeparatorDec_Enable = False
  4155.         End If
  4156.       End Function
  4157.  
  4158.       Sub SeparatorInc_Click()
  4159.         CurrentGadget.Separator = CurrentGadget.Separator + 1
  4160.       End Sub
  4161.  
  4162.       Sub SeparatorInc_DblClick()
  4163.         CurrentGadget.Separator = CurrentGadget.Separator + 10
  4164.       End Sub
  4165.  
  4166.       Function SeparatorInc_Enable() as integer
  4167.         If ObjectBoxEditor.Enabled Then 
  4168.           If ObjBox <> Nothing && ObjBox.LayoutStyle = "ToolBar" && CurrentGadget <> Nothing Then 
  4169.             SeparatorInc_Enable = True
  4170.           Else 
  4171.             SeparatorInc_Enable = False
  4172.           End If
  4173.         Else 
  4174.           SeparatorInc_Enable = False
  4175.         End If
  4176.       End Function
  4177.  
  4178.       Sub SlideNext_Click()
  4179.         CurrentGadget.Position = CurrentGadget.Position + 1
  4180.       End Sub
  4181.  
  4182.       Function SlideNext_Enable() as integer
  4183.         If ObjectBoxEditor.Enabled Then 
  4184.           If ObjBox <> Nothing Then 
  4185.             If ObjBox.NumItems > 1 && CurrentGadget <> Nothing && CurrentGadget.Position < ObjBox.NumItems Then 
  4186.               SlideNext_Enable = True
  4187.             Else 
  4188.               SlideNext_Enable = False
  4189.             End If
  4190.           Else 
  4191.             SlideNext_Enable = False
  4192.           End If
  4193.         Else 
  4194.           SlideNext_Enable = False
  4195.         End If
  4196.       End Function
  4197.  
  4198.       Sub SlidePrevious_Click()
  4199.         CurrentGadget.Position = CurrentGadget.Position - 1
  4200.       End Sub
  4201.  
  4202.       Function SlidePrevious_Enable() as integer
  4203.         If ObjectBoxEditor.Enabled Then 
  4204.           If ObjBox <> Nothing Then 
  4205.             If ObjBox.NumItems > 1 && CurrentGadget <> Nothing && CurrentGadget.Position > 1 Then 
  4206.               SlidePrevious_Enable = True
  4207.             Else 
  4208.               SlidePrevious_Enable = False
  4209.             End If
  4210.           Else 
  4211.             SlidePrevious_Enable = False
  4212.           End If
  4213.         Else 
  4214.           SlidePrevious_Enable = False
  4215.         End If
  4216.       End Function
  4217.  
  4218.       Function TextUnload(ByVal indent as string, cmds as string) As Integer
  4219.         cmds = cmds & indent & ".EditOnAdd = " & EditOnAdd & "^J"
  4220.         If GadgetPrototype = Nothing Then 
  4221.           cmds = cmds & indent & ".GadgetPrototype = Nothing^J"
  4222.         Else 
  4223.           cmds = cmds & indent & ".GadgetPrototype = " & GadgetPrototype & "^J"
  4224.         End If
  4225.         ' Request inherited properites to unload also
  4226.         TextUnload = False
  4227.       End Function
  4228.  
  4229.     End Type
  4230.     Type CBGadget From ComboBox
  4231.       Dim SuppressClick As Boolean
  4232.  
  4233.       ' METHODS for object: ObjectBoxEditor.ObjBoxForm.CBGadget
  4234.       Sub Change()
  4235.         dim o as Object
  4236.         o = FindEmbed(Parent.Toolbox.ObjBox, Text)
  4237.         If o && TypeOf o Is ButtonGadget Then ObjectBoxEditor.Edit(o)
  4238.       End Sub
  4239.  
  4240.       Sub Click()
  4241.         If SuppressClick Then 
  4242.           SuppressClick = False
  4243.           Exit Sub
  4244.         End If
  4245.         ObjectBoxEditor.Edit(FindEmbed(Parent.Toolbox.ObjBox, List(ListIndex)))
  4246.       End Sub
  4247.  
  4248.       Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  4249.         If keyCode = VK_RETURN Then 
  4250.           dim o as Object
  4251.           keyCode = 0
  4252.           o = FindEmbed(Parent.Toolbox.ObjBox, Text)
  4253.           If o && TypeOf o Is ButtonGadget Then ObjectBoxEditor.Edit(o)
  4254.         End If
  4255.       End Sub
  4256.  
  4257.     End Type
  4258.  
  4259.     ' METHODS for object: ObjectBoxEditor.ObjBoxForm
  4260.     Sub CBGadget_DropDown()
  4261.       If Toolbox.ObjBox Then 
  4262.         Dim i as integer
  4263.         CBGadget.Clear
  4264.         For i = 1 To Toolbox.ObjBox.NumItems
  4265.           CBGadget.AddItem(Toolbox.ObjBox.At(i).Name)
  4266.         Next i
  4267.         If Toolbox.CurrentGadget && Toolbox.CurrentGadget.Name <> CBGadget.Text Then 
  4268.           CBGadget.SuppressClick = True
  4269.           CBGadget.ListIndex = CBGadget.ItemIndex(Toolbox.CurrentGadget.Name)
  4270.         End If
  4271.       Else 
  4272.         CBGadget.Clear
  4273.       End If
  4274.     End Sub
  4275.  
  4276.     Function getActive As Long
  4277.       If ToolPalette.ToggleObjectBoxEdit.State = "Up" Then 
  4278.         getActive = False
  4279.       Else 
  4280.         getActive = True
  4281.       End If
  4282.     End Function
  4283.  
  4284.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  4285.       CBGadget.KeyDown(keyCode, shift)
  4286.     End Sub
  4287.  
  4288.     Sub Resize()
  4289.       CBGadget.Width = ScaleWidth - 4500
  4290.       Height = 840
  4291.       CBGadget.Refresh
  4292.     End Sub
  4293.  
  4294.     Sub SetCaption()
  4295.       Caption = "Editing: "
  4296.       If Toolbox.ObjBox Then 
  4297.         If Toolbox.ObjBox.Name <> "" Then 
  4298.           Caption = Caption & Toolbox.ObjBox.Name
  4299.         Else 
  4300.           Caption = Caption & Toolbox.ObjBox
  4301.         End If
  4302.       Else 
  4303.         Caption = Caption & "NOTHING"
  4304.       End If
  4305.     End Sub
  4306.  
  4307.     Sub SetPrototype
  4308.       If Toolbox.ObjBox = ControlTools.Palette Then 
  4309.         Toolbox.GadgetPrototype = ControlTools.Gadget
  4310.       Else 
  4311.         Toolbox.GadgetPrototype = ToolGadget
  4312.       End If
  4313.     End Sub
  4314.  
  4315.   End Type
  4316.   Property Active Get getActive As Long
  4317.  
  4318.   ' METHODS for object: ObjectBoxEditor
  4319.   Sub Edit(o As Object)
  4320.     If (o && TypeOf o Is ObjectBox) && o <> ObjBoxForm.Toolbox Then 
  4321.       ObjBoxForm.Toolbox.ObjBox = o
  4322.       If o.NumItems > 0 Then 
  4323.         ObjBoxForm.Toolbox.CurrentGadget = o.At(1)
  4324.       Else 
  4325.         ObjBoxForm.Toolbox.CurrentGadget = Nothing
  4326.       End If
  4327.       If Active Then ObjBoxForm.Visible = True
  4328.       SetPrototype
  4329.       ObjBoxForm.SetCaption
  4330.       ObjBoxForm.CBGadget_DropDown
  4331.     ElseIf (o && TypeOf o Is ButtonGadget) && o.Parent Then 
  4332.       If o = ObjBoxForm.Toolbox.CurrentGadget Then 
  4333.       Else 
  4334.         ObjBoxForm.Toolbox.ObjBox = o.Parent
  4335.         ObjBoxForm.Toolbox.CurrentGadget = o
  4336.         If Active Then ObjBoxForm.Visible = True
  4337.         ObjBoxForm.SetPrototype
  4338.         ObjBoxForm.SetCaption
  4339.         ObjBoxForm.CBGadget_DropDown
  4340.       End If
  4341.       ' Make the Editor standout.
  4342.       If Active Then ObjBoxForm.BringToTop
  4343.     End If
  4344.   End Sub
  4345.  
  4346.   Function getActive As Long
  4347.     If ToolPalette.ToggleObjectBoxEdit.State = "Up" Then 
  4348.       getActive = False
  4349.     Else 
  4350.       getActive = True
  4351.     End If
  4352.   End Function
  4353.  
  4354.   Sub SetPrototype
  4355.     If ObjBoxForm.Toolbox.ObjBox = ControlTools.Palette Then 
  4356.       ObjBoxForm.Toolbox.GadgetPrototype = ControlTools.Gadget
  4357.     Else 
  4358.       ObjBoxForm.Toolbox.GadgetPrototype = ToolGadget
  4359.     End If
  4360.   End Sub
  4361.  
  4362. End Type
  4363.  
  4364. Type MenuEditHook From ObjectEditor
  4365.  
  4366.   ' METHODS for object: MenuEditHook
  4367.   Sub BringToTop()
  4368.     MenuEdit.BringToTop()
  4369.   End Sub
  4370.  
  4371.   Sub Edit(obj As Object)
  4372.     If obj && (TypeOf obj Is PopupMenu || TypeOf obj Is MenuBar) Then 
  4373.       MenuEdit.ProcessMenu(obj)
  4374.       MenuEdit.Show
  4375.       MenuEdit.BringToTop
  4376.     End If
  4377.   End Sub
  4378.  
  4379.   Sub Hide()
  4380.     MenuEdit.Hide()
  4381.   End Sub
  4382.  
  4383.   Sub Show()
  4384.     MenuEdit.Show()
  4385.   End Sub
  4386.  
  4387. End Type
  4388.  
  4389. Type EnvelopForm From Form
  4390.   Type EnvelopMenus From MenuBar
  4391.     Dim EnvelopFileMenu As New PopupMenu
  4392.     Dim EnvelopObjectMenu As New PopupMenu
  4393.     Dim EnvelopOptionsMenu As New PopupMenu
  4394.     Dim EnvelopHelpMenu As New PopupMenu
  4395.     Dim EnvelopToolsMenu As New PopupMenu
  4396.   End Type
  4397.   Dim LblEditObj As New Label
  4398.   Type toolbar From ObjectBox
  4399.     Dim NewProject As New ToolGadget
  4400.     Dim OpenProject As New ToolGadget
  4401.     Dim SaveProject As New ToolGadget
  4402.     Dim CloseProject As New ToolGadget
  4403.     Type WorksetLeft From ToolGadget
  4404.  
  4405.       ' METHODS for object: EnvelopForm.toolbar.WorksetLeft
  4406.       Sub Click()
  4407.         WorkSet.PrevObj
  4408.       End Sub
  4409.  
  4410.       Function Enable() As Integer
  4411.         Enable = WorkSet.Active
  4412.       End Function
  4413.  
  4414.     End Type
  4415.     Type Finger From ToolGadget
  4416.       Dim oldCaption As String
  4417.       Dim fingerStarted As Boolean
  4418.       Dim oldAutoBusy As Boolean
  4419.       Dim fingerPointer As Integer
  4420.  
  4421.       ' METHODS for object: EnvelopForm.toolbar.Finger
  4422.       Function FindObjectUnderPoint(x, y as Single) As Object
  4423.         dim p as New Point
  4424.         p.x = x : p.y = y
  4425.         getScreenCoords(p)
  4426.         FindObjectUnderPoint = ObjectTools.FindObjectUnderPoint(p.x, p.y)
  4427.       End Function
  4428.  
  4429.       Sub getScreenCoords(p as Point)
  4430.         p.x = p.x / Screen.TwipsPerPixelX + Left
  4431.         p.y = p.y / Screen.TwipsPerPixelY + Top
  4432.         ClientToScreen(Parent.hWnd, p)
  4433.       End Sub
  4434.  
  4435.       Sub MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
  4436.         If button And 1 && Not fingerStarted Then 
  4437.           fingerStarted = True
  4438.           oldAutoBusy = App.AutoBusySignal
  4439.           App.AutoBusySignal = False
  4440.           Parent.MousePointer = fingerPointer
  4441.           oldCaption = EnvelopForm.Caption
  4442.         End If
  4443.       End Sub
  4444.  
  4445.       Sub MouseMove(button As Integer, shift As Integer, x As Single, y As Single)
  4446.         If button And 1 Then 
  4447.           Dim obj As Object
  4448.           obj = FindObjectUnderPoint(x, y)
  4449.           EnvelopForm.Caption = "Found Object: " & IIf(obj, obj, "Nothing")
  4450.         End If
  4451.       End Sub
  4452.  
  4453.       Sub MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  4454.         If fingerStarted Then 
  4455.           dim obj as Object
  4456.           fingerStarted = False
  4457.           EnvelopForm.Caption = oldCaption
  4458.           obj = FindObjectUnderPoint(x, y)
  4459.           If obj Then 
  4460.             ' Special case the EnvelopForm to turn Form-Editing off (avoids confusing state)
  4461.             If (obj = EnvelopForm) Then FormEditor.Editing = False
  4462.             ObjectEditorMgr.Edit(obj)
  4463.           End If
  4464.           Parent.MousePointer = "Default"
  4465.           App.AutoBusySignal = oldAutoBusy
  4466.         End If
  4467.       End Sub
  4468.  
  4469.     End Type
  4470.     Type WorksetRight From ToolGadget
  4471.  
  4472.       ' METHODS for object: EnvelopForm.toolbar.WorksetRight
  4473.       Sub Click()
  4474.         WorkSet.NextObj
  4475.       End Sub
  4476.  
  4477.       Function Enable() As Integer
  4478.         Enable = WorkSet.Active
  4479.       End Function
  4480.  
  4481.     End Type
  4482.     Dim NewForm As New ToolGadget
  4483.     Dim CopyObject As New ToolGadget
  4484.     Dim AbstractObject As New ToolGadget
  4485.     Dim DeleteObject As New ToolGadget
  4486.     Type ToggleEdit From ToolGadget
  4487.       Property HintText Get getHintText As String
  4488.  
  4489.       ' METHODS for object: EnvelopForm.toolbar.ToggleEdit
  4490.       Function getHintText As String
  4491.         If FormEditor.Editing Then 
  4492.           getHintText = "Deactivate Form Editor"
  4493.         Else 
  4494.           getHintText = "Activate Form Editor"
  4495.         End If
  4496.       End Function
  4497.  
  4498.     End Type
  4499.     Type RestoreLayout From ToolGadget
  4500.  
  4501.       ' METHODS for object: EnvelopForm.toolbar.RestoreLayout
  4502.       Sub Click()
  4503.         EnvelopLayoutSet.AutoRestoreLayout
  4504.       End Sub
  4505.  
  4506.       Sub DblClick()
  4507.         ScreenLayoutConfigForm.Execute(EnvelopLayoutSet)
  4508.       End Sub
  4509.  
  4510.     End Type
  4511.     Type Help From EnvelopForm.toolbar.Finger
  4512.  
  4513.       ' METHODS for object: EnvelopForm.toolbar.Help
  4514.       Sub Click()
  4515.         EnvelopForm.HelpTopics_Click
  4516.       End Sub
  4517.  
  4518.       Sub MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  4519.         If fingerStarted Then 
  4520.           dim obj as Object
  4521.           fingerStarted = False
  4522.           EnvelopForm.Caption = oldCaption
  4523.           obj = FindObjectUnderPoint(x, y)
  4524.           If obj Then 
  4525.             If TypeOf obj Is MethodEditor Then 
  4526.               Envelop.Help.ShowTopicHelp("Methods_Browser")
  4527.             ElseIf TypeOf obj Is PropertyEditor Then 
  4528.               Envelop.Help.ShowTopicHelp("Property_Editor")
  4529.             ElseIf obj = ObjectViewer Then 
  4530.               Envelop.Help.ShowTopicHelp("Object_Viewer")
  4531.             ElseIf obj = EnvelopForm Then 
  4532.               Envelop.Help.ShowTopicHelp("Main_Envelop_Menu_and_Toolbar")
  4533.             ElseIf FormEditor.CurForm = obj Then 
  4534.               Envelop.Help.ShowTopicHelp("Form_environment")
  4535.             ElseIf obj = Me Then 
  4536.               ' Do nothing in particular, wait for Click event.
  4537.             Else 
  4538.               Envelop.Help.ShowObjectHelp(obj)
  4539.             End If
  4540.           End If
  4541.           Parent.MousePointer = "Default"
  4542.           App.AutoBusySignal = oldAutoBusy
  4543.         End If
  4544.       End Sub
  4545.  
  4546.     End Type
  4547.     Dim NewObject As New ToolGadget
  4548.  
  4549.     ' METHODS for object: EnvelopForm.toolbar
  4550.     Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  4551.       effect = 0
  4552.     End Sub
  4553.  
  4554.   End Type
  4555.   Type CBSelectedObject From ComboBox
  4556.  
  4557.     ' METHODS for object: EnvelopForm.CBSelectedObject
  4558.     Sub Click()
  4559.       Dim editObj as Object
  4560.     
  4561.       editObj = FindObject(List(ListIndex))
  4562.       If Not editObj Then Exit Sub
  4563.       ObjectEditorMgr.ResetOthers(WorkSet, editObj)
  4564.     End Sub
  4565.  
  4566.     Sub Edit(obj as Object)
  4567.       dim name as String
  4568.       dim grpObj as Object
  4569.       dim idx as Long
  4570.     
  4571.       If Not obj Then 
  4572.         Exit Sub
  4573.       End If
  4574.     
  4575.       name = obj
  4576.       idx = ItemIndex(name)
  4577.       If (idx <> -1) Then 
  4578.         RemoveItem(idx)
  4579.       End If
  4580.       If (ListCount >= 10) Then RemoveItem(ListCount - 1)
  4581.     
  4582.       InsertItem(name, 0)
  4583.       ' Make the combo select the just entered item, by setting Text property.
  4584.       ' this avoids the "Click" event which would result from setting ListIndex.
  4585.       Text = name
  4586.     End Sub
  4587.  
  4588.     Sub EditByName(nm as String)
  4589.       Dim obj as Object
  4590.       obj = FindObject(nm)
  4591.       ' Special case the EnvelopForm to turn Form-Editing off (avoids confusing state)
  4592.       If (obj = EnvelopForm) Then FormEditor.Editing = False
  4593.       If obj Then ObjectEditorMgr.Edit obj
  4594.     End Sub
  4595.  
  4596.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  4597.       If keyCode = VK_RETURN Then 
  4598.         keyCode = 0
  4599.         EditByName(Text)
  4600.       End If
  4601.     End Sub
  4602.  
  4603.     Sub KeyUp(keyCode As Integer, ByVal shift As Integer)
  4604.       ' Special case having a "." for last typed char, so that
  4605.       ' composite names like "A.B" can be type if "A" is already in list.
  4606.       If (Right(Text, 1) <> ".") Then SelectNamed(Text)
  4607.     End Sub
  4608.  
  4609.     Sub Selection(obj as Object)
  4610.       If obj Then 
  4611.         Dim name as String
  4612.         name = obj
  4613.         If Text <> name Then 
  4614.           Text = obj
  4615.         End If
  4616.       End If
  4617.     End Sub
  4618.  
  4619.     Sub SelectNamed(nm As String)
  4620.       Dim obj as Object
  4621.       obj = FindObject(nm)
  4622.       If ObjectViewer.SelObject <> obj Then ObjectViewer.SelObject = Nothing
  4623.       ObjectEditorMgr.Selection obj
  4624.     End Sub
  4625.  
  4626.   End Type
  4627.  
  4628.   ' METHODS for object: EnvelopForm
  4629.   Sub About_Click()
  4630.     AboutEnvelopForm.Execute()
  4631.   End Sub
  4632.  
  4633.   Sub AbstractObject_Click()
  4634.     Dim nm, rootNm, newNm as String
  4635.     Dim old, abso as Object
  4636.     Dim r as Long
  4637.     old = ObjectEditorMgr.SelectedObject
  4638.     r = InputDialog.Execute("Abstract Object", "Enter name to give new prototype of " & old & ":", UniqueObjectName(old))
  4639.     If r <> IDOK Then Exit Sub
  4640.     newNm = InputDialog.Text
  4641.     If IsIdentifierValid(newNm) = 0 Then 
  4642.       Dim mb As New MessageBox
  4643.       mb.SetIconExclamation
  4644.       mb.Message("Invalid identifier", """" & newNm & """ is not a valid object name")
  4645.       Exit Sub
  4646.     End If
  4647.   
  4648.     rootNm = ObjectTools.RootName(old)
  4649.   
  4650.     ' Abstract object and reset viewers and editors
  4651.     abso = ObjectTools.AbstractObject(old, newNm)
  4652.     ObjectViewer.ResetAbstract(abso)
  4653.     ObjectEditorMgr.Edit abso
  4654.   
  4655.     ' If original was an embedded control with prefixed name,
  4656.     ' change original's prefixed name to reflect new type
  4657.     If TypeOf old Is Window && old.Parent Then 
  4658.       If Instr(old.Name, rootNm) = 1 && Val(Mid(old.Name, Len(rootNm) + 1)) Then 
  4659.         rootNm = ObjectTools.RootName(old)
  4660.         old.Name = UniqueEmbedName(old.Parent, rootNm)
  4661.       End If
  4662.     End If
  4663.     If TypeOf old Is HyperControl && old.Parent Then 
  4664.       abso.Caption = abso
  4665.       abso.Move(abso.Left, abso.Top, old.Width + (abso.Width - abso.ScaleWidth), old.Height + (abso.Height - abso.ScaleHeight))
  4666.     End If
  4667.   End Sub
  4668.  
  4669.   Function AbstractObject_Enable() As Integer
  4670.     AbstractObject_Enable = (ObjectEditorMgr.SelectedObject <> Nothing)
  4671.   End Function
  4672.  
  4673.   Sub AppEditor_Click()
  4674.     ApplicationEditor.Visible = Not ApplicationEditor.Visible
  4675.   End Sub
  4676.  
  4677.   Function AppEditor_Enable() As Integer
  4678.     AppEditor_Enable = True
  4679.     EnvelopMenus.EnvelopToolsMenu.CheckItem("AppEditor", ApplicationEditor.Visible)
  4680.   End Function
  4681.  
  4682.   Sub CBSelectedObject_DropDown()
  4683.     WorkSet.CleanList
  4684.   End Sub
  4685.  
  4686.   Sub CloseAll_Click()
  4687.     PropertyEditor.Hide
  4688.     MethodEditor.Hide
  4689.     ObjectViewer.Hide
  4690.     SourceSearcher.Hide
  4691.     ToolPalette.Hide
  4692.     ControlTools.Palette.Hide
  4693.     Debug.Hide
  4694.     MenuEdit.Hide
  4695.     MenuTester.Hide
  4696.     GroupEditor.Hide
  4697.     ApplicationEditor.Hide
  4698.     WorkSet.Hide
  4699.   End Sub
  4700.  
  4701.   Sub CloseProject_Click
  4702.     ObjectViewer.CloseProject_Click
  4703.   End Sub
  4704.  
  4705.   Function CloseProject_Enable() As Integer
  4706.     Dim enable As Integer
  4707.     enable = ObjectViewer.CloseProject_Enable
  4708.     If enable Then 
  4709.       toolbar.CloseProject.HintText = "Close project: " & ProjectManager.CurrentProject
  4710.     Else 
  4711.       toolbar.CloseProject.HintText = "Close project"
  4712.     End If
  4713.     CloseProject_Enable = enable
  4714.   End Function
  4715.  
  4716.   Sub ConfigureLayout_Click()
  4717.     ScreenLayoutConfigForm.Execute EnvelopLayoutSet
  4718.   End Sub
  4719.  
  4720.   Sub ControlPalette_Click()
  4721.     ControlTools.Palette.Visible = Not ControlTools.Palette.Visible
  4722.   End Sub
  4723.  
  4724.   Function ControlPalette_Enable() As Integer
  4725.     ControlPalette_Enable = True
  4726.     EnvelopMenus.EnvelopToolsMenu.CheckItem("ControlPalette", ControlTools.Palette.Visible)
  4727.   End Function
  4728.  
  4729.   Sub CopyObject_Click()
  4730.     Dim o as Object
  4731.   
  4732.     ' Try to get the FormEditor or the ObjectViewer to do the copy.
  4733.     o = ObjectEditorMgr.SelectedObject
  4734.     If (Not FormEditorCopy(o)) && (Not ObjectViewer.CopyObjectQuick(o, False)) Then 
  4735.       ' Just do it ourselves
  4736.       Dim r as Long
  4737.       r = InputDialog.Execute("Copy Object", "Enter name for new object:", UniqueObjectName(o))
  4738.       If r = IDOK && Len(InputDialog.Text) > 0 Then CopyObject(o, InputDialog.Text)
  4739.     End If
  4740.   End Sub
  4741.  
  4742.   Function CopyObject_Enable() As Integer
  4743.     CopyObject_Enable = (ObjectEditorMgr.SelectedObject <> Nothing)
  4744.   End Function
  4745.  
  4746.   Sub DebugWindow_Click()
  4747.     Debug.Visible = Not Debug.Visible
  4748.   End Sub
  4749.  
  4750.   Function DebugWindow_Enable() As Integer
  4751.     DebugWindow_Enable = True
  4752.     EnvelopMenus.EnvelopToolsMenu.CheckItem("DebugWindow", Debug.Visible)
  4753.   End Function
  4754.  
  4755.   Sub DeleteObject_Click()
  4756.     Dim o as Object
  4757.     Dim msg as String
  4758.   
  4759.     o = ObjectEditorMgr.SelectedObject
  4760.   
  4761.     ' Try to get the FormEditor to do the delete.
  4762.     Try
  4763.       If TypeOf o Is Window && o.Parent = FormEditor.CurForm Then 
  4764.         Dim i, n as Integer
  4765.   
  4766.         ObjectViewer.SelObject = o.Parent
  4767.         n = FormEditor.NumSelected - 1
  4768.         For i = 0 To n
  4769.           If FormEditor.GetSelected(i) = o Then 
  4770.             msg = "Destroy selected control" & IIf(FormEditor.NumSelected > 1, "s?", "?")
  4771.             If OKCancelBox.Message("Destroy Object", msg) <> IDOK Then Exit Sub
  4772.             ' If the FormEditor can delete this object, let it.  Otherwise
  4773.             ' let the ObjectViewer try.
  4774.             ' The FormEditor will delete all selected controls
  4775.             FormEditor.DeleteControl(Nothing)
  4776.             Exit Sub
  4777.           End If
  4778.         Next i
  4779.       End If
  4780.     Catch
  4781.     End Try
  4782.   
  4783.     msg = "Destroy object '" & o & "' ?"
  4784.     If OKCancelBox.Message("Destroy Object", msg) <> IDOK Then Exit Sub
  4785.   
  4786.     ' Alert the user if we are deleting an object that has copies of itself in existence
  4787.     If ObjectHasCopies(o) Then 
  4788.       msg = "The object '" & o & "' has copies of itself that will also be deleted.^M^J OK to continue?"
  4789.       If OKCancelBox.Message("Destroy Object", msg) <> IDOK Then Exit Sub
  4790.     End If
  4791.   
  4792.     ' Try to get the ObjectViewer to do the delete
  4793.     ' 
  4794.     ' If the ObjectViewer can delete this object, let it.  Otherwise
  4795.     ' delete it ourselves.
  4796.     If Not ObjectViewer.DestroySelectedObject(o) Then 
  4797.       ' Just do it ourselves
  4798.       DestroyObject(o)
  4799.       ObjectEditorMgr.Selection ObjectViewer.SelObject
  4800.     End If
  4801.   End Sub
  4802.  
  4803.   Function DeleteObject_Enable() As Integer
  4804.     DeleteObject_Enable = ObjectEditorMgr.SelectedObject && CanDeleteObject(ObjectEditorMgr.SelectedObject)
  4805.   End Function
  4806.  
  4807.   Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  4808.     If state = 4 Then 
  4809.       ModuleManager.LoadModule(source.FileName, False)
  4810.       ObjectViewer.Reset
  4811.     Else 
  4812.       effect = 0
  4813.     End If
  4814.   End Sub
  4815.  
  4816.   Function FormEditorCopy(o As Object) As Boolean
  4817.     ' Try to get the FormEditor to do the copy.
  4818.     Try
  4819.       Dim p as Form
  4820.       Dim i, n as Integer
  4821.   
  4822.       p = o.Parent
  4823.       If p <> FormEditor.CurForm Then Throw No
  4824.       n = FormEditor.NumSelected - 1
  4825.       For i = 0 To n
  4826.         If FormEditor.GetSelected(i) = o Then Exit For
  4827.       Next i
  4828.       If i > n Then Throw No
  4829.       FormEditor.CopyControls
  4830.       FormEditorCopy = True
  4831.       Exit Function
  4832.     Catch
  4833.     End Try
  4834.     FormEditorCopy = False
  4835.   End Function
  4836.  
  4837.   Sub GroupEditor_Click()
  4838.     GroupEditor.Visible = Not GroupEditor.Visible
  4839.   End Sub
  4840.  
  4841.   Function GroupEditor_Enable() As Integer
  4842.     GroupEditor_Enable = True
  4843.     EnvelopMenus.EnvelopToolsMenu.CheckItem("GroupEditor", GroupEditor.Visible)
  4844.   End Function
  4845.  
  4846.   Sub HelpSamples_Click()
  4847.     SamplesBrowser.Show
  4848.     SamplesBrowser.BringToTop
  4849.   End Sub
  4850.  
  4851.   Sub HelpTopics_Click()
  4852.     Envelop.Help.HelpTopics
  4853.   End Sub
  4854.  
  4855.   Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  4856.     CBSelectedObject.KeyDown(keyCode, shift)
  4857.     If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Main_Envelop_Menu_and_Toolbar")
  4858.   End Sub
  4859.  
  4860.   Sub Load()
  4861.     ' Secure this object to prevent deletion.
  4862.     ' TODO: Need to specify can't delete or rename security, can't use general, because
  4863.     ' then methods and properties can't be changed either.
  4864.     ' SecureObject(Me, ACL)
  4865.   
  4866.     ' TODO: Patch to prevent selected combo being hidden by toolbar
  4867.     EnvelopForm.CBSelectedObject.ZOrder = 1
  4868.   
  4869.     ' Hide the project startup dialog, doesn't matter if it didn't show
  4870.     ProjectStartupDialog.Hide
  4871.   
  4872.     ' Display the object viewer; take care of project startup etc.
  4873.     ObjectViewer.Startup
  4874.   
  4875.     ' Restore default layout or best layout for current screen resolution.
  4876.     EnvelopLayoutSet.AutoRestoreLayout()
  4877.   
  4878.     ' Overcome a timing problem with making the default object "Form1" and restoring
  4879.     ' the layout position of the object it copies from "Form".
  4880.     ' Ummm, but only do this if we just made a new or default project! Otherwise we
  4881.     ' might move someone's Form1 in a project they just opened.
  4882.     With ProjectStartupOptions
  4883.       If .StartupAction = .ACTION_NEW_PROJECT || .StartupAction = .ACTION_DEFAULT_PROJECT Then 
  4884.         If FindObject("Form1") Then Form1.Move(Form.Left, Form.Top, Form.Width, Form.Height)
  4885.       End If
  4886.     End With
  4887.   
  4888.     ' Set the module index of the Envelop objects, to keep Debugger from
  4889.     ' trapping exceptions that occur in code run from these objects.
  4890.     Debugger.IgnoreExceptionsModule = ModuleManager.ModuleContaining(Me).Selector
  4891.   
  4892.   End Sub
  4893.  
  4894.   Sub LoadModule_Click()
  4895.     ObjectViewer.LoadModule_Click
  4896.   End Sub
  4897.  
  4898.   Sub MenuEditor_Click()
  4899.     MenuEdit.Visible = Not MenuEdit.Visible
  4900.   End Sub
  4901.  
  4902.   Function MenuEditor_Enable() As Integer
  4903.     MenuEditor_Enable = True
  4904.     EnvelopMenus.EnvelopToolsMenu.CheckItem("MenuEditor", MenuEdit.Visible)
  4905.   End Function
  4906.  
  4907.   Sub MergeModule_Click()
  4908.     Envelop.ETOOpen.MergeEto
  4909.   End Sub
  4910.  
  4911.   Sub MethodBrowser_Click()
  4912.     MethodEditor.Visible = Not MethodEditor.Visible
  4913.   End Sub
  4914.  
  4915.   Function MethodBrowser_Enable() As Integer
  4916.     MethodBrowser_Enable = True
  4917.     EnvelopMenus.EnvelopToolsMenu.CheckItem("MethodBrowser", MethodEditor.Visible)
  4918.   End Function
  4919.  
  4920.   Sub MoveObject_Click()
  4921.     ObjectViewer.MoveObject_Click
  4922.   End Sub
  4923.  
  4924.   Function MoveObject_Enable() As Integer
  4925.     ' Set menu item to show an informative string...
  4926.     Dim enable As Boolean
  4927.     Dim pos As Integer
  4928.     Dim itemStr As String
  4929.     enable = ObjectViewer.MoveObject_Enable
  4930.     pos = EnvelopMenus.EnvelopObjectMenu.ItemPosition("MoveObject")
  4931.     itemStr = "Move to " & IIf(enable, ModuleManager.CurrentModule.DisplayName, "Current Module")
  4932.     EnvelopMenus.EnvelopObjectMenu.SetCaption(pos, itemStr)
  4933.     MoveObject_Enable = enable
  4934.   End Function
  4935.  
  4936.   Sub NewForm_Click()
  4937.     Dim f as Form
  4938.     Dim nm as String
  4939.   
  4940.     nm = UniqueObjectNameFromString("Form")
  4941.     f = CopyObject(Form, nm)
  4942.     f.Caption = nm
  4943.   
  4944.     FormEditor.Editing = True
  4945.     ObjectEditorMgr.Edit f
  4946.     ObjectViewer.ResetNewObject(f)
  4947.   End Sub
  4948.  
  4949.   Sub NewModule_Click()
  4950.     ObjectViewer.NewModule_Click
  4951.   End Sub
  4952.  
  4953.   Sub NewObject_Click()
  4954.     ObjectViewer.NewObject_Click
  4955.   End Sub
  4956.  
  4957.   Sub NewProject_Click
  4958.     ObjectViewer.NewProject_Click
  4959.   End Sub
  4960.  
  4961.   Sub ObjectBrowser_Click()
  4962.     ObjectViewer.Visible = Not ObjectViewer.Visible
  4963.   End Sub
  4964.  
  4965.   Function ObjectBrowser_Enable() As Integer
  4966.     ObjectBrowser_Enable = True
  4967.     EnvelopMenus.EnvelopToolsMenu.CheckItem("ObjectBrowser", ObjectViewer.Visible)
  4968.   End Function
  4969.  
  4970.   Sub OcxTool_Click()
  4971.     OcxTool.Visible = Not OcxTool.Visible
  4972.   End Sub
  4973.  
  4974.   Function OcxTool_Enable() As Integer
  4975.     OcxTool_Enable = True
  4976.     EnvelopMenus.EnvelopToolsMenu.CheckItem("OcxTool", OcxTool.Visible)
  4977.   End Function
  4978.  
  4979.   Sub OpenProject_Click
  4980.     ObjectViewer.OpenProject_Click
  4981.   End Sub
  4982.  
  4983.   Sub PropertyEditor_Click()
  4984.     PropertyEditor.Visible = Not PropertyEditor.Visible
  4985.   End Sub
  4986.  
  4987.   Function PropertyEditor_Enable() As Integer
  4988.     PropertyEditor_Enable = True
  4989.     EnvelopMenus.EnvelopToolsMenu.CheckItem("PropertyEditor", PropertyEditor.Visible)
  4990.   End Function
  4991.  
  4992.   Sub QuickCopy_Click()
  4993.     Dim o as Object
  4994.   
  4995.     ' Try to get the FormEditor or the ObjectViewer to do the copy.
  4996.     o = ObjectEditorMgr.SelectedObject
  4997.     If (Not FormEditorCopy(o)) && (Not ObjectViewer.CopyObjectQuick(o, True)) Then 
  4998.       ' Just do it ourselves
  4999.       CopyObject(o, UniqueObjectName(o))
  5000.     End If
  5001.   End Sub
  5002.  
  5003.   Function QuickCopy_Enable() As Integer
  5004.     QuickCopy_Enable = (ObjectEditorMgr.SelectedObject <> Nothing)
  5005.   End Function
  5006.  
  5007.   Sub QuitApp_Click()
  5008.     App.Quit
  5009.   End Sub
  5010.  
  5011.   Sub RenameObject_Click()
  5012.     Dim o as Object
  5013.     Dim nm as String
  5014.   
  5015.     o = ObjectEditorMgr.SelectedObject
  5016.     nm = o
  5017.     If Instr(nm, ".") Then nm = stripEmbedName(nm)
  5018.   
  5019.     If InputDialog.Execute("Rename Object", "Enter new name for object:", nm) = IDOK Then 
  5020.       Dim newName As String
  5021.       newName = InputDialog.Text
  5022.       If IsIdentifierValid(newName) = 0 Then 
  5023.         Dim mb As New MessageBox
  5024.         mb.SetIconExclamation
  5025.         mb.Message("Invalid identifier", """" & newName & """ is not a valid object name")
  5026.         Exit Sub
  5027.       End If
  5028.   
  5029.       Try
  5030.         If HostObject(o) Then 
  5031.           ' The object to rename is an Embedded object, so unless the ObjectViewer is showing
  5032.           ' embeds we can just do the rename like this.
  5033.           If TypeOf o Is Control Then 
  5034.             ' Use Name property for these guys, Name doesn't always work on Forms
  5035.             o.Name = newName
  5036.           Else 
  5037.             RenameObject(o, newName)
  5038.           End If
  5039.         ElseIf Not ObjectViewer.RenameSelectedObject(o, newName) Then 
  5040.           ' If the ObjectViewer can't be shown for example...
  5041.           RenameObject(o, newName)
  5042.         End If
  5043.       Catch
  5044.         InfoBox.Message("Rename failed", "The name " & newName & " is already in use.")
  5045.       End Try
  5046.       ObjectEditorMgr.Selection(o)
  5047.     End If
  5048.   End Sub
  5049.  
  5050.   Function RenameObject_Enable() As Integer
  5051.     Dim obj As Object
  5052.     obj = ObjectEditorMgr.SelectedObject
  5053.     RenameObject_Enable = obj && (Not IsDynamic(obj)) && ((TypeOf obj Is Project) || CanDeleteObject(obj))
  5054.   End Function
  5055.  
  5056.   Sub Resize()
  5057.     dim lastGad As ButtonGadget
  5058.     dim minLeft, newLeft As Single
  5059.     dim overhang as single
  5060.     dim comboWidth, minCombo, maxCombo, availWidth, desiredWidth As Single
  5061.     ' Define the min/max widths of the Selected Object Combo (CBSelectedObject)
  5062.     minCombo = 2200
  5063.     maxCombo = 3315
  5064.   
  5065.     ' Set the inside-height of the Form to be just shy of the toolbar height
  5066.     ' (hides border pixel).
  5067.     Height = (Height - ScaleHeight) + toolbar.Height - 30
  5068.   
  5069.     ' Reposition the Toolbar to cover entire client area.
  5070.     toolbar.Move(-30, -30, ScaleWidth + 30, toolbar.Height)
  5071.   
  5072.     ' Figure out width of "used" portion of Toolbar (i.e. right edge of last gadget)
  5073.     lastGad = EnvelopForm.toolbar.At(EnvelopForm.toolbar.NumItems)
  5074.     minLeft = EnvelopForm.toolbar.Left + (lastGad.Left + lastGad.bitmap.Width) * Screen.TwipsPerPixelX + 150
  5075.   
  5076.     ' Compute some stuff
  5077.     comboWidth = maxCombo
  5078.     availWidth = ScaleWidth - minLeft
  5079.     desiredWidth = LblEditObj.Width + 75 + comboWidth + 75
  5080.     If (availWidth < desiredWidth) Then 
  5081.       ' Ok, something has to give, reduce the size of the ComboBox as much as possible/needed
  5082.       comboWidth = comboWidth - (desiredWidth - availWidth)
  5083.       If (comboWidth < minCombo) Then comboWidth = minCombo
  5084.     End If
  5085.     CBSelectedObject.Width = comboWidth
  5086.   
  5087.     ' Figure out where CBSelectedObject combo should go.
  5088.     newLeft = ScaleWidth - CBSelectedObject.Width - 75
  5089.     If (newLeft < minLeft) Then newLeft = minLeft
  5090.     CBSelectedObject.Left = newLeft
  5091.   
  5092.     ' Compute where Label "Selected:" should go, try to place just to the left of the
  5093.     ' ComboBox, but not past the absolute minimum Left position "minLeft"
  5094.     newLeft = CBSelectedObject.Left - LblEditObj.Width - 75
  5095.     If (newLeft < minLeft) Then 
  5096.       newLeft = minLeft
  5097.     End If
  5098.     ' Because the ZOrder of the Label is lower than the SelectedCombo, it will appear under
  5099.     ' the combo, giving priority to the SelectedCombo, if they overlap.
  5100.     LblEditObj.Left = newLeft
  5101.   End Sub
  5102.  
  5103.   Sub RestoreBestLayout()
  5104.     dim layoutName As String
  5105.     dim layout As ScreenLayout
  5106.   
  5107.     ' Using the dimensions reported by the Screen object, figure out which
  5108.     ' pre-recorded layout would best fit the screen resolution.
  5109.     layoutName = "EnvelopForm.ScreenLayout" & Screen.pixelWidth & "x" & Screen.pixelHeight
  5110.     layout = FindObject(layoutName)
  5111.     If layout Then layout.RestoreLayout
  5112.   End Sub
  5113.  
  5114.   Sub SaveAll_Click()
  5115.     ObjectViewer.SaveAll_Click
  5116.   End Sub
  5117.  
  5118.   Function SaveAll_Enable() As Integer
  5119.     SaveAll_Enable = ObjectViewer.SaveAll_Enable
  5120.   End Function
  5121.  
  5122.   Sub SaveModuleAs_Click()
  5123.     ObjectViewer.SaveModuleAs_Click
  5124.   End Sub
  5125.  
  5126.   Function SaveModuleAs_Enable() As Integer
  5127.     SaveModuleAs_Enable = ObjectViewer.SaveModuleAs_Enable
  5128.   End Function
  5129.  
  5130.   Sub SaveModule_Click()
  5131.     ObjectViewer.SaveModule_Click
  5132.   End Sub
  5133.  
  5134.   Function SaveModule_Enable() As Integer
  5135.     Dim om as ObjectModule
  5136.     om = ObjectViewer.SelModule
  5137.     SaveModule_Enable = Not om.ReadOnly && om.IsModified
  5138.   End Function
  5139.  
  5140.   Sub SaveProjectAs_Click
  5141.     ObjectViewer.SaveProjectAs_Click
  5142.   End Sub
  5143.  
  5144.   Function SaveProjectAs_Enable As Integer
  5145.     SaveProjectAs_Enable = ObjectViewer.SaveProjectAs_Enable
  5146.   End Function
  5147.  
  5148.   Sub SaveProject_Click
  5149.     ObjectViewer.SaveProject_Click
  5150.   End Sub
  5151.  
  5152.   Function SaveProject_Enable As Integer
  5153.     Dim enable As Integer
  5154.     enable = ObjectViewer.SaveProject_Enable
  5155.     If enable Then 
  5156.       toolbar.SaveProject.HintText = "Save project: " & ProjectManager.CurrentProject
  5157.     Else 
  5158.       toolbar.SaveProject.HintText = "Save project"
  5159.     End If
  5160.     SaveProject_Enable = enable
  5161.   End Function
  5162.  
  5163.   Sub SourceBrowser_Click()
  5164.     SourceSearcher.Visible = Not SourceSearcher.Visible
  5165.   End Sub
  5166.  
  5167.   Function SourceBrowser_Enable() As Integer
  5168.     SourceBrowser_Enable = True
  5169.     EnvelopMenus.EnvelopToolsMenu.CheckItem("SourceBrowser", SourceSearcher.Visible)
  5170.   End Function
  5171.  
  5172.   Sub StartupOptions_Click()
  5173.     ProjectStartupOptionsDialog.Execute
  5174.   End Sub
  5175.  
  5176.   Function stripEmbedName(nm As String) As String
  5177.     Dim pos, lastdot As Integer
  5178.   
  5179.     ' Find last "." in name
  5180.     pos = Instr(nm, ".")
  5181.     lastdot = pos
  5182.     While (pos)
  5183.       pos = Instr(pos + 1, nm, ".")
  5184.       If (pos) Then lastdot = pos
  5185.     Wend
  5186.     stripEmbedName = Mid(nm, lastdot + 1)
  5187.   End Function
  5188.  
  5189.   Sub ToggleEdit_Click()
  5190.     FormEditor.Editing = Not FormEditor.Editing
  5191.     toolbar.ToggleEdit.State = IIf(FormEditor.Editing, "Down", "Up")
  5192.   End Sub
  5193.  
  5194.   Function ToggleEdit_Enable() As Integer
  5195.     ToggleEdit_Enable = True
  5196.     toolbar.ToggleEdit.State = IIf(FormEditor.Editing, "Down", "Up")
  5197.     EnvelopMenus.EnvelopOptionsMenu.CheckItem("ToggleEdit", FormEditor.Editing)
  5198.   End Function
  5199.  
  5200.   Sub ToolPalette_Click()
  5201.     ToolPalette.Visible = Not ToolPalette.Visible
  5202.   End Sub
  5203.  
  5204.   Function ToolPalette_Enable() As Integer
  5205.     ToolPalette_Enable = True
  5206.     EnvelopMenus.EnvelopToolsMenu.CheckItem("ToolPalette", ToolPalette.Visible)
  5207.   End Function
  5208.  
  5209.   Sub TrapInterp_Click()
  5210.     If (EnvelopMenus.EnvelopOptionsMenu.ItemIsChecked("TrapInterp")) Then 
  5211.       Debugger.TrapInterpretiveExceptions = False
  5212.     Else 
  5213.       Debugger.TrapInterpretiveExceptions = True
  5214.     End If
  5215.     EnvelopMenus.EnvelopOptionsMenu.CheckItem("TrapInterp", Debugger.TrapInterpretiveExceptions)
  5216.   End Sub
  5217.  
  5218.   Function TrapInterp_Enable() As Integer
  5219.     TrapInterp_Enable = True
  5220.     EnvelopMenus.EnvelopOptionsMenu.CheckItem("TrapInterp", Debugger.TrapInterpretiveExceptions)
  5221.     TrapInterp_Enable = Debugger.Available
  5222.   End Function
  5223.  
  5224.   Sub TrapSys_Click()
  5225.     If (EnvelopMenus.EnvelopOptionsMenu.ItemIsChecked("TrapSys")) Then 
  5226.       Debugger.TrapSystemExceptions = False
  5227.     Else 
  5228.       Debugger.TrapSystemExceptions = True
  5229.     End If
  5230.     EnvelopMenus.EnvelopOptionsMenu.CheckItem("TrapSys", Debugger.TrapSystemExceptions)
  5231.   End Sub
  5232.  
  5233.   Function TrapSys_Enable() As Integer
  5234.     EnvelopMenus.EnvelopOptionsMenu.CheckItem("TrapSys", Debugger.TrapSystemExceptions)
  5235.     TrapSys_Enable = Debugger.Available
  5236.   End Function
  5237.  
  5238.   Sub UnloadModule_Click()
  5239.     ObjectViewer.UnloadModule_Click
  5240.   End Sub
  5241.  
  5242.   Function UnloadModule_Enable() As Integer
  5243.     UnloadModule_Enable = ObjectViewer.UnloadModule_Enable
  5244.   End Function
  5245.  
  5246.   Sub WorkSet_Click()
  5247.     WorkSet.Visible = Not WorkSet.Visible
  5248.   End Sub
  5249.  
  5250.   Function WorkSet_Enable() As Integer
  5251.     WorkSet_Enable = True
  5252.     EnvelopMenus.EnvelopToolsMenu.CheckItem("WorkSet", WorkSet.Visible)
  5253.   End Function
  5254.  
  5255.   Sub WriteText_Click()
  5256.     Envelop.SADlg.WriteObjectAsText(ObjectEditorMgr.SelectedObject)
  5257.   End Sub
  5258.  
  5259.   Function WriteText_Enable() As Integer
  5260.     WriteText_Enable = (ObjectEditorMgr.SelectedObject <> Nothing)
  5261.   End Function
  5262.  
  5263. End Type
  5264.  
  5265. Type ObjDebug From ObjDebug
  5266. End Type
  5267.  
  5268. Type ProjectStartupDialog From Form
  5269.   Dim BTNOpenProject As New Button
  5270.   Type BTNNewProject From Button
  5271.     Dim font1 As New Font
  5272.   End Type
  5273.   Dim BTNNoProject As New Button
  5274.   Dim LblNewProject As New Label
  5275.   Dim LblNoProject As New Label
  5276.   Dim LblOpenProject As New Label
  5277.   Type LblHeader From Label
  5278.     Dim font As New Font
  5279.   End Type
  5280.   Dim font1 As New Font
  5281.  
  5282.   ' METHODS for object: ProjectStartupDialog
  5283.   Sub Activate
  5284.     LblHeader.BackColor = GetSysColor(COLOR_ACTIVECAPTION)
  5285.     LblHeader.ForeColor = GetSysColor(COLOR_CAPTIONTEXT)
  5286.   End Sub
  5287.  
  5288.   Sub BTNNewProject_Click()
  5289.     ModalResult(ProjectStartupOptions.ACTION_NEW_PROJECT)
  5290.   End Sub
  5291.  
  5292.   Sub BTNNoProject_Click()
  5293.     ModalResult(ProjectStartupOptions.ACTION_NO_PROJECT)
  5294.   End Sub
  5295.  
  5296.   Sub BTNOpenProject_Click()
  5297.     ModalResult(ProjectStartupOptions.ACTION_OPEN_PROJECT)
  5298.   End Sub
  5299.  
  5300.   Sub Deactivate
  5301.     LblHeader.BackColor = GetSysColor(COLOR_INACTIVECAPTION)
  5302.     LblHeader.ForeColor = GetSysColor(COLOR_INACTIVECAPTIONTEXT)
  5303.   End Sub
  5304.  
  5305.   Sub Execute
  5306.     If ProjectStartupOptions.AskOnStartup Then 
  5307.       Center
  5308.       ProjectStartupOptions.StartupAction = ShowModal
  5309.     End If
  5310.   End Sub
  5311.  
  5312. End Type
  5313.  
  5314. Type AboutEnvelopForm From Form
  5315.   Dim bitmap As New Bitmap
  5316.   Dim imgAbout As New Image
  5317.   Type lstDLLs From ListBox
  5318.  
  5319.     ' METHODS for object: AboutEnvelopForm.lstDLLs
  5320.     Sub Reset
  5321.       dim v, s as string
  5322.       dim pos as integer
  5323.       dim done as Boolean
  5324.       Clear
  5325.       v = ObjectModule.Version
  5326.       done = False
  5327.       While Not done
  5328.         pos = Instr(v, ";")
  5329.         If pos > 0 Then 
  5330.           s = Left(v, pos - 1)
  5331.           v = Mid(v, pos + 1)
  5332.         Else 
  5333.           s = v
  5334.           done = True
  5335.         End If
  5336.         pos = Instr(s, ":")
  5337.         AddItem Left(s, pos - 1) & " " & Mid(s, pos + 1)
  5338.       Wend
  5339.     End Sub
  5340.  
  5341.   End Type
  5342.   Dim MLReadMe As New MarkupLayer
  5343.   Dim MLRelNotes As New MarkupLayer
  5344.   Dim MLLicense As New MarkupLayer
  5345.   Dim MLStory As New MarkupLayer
  5346.   Dim MLOK As New MarkupLayer
  5347.   Dim MLVersion As New MarkupLayer
  5348.  
  5349.   ' METHODS for object: AboutEnvelopForm
  5350.   Sub Execute()
  5351.     LoadForm
  5352.     LayoutControls
  5353.     Center
  5354.     ShowModal
  5355.   End Sub
  5356.  
  5357.   Sub imgAbout_Click()
  5358.     Hide
  5359.   End Sub
  5360.  
  5361.   Sub KeyUp(keyCode As Integer, ByVal shift As Integer)
  5362.     Hide
  5363.   End Sub
  5364.  
  5365.   Sub LayoutControls
  5366.     Dim x, y, w, h, gap As Single
  5367.     ' Size the form so that it just fits the bitmap/image.
  5368.     ' Ensure that the image is not stretched.
  5369.     imgAbout.ResizeMode = "1 - Clip"
  5370.     imgAbout.ScaleX = 1.0
  5371.     imgAbout.ScaleY = 1.0
  5372.     imgAbout.ScrollBars = "0 - Never"
  5373.   
  5374.     ' Move image to upper-left and appropriate size for the bitmap
  5375.     ' while my ScaleMode is pixels.
  5376.     ScaleMode = "3 - Pixel"
  5377.     imgAbout.Move(0, 0, bitmap.Width, bitmap.Height)
  5378.   
  5379.     ' Markup layer positions are currently hard-coded in pixels.
  5380.     ' Change the lines below to =1 and uncomment to help lay them out manually.
  5381.     ' MLReadMe.BevelOuter = 0
  5382.     ' MLRelNotes.BevelOuter = 0
  5383.     ' MLLicense.BevelOuter = 0
  5384.     ' MLStory.BevelOuter = 0
  5385.     ' MLOK.BevelOuter = 0
  5386.     ' MLVersion.BevelOuter = 0
  5387.     x = 332 : y = 48 : w = 128 : h = 16 : gap = 5
  5388.     MLReadMe.Move(x, y, w, h) : y = y + h : MLReadMe.ZOrder = 1
  5389.     MLRelNotes.Move(x, y, w, h) : y = y + h : MLRelNotes.ZOrder = 2
  5390.     y = y + gap
  5391.     MLStory.Move(x, y, w, h) : y = y + h : MLStory.ZOrder = 3
  5392.     MLLicense.Move(x, y, w, h) : y = y + h : MLLicense.ZOrder = 4
  5393.     y = y + gap
  5394.     MLOK.Move(x, y, w, h) : y = y + h : MLOK.ZOrder = 5
  5395.     y = y + gap
  5396.     MLVersion.Move(x, y, w, h) : y = y + h : MLVersion.ZOrder = 6
  5397.   
  5398.     ' Position and hide the list of DLLs in pixel mode.
  5399.     x = 332 : y = 48 : w = 128 : h = 170
  5400.     lstDLLs.Move(x, y, w, h)
  5401.     lstDLLs.Visible = False
  5402.   
  5403.     ' Go to twips mode to size the form to the image.
  5404.     ScaleMode = "1 - Twip"
  5405.     BorderStyle = "0 - None"
  5406.     Width = imgAbout.Width
  5407.     Height = imgAbout.Height
  5408.     KeyPreview = True ' ensure I get keys to make hiding easy.
  5409.   End Sub
  5410.  
  5411.   Sub lstDLLs_DblClick()
  5412.     lstDLLs.Visible = False
  5413.   End Sub
  5414.  
  5415.   Sub MLLicense_Click()
  5416.     ShowFile("LICENSE.TXT")
  5417.   End Sub
  5418.  
  5419.   Sub MLOK_Click()
  5420.     Hide
  5421.   End Sub
  5422.  
  5423.   Sub MLReadMe_Click()
  5424.     ShowFile("README.TXT")
  5425.   End Sub
  5426.  
  5427.   Sub MLRelNotes_Click()
  5428.     ShowFile("NOTES.TXT")
  5429.   End Sub
  5430.  
  5431.   Sub MLStory_Click()
  5432.     ShowFile("STORY.TXT")
  5433.   End Sub
  5434.  
  5435.   Sub MLVersion_Click()
  5436.     lstDLLs.Visible = True
  5437.     lstDLLs.ZOrder = 1
  5438.     lstDLLs.Reset
  5439.   End Sub
  5440.  
  5441.   Sub ShowFile(filename As String)
  5442.     Dim simple As New SimpleMultiLineDialog
  5443.     Dim F As New File
  5444.     F.FileName = Envelop.Path & filename
  5445.     simple.Width = Screen.Width * 0.75
  5446.     If simple.Width < 8000 Then simple.Width = Screen.Width
  5447.     simple.Height = Screen.Height * 0.75
  5448.     simple.Center
  5449.     simple.ExecuteFile(Envelop.Path & filename, True, True)
  5450.   End Sub
  5451.  
  5452. End Type
  5453.  
  5454. Type WorkSet From ObjectEditor
  5455.   Type WorkSetForm From Form
  5456.     Dim List As New ListBox
  5457.     Dim ListMaxItems As Integer
  5458.     Dim IgnoreClick As Integer
  5459.  
  5460.     ' METHODS for object: WorkSet.WorkSetForm
  5461.     Sub CleanList()
  5462.       Dim i as integer
  5463.     
  5464.       i = 0
  5465.       While i < List.ListCount - 1
  5466.         If (Not FindObject(List.List(i))) Then 
  5467.           List.RemoveItem(i)
  5468.           EnvelopForm.CBSelectedObject.RemoveItem(i)
  5469.         Else 
  5470.           i = i + 1
  5471.         End If
  5472.       Wend
  5473.     End Sub
  5474.  
  5475.     Sub Edit(obj as Object)
  5476.       dim name as String
  5477.       dim grpObj as Object
  5478.       dim idx as Long
  5479.     
  5480.       LoadForm
  5481.       If Not obj Then 
  5482.         Exit Sub
  5483.       End If
  5484.     
  5485.       ' Remove item if already in list
  5486.       name = obj
  5487.       idx = FindPosition(name)
  5488.       If (idx <> -1) Then 
  5489.         List.RemoveItem(idx)
  5490.       End If
  5491.     
  5492.       ' Shorten list if it is too long.
  5493.       If (ListMaxItems = List.ListCount) Then 
  5494.         List.RemoveItem(List.ListCount - 1)
  5495.       End If
  5496.     
  5497.       ' Add item in and suppress click method
  5498.       List.InsertItem(name, 0)
  5499.       If List.ListIndex Then 
  5500.         IgnoreClick = True
  5501.         List.ListIndex = 0
  5502.       End If
  5503.     
  5504.       ' Propagate selection to CBSelectedObject
  5505.       EnvelopForm.CBSelectedObject.Edit obj
  5506.     End Sub
  5507.  
  5508.     Function FindPosition(ObjName as String) As Integer
  5509.       FindPosition = List.ItemIndex(ObjName)
  5510.     End Function
  5511.  
  5512.     Sub List_Click()
  5513.       If IgnoreClick Then 
  5514.         IgnoreClick = False
  5515.       Else 
  5516.         Dim obj as Object
  5517.         obj = FindObject(List.Text)
  5518.         CleanList
  5519.         If obj Then 
  5520.           ' Special case the EnvelopForm to turn Form-Editing off (avoids confusing state)
  5521.           If (obj = EnvelopForm) Then FormEditor.Editing = False
  5522.           ObjectEditorMgr.ResetOthers(WorkSet, obj)
  5523.           ObjectEditorMgr.Selection obj
  5524.         End If
  5525.       End If
  5526.     End Sub
  5527.  
  5528.     Sub List_DblClick()
  5529.       Dim obj as Object
  5530.       obj = FindObject(List.Text)
  5531.       CleanList
  5532.       If obj Then 
  5533.         ' Special case the EnvelopForm to turn Form-Editing off (avoids confusing state)
  5534.         If (obj = EnvelopForm) Then FormEditor.Editing = False
  5535.         ObjectEditorMgr.Edit(obj)
  5536.         EnvelopForm.CBSelectedObject.Edit obj
  5537.       End If
  5538.     End Sub
  5539.  
  5540.     Sub List_DragStart(data as XferData, x As Single, y As Single)
  5541.       dim o as Object
  5542.       o = FindObject(List.Text)
  5543.       If o Then 
  5544.         data.ObjectRef = o
  5545.         data.Drag(1)
  5546.       End If
  5547.     End Sub
  5548.  
  5549.     Sub List_KeyDown(keyCode As Integer, ByVal shift As Integer)
  5550.       If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("WorkSet")
  5551.     End Sub
  5552.  
  5553.     Sub NextObj()
  5554.       If List.ListIndex = 0 Then 
  5555.         List.ListIndex = List.ListCount - 1
  5556.       Else 
  5557.         List.ListIndex = List.ListIndex - 1
  5558.       End If
  5559.     End Sub
  5560.  
  5561.     Sub PrevObj()
  5562.       If List.ListIndex = List.ListCount - 1 Then 
  5563.         List.ListIndex = 0
  5564.       Else 
  5565.         List.ListIndex = List.ListIndex + 1
  5566.       End If
  5567.     End Sub
  5568.  
  5569.     Sub Resize()
  5570.       List.Move(0, 0, ScaleWidth, ScaleHeight)
  5571.       Height = Height - ScaleHeight + List.Height
  5572.     End Sub
  5573.  
  5574.   End Type
  5575.   Property Visible Get getVisible Set setVisible As Boolean
  5576.  
  5577.   ' METHODS for object: WorkSet
  5578.   Function Active() as Integer
  5579.     Active = WorkSetForm.List.ListCount > 1
  5580.   End Function
  5581.  
  5582.   Sub BringToTop()
  5583.     WorkSetForm.BringToTop()
  5584.   End Sub
  5585.  
  5586.   Sub CleanList
  5587.     WorkSetForm.CleanList
  5588.   End Sub
  5589.  
  5590.   Sub Edit(obj As Object)
  5591.     WorkSetForm.Edit(obj)
  5592.   End Sub
  5593.  
  5594.   Function getVisible() as Boolean
  5595.     getVisible = WorkSetForm.Visible
  5596.   End Function
  5597.  
  5598.   Sub Hide()
  5599.     WorkSetForm.Hide()
  5600.   End Sub
  5601.  
  5602.   Sub NextObj()
  5603.     WorkSetForm.NextObj()
  5604.   End Sub
  5605.  
  5606.   Sub PrevObj()
  5607.     WorkSetForm.PrevObj()
  5608.   End Sub
  5609.  
  5610.   Sub Selection(obj as Object)
  5611.     ' Propagate selection to CBSelectedObject
  5612.     EnvelopForm.CBSelectedObject.Selection obj
  5613.   End Sub
  5614.  
  5615.   Sub setVisible(vis as Boolean)
  5616.     WorkSetForm.Visible = vis
  5617.   End Sub
  5618.  
  5619.   Sub Show()
  5620.     WorkSetForm.Show()
  5621.   End Sub
  5622.  
  5623.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  5624.     ' Save Nothing
  5625.     TextUnload = True
  5626.   End Function
  5627.  
  5628. End Type
  5629.  
  5630. Type ObjectBoxConfigWizard From WizardMaster.Wizard
  5631.   Type ObjBoxMargin From WizardMaster.FrmStep
  5632.     Dim TBTop As New TextBox
  5633.     Dim TBLeft As New TextBox
  5634.     Dim TBRight As New TextBox
  5635.     Dim TBBottom As New TextBox
  5636.     Dim LBLTop As New Label
  5637.     Dim LBLLeft As New Label
  5638.     Dim LBLRight As New Label
  5639.     Dim LBLBottom As New Label
  5640.   End Type
  5641.   Type ObjBoxLayout From WizardMaster.FrmStep
  5642.     Dim OBToolBar As New OptionButton
  5643.     Dim OBToolBox As New OptionButton
  5644.  
  5645.     ' METHODS for object: ObjectBoxConfigWizard.ObjBoxLayout
  5646.     Sub ObjBoxLayout_ValidateDisplay(ok As Boolean)
  5647.       If TempBox.LayoutStyle = "ToolBox" Then 
  5648.         ObjBoxLayout.OBToolBar.Value = False
  5649.         ObjBoxLayout.OBToolBox.Value = True
  5650.       Else 
  5651.         ObjBoxLayout.OBToolBox.Value = False
  5652.         ObjBoxLayout.OBToolBar.Value = True
  5653.       End If
  5654.     End Sub
  5655.  
  5656.   End Type
  5657.   Type ObjBoxTileDir From WizardMaster.FrmStep
  5658.     Dim OBHoriz As New OptionButton
  5659.     Dim OBVertical As New OptionButton
  5660.  
  5661.     ' METHODS for object: ObjectBoxConfigWizard.ObjBoxTileDir
  5662.     Sub OBHoriz_Click()
  5663.       wizard.TempBox.TileDirection = "Horizontal"
  5664.     End Sub
  5665.  
  5666.     Sub OBVertical_Click()
  5667.       wizard.TempBox.TileDirection = "Vertical"
  5668.     End Sub
  5669.  
  5670.   End Type
  5671.   Type ObjBoxColumns From WizardMaster.FrmStep
  5672.     Dim SBColumns As New ScrollBar
  5673.     Dim LblColumns As New Label
  5674.  
  5675.     ' METHODS for object: ObjectBoxConfigWizard.ObjBoxColumns
  5676.     Sub SBColumns_Change()
  5677.       LblColumns.Caption = "Columns: " & SBColumns.Value
  5678.       wizard.TempBox.NumColumns = SBColumns.Value
  5679.     End Sub
  5680.  
  5681.     Sub SBColumns_Scroll()
  5682.       LblColumns.Caption = "Columns: " & SBColumns.Value
  5683.     End Sub
  5684.  
  5685.     Sub TBColumns_KeyDown(keyCode As Integer, ByVal shift As Integer)
  5686.       Try
  5687.         If TBColumns.Text > SBColumns.Max Then 
  5688.           SBColumns.Max = TBColumns.Text
  5689.         Else 
  5690.           SBColumns.Max = 20
  5691.         End If
  5692.         SBColumns.Value = TBColumns.Text
  5693.       Catch
  5694.       End Try
  5695.     End Sub
  5696.  
  5697.   End Type
  5698.   Dim OriginalBox As ObjectBox
  5699.   Dim TempBox As New ObjectBox
  5700.  
  5701.   ' METHODS for object: ObjectBoxConfigWizard
  5702.   Sub FinishBox
  5703.     OriginalBox.MarginBottom = TempBox.MarginBottom
  5704.     OriginalBox.MarginLeft = TempBox.MarginLeft
  5705.     OriginalBox.MarginRight = TempBox.MarginRight
  5706.     OriginalBox.MarginTop = TempBox.MarginTop
  5707.     OriginalBox.LayoutStyle = TempBox.LayoutStyle
  5708.     OriginalBox.NumColumns = TempBox.NumColumns
  5709.     OriginalBox.TileDirection = TempBox.TileDirection
  5710.     OriginalBox.ForceLayout(True)
  5711.   End Sub
  5712.  
  5713.   Sub ObjBoxColumns_ValidateDisplay(ok As Boolean)
  5714.     ObjBoxColumns.SBColumns.Value = TempBox.NumColumns
  5715.   
  5716.   End Sub
  5717.  
  5718.   Sub ObjBoxColumns_ValidateFinish(ok As Boolean)
  5719.     FinishBox
  5720.   End Sub
  5721.  
  5722.   Sub ObjBoxLayout_ValidateDisplay(ok As Boolean)
  5723.     If TempBox.LayoutStyle = "ToolBox" Then 
  5724.       ObjBoxLayout.OBToolBar.Value = False
  5725.       ObjBoxLayout.OBToolBox.Value = True
  5726.     Else 
  5727.       ObjBoxLayout.OBToolBox.Value = False
  5728.       ObjBoxLayout.OBToolBar.Value = True
  5729.     End If
  5730.   
  5731.   End Sub
  5732.  
  5733.   Sub ObjBoxLayout_ValidateFinish(ok As Boolean)
  5734.     dim OKToFinish as Boolean
  5735.     ObjBoxLayout_ValidateNext(OKToFinish)
  5736.     If OKToFinish Then FinishBox
  5737.   End Sub
  5738.  
  5739.   Sub ObjBoxLayout_ValidateNext(ok As Boolean)
  5740.     If ObjBoxLayout.OBToolBar.Value Then 
  5741.       ObjBoxLayout.NextStep = ObjBoxTileDir
  5742.       TempBox.LayoutStyle = "ToolBar"
  5743.     Else 
  5744.       ObjBoxLayout.NextStep = ObjBoxColumns
  5745.       TempBox.LayoutStyle = "ToolBox"
  5746.     End If
  5747.     ok = True
  5748.   End Sub
  5749.  
  5750.   Sub ObjBoxMargin_ValidateDisplay(ok As Boolean)
  5751.     If OriginalBox = Nothing Then 
  5752.       MessageBox.Msg("Error in ObjectBoxConfigWizard, OriginalBox not connected")
  5753.       ok = False
  5754.     Else 
  5755.       If Not ObjBoxMargin.initialized Then 
  5756.         TempBox.MarginBottom = OriginalBox.MarginBottom
  5757.         TempBox.MarginLeft = OriginalBox.MarginLeft
  5758.         TempBox.MarginRight = OriginalBox.MarginRight
  5759.         TempBox.MarginTop = OriginalBox.MarginTop
  5760.         TempBox.LayoutStyle = OriginalBox.LayoutStyle
  5761.         TempBox.NumColumns = OriginalBox.NumColumns
  5762.         TempBox.TileDirection = OriginalBox.TileDirection
  5763.         ObjBoxMargin.initialized = True
  5764.       End If
  5765.       ObjBoxMargin.TBLeft.Text = TempBox.MarginLeft
  5766.       ObjBoxMargin.TBTop.Text = TempBox.MarginTop
  5767.       ObjBoxMargin.TBRight.Text = TempBox.MarginRight
  5768.       ObjBoxMargin.TBBottom.Text = TempBox.MarginBottom
  5769.     End If
  5770.   End Sub
  5771.  
  5772.   Sub ObjBoxMargin_ValidateFinish(ok As Boolean)
  5773.     dim OKToFinish as boolean
  5774.     ObjBoxMargin_ValidateNext(OKToFinish)
  5775.     If OKToFinish Then FinishBox
  5776.   End Sub
  5777.  
  5778.   Sub ObjBoxMargin_ValidateNext(ok As Boolean)
  5779.     Try
  5780.       TempBox.MarginLeft = ObjBoxMargin.TBLeft.Text
  5781.       TempBox.MarginTop = ObjBoxMargin.TBTop.Text
  5782.       TempBox.MarginRight = ObjBoxMargin.TBRight.Text
  5783.       TempBox.MarginBottom = ObjBoxMargin.TBBottom.Text
  5784.       ok = True
  5785.     Catch ConvertFailed
  5786.       MessageBox.Msg("Margins must be of type integer, please remove any non-numeric chars.")
  5787.       ok = False
  5788.     Catch
  5789.       MessageBox.Msg("Unexpected Behavior")
  5790.       ok = False
  5791.     End Try
  5792.   End Sub
  5793.  
  5794.   Sub ObjBoxTileDir_ValidateDisplay(ok As Boolean)
  5795.     If TempBox.TileDirection = "Horizontal" Then 
  5796.       ObjBoxTileDir.OBVertical.Value = False
  5797.       ObjBoxTileDir.OBHoriz.Value = True
  5798.     Else 
  5799.       ObjBoxTileDir.OBHoriz.Value = False
  5800.       ObjBoxTileDir.OBVertical.Value = True
  5801.     End If
  5802.   End Sub
  5803.  
  5804.   Sub ObjBoxTileDir_ValidateFinish(ok As Boolean)
  5805.     FinishBox
  5806.   End Sub
  5807.  
  5808.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  5809.     ' Write our parent's properties, but none of ours.
  5810.     TextUnload = False
  5811.   End Function
  5812.  
  5813. End Type
  5814.  
  5815. Type SampleMasterFormMenuBar From MenuBar
  5816. End Type
  5817.  
  5818. Type SampleMasterForm From Form
  5819.   Dim SampleDir As String
  5820.   Dim helpfile As New HelpFile
  5821.   Dim SampleName As String
  5822.  
  5823.   ' METHODS for object: SampleMasterForm
  5824.   Sub Destruct()
  5825.     helpfile.Quit
  5826.   End Sub
  5827.  
  5828.   Sub ExitApplication_Click()
  5829.     helpfile.Quit
  5830.     Hide
  5831.   End Sub
  5832.  
  5833.   Sub HelpContents_Click()
  5834.     helpfile.Contents
  5835.   End Sub
  5836.  
  5837.   Function HelpContents_Enable() As Integer
  5838.     HelpContents_Enable = helpfile.Exists
  5839.   End Function
  5840.  
  5841.   Sub InitHelpFile
  5842.     helpfile.FileName = SampleDir & SampleName & ".hlp"
  5843.   End Sub
  5844.  
  5845.   Sub Preload
  5846.     SetSampleDir
  5847.     InitHelpFile
  5848.     If Me <> SampleMasterForm Then LoadForm
  5849.     ResetApplication_Click
  5850.     If Me <> SampleMasterForm Then Show
  5851.   End Sub
  5852.  
  5853.   Sub ResetApplication_Click()
  5854.   End Sub
  5855.  
  5856.   Sub SaveAsBinary
  5857.     ModuleManager.ModuleContaining(Me).SaveAs(SampleDir & SampleName & ".ebo", False)
  5858.   End Sub
  5859.  
  5860.   Sub SaveAsText
  5861.     ModuleManager.ModuleContaining(Me).SaveAs(SampleDir & SampleName & ".eto", True)
  5862.   End Sub
  5863.  
  5864.   Sub SetSampleDir()
  5865.     ' The purpose of this routine is to set "SampleDir", a string containing
  5866.     ' the directory from which the application was loaded.  This may be useful
  5867.     ' in the event any data must be saved from the application and File objects
  5868.     ' were used and possibly changed our current directory.
  5869.     Dim m As ObjectModule
  5870.     Dim f As New File
  5871.     m = ModuleManager.ModuleContaining(Me)
  5872.     f.FileName = m.FileName
  5873.     SampleDir = f.Path
  5874.     SampleName = f.Name
  5875.   End Sub
  5876.  
  5877. End Type
  5878.  
  5879. Type FormEditor From FormEditor
  5880.  
  5881.   ' METHODS for object: FormEditor
  5882.   Function DblClick(item As Object, shift As Integer, x As Single, y As Single) As Integer
  5883.     ' If its a form, and SHIFT or CTRL is pressed ...
  5884.     If item && TypeOf item Is Form && shift Then 
  5885.       ' If we are already editing the double-clicked form, edit parent, if it
  5886.       ' is not the EnvelopForm. Otherwise, call det
  5887.       If (CurForm = item) Then 
  5888.         If item.Parent && (item.Parent <> EnvelopForm) Then CurForm = item.Parent
  5889.       Else 
  5890.         CurForm = item
  5891.       End If
  5892.     Else 
  5893.       ' Detailed edit for non forms...
  5894.       If ObjectEditorMgr.DetailedEdit(item) Then 
  5895.         ' A specialized ObjectEditor handled the event.
  5896.         PropertyEditor.Refresh("ChangedProperty")
  5897.       Else 
  5898.         ' DblClick on an object with no special DetailedEdit, gets a free trip
  5899.         ' to the MethodEditor
  5900.         MethodEditor.BringToTop
  5901.       End If
  5902.     End If
  5903.   End Function
  5904.  
  5905.   Sub KeyUp(keyCode As Integer, ByVal shift As Integer)
  5906.     If (keyCode = VK_F1) Then 
  5907.       If NumSelected Then 
  5908.         Envelop.Help.ShowObjectHelp(GetSelected(0))
  5909.       Else 
  5910.         Envelop.Help.ShowTopicHelp("Form_environment")
  5911.       End If
  5912.     ElseIf (keyCode = VK_DELETE) Then 
  5913.       EnvelopForm.DeleteObject_Click()
  5914.     End If
  5915.   End Sub
  5916.  
  5917. End Type
  5918.  
  5919. Type SampleMasterFormFileMenu From PopupMenu
  5920. End Type
  5921.  
  5922. Type Debugger From Debugger
  5923. End Type
  5924.  
  5925. Type MenuEdit From Form
  5926.   Type menuList From IndentedList
  5927.     Dim bitmaps As New Bitmap
  5928.   End Type
  5929.   Dim ICN_CLOSEDFOLDER As Integer
  5930.   Dim ICN_OPENFOLDER As Integer
  5931.   Dim ICN_MENUITEM As Integer
  5932.   Dim ICN_SEPARATOR As Integer
  5933.   Dim DraggingIndex As Long
  5934.   Dim InputMenu As Menu
  5935.   Dim WorkingMenu As Menu
  5936.   Type menutools From ObjectBox
  5937.     Dim openmenu As New ToolGadget
  5938.     Dim testdrive As New ToolGadget
  5939.     Dim apply As New ToolGadget
  5940.     Dim insertitem As New ToolGadget
  5941.     Dim insertsubmenu As New ToolGadget
  5942.     Dim insertsep As New ToolGadget
  5943.     Dim delitem As New ToolGadget
  5944.     Dim moveup As New ToolGadget
  5945.     Dim movedown As New ToolGadget
  5946.     Dim properties As New ToolGadget
  5947.   End Type
  5948.   Dim Label1 As New Label
  5949.   Dim Label2 As New Label
  5950.   Dim txtCaption As New TextBox
  5951.   Dim txtName As New TextBox
  5952.   Dim Label3 As New Label
  5953.   Dim chkChecked As New CheckBox
  5954.   Dim cbAccel As New ComboBox
  5955.   Dim UpdatingProperties As Integer
  5956.   Dim SuppressUpdatingProperties As Integer
  5957.   Dim changed As Boolean
  5958.  
  5959.   ' METHODS for object: MenuEdit
  5960.   Function AllowSepAtIndex(ByVal index As Integer) As Integer
  5961.     Dim theMenu As Object
  5962.     Dim level As Integer
  5963.     Dim position As Integer
  5964.   
  5965.     If index = -1 Then 
  5966.       AllowSepAtIndex = False
  5967.     ElseIf MenuEdit.menuList.ItemLevel(index) > 1 Then 
  5968.       AllowSepAtIndex = True
  5969.     Else  ' see if we are directly beneath a menu bar
  5970.       ' Only bother checking further if the top guy is a menubar
  5971.       theMenu = MenuEdit.menuList.ItemObject(0)
  5972.       If TypeOf theMenu Is FindObject("MenuBar") Then 
  5973.         If index = 0 Then 
  5974.           AllowSepAtIndex = False
  5975.         Else 
  5976.           theMenu = MenuEdit.menuList.ItemObject(index)
  5977.           ' Submenu    ---check to see if folder is open or closed
  5978.           If theMenu Then 
  5979.             If MenuEdit.menuList.ItemIsExpanded(index) Then 
  5980.               ' If folder is open, we'll allow inserting seps
  5981.               AllowSepAtIndex = True
  5982.             Else 
  5983.               ' special check in case
  5984.               ' we have an empty folder....alway insertion
  5985.               If theMenu.ItemCount = 0 Then 
  5986.                 AllowSepAtIndex = True
  5987.               Else 
  5988.                 AllowSepAtIndex = False
  5989.               End If
  5990.             End If
  5991.           Else  ' Must be command item, disallow sep insertion
  5992.             AllowSepAtIndex = False
  5993.           End If
  5994.         End If
  5995.       Else  ' not beneath menubar
  5996.         AllowSepAtIndex = True
  5997.       End If
  5998.     End If
  5999.   End Function
  6000.  
  6001.   Sub apply_Click
  6002.     CloneMenuRecursively(InputMenu, WorkingMenu)
  6003.     changed = False
  6004.   End Sub
  6005.  
  6006.   Function apply_Enable As Integer
  6007.     apply_Enable = IIf(changed && MenuEdit.menuList.ListCount > 0, True, False)
  6008.   End Function
  6009.  
  6010.   Sub cbAccel_Click()
  6011.     Dim index As Integer
  6012.     Dim position As Integer
  6013.     Dim accelKey As Long
  6014.     Dim theMenu As Object
  6015.     Dim name As String
  6016.   
  6017.     If UpdatingProperties Then Exit Sub
  6018.   
  6019.     index = MenuEdit.menuList.ListIndex
  6020.   
  6021.     ' Get out if nothing is selected or it at the anchor
  6022.     If index <= 0 Then Exit Sub
  6023.   
  6024.     ' get the containing menu for the item at index where we st
  6025.     ' the item's relative position within that containing menu
  6026.     theMenu = GetPositionInfo(index, position)
  6027.   
  6028.     name = theMenu.ItemNameAt(position)
  6029.   
  6030.     accelKey = cbAccel.ListIndex
  6031.     If accelKey <> -1 Then 
  6032.       theMenu.AccelKey = accelKey
  6033.       theMenu.SetAccelerator(name, accelKey)
  6034.       changed = True
  6035.     End If
  6036.   End Sub
  6037.  
  6038.   Sub chkChecked_Click()
  6039.     Dim index As Integer
  6040.     Dim position As Integer
  6041.     Dim theMenu As Object
  6042.     Dim name As String
  6043.   
  6044.     If UpdatingProperties Then Exit Sub
  6045.   
  6046.     index = MenuEdit.menuList.ListIndex
  6047.   
  6048.     ' Get out if nothing is selected or it at the anchor
  6049.     If index <= 0 Then Exit Sub
  6050.   
  6051.     ' get the containing menu for the item at index where we st
  6052.     ' the item's relative position within that containing menu
  6053.     theMenu = GetPositionInfo(index, position)
  6054.   
  6055.     name = theMenu.ItemNameAt(position)
  6056.     theMenu.CheckItem(name, chkChecked.Value)
  6057.     changed = True
  6058.   End Sub
  6059.  
  6060.   Sub CleanUp
  6061.     DestroyObject(MenuTester.MenuBar)
  6062.     MenuEdit.menuList.Clear
  6063.   End Sub
  6064.  
  6065.   Sub CloneMenuRecursively(destMenu As Object, sourceMenu As Object)
  6066.     Dim i As Integer
  6067.     Dim itemId As Long
  6068.     Dim subMenu As Object
  6069.     Dim newMenu As Object
  6070.     Dim name As String
  6071.     Dim pos As Integer
  6072.     Dim checked As Integer
  6073.     Dim accelKey As Long
  6074.   
  6075.     ' Gut the destination menu.  Peel 'em off from the tail on up
  6076.     For i = destMenu.ItemCount - 1 To 0 Step -1
  6077.       destMenu.RemoveItem(i)
  6078.     Next i
  6079.   
  6080.     ' go through the source menu and rebuild the dest menu
  6081.     ' from it
  6082.     For i = 0 To sourceMenu.ItemCount - 1
  6083.   
  6084.       itemId = sourceMenu.ItemIdAt(i)
  6085.   
  6086.       name = sourceMenu.ItemNameAt(i)
  6087.   
  6088.       ' If the item is a submenu (id == -1), process it as well
  6089.       If (itemId = -1) Then 
  6090.         subMenu = FindObject(name)
  6091.   
  6092.         If Not HostObject(subMenu) Then 
  6093.           ' for submenus that are coming from top level popups (re-usable menus)
  6094.           ' prefix their names with 'REFD'
  6095.           name = "REFD" & name
  6096.         Else 
  6097.           ' Get at the 'local' name
  6098.           pos = Instr(2, name, ".")
  6099.           While pos
  6100.             name = Right$(name, Len(name) - pos)
  6101.             pos = Instr(2, name, ".")
  6102.           Wend
  6103.         End If
  6104.   
  6105.         ' When doing the cloning that is applying changes to our input menu, and
  6106.         ' we have a submenu prefaced with REFD (indicating a top level reusable
  6107.         ' popup) we want to apply the changes to that popup at the top level
  6108.         ' and not embed the menu.
  6109.         If Left$(name, 4) = "REFD" Then 
  6110.           newMenu = FindObject(Right$(name, Len(name) - 4))
  6111.           If Not HostObject(newMenu) Then 
  6112.             ' insert that popup into the dest menu
  6113.             destMenu.InsertPopup(newMenu, sourceMenu.ItemCaptionAt(i), i)
  6114.             CloneMenuRecursively(newMenu, subMenu)
  6115.           End If
  6116.         Else 
  6117.           ' See if there is already a menu there with the same name
  6118.           newMenu = FindEmbed(destMenu, name)
  6119.           ' if not, embed a fresh one
  6120.           If Not newMenu Then 
  6121.             newMenu = EmbedObject(destMenu, FindObject("PopupMenu"), name)
  6122.           End If
  6123.   
  6124.           ' insert that popup into the dest menu
  6125.           destMenu.InsertPopup(newMenu, sourceMenu.ItemCaptionAt(i), i)
  6126.   
  6127.           ' and recursively clone the submenu into the new embed
  6128.           CloneMenuRecursively(newMenu, subMenu)
  6129.         End If
  6130.       Else 
  6131.   
  6132.         ' Looks like we'll have to use GetMenuState to determine if
  6133.         ' we have a separator...for now, just see if the name
  6134.         ' is blank
  6135.         If (name = "") Then 
  6136.           destMenu.InsertSeparator(i)
  6137.         Else 
  6138.           destMenu.InsertItem(name, sourceMenu.ItemCaptionAt(i), i)
  6139.   
  6140.           checked = IIf(sourceMenu.ItemIsChecked(name), 1, 0)
  6141.           destMenu.CheckItem(name, checked)
  6142.   
  6143.           accelKey = sourceMenu.GetAccelerator(name)
  6144.           If accelKey <> -1 Then 
  6145.             destMenu.AccelKey = accelKey
  6146.             destMenu.SetAccelerator(name, accelKey)
  6147.           End If
  6148.         End If
  6149.   
  6150.       End If
  6151.   
  6152.     Next i
  6153.   
  6154.   End Sub
  6155.  
  6156.   Sub close_Click
  6157.     CleanUp
  6158.     MenuEdit.Hide
  6159.     MenuTester.Hide
  6160.   End Sub
  6161.  
  6162.   Sub DeleteListEntries(ByVal index As Integer, ByVal level As Integer)
  6163.     Dim l As Integer
  6164.   
  6165.     MenuEdit.menuList.RemoveItem(index)
  6166.   
  6167.     ' Note that after we removed the item, the next item in the list
  6168.     ' is now at position 'index', so we do not need to increment
  6169.     ' index
  6170.   
  6171.     l = MenuEdit.menuList.ItemLevel(index)
  6172.     While index < MenuEdit.menuList.ListCount && l > level
  6173.       MenuEdit.menuList.RemoveItem(index)
  6174.   
  6175.       l = MenuEdit.menuList.ItemLevel(index)
  6176.     Wend
  6177.   End Sub
  6178.  
  6179.   Sub delitem_Click
  6180.     RemoveCurrentItem
  6181.     changed = True
  6182.   End Sub
  6183.  
  6184.   Function delitem_Enable As Integer
  6185.     delitem_Enable = IIf(MenuEdit.menuList.ListIndex > 0, True, False)
  6186.   End Function
  6187.  
  6188.   Function FindNextSameLevelIndex(ByVal index As Integer) As Integer
  6189.     ' get the index for the first item after to us that has the same level as ours
  6190.     Dim l, level As Integer
  6191.     Dim count As Integer
  6192.     Dim returnIndex As Integer
  6193.   
  6194.     level = MenuEdit.menuList.ItemLevel(index)
  6195.     count = MenuEdit.menuList.ListCount
  6196.   
  6197.     returnIndex = index + 1
  6198.     l = MenuEdit.menuList.ItemLevel(returnIndex)
  6199.   
  6200.     ' go forward in the list until we hit a guy with a
  6201.     ' level the same as ours
  6202.   
  6203.     While l <> level && returnIndex < count
  6204.       returnIndex = returnIndex + 1
  6205.       l = MenuEdit.menuList.ItemLevel(returnIndex)
  6206.     Wend
  6207.     FindNextSameLevelIndex = returnIndex
  6208.   End Function
  6209.  
  6210.   Function FindPrevLevelIndex(ByVal index As Integer) As Integer
  6211.     ' get the index for the first item prior to us that has a level less than ours
  6212.     Dim l, level As Integer
  6213.     Dim returnIndex As Integer
  6214.   
  6215.     level = MenuEdit.menuList.ItemLevel(index)
  6216.   
  6217.     returnIndex = index - 1
  6218.     l = MenuEdit.menuList.ItemLevel(returnIndex)
  6219.   
  6220.     ' go backward in the list until we hit a guy with a
  6221.     ' level less than our own
  6222.     While l >= level && returnIndex >= 0
  6223.       returnIndex = returnIndex - 1
  6224.       l = MenuEdit.menuList.ItemLevel(returnIndex)
  6225.     Wend
  6226.     FindPrevLevelIndex = returnIndex
  6227.   End Function
  6228.  
  6229.   Function FindPrevSameLevelIndex(ByVal index As Integer) As Integer
  6230.     ' get the index for the first item prior to us that has the same level as ours
  6231.     Dim l, level As Integer
  6232.     Dim returnIndex As Integer
  6233.   
  6234.     level = MenuEdit.menuList.ItemLevel(index)
  6235.   
  6236.     returnIndex = index - 1
  6237.     l = MenuEdit.menuList.ItemLevel(returnIndex)
  6238.   
  6239.     ' go backward in the list until we hit a guy with a
  6240.     ' level the same as ours
  6241.     While l <> level && returnIndex > 0
  6242.       returnIndex = returnIndex - 1
  6243.       l = MenuEdit.menuList.ItemLevel(returnIndex)
  6244.     Wend
  6245.     FindPrevSameLevelIndex = returnIndex
  6246.   End Function
  6247.  
  6248.   Function  GetPositionInfo(ByVal index As Integer, relativePosition As Integer) As Object
  6249.     Dim l, level As Integer
  6250.   
  6251.     ' get the containing menu for the item at the current index and
  6252.     ' the item's relative position within that containing menu
  6253.   
  6254.     relativePosition = 0
  6255.   
  6256.     level = MenuEdit.menuList.ItemLevel(index)
  6257.   
  6258.     index = index - 1
  6259.     l = MenuEdit.menuList.ItemLevel(index)
  6260.   
  6261.     ' go backward in the list until we hit a guy with a
  6262.     ' level less than our own
  6263.     While l >= level && index >= 0
  6264.       ' only increment the relativePosition counter when we
  6265.       ' have encountered an entry at the same level
  6266.       If l = level Then relativePosition = relativePosition + 1
  6267.       index = index - 1
  6268.       l = MenuEdit.menuList.ItemLevel(index)
  6269.     Wend
  6270.   
  6271.     GetPositionInfo = MenuEdit.menuList.ItemObject(index)
  6272.   End Function
  6273.  
  6274.   Sub InsertItem(label As String, name As String, checked As Integer, accelKey As Long)
  6275.     Dim index As Integer
  6276.     Dim level As Integer
  6277.     Dim position As Integer
  6278.     Dim intoSubMenu As Boolean
  6279.     Dim theMenu As Object
  6280.   
  6281.     theMenu = PrepForInsertion(index, level, position)
  6282.   
  6283.     If index = -1 Then Exit Sub
  6284.   
  6285.     If theMenu Then 
  6286.       ' add it to the menu
  6287.       theMenu.InsertItem(name, label, position)
  6288.   
  6289.       ' only do check & accels if we are within a popup
  6290.       If TypeOf theMenu Is FindObject("PopupMenu") Then 
  6291.         ' check it if need be
  6292.         If checked Then theMenu.CheckItem(name, 1)
  6293.   
  6294.         ' deal with any acclerator key
  6295.         If accelKey <> -1 Then 
  6296.           theMenu.AccelKey = accelKey
  6297.           theMenu.SetAccelerator(name, accelKey)
  6298.         End If
  6299.       End If
  6300.   
  6301.       ' add it to our list
  6302.       MenuEdit.menuList.InsertItem(label, ICN_MENUITEM, level, index + 1)
  6303.       MenuEdit.menuList.SetSelected(index + 1, True)
  6304.       UpdateProperties
  6305.     End If
  6306.   
  6307.   End Sub
  6308.  
  6309.   Sub insertitem_Click
  6310.     InsertItem("Item", "Item", 0, 0)
  6311.     changed = True
  6312.   End Sub
  6313.  
  6314.   Function insertitem_Enable As Integer
  6315.     insertitem_Enable = IIf(MenuEdit.menuList.ListIndex <> -1, True, False)
  6316.   End Function
  6317.  
  6318.   Sub InsertSeparator
  6319.     Dim index As Integer
  6320.     Dim level As Integer
  6321.     Dim position As Integer
  6322.     Dim intoSubMenu As Boolean
  6323.     Dim theMenu As Object
  6324.   
  6325.     theMenu = PrepForInsertion(index, level, position)
  6326.   
  6327.     If index = -1 Then Exit Sub
  6328.   
  6329.     If theMenu && TypeOf theMenu Is FindObject("PopupMenu") Then 
  6330.       ' add it to the menu
  6331.       theMenu.InsertSeparator(position)
  6332.   
  6333.       ' add it to our list
  6334.       MenuEdit.menuList.InsertItem("<separator>", ICN_SEPARATOR, level, index + 1)
  6335.       MenuEdit.menuList.SetSelected(index + 1, True)
  6336.       UpdateProperties
  6337.     End If
  6338.   
  6339.   
  6340.   End Sub
  6341.  
  6342.   Sub insertsep_Click
  6343.     InsertSeparator
  6344.     changed = True
  6345.   End Sub
  6346.  
  6347.   Function insertsep_Enable As Integer
  6348.     insertsep_Enable = AllowSepAtIndex(MenuEdit.menuList.ListIndex)
  6349.   End Function
  6350.  
  6351.   Sub InsertSubMenu(label As String, name As String)
  6352.     Dim index As Integer
  6353.     Dim level As Integer
  6354.     Dim position As Integer
  6355.     Dim theMenu As Object
  6356.     Dim newMenu As PopupMenu
  6357.   
  6358.     theMenu = PrepForInsertion(index, level, position)
  6359.   
  6360.     If index = -1 Then Exit Sub
  6361.   
  6362.     If theMenu Then 
  6363.       ' create a new popup and add it to the menu
  6364.       newMenu = EmbedObject(theMenu, FindObject("PopupMenu"), name)
  6365.       theMenu.InsertPopup(newMenu, label, position)
  6366.   
  6367.   
  6368.       index = index + 1
  6369.       ' add it to our list
  6370.       MenuEdit.menuList.InsertItem(label, ICN_CLOSEDFOLDER, level, index)
  6371.   
  6372.       ' Indicate that this guy can expand & close
  6373.       MenuEdit.menuList.SetItemCanExpand(index, True)
  6374.   
  6375.       MenuEdit.menuList.SetItemObject(index, newMenu)
  6376.   
  6377.       MenuEdit.menuList.SetSelected(index, True)
  6378.   
  6379.       UpdateProperties
  6380.     End If
  6381.   
  6382.   End Sub
  6383.  
  6384.   Sub insertsubmenu_Click
  6385.     Dim retVal As Long
  6386.     Dim index As Integer
  6387.     Dim level As Integer
  6388.     Dim position As Integer
  6389.     Dim theMenu As Object
  6390.   
  6391.     theMenu = PrepForInsertion(index, level, position)
  6392.   
  6393.     ' Get a name for the Submenu
  6394.     retVal = InputDialog.Execute("Insert Submenu", "Enter a name for the submenu", UniqueEmbedName(theMenu, "Submenu"))
  6395.   
  6396.     If retVal = IDOK Then 
  6397.       InsertSubMenu("Submenu", InputDialog.Text)
  6398.       changed = True
  6399.     End If
  6400.   End Sub
  6401.  
  6402.   Function insertsubmenu_Enable As Integer
  6403.     insertsubmenu_Enable = IIf(MenuEdit.menuList.ListIndex <> -1, True, False)
  6404.   End Function
  6405.  
  6406.   Sub menuList_Click()
  6407.     UpdateProperties
  6408.   End Sub
  6409.  
  6410.   Sub menuList_Collapsed(ByVal itemIndex as Integer, ByVal itemData as Long, itemObj as Object)
  6411.     MenuEdit.menuList.SetItemIcon(itemIndex, ICN_CLOSEDFOLDER)
  6412.     UpdateProperties
  6413.   End Sub
  6414.  
  6415.   Sub menuList_DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  6416.     Dim targetIndex As Integer
  6417.     Dim dragLevel As Integer
  6418.     Dim position As Integer
  6419.     Dim i As Integer
  6420.     Dim ok As Boolean
  6421.   
  6422.     Dim dragIsFolder As Boolean
  6423.     Dim theMenu as Object
  6424.     Dim dragMenu As Object
  6425.   
  6426.     ' get the index of the list item under the cursor
  6427.     targetIndex = menuList.FindIndexUnderPoint(x, y)
  6428.   
  6429.     ' get out if we have an invalid target index or
  6430.     ' we're dropping a guy onto himself or trying to drag the 'anchor'
  6431.     If targetIndex = -1 || targetIndex = DraggingIndex || DraggingIndex = 0 Then 
  6432.       ' show the No Drop cursor
  6433.       If state = 2 Then effect = 0
  6434.       Exit Sub
  6435.     End If
  6436.   
  6437.   
  6438.     ' see if we are dragging a folder
  6439.     dragMenu = MenuEdit.menuList.ItemObject(DraggingIndex)
  6440.     If dragMenu Then 
  6441.       dragIsFolder = True
  6442.     Else 
  6443.       ' See if we are dragging a separator and if the target index should
  6444.       ' allow a drop (to prevent seps under menubars)
  6445.       ' Only need to bother if target index is <=1 ...minor optimization
  6446.       If MenuEdit.menuList.ItemLevel(targetIndex) <= 1 Then 
  6447.         theMenu = GetPositionInfo(DraggingIndex, position)
  6448.         If theMenu.ItemNameAt(position) = "" && Not AllowSepAtIndex(targetIndex) Then 
  6449.           ' show the No Drop cursor
  6450.           If state = 2 Then effect = 0
  6451.           Exit Sub
  6452.         End If
  6453.       End If
  6454.     End If
  6455.   
  6456.     dragLevel = MenuEdit.menuList.ItemLevel(DraggingIndex)
  6457.   
  6458.     If dragIsFolder Then 
  6459.       ' Must make sure we are not dragging a menu into one of its own descendants
  6460.       If targetIndex > DraggingIndex Then 
  6461.         If MenuEdit.menuList.ItemLevel(DraggingIndex + 1) > dragLevel Then 
  6462.           ok = False
  6463.           For i = DraggingIndex + 1 To targetIndex
  6464.             If MenuEdit.menuList.ItemLevel(i) <= dragLevel Then 
  6465.               ok = True
  6466.               Exit For
  6467.             End If
  6468.           Next i
  6469.           If Not ok Then 
  6470.             ' show the No Drop cursor
  6471.             If state = 2 Then effect = 0
  6472.             Exit Sub
  6473.           End If
  6474.         End If
  6475.       End If
  6476.     End If
  6477.   
  6478.     ' beyond this point, we're not currently interested unless we are dropping
  6479.     If state = 3 Then 
  6480.        RelocateItem(DraggingIndex, targetIndex, False)
  6481.        changed = True
  6482.     End If
  6483.   End Sub
  6484.  
  6485.   Sub menuList_DragStart(xfd As XferData, x As Single, y As Single)
  6486.     DraggingIndex = menuList.FindIndexUnderPoint(x, y)
  6487.     MenuEdit.menuList.SetSelected(DraggingIndex, True)
  6488.     UpdateProperties
  6489.     xfd.Drag(2)
  6490.     ' Drag and drop ends up eating the mouse up event.  Since we
  6491.     ' are doing left mouse dnd, this leaves the list in a state where it
  6492.     ' is expecting a mouse up.  The side effect is that the list tracks
  6493.     ' the cursor to highlight the selection (while the mouse is up).
  6494.     ' We will explicitly send a lbutton up message to the list's hwnd
  6495.     ' to fix the problem.
  6496.     SendMessage(menuList.hWnd, User32.WM_LBUTTONUP, 0, 0)
  6497.   End Sub
  6498.  
  6499.   Sub menuList_Expand(ByVal itemIndex as Integer, ByVal itemData as Long, itemObj as Object)
  6500.     Dim index As Integer
  6501.     Dim level As Integer
  6502.     Dim theMenu As Object
  6503.   
  6504.     ' display the 'expanded' icon
  6505.     MenuEdit.menuList.SetItemIcon(itemIndex, ICN_OPENFOLDER)
  6506.   
  6507.     ' Try to find the menu we want in the
  6508.     ' ItemObject of the list entry
  6509.   
  6510.     theMenu = MenuEdit.menuList.ItemObject(itemIndex)
  6511.   
  6512.     If Not theMenu Then Exit Sub
  6513.   
  6514.     level = MenuEdit.menuList.ItemLevel(itemIndex)
  6515.   
  6516.     index = itemIndex + 1
  6517.     level = level + 1
  6518.     ProcessMenusRecursively(theMenu, False, level, index)
  6519.   
  6520.     UpdateProperties
  6521.   
  6522.   End Sub
  6523.  
  6524.   Sub menuList_KeyDown(keyCode As Integer, ByVal shift As Integer)
  6525.     If (keyCode = VK_DELETE) Then 
  6526.       RemoveCurrentItem
  6527.       changed = True
  6528.     End If
  6529.   End Sub
  6530.  
  6531.   Sub movedown_Click
  6532.     Dim index As Integer
  6533.     Dim level As Integer
  6534.     Dim level2 As Integer
  6535.     Dim pos As Integer
  6536.   
  6537.     index = MenuEdit.menuList.ListIndex
  6538.   
  6539.   
  6540.     ' Get out if nothing is selected or if dealing with the Anchor
  6541.     If index <= 0 Then Exit Sub
  6542.   
  6543.     If index + 1 >= MenuEdit.menuList.ListCount Then Exit Sub
  6544.   
  6545.   
  6546.     level = MenuEdit.menuList.ItemLevel(index)
  6547.     level2 = MenuEdit.menuList.ItemLevel(index + 1)
  6548.   
  6549.     If level2 < level Then Exit Sub
  6550.   
  6551.   
  6552.     If level2 <> level Then 
  6553.       pos = FindNextSameLevelIndex(index)
  6554.       If MenuEdit.menuList.ItemIsExpanded(pos) Then pos = FindNextSameLevelIndex(pos) - 1
  6555.       RelocateItem(index, pos, True)
  6556.     ElseIf MenuEdit.menuList.ItemIsExpanded(index + 1) Then 
  6557.       pos = FindNextSameLevelIndex(index + 1) - 1
  6558.       RelocateItem(index, pos, True)
  6559.     Else 
  6560.       RelocateItem(index, index + 1, True)
  6561.     End If
  6562.  
  6563.     changed = True
  6564.  
  6565.   End Sub
  6566.  
  6567.   Function movedown_Enable As Integer
  6568.     Dim retVal As Integer
  6569.     Dim index As Integer
  6570.     Dim level As Integer
  6571.     Dim level2 As Integer
  6572.   
  6573.     retVal = False
  6574.   
  6575.     index = MenuEdit.menuList.ListIndex
  6576.   
  6577.     If index > 0 && index + 1 < MenuEdit.menuList.ListCount Then 
  6578.   
  6579.       level = MenuEdit.menuList.ItemLevel(index)
  6580.       level2 = MenuEdit.menuList.ItemLevel(index + 1)
  6581.   
  6582.       If level2 >= level Then retVal = True
  6583.   
  6584.     End If
  6585.   
  6586.     movedown_Enable = retVal
  6587.   End Function
  6588.  
  6589.   Sub moveup_Click
  6590.     Dim index As Integer
  6591.     Dim level As Integer
  6592.     Dim level2 As Integer
  6593.   
  6594.     index = MenuEdit.menuList.ListIndex
  6595.   
  6596.   
  6597.     ' Get out if nothing is selected or if dealing with the Anchor
  6598.     If index <= 0 Then Exit Sub
  6599.   
  6600.   
  6601.     level = MenuEdit.menuList.ItemLevel(index)
  6602.     level2 = MenuEdit.menuList.ItemLevel(index - 1)
  6603.   
  6604.     If level - 1 = level2 Then Exit Sub
  6605.   
  6606.     If level2 <> level Then 
  6607.       RelocateItem(index, FindPrevSameLevelIndex(index) - 1, True)
  6608.     Else 
  6609.       ' use index -2 because it represent the spot after which
  6610.       ' the moved item is placed
  6611.       RelocateItem(index, index - 2, True)
  6612.     End If
  6613.   
  6614.     changed = True
  6615.  
  6616.   End Sub
  6617.  
  6618.   Function moveup_Enable As Integer
  6619.     Dim retVal As Integer
  6620.     Dim index As Integer
  6621.     Dim level As Integer
  6622.     Dim level2 As Integer
  6623.   
  6624.     retVal = False
  6625.   
  6626.     index = MenuEdit.menuList.ListIndex
  6627.   
  6628.     If index > 0 Then 
  6629.   
  6630.   
  6631.       level = MenuEdit.menuList.ItemLevel(index)
  6632.       level2 = MenuEdit.menuList.ItemLevel(index - 1)
  6633.   
  6634.       If level - 1 <> level2 Then retVal = True
  6635.     End If
  6636.   
  6637.     moveup_Enable = retVal
  6638.   End Function
  6639.  
  6640.   Sub openmenu_Click
  6641.     Dim retVal As Long
  6642.   
  6643.     MenuSelector.optMbar.Value = True
  6644.     MenuSelector.Populate
  6645.   
  6646.     retVal = MenuSelector.ShowModal
  6647.     If retVal = IDOK Then 
  6648.       ProcessMenu(FindObject(MenuSelector.cboMenus.Text))
  6649.     End If
  6650.   End Sub
  6651.  
  6652.   Sub Preload()
  6653.     Dim enums As String
  6654.     dim curpos as Integer
  6655.   
  6656.     LoadForm
  6657.   
  6658.     ' build up the contents of the accelerator key combo box
  6659.     enums = GetEnumStrings("AcceleratorKey")
  6660.     cbAccel.Clear
  6661.     curpos = 1
  6662.     While (curpos < Len(enums))
  6663.       Dim eol as Integer
  6664.       eol = Instr(curpos, enums, Chr(13))
  6665.       If eol = 0 Then Exit Do
  6666.       cbAccel.AddItem(Mid(enums, curpos, (eol - curpos)))
  6667.       curpos = eol + 2
  6668.     Wend
  6669.   
  6670.     ' disable the property guys initially
  6671.     txtCaption.Enabled = False
  6672.     txtName.Enabled = False
  6673.     chkChecked.Enabled = False
  6674.     cbAccel.Enabled = False
  6675.   
  6676.     changed = False
  6677.  
  6678.   End Sub
  6679.  
  6680.   Function PrepForInsertion(index As Integer, level As Integer, position As Integer) As Object
  6681.     Dim index As Integer
  6682.     Dim level As Integer
  6683.     Dim intoSubMenu As Boolean
  6684.     Dim theMenu As Object
  6685.   
  6686.     ' This will retrieve the index, level, position, and containing menu in
  6687.     ' preparation for a menu insertion
  6688.     index = MenuEdit.menuList.ListIndex
  6689.     If index = -1 Then Exit Function
  6690.   
  6691.     ' deal with case for root object...always expand
  6692.     If index = 0 Then 
  6693.       theMenu = MenuEdit.menuList.ItemObject(index)
  6694.       MenuEdit.menuList.ExpandItem(0)
  6695.       position = 0
  6696.       level = 1
  6697.       PrepForInsertion = theMenu
  6698.       Exit Function
  6699.     End If
  6700.   
  6701.   
  6702.     theMenu = MenuEdit.menuList.ItemObject(index)
  6703.     level = MenuEdit.menuList.ItemLevel(index)
  6704.   
  6705.     intoSubMenu = False
  6706.   
  6707.   
  6708.     ' Submenu    ---check to see if folder is open or closed
  6709.     If theMenu Then 
  6710.       If MenuEdit.menuList.ItemIsExpanded(index) Then 
  6711.         ' If folder is open, we'll insert at the top of the menu
  6712.         level = level + 1
  6713.         intoSubMenu = True
  6714.       Else 
  6715.         ' special check in case
  6716.         ' we have an empty folder....alway add the
  6717.         ' new node to the empty folder (because empty folders will never
  6718.         ' let ItemIsExpanded return True
  6719.         If theMenu.ItemCount = 0 Then 
  6720.           level = level + 1
  6721.           intoSubMenu = True
  6722.           MenuEdit.menuList.SetItemIcon(index, ICN_OPENFOLDER)
  6723.         End If
  6724.   
  6725.       End If
  6726.   
  6727.     End If
  6728.   
  6729.     If intoSubMenu Then 
  6730.       position = 0
  6731.     Else 
  6732.       ' get the containing menu for the item at the current index and
  6733.       ' the item's relative position within that containing menu
  6734.       theMenu = GetPositionInfo(index, position)
  6735.       position = position + 1
  6736.     End If
  6737.   
  6738.     PrepForInsertion = theMenu
  6739.   
  6740.   End Function
  6741.  
  6742.   Sub ProcessMenu(theMenu As Object)
  6743.     Dim m As Object
  6744.     Dim stdMbar As MenuBar
  6745.     Dim index As Integer
  6746.     Dim name As String
  6747.   
  6748.     CleanUp
  6749.   
  6750.     If Not theMenu Then Exit Sub
  6751.   
  6752.     ' the reset is to get the icons drawn cuz
  6753.     ' when we are using an eto file, they don't show up
  6754.     MenuEdit.menuList.Reset
  6755.   
  6756.     name = theMenu
  6757.   
  6758.     ' get the menubar proto
  6759.     stdMbar = FindObject("MenuBar")
  6760.   
  6761.     If TypeOf theMenu Is stdMbar Then 
  6762.       ' if we're dealing with a menubar, embed the menubar proto onto
  6763.       ' the testing form and then clone the input meubar into it
  6764.       ' EmbedObject(MenuTester, stdMbar, "TestingMenuBar")
  6765.       ' CloneMenu(MenuTester.TestingMenuBar, theMenu, False)
  6766.       EmbedObject(MenuTester, theMenu, "TestingMenuBar")
  6767.       SubsumeRecursively(MenuTester.TestingMenuBar)
  6768.   
  6769.       MenuTester.MenuBar = MenuTester.TestingMenuBar
  6770.       WorkingMenu = MenuTester.TestingMenuBar
  6771.     ElseIf TypeOf theMenu Is FindObject("PopupMenu") Then 
  6772.       ' if we we're dealing with a pop-up, first embed the
  6773.       ' standard menubar into our test form
  6774.       EmbedObject(MenuTester, stdMbar, "TestingMenuBar")
  6775.       MenuTester.MenuBar = MenuTester.TestingMenuBar
  6776.   
  6777.       ' then embed a standard popupmenu into the menubar and
  6778.       ' clone the input menu into it
  6779.       ' EmbedObject(MenuTester.TestingMenuBar, FindObject("PopupMenu"), "TestingMenu")
  6780.       ' CloneMenu(MenuTester.TestingMenuBar.TestingMenu, theMenu, False)
  6781.   
  6782.       EmbedObject(MenuTester.TestingMenuBar, theMenu, "TestingMenu")
  6783.       SubsumeRecursively(MenuTester.TestingMenuBar.TestingMenu)
  6784.   
  6785.       WorkingMenu = MenuTester.TestingMenuBar.TestingMenu
  6786.       MenuTester.MenuBar.InsertPopup(WorkingMenu, name, 0)
  6787.     Else 
  6788.       Exit Sub
  6789.     End If
  6790.   
  6791.     InputMenu = theMenu
  6792.   
  6793.     ' construct the list based upon info in the test menubar
  6794.     index = 0
  6795.   
  6796.     ' Set the title bar of the menu editor
  6797.     MenuEdit.Caption = "Editing:  " & name
  6798.   
  6799.     ' add the 'anchor' for our list
  6800.     MenuEdit.menuList.InsertItem(name, ICN_OPENFOLDER, 0, index)
  6801.   
  6802.     ' Set the list item's object to be the test menu
  6803.     MenuEdit.menuList.SetItemObject(index, WorkingMenu)
  6804.   
  6805.     ' Indicate that this guy can expand & close
  6806.     MenuEdit.menuList.SetItemCanExpand(index, True)
  6807.  
  6808.     ' Select the first item in the list
  6809.     MenuEdit.menuList.ListIndex = 0
  6810.   
  6811.     index = index + 1
  6812.   
  6813.     ProcessMenusRecursively(WorkingMenu, False, 1, index)
  6814.   
  6815.   End Sub
  6816.  
  6817.   Sub ProcessMenusRecursively(theMenu As Object, ByVal expandSubMenus As Boolean, ByVal level As Integer, index As Integer)
  6818.     Dim i As Integer
  6819.     Dim iconVal As Integer
  6820.     Dim itemId As Long
  6821.     Dim subMenu As Object
  6822.     Dim newMenu As Object
  6823.     Dim name As String
  6824.     Dim caption As String
  6825.     ' TODO Make sure theMenu is MenuBar or PopupMenu
  6826.   
  6827.     If theMenu Then 
  6828.       For i = 0 To theMenu.ItemCount - 1
  6829.   
  6830.         itemId = theMenu.ItemIdAt(i)
  6831.   
  6832.         name = theMenu.ItemNameAt(i)
  6833.   
  6834.         caption = theMenu.ItemCaptionAt(i)
  6835.   
  6836.   
  6837.         ' If the item is a submenu (id == -1), process it as well
  6838.         If (itemId = -1) Then 
  6839.   
  6840.   
  6841.           subMenu = FindObject(name)
  6842.   
  6843.           If Not HostObject(subMenu) Then 
  6844.             ' for submenus that are coming from top level popups (re-usable menus)
  6845.             ' prefix their names with 'REFD'
  6846.             name = "REFD" & name
  6847.   
  6848.             ' remove the menu item that referred to the reusable menu
  6849.             theMenu.RemoveItem(i)
  6850.   
  6851.             ' get a fresh embed to represent the ref'd menu
  6852.             newMenu = EmbedObject(theMenu, FindObject("PopupMenu"), name)
  6853.   
  6854.             ' clone the original ref'd submenu into our new embed
  6855.             CloneMenuRecursively(newMenu, subMenu)
  6856.   
  6857.             ' insert into the same spot
  6858.             theMenu.InsertPopup(newMenu, caption, i)
  6859.   
  6860.             subMenu = newMenu
  6861.   
  6862.           End If
  6863.   
  6864.           If expandSubMenus Then 
  6865.             iconVal = ICN_OPENFOLDER
  6866.           Else 
  6867.             iconVal = ICN_CLOSEDFOLDER
  6868.           End If
  6869.   
  6870.           MenuEdit.menuList.InsertItem(caption, iconVal, level, index)
  6871.   
  6872.           ' Set the list item's object to be the submenu
  6873.           MenuEdit.menuList.SetItemObject(index, subMenu)
  6874.   
  6875.           ' Indicate that this guy can expand & close
  6876.           MenuEdit.menuList.SetItemCanExpand(index, True)
  6877.   
  6878.           index = index + 1
  6879.   
  6880.           ' Process the submenu
  6881.           If expandSubMenus Then ProcessMenusRecursively(subMenu, expandSubMenus, level + 1, index)
  6882.         Else 
  6883.   
  6884.           ' Looks like we'll have to use GetMenuState to determine if
  6885.           ' we have a separator...for now, just see if the name
  6886.           ' is blank
  6887.           If (name = "") Then 
  6888.             MenuEdit.menuList.InsertItem("<separator>", ICN_SEPARATOR, level, index)
  6889.             index = index + 1
  6890.           Else 
  6891.             MenuEdit.menuList.InsertItem(caption, ICN_MENUITEM, level, index)
  6892.             index = index + 1
  6893.           End If
  6894.   
  6895.         End If
  6896.   
  6897.       Next i
  6898.     End If
  6899.   
  6900.   
  6901.   End Sub
  6902.  
  6903.   Sub properties_Click
  6904.     Dim vis As Boolean
  6905.   
  6906.     If menutools.properties.State = 1 Then 
  6907.       menutools.properties.State = 0
  6908.       ' Turn off all the property stuff
  6909.       vis = False
  6910.     Else 
  6911.       menutools.properties.State = 1
  6912.       vis = True
  6913.     End If
  6914.   
  6915.     ' Turn all the property stuff on or off
  6916.     Label1.Visible = vis
  6917.     Label2.Visible = vis
  6918.     Label3.Visible = vis
  6919.     txtCaption.Visible = vis
  6920.     txtName.Visible = vis
  6921.     chkChecked.Visible = vis
  6922.     cbAccel.Visible = vis
  6923.   
  6924.     ' resize the menuList
  6925.     Resize
  6926.   End Sub
  6927.  
  6928.   Sub RelocateItem(ByVal originalIndex As Integer, ByVal targetIndex As Integer, ByVal preserveLevel As Boolean)
  6929.     Dim originalLevel As Integer
  6930.     Dim targetLevel As Integer
  6931.     Dim originalContainer As Object
  6932.     Dim targetContainer As Object
  6933.     Dim originalPosition As Integer
  6934.     Dim targetPosition As Integer
  6935.     Dim i As Integer
  6936.     Dim ok As Boolean
  6937.   
  6938.     Dim iconVal As Integer
  6939.   
  6940.     Dim targetIsFolder As Boolean
  6941.     Dim originalIsFolder As Boolean
  6942.     Dim targetIsOpen As Boolean
  6943.     Dim targetMenu as Object
  6944.     Dim originalMenu As Object
  6945.     Dim copiedMenu As Object
  6946.   
  6947.     Dim newName As String
  6948.     Dim newCaption As String
  6949.     Dim checked As Boolean
  6950.     Dim accelKey As Long
  6951.   
  6952.     originalMenu = MenuEdit.menuList.ItemObject(originalIndex)
  6953.     If originalMenu Then originalIsFolder = True
  6954.   
  6955.     originalLevel = MenuEdit.menuList.ItemLevel(originalIndex)
  6956.   
  6957.     If originalIsFolder Then 
  6958.       ' Must make sure we are not relocating a menu into one of its own descendants
  6959.       If targetIndex > originalIndex Then 
  6960.         If MenuEdit.menuList.ItemLevel(originalIndex + 1) > originalLevel Then 
  6961.           ok = False
  6962.           For i = originalIndex + 1 To targetIndex
  6963.             If MenuEdit.menuList.ItemLevel(i) <= originalLevel Then 
  6964.               ok = True
  6965.               Exit For
  6966.             End If
  6967.           Next i
  6968.           If Not ok Then 
  6969.             Exit Sub
  6970.           End If
  6971.         End If
  6972.       End If
  6973.     End If
  6974.   
  6975.     If Not preserveLevel Then 
  6976.       targetMenu = MenuEdit.menuList.ItemObject(targetIndex)
  6977.       If targetMenu Then 
  6978.         targetIsFolder = True
  6979.         ' see if the folder is open...Note that if the folder is empty, we
  6980.         ' will say that it is open, since dropping on a closed folder
  6981.         ' that is empty will result in dropping INTO the folder
  6982.         If MenuEdit.menuList.ItemIsExpanded(targetIndex) Then 
  6983.           targetIsOpen = True
  6984.         ElseIf targetMenu.ItemCount = 0 Then 
  6985.           targetIsOpen = True
  6986.           MenuEdit.menuList.SetItemIcon(targetIndex, ICN_OPENFOLDER)
  6987.         End If
  6988.       End If
  6989.     End If
  6990.   
  6991.     ' get the containing menu for the item at the original index and
  6992.     ' the item's relative position within that containing menu
  6993.     originalContainer = GetPositionInfo(originalIndex, originalPosition)
  6994.   
  6995.     If Not preserveLevel Then 
  6996.       ' get the containing menu for the item at index where we are dropping and
  6997.       ' the item's relative position within that containing menu
  6998.       targetContainer = GetPositionInfo(targetIndex, targetPosition)
  6999.   
  7000.       targetLevel = MenuEdit.menuList.ItemLevel(targetIndex)
  7001.   
  7002.       targetIndex = targetIndex + 1
  7003.   
  7004.       If targetIsFolder && targetIsOpen Then 
  7005.         ' TARGET FOLDER IS OPEN --- ADD INTO IT
  7006.         targetContainer = targetMenu
  7007.         targetPosition = 0
  7008.         targetLevel = targetLevel + 1
  7009.       Else 
  7010.         targetPosition = targetPosition + 1
  7011.       End If
  7012.     Else 
  7013.       targetContainer = originalContainer
  7014.       targetLevel = originalLevel
  7015.       targetIndex = targetIndex + 1
  7016.   
  7017.       If targetIndex < originalIndex Then 
  7018.         targetPosition = originalPosition - 1
  7019.       Else 
  7020.         targetPosition = originalPosition + 2
  7021.       End If
  7022.     End If
  7023.   
  7024.     If originalIsFolder Then 
  7025.       Dim pos As Integer
  7026.       ' Extract info for the original guy
  7027.       newName = originalContainer.ItemNameAt(originalPosition)
  7028.   
  7029.       ' Get at the 'local' name
  7030.       pos = Instr(2, newName, ".")
  7031.       While pos
  7032.         newName = Right$(newName, Len(newName) - pos)
  7033.         pos = Instr(2, newName, ".")
  7034.       Wend
  7035.   
  7036.       newCaption = originalContainer.ItemCaptionAt(originalPosition)
  7037.       iconVal = ICN_CLOSEDFOLDER
  7038.   
  7039.       ' copiedMenu = EmbedObject(targetContainer, FindObject("PopupMenu"), "bldrTmp")
  7040.       ' CloneMenu(copiedMenu, originalMenu, False)
  7041.       copiedMenu = EmbedObject(targetContainer, originalMenu, "bldrTmp")
  7042.   
  7043.       SubsumeRecursively(copiedMenu)
  7044.   
  7045.       originalContainer.RemoveItem(originalPosition)
  7046.   
  7047.       ' If within the same container, compensate for the guy we deleted if it was
  7048.       ' above the target position
  7049.       If originalContainer = targetContainer Then 
  7050.         If originalPosition < targetPosition Then targetPosition = targetPosition - 1
  7051.       End If
  7052.   
  7053.       targetContainer.InsertPopup(copiedMenu, newCaption, targetPosition)
  7054.   
  7055.       DestroyObject(originalMenu)
  7056.       RenameObject(copiedMenu, newName)
  7057.   
  7058.       ' Get the list up to date.  Deal with lowest in the list first
  7059.       SuppressUpdatingProperties = 1
  7060.       If originalIndex >= targetIndex Then 
  7061.         MenuEdit.menuList.CollapseItem(originalIndex)
  7062.         MenuEdit.menuList.RemoveItem(originalIndex)
  7063.         MenuEdit.menuList.InsertItem(newCaption, iconVal, targetLevel, targetIndex)
  7064.   
  7065.         MenuEdit.menuList.SetItemCanExpand(targetIndex, True)
  7066.         MenuEdit.menuList.SetItemObject(targetIndex, copiedMenu)
  7067.         MenuEdit.menuList.SetSelected(targetIndex, True)
  7068.       Else 
  7069.         MenuEdit.menuList.InsertItem(newCaption, iconVal, targetLevel, targetIndex)
  7070.   
  7071.         MenuEdit.menuList.SetItemCanExpand(targetIndex, True)
  7072.         MenuEdit.menuList.SetItemObject(targetIndex, copiedMenu)
  7073.   
  7074.         If MenuEdit.menuList.ItemIsExpanded(originalIndex) Then 
  7075.           MenuEdit.menuList.CollapseItem(originalIndex)
  7076.         Else 
  7077.           MenuEdit.menuList.SetSelected(targetIndex - 1, True)
  7078.         End If
  7079.         MenuEdit.menuList.RemoveItem(originalIndex)
  7080.       End If
  7081.       SuppressUpdatingProperties = 0
  7082.   
  7083.     Else 
  7084.       ' DRAG IS COMMAND ITEM OR SEPARATOR
  7085.   
  7086.       ' extract info from the original guy
  7087.       newName = originalContainer.ItemNameAt(originalPosition)
  7088.   
  7089.       If newName <> "" Then 
  7090.         newCaption = originalContainer.ItemCaptionAt(originalPosition)
  7091.         If Not TypeOf originalContainer Is FindObject("MenuBar") Then 
  7092.           checked = originalContainer.ItemIsChecked(newName)
  7093.           accelKey = originalContainer.GetAccelerator(newName)
  7094.         End If
  7095.         iconVal = ICN_MENUITEM
  7096.       Else 
  7097.         newCaption = "<separator>"
  7098.         iconVal = ICN_SEPARATOR
  7099.       End If
  7100.   
  7101.       ' remove the original guy
  7102.       originalContainer.RemoveItem(originalPosition)
  7103.   
  7104.       ' If within the same container, compensate for the guy we deleted if it was
  7105.       ' above the target position
  7106.       If originalContainer = targetContainer Then 
  7107.         If originalPosition < targetPosition Then targetPosition = targetPosition - 1
  7108.       End If
  7109.   
  7110.       SuppressUpdatingProperties = 1
  7111.       If newName <> "" Then 
  7112.         targetContainer.InsertItem(newName, newCaption, targetPosition)
  7113.         If checked Then targetContainer.CheckItem(newName, checked)
  7114.         If accelKey Then 
  7115.           targetContainer.AccelKey = accelKey
  7116.           targetContainer.SetAccelerator(newName, accelKey)
  7117.         End If
  7118.       Else 
  7119.         targetContainer.InsertSeparator(targetPosition)
  7120.       End If
  7121.   
  7122.       ' Get the list up to date.  Deal with lowest in the list first
  7123.       If originalIndex >= targetIndex Then 
  7124.         MenuEdit.menuList.RemoveItem(originalIndex)
  7125.         MenuEdit.menuList.InsertItem(newCaption, iconVal, targetLevel, targetIndex)
  7126.         MenuEdit.menuList.SetSelected(targetIndex, True)
  7127.       Else 
  7128.         MenuEdit.menuList.InsertItem(newCaption, iconVal, targetLevel, targetIndex)
  7129.         MenuEdit.menuList.RemoveItem(originalIndex)
  7130.         MenuEdit.menuList.SetSelected(targetIndex - 1, True)
  7131.       End If
  7132.       SuppressUpdatingProperties = 0
  7133.     End If
  7134.   
  7135.   End Sub
  7136.  
  7137.   Sub RemoveCurrentItem
  7138.     Dim index As Integer
  7139.     Dim relativePosition As Integer
  7140.     Dim containingMenu As Object
  7141.     Dim theMenu As Object
  7142.   
  7143.     index = MenuEdit.menuList.ListIndex
  7144.   
  7145.     ' Get out if nothing is selected or if dealing with the Anchor
  7146.     If index <= 0 Then Exit Sub
  7147.     ' get the containing menu for the item at the current index and
  7148.     ' the item's relative position within that containing menu
  7149.     containingMenu = GetPositionInfo(index, relativePosition)
  7150.   
  7151.     If containingMenu Then containingMenu.RemoveItem(relativePosition)
  7152.   
  7153.     ' if we are not deleting a 're-usable' referenced menu, destroy any
  7154.     ' object held by the list item (only applies to submenu entries)
  7155.     theMenu = MenuEdit.menuList.ItemObject(index)
  7156.     If theMenu Then 
  7157.       Dim name As String
  7158.       name = theMenu
  7159.       If Left$(name, 4) <> "REFD" Then DestroyObject(theMenu)
  7160.     End If
  7161.   
  7162.   
  7163.     ' delete the list entry and any sub menu items it may have
  7164.     DeleteListEntries(index, MenuEdit.menuList.ItemLevel(index))
  7165.  
  7166.     If (index < MenuEdit.menuList.ListCount) Then
  7167.       MenuEdit.menuList.SetSelected(index, True)
  7168.     Else
  7169.       MenuEdit.menuList.SetSelected(index-1, True)
  7170.     End If
  7171.  
  7172.   End Sub
  7173.  
  7174.   Sub Resize()
  7175.     menutools.Top = 0
  7176.     menutools.Left = 0
  7177.     menutools.Width = ScaleWidth
  7178.   
  7179.     ' keep the indented list snuggly within our form
  7180.     If Label2.Visible Then 
  7181.       menuList.Top = Label2.Top + Label2.Height
  7182.       menuList.Height = ScaleHeight - menuList.Top
  7183.     Else 
  7184.       menuList.Top = menutools.Height
  7185.       menuList.Height = ScaleHeight - menuList.Top
  7186.     End If
  7187.     menuList.Left = 0
  7188.     menuList.Width = ScaleWidth
  7189.   
  7190.   End Sub
  7191.  
  7192.   Sub SubsumeRecursively(theMenu As Object)
  7193.     ' TODO need to ensure that the menu is menubar or popup
  7194.     SubsumeParent(theMenu)
  7195.     EnumObjectEmbeds(theMenu, Me, "SubsumeRecursively")
  7196.   End Sub
  7197.  
  7198.   Sub testdrive_Click
  7199.     MenuTester.Show
  7200.     MenuTester.BringToTop
  7201.   End Sub
  7202.  
  7203.   Function testdrive_Enable As Integer
  7204.     testdrive_Enable = IIf(MenuEdit.menuList.ListCount > 0, True, False)
  7205.   End Function
  7206.  
  7207.   Sub txtCaption_KeyUp(keyCode As Integer, ByVal shift As Integer)
  7208.     Dim index As Integer
  7209.     Dim position As Integer
  7210.     Dim caption As String
  7211.     Dim theMenu As Object
  7212.   
  7213.     index = MenuEdit.menuList.ListIndex
  7214.   
  7215.     ' Get out if nothing is selected or it at the anchor
  7216.     If index <= 0 Then Exit Sub
  7217.   
  7218.     ' get the containing menu for the item at index where we st
  7219.     ' the item's relative position within that containing menu
  7220.     theMenu = GetPositionInfo(index, position)
  7221.   
  7222.     caption = txtCaption.Text
  7223.     theMenu.SetCaption(position, caption)
  7224.     MenuEdit.menuList.SetItemString(index, caption)
  7225.     changed = True
  7226.   End Sub
  7227.  
  7228.   Sub txtName_KeyUp(keyCode As Integer, ByVal shift As Integer)
  7229.     Dim index As Integer
  7230.     Dim position As Integer
  7231.     Dim theMenu As Object
  7232.   
  7233.     index = MenuEdit.menuList.ListIndex
  7234.   
  7235.     ' Get out if nothing is selected or it at the anchor
  7236.     If index <= 0 Then Exit Sub
  7237.   
  7238.     ' get the containing menu for the item at index where we st
  7239.     ' the item's relative position within that containing menu
  7240.     theMenu = GetPositionInfo(index, position)
  7241.   
  7242.     theMenu.SetName(position, txtName.Text)
  7243.     changed = True
  7244.   End Sub
  7245.  
  7246.   Sub UpdateProperties
  7247.     Dim index As Integer
  7248.     Dim position As Integer
  7249.     Dim name As String
  7250.     Dim caption As String
  7251.     Dim checked As Integer
  7252.     Dim accelKey As Long
  7253.     Dim theMenu As Object
  7254.     Dim pos As Integer
  7255.     Dim captionEnabled As Boolean
  7256.     Dim isCmdItem As Boolean
  7257.   
  7258.     If SuppressUpdatingProperties Then Exit Sub
  7259.   
  7260.     index = MenuEdit.menuList.ListIndex
  7261.   
  7262.     ' Get out if nothing is selected or it at the anchor
  7263.     If index <= 0 Then
  7264.       ' Clear out the properties.  use the UpdatingProperties flag
  7265.       ' to prevent combo box click method from redundantly
  7266.       ' doing work after we set the list index on it
  7267.       UpdatingProperties = 1
  7268.       txtCaption.Text = ""
  7269.       txtCaption.Enabled = False
  7270.       txtName.Text = ""
  7271.       txtName.Enabled = False
  7272.       chkChecked.Enabled = False
  7273.       cbAccel.Enabled = False
  7274.       chkChecked.Value = False
  7275.       cbAccel.ListIndex = 0
  7276.       UpdatingProperties = 0
  7277.  
  7278.       Exit Sub
  7279.     End If
  7280.   
  7281.     ' get the containing menu for the item at index where we started our drag and
  7282.     ' the item's relative position within that containing menu
  7283.     theMenu = GetPositionInfo(index, position)
  7284.   
  7285.     name = theMenu.ItemNameAt(position)
  7286.     caption = theMenu.ItemCaptionAt(position)
  7287.     captionEnabled = True
  7288.   
  7289.     If MenuEdit.menuList.ItemObject(index) Then 
  7290.       ' PropertiesForm.Caption = "SubMenu Item Properties"
  7291.       ' Get at the 'local' name
  7292.       pos = Instr(2, name, ".")
  7293.       While pos
  7294.         name = Right$(name, Len(name) - pos)
  7295.         pos = Instr(2, name, ".")
  7296.       Wend
  7297.     Else 
  7298.       ' PropertiesForm.Caption = "Command Item Properties"
  7299.       If name <> "" Then 
  7300.         If Not TypeOf theMenu Is FindObject("MenuBar") Then 
  7301.           checked = IIf(theMenu.ItemIsChecked(name), 1, 0)
  7302.           accelKey = theMenu.GetAccelerator(name)
  7303.         End If
  7304.         isCmdItem = True
  7305.       Else 
  7306.         caption = "<separator>"
  7307.         captionEnabled = False
  7308.       End If
  7309.     End If
  7310.   
  7311.     ' update the properties.  use the UpdatingProperties flag
  7312.     ' to prevent combo box click method from redundantly
  7313.     ' doing work after we set the list index on it
  7314.     UpdatingProperties = 1
  7315.     txtCaption.Text = caption
  7316.     txtCaption.Enabled = captionEnabled
  7317.     txtName.Text = name
  7318.     txtName.Enabled = isCmdItem
  7319.     chkChecked.Enabled = isCmdItem
  7320.     cbAccel.Enabled = isCmdItem
  7321.     chkChecked.Value = checked
  7322.     cbAccel.ListIndex = accelKey
  7323.     UpdatingProperties = 0
  7324.   
  7325.   End Sub
  7326.  
  7327. End Type
  7328.  
  7329. Type PropertyEditor From PropertyEditor
  7330.   Type DimensionArrayForm From Form
  7331.     Dim TBStmt As New TextBox
  7332.     Dim LblName As New Label
  7333.     Dim LblDims As New Label
  7334.     Dim CBType As New ComboBox
  7335.     Dim LblType As New Label
  7336.     Dim LblStmt As New Label
  7337.     Dim TBName As New TextBox
  7338.     Dim TBDims As New TextBox
  7339.     Dim posDim As Integer
  7340.     Dim posOpen As Integer
  7341.     Dim posName As Integer
  7342.     Dim posClose As Integer
  7343.     Dim posDims As Integer
  7344.     Dim posAs As Integer
  7345.     Dim posType As Integer
  7346.     Dim ignoreChange As Boolean
  7347.     Dim BtnOK As New Button
  7348.     Dim BtnCancel As New Button
  7349.  
  7350.     ' METHODS for object: PropertyEditor.DimensionArrayForm
  7351.     Sub BtnCancel_Click
  7352.       ModalResult IDCANCEL
  7353.     End Sub
  7354.  
  7355.     Sub BtnOK_Click
  7356.       ModalResult IDOK
  7357.     End Sub
  7358.  
  7359.     Sub CBType_Click()
  7360.       If Not ignoreChange Then 
  7361.         ParseStatement
  7362.         UpdateStatementType
  7363.       End If
  7364.     End Sub
  7365.  
  7366.     Function Execute(dimStmt As String) As Integer
  7367.       Dim initName As String
  7368.     
  7369.       ' Make sure the form is loaded so that Change events work
  7370.       LoadForm
  7371.       DefaultButton = BtnOK
  7372.       CancelButton = BtnCancel
  7373.     
  7374.       ' Initial value of dimStmt is a suggested name. If we have no
  7375.       ' prior statement, then use default, otherwise just set name.
  7376.       initName = IIf(dimStmt = "", "array", dimStmt)
  7377.       If TBStmt.Text = "" Then 
  7378.         TBStmt.Text = "Dim " & initName & " (10) As Integer"
  7379.       Else 
  7380.         TBName.Text = initName
  7381.       End If
  7382.     
  7383.       Show
  7384.       TBName.SetFocus : TBName.SelStart = 0 : TBName.SelLength = 256
  7385.       If ShowModal = IDOK Then 
  7386.         dimStmt = TBStmt.Text
  7387.         Execute = 1
  7388.       Else 
  7389.         Execute = -1
  7390.       End If
  7391.       Hide
  7392.     End Function
  7393.  
  7394.     Sub Load()
  7395.       CBType.AddItem "Integer"
  7396.       CBType.AddItem "Long"
  7397.       CBType.AddItem "String"
  7398.       CBType.AddItem "Single"
  7399.       CBType.AddItem "Double"
  7400.       CBType.AddItem "Object"
  7401.     End Sub
  7402.  
  7403.     Sub ParseStatement()
  7404.       Dim text As String
  7405.       text = TBStmt.Text
  7406.     
  7407.       posClose = 0 : posDims = 0 : posAs = 0 : posType = 0
  7408.     
  7409.       ' Look for 'dim' followed by '('.
  7410.       posDim = Instr(1, text, "dim", 1)
  7411.       posOpen = Instr(posDim + 1, text, "(")
  7412.       posName = IIf(posDim > 0, posDim + 3, 0)
  7413.     
  7414.       ' OK, now look for the ')' and, if found, get dimens part
  7415.       posClose = Instr(posOpen + 1, text, ")")
  7416.       posDims = IIf(posOpen > 0, posOpen + 1, 0)
  7417.     
  7418.       ' Look for 'as', followed by space: rest is the type
  7419.       posAs = Instr(posClose + 1, text, "as", 1)
  7420.       posType = IIf(posAs > 0, posAs + 2, 0)
  7421.     
  7422.     End Sub
  7423.  
  7424.     Sub Resize()
  7425.       Dim m, l, w, h, effWidth As Single
  7426.       m = TBStmt.Top
  7427.       w = BtnOK.Width : h = BtnOK.Height
  7428.       effWidth = IIf(ScaleWidth < 4470, 4470, ScaleWidth)
  7429.       l = effWidth - w - m
  7430.       BtnOK.Move(l, m, w, h)
  7431.       BtnCancel.Move(l, BtnOK.Top + h + m, w, h)
  7432.       w = BtnOK.Left - m - TBStmt.Left
  7433.       TBStmt.Width = w
  7434.       TBName.Width = w
  7435.       TBDims.Width = w
  7436.       ' CBType.Width = w
  7437.       Refresh
  7438.     End Sub
  7439.  
  7440.     Sub TBDims_Change()
  7441.       If Not ignoreChange Then 
  7442.         ParseStatement
  7443.         UpdateStatementDims
  7444.       End If
  7445.     End Sub
  7446.  
  7447.     Sub TBName_Change()
  7448.       If Not ignoreChange Then 
  7449.         ParseStatement
  7450.         UpdateStatementName
  7451.       End If
  7452.     End Sub
  7453.  
  7454.     Sub TBStmt_Change()
  7455.       If Not ignoreChange Then 
  7456.         ParseStatement
  7457.         UpdateNameDimType
  7458.       End If
  7459.     End Sub
  7460.  
  7461.     Sub UpdateNameDimType()
  7462.       Dim i As Integer
  7463.       Dim text, capType As String
  7464.       text = TBStmt.Text
  7465.     
  7466.       ' Update the name text if we can.
  7467.       ignoreChange = True
  7468.       If posDim = 0 || posOpen = 0 || Mid(text, posName, 1) <> " " Then 
  7469.         TBName.Text = ""
  7470.       Else 
  7471.         ' Trim the stuff between the dim and ( and call it the name.
  7472.         TBName.Text = Trim(Mid(text, posName, posOpen - posName))
  7473.       End If
  7474.     
  7475.       ' Dimens part is whatever is between the parens.
  7476.       If posOpen = 0 || posClose = 0 Then 
  7477.         TBDims.Text = ""
  7478.       Else 
  7479.         TBDims.Text = Trim(Mid(text, posDims, posClose - posDims))
  7480.       End If
  7481.     
  7482.       ' Type is whatever follows the 'as'
  7483.       If posAs = 0 || Mid(text, posType, 1) <> " " Then 
  7484.         CBType.ListIndex = -1
  7485.       Else 
  7486.         capType = Trim(Mid(text, posType))
  7487.         capType = UCase(Left(capType, 1)) & LCase(Mid(capType, 2))
  7488.         If capType = "" Then 
  7489.           CBType.ListIndex = -1
  7490.         Else 
  7491.           i = CBType.ItemIndex(capType)
  7492.           CBType.ListIndex = IIf(i <> -1, i, CBType.ListCount - 1)
  7493.         End If
  7494.       End If
  7495.       ignoreChange = False
  7496.     End Sub
  7497.  
  7498.     Sub UpdateStatementDims
  7499.       ' Replace dimens part (whatever is between the parens).
  7500.       If posOpen > 0 && posClose > 0 Then 
  7501.         Dim text As String
  7502.         text = TBStmt.Text
  7503.     
  7504.         ignoreChange = True
  7505.         TBStmt.Text = Left(text, posOpen) & TBDims.Text & Mid(text, posClose)
  7506.         ignoreChange = False
  7507.       End If
  7508.     End Sub
  7509.  
  7510.     Sub UpdateStatementName
  7511.       Dim text As String
  7512.       text = TBStmt.Text
  7513.     
  7514.       ' Replace the stuff between the dim and ( with the name
  7515.       If posDim > 0 && posOpen > 0 && Mid(text, posName, 1) = " " Then 
  7516.         ignoreChange = True
  7517.         TBStmt.Text = Left(text, posName) & TBName.Text & " " & Mid(text, posOpen)
  7518.         ignoreChange = False
  7519.       End If
  7520.     End Sub
  7521.  
  7522.     Sub UpdateStatementType
  7523.       Dim text As String
  7524.       text = TBStmt.Text
  7525.     
  7526.       ' Replace type in statement (whatever follows the 'as')
  7527.       If posAs > 0 && Mid(text, posType, 1) = " " Then 
  7528.         ignoreChange = True
  7529.         TBStmt.Text = Left(text, posType) & CBType.Text
  7530.         ignoreChange = False
  7531.       End If
  7532.     End Sub
  7533.  
  7534.   End Type
  7535.   Type EnumPicker From Form
  7536.     Dim EnumList As New ListBox
  7537.     Dim BtnOk As New Button
  7538.     Dim BtnCancel As New Button
  7539.  
  7540.     ' METHODS for object: PropertyEditor.EnumPicker
  7541.     Sub BtnCancel_Click()
  7542.       Hide : ModalResult(IDCANCEL)
  7543.     End Sub
  7544.  
  7545.     Sub BtnOk_Click()
  7546.       Hide : ModalResult(IDOK)
  7547.     End Sub
  7548.  
  7549.     Function ShowModal() As Long
  7550.       dim f strictly As Form
  7551.       dim enums As String
  7552.       dim curpos, eol as integer
  7553.     
  7554.       ' Make sure Form is created and shown, so configurations below stick.
  7555.       LoadForm()
  7556.       Show()
  7557.     
  7558.       EnumList.SetFocus()
  7559.     
  7560.       curpos = 1
  7561.       enums = GetEnumList()
  7562.       EnumList.Clear
  7563.       While (curpos < Len(enums))
  7564.         dim eol as integer
  7565.         eol = Instr(curpos, enums, Chr(13))
  7566.         If eol = 0 Then Exit Do
  7567.         EnumList.AddItem(Mid(enums, curpos, (eol - curpos)))
  7568.         curpos = eol + 2
  7569.       Wend
  7570.     
  7571.       f = Me
  7572.       ShowModal = f.ShowModal
  7573.     End Function
  7574.  
  7575.   End Type
  7576.   Type ObjPicker From Form
  7577.     Dim BtnOk As New Button
  7578.     Dim BtnCancel As New Button
  7579.     Dim ObjList As New ObjectList
  7580.     Dim Label1 As New Label
  7581.     Dim CBReference As New CheckBox
  7582.     Dim CBUntyped As New CheckBox
  7583.     Dim CBShowEmbeds As New CheckBox
  7584.  
  7585.     ' METHODS for object: PropertyEditor.ObjPicker
  7586.     Sub BtnCancel_Click()
  7587.       Hide : ModalResult(IDCANCEL)
  7588.     End Sub
  7589.  
  7590.     Sub BtnOk_Click()
  7591.       Hide : ModalResult(IDOK)
  7592.     End Sub
  7593.  
  7594.     Sub CBShowEmbeds_Click()
  7595.       ObjList.ShowEmbeds = CBShowEmbeds.Value = "Checked"
  7596.     End Sub
  7597.  
  7598.     Sub CBUntyped_Click()
  7599.       ObjList.Enabled = CBUntyped.Value <> "Checked"
  7600.       CBShowEmbeds.Enabled = ObjList.Enabled
  7601.     End Sub
  7602.  
  7603.     Function IsLegalKey(keyAscii As Integer) As Integer
  7604.       Select Case keyAscii
  7605.         Case VK_BACK, Asc(" "), Asc("."), Asc("0") To Asc("9"), Asc("A") To Asc("z")
  7606.           IsLegalKey = True
  7607.         Case Else
  7608.           IsLegalKey = False
  7609.       End Select
  7610.     End Function
  7611.  
  7612.     Sub ObjList_KeyPress(keyAscii As Integer)
  7613.       dim newselection as integer
  7614.       newselection = -1
  7615.     
  7616.       ' Process particular keys, and set "newselection" if key is processed.
  7617.       If (keyAscii = VK_BACK) Then 
  7618.         Label1.Text = Left(Label1.Text, Len(Label1.Text) - 1)
  7619.         newselection = ObjList.FindString(Label1.Text, -1)
  7620.       ElseIf keyAscii = Asc(" ") || IsLegalKey(keyAscii) Then 
  7621.         dim newstring as string
  7622.         If keyAscii = Asc(" ") Then 
  7623.           newselection = ObjList.FindString(Label1.Text, ObjList.ListIndex)
  7624.           newstring = Label1.Text
  7625.         Else 
  7626.           newstring = Label1.Text & Chr(keyAscii)
  7627.           newselection = ObjList.FindString(newstring, -1)
  7628.         End If
  7629.         If newselection = -1 Then keyAscii = 0 : Exit Sub
  7630.         Label1.Text = newstring
  7631.       End If
  7632.     
  7633.       If (newselection <> -1) Then 
  7634.         ' Suppress keystroke that generated new selection
  7635.         ObjList.ListIndex = newselection
  7636.         keyAscii = 0
  7637.       End If
  7638.     End Sub
  7639.  
  7640.     Sub ObjList_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  7641.       Label1.Text = ""
  7642.     End Sub
  7643.  
  7644.     Sub Resize()
  7645.       Dim m, mm, l, t, w, h, effWidth As Single
  7646.       m = 90 : mm = 180
  7647.       effWidth = IIf(ScaleWidth < 4370, 4370, ScaleWidth)
  7648.     
  7649.       t = CBReference.Top : w = CBReference.Width : h = CBReference.Height
  7650.       l = effWidth - w - m
  7651.       CBReference.Move(l, t, w, h)
  7652.       CBUntyped.Move(l, t + h + m, w, h)
  7653.     
  7654.       w = BtnOk.Width : h = BtnOk.Height
  7655.       l = effWidth - w - m
  7656.       BtnOk.Move(l, m, w, h)
  7657.       BtnCancel.Move(l, BtnOk.Top + h + m, w, h)
  7658.     
  7659.       w = CBReference.Left - m - ObjList.Left
  7660.       ObjList.Width = w
  7661.       Label1.Width = w
  7662.     
  7663.       t = ObjList.Top
  7664.       h = ScaleHeight - t - mm - CBShowEmbeds.Height
  7665.       CBShowEmbeds.Top = t + h + m
  7666.       ObjList.Height = h
  7667.       Refresh
  7668.     End Sub
  7669.  
  7670.     Function ShowModal() As Long
  7671.       dim f strictly As Form
  7672.     
  7673.       ' Make sure Form is created and shown, so configurations below stick.
  7674.       LoadForm()
  7675.       Show()
  7676.     
  7677.       Label1.Text = ""
  7678.       ObjList.Reset()
  7679.       ObjList.SetFocus()
  7680.     
  7681.       f = Me
  7682.       ShowModal = f.ShowModal
  7683.     End Function
  7684.  
  7685.   End Type
  7686.  
  7687.   ' METHODS for object: PropertyEditor
  7688.   Function ArrayConfig(dimStmt As String) As Integer
  7689.     ArrayConfig = DimensionArrayForm.Execute(dimStmt)
  7690.   End Function
  7691.  
  7692.   Function DblClick() As Integer
  7693.     ' Initialize the "handled" state of Event to not true.
  7694.     DblClick = False
  7695.   
  7696.     ' Independent of all else, Handle Embedded forms
  7697.     If SelPropIsEmbed Then 
  7698.       Dim obj as Object
  7699.       obj = FindObject(SelPropString)
  7700.       If obj && ObjectEditorMgr.DetailedEdit(obj) Then 
  7701.         ' A specialized ObjectEditor handled the event.
  7702.         Refresh("ChangedProperty")
  7703.         DblClick = True
  7704.       End If
  7705.     Else 
  7706.       If ObjectEditorMgr.PropertyEdit(SelPropObject) || GenericPropertyEdit() Then 
  7707.         ' A specialized ObjectEditor handled the event.
  7708.         Refresh("ChangedProperty")
  7709.         DblClick = True
  7710.       End If
  7711.     End If
  7712.   End Function
  7713.  
  7714.   Function EnumPick(enumName As String) As Integer
  7715.     If EnumPicker.ShowModal() = IDOK Then 
  7716.       enumName = EnumPicker.EnumList.Text
  7717.       EnumPick = 1
  7718.     Else 
  7719.       EnumPick = -1
  7720.     End If
  7721.   End Function
  7722.  
  7723.   Function GenericPropertyEdit() As Long
  7724.     Dim fName As String
  7725.     fName = SelPropName
  7726.   
  7727.     ' Initialize handled status to not true
  7728.     GenericPropertyEdit = False
  7729.   
  7730.     ' Handle Color Field for all object types
  7731.     If Instr(fName, "Color") && SelPropType = 1 Then 
  7732.       ColorDialog.Title = fName
  7733.       ColorDialog.Color = SelPropString
  7734.       If ColorDialog.Execute = 1 Then 
  7735.         SelPropAssign(ColorDialog.Color)
  7736.         GenericPropertyEdit = True
  7737.       End If
  7738.   
  7739.       ' Handle Font Reference Field For all object types
  7740.     ElseIf (StrComp(fName, "Font") = 0) && Not SelPropIsEmbed Then 
  7741.       GenericPropertyEdit = SetWindowFont(SelPropObject)
  7742.     End If
  7743.   
  7744.   End Function
  7745.  
  7746.   Sub Help()
  7747.     If SelPropIsEmbed Then 
  7748.       Envelop.Help.ShowObjectHelp(FindEmbed(SelPropObject, SelPropName))
  7749.     Else 
  7750.       Envelop.Help.ShowPropertyHelp(SelPropName, SelPropObject)
  7751.     End If
  7752.   End Sub
  7753.  
  7754.   Function ObjPick(asReference As Integer, result As Integer) As Object
  7755.     If ObjPicker.ShowModal() = IDOK Then 
  7756.       asReference = ObjPicker.CBReference.Value = "Checked"
  7757.       ObjPick = IIf(ObjPicker.CBUntyped.Value = "Checked", Nothing, ObjPicker.ObjList.SelObject)
  7758.       result = 1
  7759.     Else 
  7760.       result = -1
  7761.     End If
  7762.   End Function
  7763.  
  7764.   Function SetWindowFont(ByVal w as Window) As Integer
  7765.     dim editFont as Font
  7766.   
  7767.     ' Default to no change
  7768.     SetWindowFont = False
  7769.   
  7770.     ' If there is not a Font object to edit already, make a temporary one to work
  7771.     ' on until "OK" is pressed on FontDialog.
  7772.     If Not w.Font Then 
  7773.       editFont = CopyObject(Font, "")
  7774.     Else 
  7775.       editFont = w.Font
  7776.     End If
  7777.   
  7778.     ' Use font dialog to configure the font passed in.
  7779.     FontDialog.Title = w & "." & SelPropName
  7780.     FontDialog.Font = editFont
  7781.     FontDialog.Color = w.ForeColor
  7782.   
  7783.     If FontDialog.Execute = 1 Then 
  7784.       ' Embed a Font object is not already there.
  7785.       If Not w.Font Then 
  7786.         ' Copy the object from 'editFont', will copy all the configured properties.
  7787.         w.Font := EmbedObject(w, editFont, UniqueEmbedName(w, "font"))
  7788.       End If
  7789.       w.ForeColor = FontDialog.Color
  7790.       SetWindowFont = True
  7791.     End If
  7792.   
  7793.   End Function
  7794.  
  7795. End Type
  7796.  
  7797. Type MenuTester From Form
  7798.   Dim Label1 As New Label
  7799.   Dim font1 As New Font
  7800. End Type
  7801.  
  7802. Type MenuEditor From MenuEditor
  7803.   Type SelectPopupForm From Form
  7804.     Dim CBPopups As New ObjectCombo
  7805.     Dim OptExisting As New OptionButton
  7806.     Dim OptNew As New OptionButton
  7807.     Dim LblCaption As New Label
  7808.     Dim TECaption As New TextBox
  7809.     Dim TEName As New TextBox
  7810.     Dim BtnOK As New Button
  7811.     Dim BtnCancel As New Button
  7812.     Dim HostMenu As Menu
  7813.     Dim LblName As New Label
  7814.  
  7815.     ' METHODS for object: MenuEditor.SelectPopupForm
  7816.     Sub BtnCancel_Click()
  7817.       Hide
  7818.       ModalResult IDCANCEL
  7819.     End Sub
  7820.  
  7821.     Sub BtnOK_Click()
  7822.       If OptNew.Value Then 
  7823.         Dim newName As String
  7824.         newName = TEName.Text
  7825.         If IsIdentifierValid(newName) = 0 Then 
  7826.           Dim mb As New MessageBox
  7827.           mb.SetIconExclamation
  7828.           mb.Message("Invalid identifier", """" & newName & """ is not a valid object name")
  7829.           Exit Sub
  7830.         End If
  7831.       End If
  7832.       Hide
  7833.       ModalResult IDOK
  7834.     End Sub
  7835.  
  7836.     Function Execute(host As Menu, caption As String, handled As Integer) As PopupMenu
  7837.       Dim result As Integer
  7838.       LoadForm
  7839.       Font = DefaultDialogFont
  7840.       HostMenu = host
  7841.       OptNew.Value = True
  7842.       OptNew_Click
  7843.       CBPopups.SetFocus
  7844.       CBPopups.Reset
  7845.       result = ShowModal
  7846.       HostMenu = Nothing
  7847.       If result = IDOK Then 
  7848.         Dim popup As PopupMenu
  7849.         If OptExisting.Value Then 
  7850.           popup = CBPopups.SelObject
  7851.         Else 
  7852.           If host Then 
  7853.             popup = EmbedObject(host, FindObject("PopupMenu"), TEName.Text)
  7854.           Else 
  7855.             popup = CopyObject(FindObject("PopupMenu"), TEName.Text)
  7856.           End If
  7857.         End If
  7858.         caption = TECaption.Text
  7859.         If caption = "" Then  ' Fill in a default caption
  7860.           Dim nm As String
  7861.           Dim pos, lastPos As Integer
  7862.           nm = popup
  7863.           Do
  7864.             pos = Instr(nm, ".")
  7865.             If pos Then nm = Mid$(nm, pos + 1)
  7866.           Loop While pos <> 0
  7867.           caption = nm
  7868.         End If
  7869.         handled = IDOK
  7870.         Execute = popup
  7871.       Else 
  7872.         handled = IDCANCEL
  7873.       End If
  7874.     End Function
  7875.  
  7876.     Sub OptExisting_Click()
  7877.       CBPopups.Visible = True
  7878.       TEName.Visible = False
  7879.     End Sub
  7880.  
  7881.     Sub OptNew_Click()
  7882.       CBPopups.Visible = False
  7883.       TEName.Visible = True
  7884.       If HostMenu Then 
  7885.         TEName.Text = UniqueEmbedName(HostMenu, "Popup")
  7886.       Else 
  7887.         TEName.Text = UniqueObjectNameFromString("PopupMenu")
  7888.       End If
  7889.     End Sub
  7890.  
  7891.     Sub Resize()
  7892.       Dim m, mm, l, t, w, h As Single
  7893.       Dim effWidth As Single
  7894.       m = 90 : mm = 180
  7895.       effWidth = IIf(ScaleWidth < 5000, 5000, ScaleWidth)
  7896.       w = BtnOK.Width
  7897.       h = BtnOK.Height
  7898.       l = effWidth - m - w
  7899.       BtnOK.Move(l, m, w, h)
  7900.       BtnCancel.Move(l, BtnOK.Top + h + m, w, h)
  7901.       l = CBPopups.Left
  7902.       h = CBPopups.Height
  7903.       w = BtnOK.Left - mm - l
  7904.       CBPopups.Move(l, CBPopups.Top, w, h)
  7905.       TEName.Move(l, TEName.Top, w, h)
  7906.       TECaption.Move(l, TECaption.Top, w, h)
  7907.       Refresh
  7908.     End Sub
  7909.  
  7910.   End Type
  7911.  
  7912.   ' METHODS for object: MenuEditor
  7913.   Sub Help()
  7914.     Envelop.Help.ShowTopicHelp("Menu_Editor")
  7915.   End Sub
  7916.  
  7917.   Function SelectPopup(container As Menu, caption As String, handled As Integer) As Object
  7918.     SelectPopup = SelectPopupForm.Execute(container, caption, handled)
  7919.   End Function
  7920.  
  7921. End Type
  7922.  
  7923. Type CtrlToolGadgetWizard From WizardMaster.Wizard
  7924.   Type SelectObject From WizardMaster.FrmStep
  7925.     Dim TextBox1 As New TextBox
  7926.   End Type
  7927.   Type SelectBitmap From WizardMaster.FrmStep
  7928.     Dim TextBox1 As New TextBox
  7929.     Dim BTNBrowse As New Button
  7930.     Dim BTNPreview As New Button
  7931.     Type SampleBox From ObjectBox
  7932.       Dim PreviewTool As New ToolGadget
  7933.  
  7934.       ' METHODS for object: CtrlToolGadgetWizard.SelectBitmap.SampleBox
  7935.       Sub Reposition
  7936.         dim l,t,w,h as long
  7937.         w = (PreviewTool.bitmap.Width + 4) * 15
  7938.         If w > 4125 Then w = 4125
  7939.         If w < 150 Then w = 150
  7940.         h = (PreviewTool.bitmap.Height + 4) * 15
  7941.         If h > 1575 Then h = 1575
  7942.         If h < 150 Then h = 150
  7943.         l = 2850 + ((4125 - w) / 2)
  7944.         t = 2175 + ((1575 - h) / 2)
  7945.         Move(l, t, w, h)
  7946.         PreviewTool.Refresh
  7947.         ForceLayout(True)
  7948.       End Sub
  7949.  
  7950.     End Type
  7951.  
  7952.     ' METHODS for object: CtrlToolGadgetWizard.SelectBitmap
  7953.     Sub BTNBrowse_Click()
  7954.       Dim length As Integer
  7955.       Dim open as New OpenDialog
  7956.     
  7957.       ' Set the title of the open dialog just before we display it.
  7958.       open.Title = "Configure Tool Gadget"
  7959.     
  7960.       ' Set the filter to look for bitmaps
  7961.       open.Filter = "Bitmap files|*.bmp|"
  7962.     
  7963.       ' Set the change directory
  7964.       open.NoChangeDir = False
  7965.     
  7966.       ' If a filename was picked, then remember it
  7967.       ' Let the picture on this wizard preview it
  7968.       If open.Execute <> IDCANCEL Then 
  7969.         TextBox1.Text = open.FileName
  7970.         BTNPreview_Click
  7971.       End If
  7972.     End Sub
  7973.  
  7974.     Sub BTNPreview_Click()
  7975.       If TextBox1.Text <> "" Then 
  7976.         SampleBox.PreviewTool.bitmap.LoadType = "FileBased"
  7977.         SampleBox.PreviewTool.bitmap.FileName = TextBox1.Text
  7978.         SampleBox.PreviewTool.bitmap.LoadType = "MemoryBased"
  7979.       End If
  7980.       SampleBox.Reposition
  7981.     End Sub
  7982.  
  7983.   End Type
  7984.   Dim ng As ControlTools.Gadget
  7985.  
  7986.   ' METHODS for object: CtrlToolGadgetWizard
  7987.   Sub Cancel()
  7988.     If ng Then 
  7989.       ng.GadgetObject = ""
  7990.       ng.bitmap.LoadType = "FileBased"
  7991.       ng.bitmap.FileName = ""
  7992.       ng.bitmap.LoadType = "MemoryBased"
  7993.     End If
  7994.   End Sub
  7995.  
  7996.   Sub SelectBitmap_ValidateDisplay(ok As Boolean)
  7997.     If Not SelectBitmap.initialized Then 
  7998.       ' If the new gadget's bitmap is not configured yet, give it a default
  7999.       With ng.bitmap
  8000.         If (.Width + .Height = 0) Then 
  8001.           ' The default is in the EVDEV.DLL as Resource 3100.
  8002.           .LoadType = "ResourceBased"
  8003.           .FileName = "evdev.dll"
  8004.           .ResId = 3100
  8005.           .LoadType = "MemoryBased"
  8006.           .FileName = ""
  8007.         End If
  8008.         ' copy the bitmap from the gadget into the preview area
  8009.         SelectBitmap.SampleBox.PreviewTool.bitmap.SetPicture(.GetPicture())
  8010.       End With
  8011.   
  8012.       SelectBitmap.SampleBox.ForceLayout(True)
  8013.       SelectBitmap.initialized = True
  8014.     End If
  8015.     SelectBitmap.TextBox1.Text = ng.bitmap.FileName
  8016.     SelectBitmap.BTNPreview_Click
  8017.   End Sub
  8018.  
  8019.   Sub SelectBitmap_ValidateFinish(ok As Boolean)
  8020.     If ng Then 
  8021.       If SelectBitmap.TextBox1.Text <> "" Then 
  8022.         ng.bitmap.LoadType = "FileBased"
  8023.         ng.bitmap.FileName = SelectBitmap.TextBox1.Text
  8024.         ng.bitmap.LoadType = "MemoryBased"
  8025.       Else 
  8026.         ng.bitmap.SetPicture SelectBitmap.SampleBox.PreviewTool.bitmap.GetPicture
  8027.       End If
  8028.       If ng.Parent Then ng.Parent.ForceLayout(True)
  8029.     End If
  8030.   End Sub
  8031.  
  8032.   Sub SelectObject_ValidateDisplay(ok As Boolean)
  8033.     If ng Then 
  8034.       SelectObject.TextBox1.Text = ng.GadgetObject
  8035.     End If
  8036.   End Sub
  8037.  
  8038.   Sub SelectObject_ValidateFinish(ok As Boolean)
  8039.     SelectObject_ValidateNext(ok)
  8040.   End Sub
  8041.  
  8042.   Sub SelectObject_ValidateNext(ok As Boolean)
  8043.     If ng Then ng.GadgetObject = FindObject(SelectObject.TextBox1.Text)
  8044.   
  8045.     ' May want to add next line:
  8046.     ' If ng.GadgetObject = Nothing then WARNING
  8047.   End Sub
  8048.  
  8049. End Type
  8050.  
  8051. Type GroupEditor From ObjectEditor
  8052.   Property Visible Get getVisible Set setVisible As Boolean
  8053.   Type EditorForm From Form
  8054.     Dim GroupRef As Object
  8055.     Dim GroupList As New ListBox
  8056.     Dim ParentForReal As GroupEditor
  8057.     Dim Up As New Button
  8058.     Dim Down As New Button
  8059.     Dim Delete As New Button
  8060.  
  8061.     ' METHODS for object: GroupEditor.EditorForm
  8062.     Function CurrentPosition() As Long
  8063.       CurrentPosition = GroupList.ListIndex
  8064.     End Function
  8065.  
  8066.     Function CursorPosition(y as single) As Long
  8067.       dim pos as long
  8068.       ' Identify list position for a given cursor location
  8069.       pos = y / GroupList.ItemHeight
  8070.       If pos > GroupList.ListCount Then pos = GroupList.ListCount
  8071.       CursorPosition = pos
  8072.     End Function
  8073.  
  8074.     Sub Delete_Click()
  8075.       Dim obj as Object
  8076.       Dim i as integer
  8077.     
  8078.       ' If no selection, bail
  8079.       i = GroupList.ListIndex
  8080.       If i < 0 Then Exit Sub
  8081.     
  8082.       ' Delete the object at the selected index
  8083.       obj = GetCurrentObject()
  8084.       If obj Then 
  8085.         GroupRef.RemoveAt(i)
  8086.         If i >= GroupRef.Count Then i = GroupRef.Count - 1
  8087.         PopulateEditor(i)
  8088.       End If
  8089.     End Sub
  8090.  
  8091.     Sub Down_Click()
  8092.       Dim obj as Object
  8093.       Dim i, cnt as integer
  8094.     
  8095.       ' If list has no more than 1 member or the selected item is
  8096.       ' already at the bottom then do nothing
  8097.       i = GroupList.ListIndex
  8098.       cnt = GroupList.ListCount
  8099.       If cnt <= 1 || i >= cnt - 1 Then Exit Sub
  8100.     
  8101.       ' Get current object, remove it from group, add it back in
  8102.       ' one position down
  8103.       obj = GetCurrentObject()
  8104.       If obj Then 
  8105.         GroupRef.RemoveAt(i)
  8106.         If i = cnt - 2 Then 
  8107.           GroupRef.Append(obj)
  8108.           i = cnt - 1
  8109.         Else 
  8110.           GroupRef.InsertAt(obj, i + 1)
  8111.           i = i + 1
  8112.         End If
  8113.       End If
  8114.     
  8115.       ' Rebuild the list and lets see it
  8116.       PopulateEditor(i)
  8117.     End Sub
  8118.  
  8119.     Sub Edit(obj As Object)
  8120.       ' If there's no object to edit or its
  8121.       ' not the right type, forget it.
  8122.       If Not obj Then Exit Sub
  8123.       If Not TypeOf obj Is Group && Not TypeOf obj Is ControlGroup Then Exit Sub
  8124.     
  8125.       ' Set our caption and group reference, then populate the list
  8126.       Caption = "Group: " & obj
  8127.       GroupRef = obj
  8128.       PopulateEditor(-1)
  8129.     End Sub
  8130.  
  8131.     Function  GetCurrentObject() As Object
  8132.       GetCurrentObject = FindObject(GroupList.Text)
  8133.     End Function
  8134.  
  8135.     Function GetObjectCount(obj as Object) As Integer
  8136.       Dim manip as Integer
  8137.     
  8138.       If Not TypeOf obj Is Group && Not TypeOf obj Is ControlGroup Then Exit Function
  8139.     
  8140.       ' Set GroupRef and object count
  8141.       GroupRef = obj
  8142.       GetObjectCount = IIf(obj, obj.Count, 0)
  8143.     
  8144.       ' Enable the group manipulations for simple groups
  8145.       manip = (obj <> Nothing) && (TypeOf obj Is Group)
  8146.       Up.Enabled = manip
  8147.       Down.Enabled = manip
  8148.       Delete.Enabled = manip
  8149.     End Function
  8150.  
  8151.     Sub GroupList_DblClick()
  8152.       dim obj as Object
  8153.       ' Double clicking an entry in the group list Edits it
  8154.       obj = GetCurrentObject()
  8155.       If obj Then ObjectEditorMgr.ResetOthers(GroupEditor, obj)
  8156.     End Sub
  8157.  
  8158.     Sub GroupList_DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  8159.       effect = 0
  8160.       If GroupRef && TypeOf GroupRef Is Group Then 
  8161.         effect = 1
  8162.         If state = 3 Then 
  8163.           OG_DragAndDrop(source, x, y, state, effect)
  8164.         Else 
  8165.           GroupList.ListIndex = CursorPosition(y)
  8166.         End If
  8167.       End If
  8168.     End Sub
  8169.  
  8170.     Sub GroupList_DragStart(data as XferData, x As Single, y As Single)
  8171.       dim obj as Object
  8172.     
  8173.       ' Start a drag with the current object
  8174.       obj = GetCurrentObject()
  8175.       If obj Then 
  8176.         data.ObjectRef = obj
  8177.         data.Drag(1)
  8178.       End If
  8179.     End Sub
  8180.  
  8181.     Sub GroupList_KeyDown(keyCode As Integer, ByVal shift As Integer)
  8182.       ' If he hits delete and we have an object and we can delete it
  8183.       ' then do it.
  8184.       If (keyCode = VK_DELETE && GroupList.ListIndex <> -1) Then 
  8185.         If Delete.Enabled Then Delete_Click
  8186.       End If
  8187.     
  8188.       If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Group_Editor")
  8189.     End Sub
  8190.  
  8191.     Sub Load()
  8192.       If GroupRef Then 
  8193.         PopulateEditor(-1)
  8194.       End If
  8195.     End Sub
  8196.  
  8197.     Sub OG_DragAndDrop(source as XferData, x as Single, y as Single, state as OleDropState, effect as OleDropEffect)
  8198.       dim idx as integer
  8199.       dim obj as Object
  8200.     
  8201.       ' Add the dragged object into the list at the positon
  8202.       ' given by the cursor location
  8203.       obj = source.ObjectRef
  8204.       idx = CursorPosition(y)
  8205.       If (idx > 0 && idx < GroupRef.Count) Then 
  8206.         GroupRef.InsertAt(obj, idx)
  8207.       ElseIf (idx <= 0) Then 
  8208.         idx = 0
  8209.         GroupRef.Prepend(obj)
  8210.       ElseIf (idx >= GroupRef.Count) Then 
  8211.         GroupRef.Append(obj)
  8212.         idx = GroupRef.Count - 1
  8213.       End If
  8214.     
  8215.       ' Rebuild the list and lets see it
  8216.       PopulateEditor(idx)
  8217.     End Sub
  8218.  
  8219.     Sub PopulateEditor(ind as Integer)
  8220.       dim i as Integer
  8221.       dim count as Integer
  8222.     
  8223.       ' Add the objects in the group to the list
  8224.       ' after clearing it first
  8225.       GroupList.Clear
  8226.       count = GetObjectCount(GroupRef)
  8227.       If (count > 0) Then 
  8228.         For i = 0 To count - 1
  8229.           GroupList.AddItem(GroupRef(i))
  8230.         Next i
  8231.       End If
  8232.     
  8233.       ' Set selection to requested index
  8234.       GroupList.ListIndex = ind
  8235.     End Sub
  8236.  
  8237.     Sub Resize()
  8238.       ' Resize the list to take up the whole form but the
  8239.       ' button area.
  8240.       GroupList.Move(0, GroupList.Top, ScaleWidth, ScaleHeight)
  8241.       Height = Height - ScaleHeight + GroupList.Height
  8242.     End Sub
  8243.  
  8244.     Sub Up_Click()
  8245.       Dim obj as Object
  8246.       Dim i, cnt as integer
  8247.     
  8248.       ' If list has no more than 1 member or the selected item is
  8249.       ' already at the top then do nothing
  8250.       i = GroupList.ListIndex
  8251.       cnt = GroupList.ListCount
  8252.       If cnt <= 1 || i <= 0 Then Exit Sub
  8253.     
  8254.       ' Get current object, remove it from group, add it back in
  8255.       ' one position up
  8256.       obj = GetCurrentObject()
  8257.       If obj Then 
  8258.         GroupRef.RemoveAt(i)
  8259.         GroupRef.InsertAt(obj, i - 1)
  8260.       End If
  8261.     
  8262.       ' Rebuild the list and lets see it
  8263.       PopulateEditor(i - 1)
  8264.     End Sub
  8265.  
  8266.   End Type
  8267.  
  8268.   ' METHODS for object: GroupEditor
  8269.   Sub BringToTop()
  8270.     EditorForm.BringToTop()
  8271.   End Sub
  8272.  
  8273.   Sub Edit(obj As Object)
  8274.     EditorForm.Edit(obj)
  8275.   End Sub
  8276.  
  8277.   Function getVisible() As Boolean
  8278.     getVisible = EditorForm.Visible
  8279.   End Function
  8280.  
  8281.   Sub Hide()
  8282.     EditorForm.Hide()
  8283.   End Sub
  8284.  
  8285.   Sub setVisible(vis As Boolean)
  8286.     EditorForm.Visible = vis
  8287.   End Sub
  8288.  
  8289.   Sub Show()
  8290.     EditorForm.Show()
  8291.   End Sub
  8292.  
  8293. End Type
  8294.  
  8295. Type NewProjectForm From Form
  8296.   Dim LblProjType As New Label
  8297.   Dim LblProjName As New Label
  8298.   Dim LblProjFile As New Label
  8299.   Dim OptApplication As New OptionButton
  8300.   Dim OptLibrary As New OptionButton
  8301.   Dim LblEXEfile As New Label
  8302.   Dim TEProjName As New TextBox
  8303.   Dim TEProjFile As New TextBox
  8304.   Dim TEEXEfile As New TextBox
  8305.   Dim BtnOK As New Button
  8306.   Dim BtnCancel As New Button
  8307.   Dim BtnBrowseProjFile As New Button
  8308.   Dim BtnBrowseEXEfile As New Button
  8309.   Dim GeneratedName As String
  8310.  
  8311.   ' METHODS for object: NewProjectForm
  8312.   Sub BtnBrowseEXEfile_Click()
  8313.     Dim dlg As New OpenDialog
  8314.     Dim name As String
  8315.     name = TEEXEfile.Text
  8316.     If name <> "" Then 
  8317.       Dim file As New File
  8318.       file.FileName = name
  8319.       dlg.FileName = file.Name & file.Extension
  8320.       dlg.InitialDir = IIf(Instr(name, "\") > 0, file.Path, Envelop.FileDialogDir)
  8321.     Else 
  8322.       dlg.FileName = "*.exe"
  8323.       dlg.InitialDir = Envelop.FileDialogDir
  8324.     End If
  8325.     dlg.Title = "Select application EXE file"
  8326.     dlg.Filter = "Executable files (*.exe)|*.exe|All files (*.*)|*.*|"
  8327.     dlg.DefaultExtension = "exe"
  8328.     dlg.FilterIndex = 1
  8329.     dlg.FileMustExist = False
  8330.     dlg.PathMustExist = True
  8331.     dlg.NoChangeDir = True
  8332.     If dlg.Execute = IDOK Then 
  8333.       TEEXEfile.Text = dlg.FileName
  8334.       Envelop.FileDialogDir = dlg.FileName
  8335.     End If
  8336.   End Sub
  8337.  
  8338.   Sub BtnBrowseProjFile_Click()
  8339.     Dim dlg As New OpenDialog
  8340.     Dim name As String
  8341.     name = TEProjFile.Text
  8342.     If name <> "" Then 
  8343.       Dim file As New File
  8344.       file.FileName = name
  8345.       dlg.FileName = file.Name & file.Extension
  8346.       dlg.InitialDir = IIf(Instr(name, "\") > 0, file.Path, Envelop.FileDialogDir)
  8347.     Else 
  8348.       dlg.FileName = "*.epj"
  8349.       dlg.InitialDir = Envelop.FileDialogDir
  8350.     End If
  8351.     dlg.Title = "Select project file"
  8352.     dlg.Filter = "Envelop projects (*.epj)|*.epj|All files (*.*)|*.*|"
  8353.     dlg.DefaultExtension = "epj"
  8354.     dlg.FilterIndex = 1
  8355.     dlg.FileMustExist = False
  8356.     dlg.PathMustExist = True
  8357.     dlg.NoChangeDir = True
  8358.     If dlg.Execute = IDOK Then 
  8359.       TEProjFile.Text = dlg.FileName
  8360.       If OptApplication.Value Then 
  8361.         Dim fle as New File
  8362.         fle.FileName = dlg.FileName
  8363.         TEEXEfile.Text = fle.Path & fle.Name & ".exe"
  8364.       End If
  8365.       Envelop.FileDialogDir = dlg.FileName
  8366.     End If
  8367.   End Sub
  8368.  
  8369.   Sub BtnCancel_Click()
  8370.     Hide
  8371.     ModalResult IDCANCEL
  8372.   End Sub
  8373.  
  8374.   Sub BtnOK_Click()
  8375.     Dim name as string
  8376.     Dim answer as integer
  8377.     Dim mb As New MessageBox
  8378.     mb.SetIconExclamation
  8379.   
  8380.     ' Check that we have a valid project object name.
  8381.     name = TEProjName.Text
  8382.     If name = "" Then 
  8383.       mb.Message("Invalid project name", "To make a new project, you must^Mspecify a valid new project object name.")
  8384.       FocusOnTE TEProjName
  8385.       Exit Sub
  8386.     ElseIf IsIdentifierValid(name) = 0 Then 
  8387.       mb.Message("Invalid project name", """" & name & """ is not a valid object name.^M^MTo make a new project, you must ^Mspecify a valid new project object name.")
  8388.       FocusOnTE TEProjName
  8389.       Exit Sub
  8390.     ElseIf FindObject(name) Then 
  8391.       mb.Message("Invalid project name", "The object """ & name & """ already exists.^M^MTo make a new project, you must ^Mspecify a valid new project object name.")
  8392.       FocusOnTE TEProjName
  8393.       Exit Sub
  8394.     End If
  8395.   
  8396.     ' Check that the specified project file can be written.
  8397.     ' Allow the user to continue if she really wants to.
  8398.     name = TEProjFile.Text
  8399.     If name = "" Then 
  8400.       answer = YesNoBox.Message("No project file name", "You have not specified a project file.^MDo you wish to continue anyway?")
  8401.       If answer <> IDYES Then 
  8402.         FocusOnTE TEProjFile
  8403.         Exit Sub
  8404.       End If
  8405.     Else 
  8406.       Dim file As New TextFile
  8407.       file.FileName = name
  8408.       If file.Exists Then 
  8409.         answer = YesNoBox.Message("Project file exists", "The project file you selected already exists.^MDo you wish to continue anyway?")
  8410.         If answer <> IDYES Then 
  8411.           FocusOnTE TEProjFile
  8412.           Exit Sub
  8413.         End If
  8414.         If file.ReadOnly Then 
  8415.           answer = YesNoBox.Message("Read-only project file", "The project file you selected is read-only.^MDo you wish to continue anyway?")
  8416.           If answer <> IDYES Then 
  8417.             FocusOnTE TEProjFile
  8418.             Exit Sub
  8419.           End If
  8420.         End If
  8421.       Else 
  8422.         Try
  8423.           file.Create(False)
  8424.         Catch
  8425.         End Try
  8426.         If Not file.Exists Then 
  8427.           answer = YesNoBox.Message("Can't make project file", "Unable to make project file: " & name & ".^MDo you wish to continue anyway?")
  8428.           If answer <> IDYES Then 
  8429.             FocusOnTE TEProjFile
  8430.             Exit Sub
  8431.           End If
  8432.         End If
  8433.         file.Delete
  8434.       End If
  8435.     End If
  8436.   
  8437.     ' Check that the specified EXE file can be written.
  8438.     ' Allow the user to continue if she really wants to.
  8439.     If OptApplication.Value Then 
  8440.       name = TEEXEfile.Text
  8441.       If name = "" Then 
  8442.         answer = YesNoBox.Message("No EXE file name", "You have not specified an application EXE file.^MDo you wish to continue anyway?")
  8443.         If answer <> IDYES Then 
  8444.           FocusOnTE TEEXEfile
  8445.           Exit Sub
  8446.         End If
  8447.       Else 
  8448.         Dim file As New TextFile
  8449.         file.FileName = name
  8450.         If file.Exists Then 
  8451.           answer = YesNoBox.Message("EXE file exists", "The application EXE file you selected already exists.^MDo you wish to continue anyway?")
  8452.           If answer <> IDYES Then 
  8453.             FocusOnTE TEEXEfile
  8454.             Exit Sub
  8455.           End If
  8456.           If file.ReadOnly Then 
  8457.             answer = YesNoBox.Message("Read-only EXE file", "The application EXE file you selected is read-only.^MDo you wish to continue anyway?")
  8458.             If answer <> IDYES Then 
  8459.               FocusOnTE TEEXEfile
  8460.               Exit Sub
  8461.             End If
  8462.           End If
  8463.         Else 
  8464.           Try
  8465.             file.Create(False)
  8466.           Catch
  8467.           End Try
  8468.           If Not file.Exists Then 
  8469.             answer = YesNoBox.Message("Can't make EXE file", "Unable to make application EXE file: " & name & ".^MDo you wish to continue anyway?")
  8470.             If answer <> IDYES Then 
  8471.               FocusOnTE TEEXEfile
  8472.               Exit Sub
  8473.             End If
  8474.           End If
  8475.           file.Delete
  8476.         End If
  8477.       End If
  8478.     End If
  8479.     Hide
  8480.     ModalResult IDOK
  8481.   End Sub
  8482.  
  8483.   Function DoExecute(ByVal auto As Boolean) As Project
  8484.     Dim name As String
  8485.     LoadForm
  8486.     Center
  8487.     OptApplication.Value = True
  8488.     OptLibrary.Value = False
  8489.     GenerateNames(True)
  8490.     TEEXEfile.Enabled = True
  8491.     BtnBrowseEXEfile.Enabled = True
  8492.   
  8493.     If auto || ShowModal = IDOK Then 
  8494.       DoExecute = MakeProject(OptApplication.Value, TEProjName.Text, TEProjFile.Text, TEEXEfile.Text)
  8495.     Else 
  8496.       DoExecute = Nothing
  8497.     End If
  8498.   End Function
  8499.  
  8500.   Function Execute As Project
  8501.     Execute = DoExecute(False)
  8502.   End Function
  8503.  
  8504.   Sub FocusOnTE(te As TextBox)
  8505.     te.SelStart = 0
  8506.     te.SelLength = 32768
  8507.     te.SetFocus
  8508.   End Sub
  8509.  
  8510.   Sub GenerateNames(app As Boolean)
  8511.     Dim name As String
  8512.     GeneratedName = UniqueObjectNameFromString(IIf(app, "Application", "Library"))
  8513.     TEProjName.Text = GeneratedName
  8514.     name = IIf(app, "app", "lib") & Mid(GeneratedName, IIf(app, 12, 8))
  8515.     TEProjFile.Text = name & ".epj"
  8516.     If app Then TEEXEfile.Text = name & ".exe"
  8517.   End Sub
  8518.  
  8519.   Function MakeDefaultProject As Project
  8520.     MakeDefaultProject = DoExecute(True)
  8521.   End Function
  8522.  
  8523.   Function MakeProject(ByVal makeApp As Boolean, ByVal objName As String, ByVal projFile As String, ByVal exeFile As String) As Project
  8524.     Dim m As ObjectModule
  8525.     Dim p As Project
  8526.     Dim f As Form
  8527.     Dim nm As String
  8528.     Dim file As New File
  8529.     Dim appOrProj As Object
  8530.   
  8531.     ' Open a new untitled module
  8532.     m = ModuleManager.LoadModule("", False)
  8533.   
  8534.     ' In that module, make the new project object and a new form
  8535.     appOrProj = IIf(makeApp, Application, Project)
  8536.     nm = IIf(objName = "", UniqueObjectNameFromString(IIf(makeApp, "Application", "Library")), objName)
  8537.     p = CopyObject(appOrProj, nm)
  8538.     f = CopyObject(Form, UniqueObjectNameFromString("Form"))
  8539.     f.Caption = f
  8540.   
  8541.     ' Secure the project object against deletion
  8542.     EmbedObject(p, ACL, "AccessControl")
  8543.     SecureObject(p, p.AccessControl)
  8544.     p.AccessControl.ObjectAccess = "110 - R,W,C,M,P"
  8545.   
  8546.     ' Set default options on the new project and make it current
  8547.     If makeApp Then 
  8548.       p.ModulePath = "base.ebo;win32.ebo;dialogs.ebo;tools.ebo;" & m.FileName
  8549.     Else 
  8550.       p.ModulePath = m.FileName
  8551.     End If
  8552.     If projFile <> "" Then 
  8553.       file.FileName = projFile
  8554.       p.ProjectFileName = file.Path & file.Name & file.Extension
  8555.     Else 
  8556.       p.ProjectFileName = ""
  8557.     End If
  8558.   
  8559.     If makeApp Then 
  8560.       If exeFile <> "" Then 
  8561.         file.FileName = exeFile
  8562.         p.EXEFileName = file.Path & file.Name & file.Extension
  8563.       Else 
  8564.         p.EXEFileName = ""
  8565.       End If
  8566.       p.MainForm = f
  8567.     End If
  8568.   
  8569.     ProjectManager.CurrentProject = p
  8570.     p.CurrentModule = m
  8571.     ObjectEditorMgr.Edit f
  8572.     MakeProject = p
  8573.   End Function
  8574.  
  8575.   Sub OptApplication_Click()
  8576.     If TEProjName.Text = GeneratedName Then 
  8577.       GenerateNames(True)
  8578.     End If
  8579.     LblEXEfile.Enabled = True
  8580.     TEEXEfile.Enabled = True
  8581.     BtnBrowseEXEfile.Enabled = True
  8582.   End Sub
  8583.  
  8584.   Sub OptLibrary_Click()
  8585.     If TEProjName.Text = GeneratedName Then 
  8586.       GenerateNames(False)
  8587.     End If
  8588.     LblEXEfile.Enabled = False
  8589.     TEEXEfile.Text = ""
  8590.     TEEXEfile.Enabled = False
  8591.     BtnBrowseEXEfile.Enabled = False
  8592.   End Sub
  8593.  
  8594.   Sub Resize
  8595.     Dim m, mm, l, t, w, h, decHeight, newHeight as integer
  8596.     Dim ActiveWidth as integer
  8597.   
  8598.     ' Initialize the variables
  8599.     m = 60
  8600.     mm = m + m
  8601.     ActiveWidth = IIf(ScaleWidth > 4800, ScaleWidth, 4800)
  8602.   
  8603.     ' Make height just the size to show everything
  8604.     decHeight = Height - ScaleHeight
  8605.     newHeight = BtnBrowseEXEfile.Top + BtnBrowseEXEfile.Height + m + decHeight
  8606.     If newHeight <> Height Then 
  8607.       Height = newHeight
  8608.     Else 
  8609.       l = ActiveWidth - m - BtnOK.Width
  8610.       BtnCancel.Left = l
  8611.       BtnOK.Left = l
  8612.       w = BtnBrowseEXEfile.Width
  8613.       l = ActiveWidth - m - w
  8614.       BtnBrowseEXEfile.Left = l
  8615.       BtnBrowseProjFile.Left = l
  8616.   
  8617.       w = l - TEProjName.Left - m
  8618.       TEEXEfile.Width = w
  8619.       TEProjFile.Width = w
  8620.       TEProjName.Width = w
  8621.   
  8622.       Refresh
  8623.     End If
  8624.   End Sub
  8625.  
  8626. End Type
  8627.  
  8628. Type SelectModuleForm From Form
  8629.   Dim LstModules As New ListBox
  8630.   Dim BtnOK As New Button
  8631.   Dim BtnCancel As New Button
  8632.   Dim BtnBrowse As New Button
  8633.   Dim LblModules As New Label
  8634.   Dim module As ObjectModule
  8635.   Dim BtnNew As New Button
  8636.  
  8637.   ' METHODS for object: SelectModuleForm
  8638.   Sub BtnBrowse_Click()
  8639.     module = Envelop.EBOOpen.BrowseForModule
  8640.     If module Then BtnOK_Click Else BtnCancel_Click
  8641.   End Sub
  8642.  
  8643.   Sub BtnCancel_Click()
  8644.     Hide
  8645.     ModalResult IDCANCEL
  8646.   End Sub
  8647.  
  8648.   Sub BtnNew_Click()
  8649.     module = ModuleManager.LoadModule("", False)
  8650.     If module Then BtnOK_Click Else BtnCancel_Click
  8651.   End Sub
  8652.  
  8653.   Sub BtnOK_Click()
  8654.     Hide
  8655.     ModalResult IDOK
  8656.   End Sub
  8657.  
  8658.   Function Execute(t As String) As ObjectModule
  8659.     InitModuleList(Nothing, Nothing, Nothing)
  8660.     BtnNew.Visible = True
  8661.     BtnBrowse.Visible = True
  8662.     Caption = IIf(t = "", "Select module", t)
  8663.     Execute = IIf(ShowModal = IDOK, module, Nothing)
  8664.   End Function
  8665.  
  8666.   Function ExecuteExcluding(x As Group, t As String) As ObjectModule
  8667.     InitModuleList(Nothing, x, Nothing)
  8668.     BtnNew.Visible = True
  8669.     BtnBrowse.Visible = True
  8670.     Caption = IIf(t = "", "Select module", t)
  8671.     ExecuteExcluding = IIf(ShowModal = IDOK, module, Nothing)
  8672.   End Function
  8673.  
  8674.   Function ExecuteFromGroupOnly(g As Group, initMod As ObjectModule, t As String) As ObjectModule
  8675.     InitModuleList(g, Nothing, initMod)
  8676.     BtnNew.Visible = False
  8677.     BtnBrowse.Visible = False
  8678.     Caption = IIf(t = "", "Select module", t)
  8679.     ExecuteFromGroupOnly = IIf(ShowModal = IDOK, module, Nothing)
  8680.   End Function
  8681.  
  8682.   Sub InitModuleList(initial As Group, exclude As Group, initMod As ObjectModule)
  8683.     Dim i, n as integer
  8684.     Dim m as ObjectModule
  8685.     LoadForm
  8686.     module = Nothing
  8687.     LstModules.Clear
  8688.     LstModules.Sorted = False
  8689.   
  8690.     ' Use initial group if given, otherwise all modules.
  8691.     n = IIf(initial, initial.Count, ModuleManager.ModuleCount) - 1
  8692.     For i = 0 To n
  8693.       m = IIf(initial, initial(i), ModuleManager.Module(i))
  8694.       If (exclude = Nothing) || (exclude.ObjectIndex(m) = -1) Then 
  8695.         LstModules.AddItem m.DisplayName
  8696.       End If
  8697.     Next i
  8698.   
  8699.     ' Select given initial module, or current module, or first module
  8700.     If LstModules.ListCount Then 
  8701.       m = IIf(initMod, initMod, ModuleManager.CurrentModule)
  8702.       LstModules.ListIndex = IIf(m, LstModules.ItemIndex(m.DisplayName), 0)
  8703.     End If
  8704.     Show
  8705.     LstModules.SetFocus
  8706.   End Sub
  8707.  
  8708.   Sub LstModules_Click()
  8709.     Dim text As String
  8710.     text = LstModules.Text
  8711.     If text = ObjectModule.DisplayName Then 
  8712.       module = ObjectModule
  8713.     Else 
  8714.       module = ModuleManager.FindModule(text)
  8715.     End If
  8716.   End Sub
  8717.  
  8718.   Sub LstModules_DblClick()
  8719.     BtnOK_Click
  8720.   End Sub
  8721.  
  8722.   Sub Resize()
  8723.     Dim m, mm, l, t, w, h  as single
  8724.     Dim effWidth as single
  8725.     m = 90 : mm = 180
  8726.     effWidth = IIf(ScaleWidth > 3435, ScaleWidth, 3435)
  8727.     w = BtnOK.Width
  8728.     h = BtnOK.Height
  8729.     l = effWidth - m - w
  8730.     BtnOK.Move(l, m, w, h)
  8731.     BtnCancel.Move(l, BtnOK.Top + h + m, w, h)
  8732.     BtnBrowse.Move(l, ScaleHeight - m - h, w, h)
  8733.     BtnNew.Move(l, BtnBrowse.Top - m - h, w, h)
  8734.     t = LblModules.Top + LblModules.Height + m
  8735.     LstModules.Move(m, t, l - mm, ScaleHeight - m - t)
  8736.   End Sub
  8737.  
  8738. End Type
  8739.  
  8740. Type ImageListBrowser From HyperControl
  8741.   Dim CurrentIndex As Integer
  8742.   Dim ImageListRef As ImageList
  8743.   Dim Images As New Image
  8744.   Dim ImageScrollBar As New ScrollBar
  8745.   Property Capacity Get getCapacity As Integer
  8746.   Dim Spacer As Integer
  8747.   Property ImageCount Get getImageCount As Integer
  8748.   Property ImageHeight Get getImageHeight Set setImageHeight As Integer
  8749.   Property ImageWidth Get getImageWidth Set setImageWidth As Integer
  8750.   Event ImageSelected(index As Integer)
  8751.  
  8752.   ' METHODS for object: ImageListBrowser
  8753.   Function getCapacity() As Integer
  8754.     ' Default method for procedural property "Capacity"
  8755.     dim capacity as integer
  8756.     dim pixW as integer
  8757.     dim spacedW as integer
  8758.   
  8759.     If ImageListRef Then 
  8760.       With ImageListRef
  8761.         ' get the width of a single image with leading & trailing spacer (in pixels)
  8762.         spacedW = .ImageWidth + 2 * Spacer
  8763.   
  8764.         ' get the width of the Images area (in pixels)
  8765.         pixW = Images.Width / Screen.TwipsPerPixelX
  8766.   
  8767.         ' compute the capacity
  8768.         capacity = pixW / spacedW
  8769.       End With
  8770.     Else 
  8771.       capacity = 0
  8772.     End If
  8773.     getCapacity = capacity
  8774.   End Function
  8775.  
  8776.   Function getImageCount() As Integer
  8777.     ' Default method for procedural property "ImageCount"
  8778.     getImageCount = IIf(ImageListRef, ImageListRef.Count, 0)
  8779.   End Function
  8780.  
  8781.   Function getImageHeight() As Integer
  8782.     ' Default method for procedural property "ImageHeight"
  8783.     getImageHeight = IIf(ImageListRef, ImageListRef.ImageHeight, 0)
  8784.   End Function
  8785.  
  8786.   Function getImageWidth() As Integer
  8787.     ' Default method for procedural property "ImageWidth"
  8788.     getImageWidth = IIf(ImageListRef, ImageListRef.ImageWidth, 0)
  8789.   End Function
  8790.  
  8791.   Sub ImageScrollBar_Change()
  8792.     Images.Cls
  8793.   End Sub
  8794.  
  8795.   Sub Images_KeyUp(keyCode As Integer, ByVal shift As Integer)
  8796.     Dim index As Integer
  8797.     Dim indexPos As Integer
  8798.     dim textY As Integer
  8799.     Dim startpos As Integer
  8800.     Dim spacedW as Integer
  8801.  
  8802.     index = CurrentIndex
  8803.  
  8804.     If keyCode = 37 Then 
  8805.       If CurrentIndex > 0 Then index = index - 1
  8806.     ElseIf keyCode = 39 Then 
  8807.       If CurrentIndex < ImageCount - 1 Then index = index + 1
  8808.     Else 
  8809.       Exit Sub
  8810.     End If
  8811.  
  8812.     If ImageListRef Then 
  8813.       spacedW = Screen.TwipsPerPixelX * (ImageListRef.ImageWidth + 2 * Spacer)
  8814.  
  8815.       If ImageScrollBar.Visible Then 
  8816.         startpos = ImageScrollBar.Value
  8817.       Else 
  8818.         startpos = 0
  8819.       End If
  8820.  
  8821.       If index <> CurrentIndex Then 
  8822.         ' if we picked an item other than the currently selected item
  8823.         ' take care of highlighting/unhighlighting
  8824.         indexPos = (index - startpos) * spacedW
  8825.         textY = 48 * Screen.TwipsPerPixelY
  8826.         ' put highlight rectangle around current index
  8827.         Images.Rectangle(indexPos, textY, indexPos + spacedW, Images.Height)
  8828.         ' unhighlight the previously selected choice  (remember we're xor'ing)
  8829.         indexPos = (CurrentIndex - startpos) * spacedW
  8830.         Images.Rectangle(indexPos, textY, indexPos + spacedW, Images.Height)
  8831.         CurrentIndex = index
  8832.         SendEvent ImageSelected(index)
  8833.       End If
  8834.     End If
  8835.   End Sub
  8836.  
  8837.   Sub Images_MouseUp(button As Integer, shift As Integer, x As Single, y As Single)
  8838.     dim index as integer
  8839.     dim indexPos as integer
  8840.     dim startpos As integer
  8841.     dim spacedW as integer
  8842.     dim textY as integer
  8843.   
  8844.     If ImageListRef Then 
  8845.   
  8846.       spacedW = Screen.TwipsPerPixelX * (ImageListRef.ImageWidth + 2 * Spacer)
  8847.   
  8848.       If ImageScrollBar.Visible Then 
  8849.         startpos = ImageScrollBar.Value
  8850.       Else 
  8851.         startpos = 0
  8852.       End If
  8853.       ' compute index for image we picked
  8854.       index = startpos + x / spacedW
  8855.   
  8856.       ' if we picked an item other than the currently selected item
  8857.       ' take care of highlighting/unhighlighting
  8858.       If (index <> CurrentIndex) Then 
  8859.         indexPos = (index - startpos) * spacedW
  8860.         textY = 48 * Screen.TwipsPerPixelY
  8861.   
  8862.         ' put highlight rectangle around current index
  8863.         Images.Rectangle(indexPos, textY, indexPos + spacedW, Images.Height)
  8864.   
  8865.         ' unhighlight the previously selected choice  (remember we're xor'ing)
  8866.         indexPos = (CurrentIndex - startpos) * spacedW
  8867.         Images.Rectangle(indexPos, textY, indexPos + spacedW, Images.Height)
  8868.         CurrentIndex = index
  8869.         SendEvent ImageSelected(index)
  8870.       End If
  8871.     End If
  8872.   End Sub
  8873.  
  8874.   Sub Images_Paint()
  8875.     dim i as integer
  8876.     dim capacity as integer
  8877.     dim indexPos as integer
  8878.     dim startpos As integer
  8879.     dim spacedW as integer
  8880.     dim spacedPixW as integer
  8881.     dim textXOffset, textY as integer
  8882.     dim twipsperpixx as integer
  8883.     dim twipsperpixy as integer
  8884.   
  8885.     twipsperpixx = Screen.TwipsPerPixelX
  8886.     twipsperpixy = Screen.TwipsPerPixelY
  8887.   
  8888.     If ImageListRef Then 
  8889.       With ImageListRef
  8890.   
  8891.         capacity = Capacity
  8892.   
  8893.         If capacity < .Count Then 
  8894.           ImageScrollBar.Visible = True
  8895.           ImageScrollBar.Max = .Count - capacity
  8896.           startpos = ImageScrollBar.Value
  8897.         Else 
  8898.           capacity = .Count
  8899.           startpos = 0
  8900.           ImageScrollBar.Visible = False
  8901.         End If
  8902.   
  8903.         spacedPixW = .ImageWidth + 2 * Spacer
  8904.         spacedW = spacedPixW * twipsperpixx
  8905.   
  8906.         textXOffset = 5 * twipsperpixx
  8907.         textY = 48 * twipsperpixy
  8908.   
  8909.         For i = 0 To capacity - 1
  8910.           ' Use the imagelist's Draw to paint the images into the specified dc
  8911.           .Draw(startpos + i, Images.hDC, i * spacedPixW + Spacer, 0, 0)
  8912.   
  8913.           ' output text representing the index number
  8914.           indexPos = i * spacedW
  8915.           Images.MoveTo(indexPos + textXOffset, textY)
  8916.           Images.Print (startpos + i)
  8917.   
  8918.           ' put highlight rectangle around current index
  8919.           If (startpos + i) = CurrentIndex Then 
  8920.             Images.Rectangle(indexPos, textY, indexPos + spacedW, Images.Height)
  8921.           End If
  8922.         Next i
  8923.       End With
  8924.     End If
  8925.   End Sub
  8926.  
  8927.   Sub Init(il As ImageList)
  8928.     ImageListRef = il
  8929.   End Sub
  8930.  
  8931.   Sub Resize()
  8932.     Images.Width = ScaleWidth
  8933.     Images.Height = ScaleHeight - ImageScrollBar.Height
  8934.     ImageScrollBar.Width = ScaleWidth
  8935.     ImageScrollBar.Top = Images.Height
  8936.   End Sub
  8937.  
  8938.   Sub SelectIndex(index As Integer)
  8939.     dim capacity As integer
  8940.     dim scrollVal as integer
  8941.   
  8942.     If ImageListRef && index >= 0 Then 
  8943.       CurrentIndex = index
  8944.       ImageScrollBar.Max = ImageListRef.Count - 1
  8945.   
  8946.       capacity = Capacity
  8947.       scrollVal = index - capacity + 1
  8948.       If scrollVal < 0 Then scrollVal = 0
  8949.       If capacity < ImageListRef.Count Then ImageScrollBar.Value = scrollVal
  8950.   
  8951.       ' Cause the images region to repaint
  8952.       Images.Cls
  8953.     End If
  8954.   End Sub
  8955.  
  8956.   Sub setImageHeight(newValue As Integer)
  8957.     ' Default method for procedural property "ImageHeight"
  8958.     If ImageListRef Then ImageListRef.ImageHeight = newValue
  8959.   End Sub
  8960.  
  8961.   Sub setImageWidth(newValue As Integer)
  8962.     ' Default method for procedural property "ImageWidth"
  8963.     If ImageListRef Then ImageListRef.ImageWidth = newValue
  8964.   End Sub
  8965.  
  8966. End Type
  8967.  
  8968. Type ImageListBuilderForm From Form
  8969.   Dim btnAddImage As New Button
  8970.   Dim btnRemoveImage As New Button
  8971.   Dim btnOK As New Button
  8972.   Dim font1 As New Font
  8973.   Dim OpenPanel As New OpenDialog
  8974.   Dim CurrentImageList As ImageList
  8975.   Dim Frame1 As New Frame
  8976.   Dim Frame2 As New Frame
  8977.   Dim opt16x16 As New OptionButton
  8978.   Dim opt32x32 As New OptionButton
  8979.   Dim optCustom As New OptionButton
  8980.   Dim txtWidth As New TextBox
  8981.   Dim txtHeight As New TextBox
  8982.   Dim Label2 As New Label
  8983.   Dim opt48x48 As New OptionButton
  8984.   Dim ImageBrowser As New ImageListBrowser
  8985.  
  8986.   ' METHODS for object: ImageListBuilderForm
  8987.   Sub btnAddImage_Click()
  8988.     Dim f As New File
  8989.     Static initialDir As String
  8990.     Dim newBmp As New Bitmap
  8991.   
  8992.     ' Set the initial dir and filename to previous selection (or empty).
  8993.     OpenPanel.InitialDir = initialDir
  8994.     OpenPanel.FileName = ""
  8995.   
  8996.   
  8997.     ' If a filename was picked, then create a bitmap object and add the bitmapt to the imagelist.
  8998.     If OpenPanel.Execute <> IDCANCEL Then 
  8999.       f.FileName = OpenPanel.FileName
  9000.       initialDir = f.Path
  9001.   
  9002.       ' set the bitmpap to the selected bmp file
  9003.       newBmp.FileName = OpenPanel.FileName
  9004.   
  9005.       ' If the user has specified dimenions to use and the
  9006.       ' image list has no images in it already, set the dimensions
  9007.       ' on the image list
  9008.       If ImageBrowser.ImageCount = 0 && txtWidth.Text <> "" && txtHeight.Text <> "" Then 
  9009.         ImageBrowser.ImageWidth = txtWidth.Text
  9010.         ImageBrowser.ImageHeight = txtHeight.Text
  9011.       End If
  9012.   
  9013.       ' Add the bitmap to the image list
  9014.       ' ...we may want to add feature for letting user specify mask color
  9015.       ' If the image list did not already have its dimensions set, this will
  9016.       ' end up setting the width and height of the image list to be based
  9017.       ' upon the bitmap's W & H
  9018.       ImageBrowser.ImageListRef.AddBitmapScaled(newBmp)
  9019.   
  9020.       UpdateForIndex(ImageBrowser.ImageCount - 1)
  9021.     End If
  9022.   End Sub
  9023.  
  9024.   Sub btnCancel_Click()
  9025.     ModalResult IDCANCEL
  9026.     Hide
  9027.   End Sub
  9028.  
  9029.   Sub btnOK_Click()
  9030.     ModalResult IDOK
  9031.     Hide
  9032.   End Sub
  9033.  
  9034.   Sub btnRemoveImage_Click()
  9035.     Dim index As Integer
  9036.     index = ImageBrowser.CurrentIndex
  9037.   
  9038.     If ImageBrowser.ImageListRef && index >= 0 Then 
  9039.       ImageBrowser.ImageListRef.RemoveImage(index)
  9040.       If index <= 0 Then index = 1
  9041.       UpdateForIndex(index - 1)
  9042.     End If
  9043.   End Sub
  9044.  
  9045.   Sub DoImageListProps(il As ImageList)
  9046.     ImageBrowser.Init(il)
  9047.     UpdateForIndex(0)
  9048.     ShowModal
  9049.   End Sub
  9050.  
  9051.   Sub opt16x16_Click()
  9052.     txtWidth.Text = "16"
  9053.     txtHeight.Text = "16"
  9054.     txtWidth.Enabled = False
  9055.     txtHeight.Enabled = False
  9056.   End Sub
  9057.  
  9058.   Sub opt32x32_Click()
  9059.     txtWidth.Text = "32"
  9060.     txtHeight.Text = "32"
  9061.     txtWidth.Enabled = False
  9062.     txtHeight.Enabled = False
  9063.   End Sub
  9064.  
  9065.   Sub opt48x48_Click()
  9066.     txtWidth.Text = "48"
  9067.     txtHeight.Text = "48"
  9068.     txtWidth.Enabled = False
  9069.     txtHeight.Enabled = False
  9070.   End Sub
  9071.  
  9072.   Sub optCustom_Click()
  9073.     txtWidth.Text = "0"
  9074.     txtHeight.Text = "0"
  9075.     txtWidth.Enabled = True
  9076.     txtHeight.Enabled = True
  9077.   End Sub
  9078.  
  9079.   Sub Preload()
  9080.     LoadForm
  9081.   End Sub
  9082.  
  9083.   Sub Resize()
  9084.     Frame1.Width = ScaleWidth - 2 * Frame1.Left
  9085.     ImageBrowser.Width = Frame1.Width - 300
  9086.     btnAddImage.Left = Frame1.Left + 150
  9087.     btnRemoveImage.Left = Frame1.Left + Frame1.Width - btnRemoveImage.Width - 150
  9088.   End Sub
  9089.  
  9090.   Sub UpdateForIndex(index As Integer)
  9091.     dim capacity As integer
  9092.     dim scrollVal as integer
  9093.   
  9094.     ImageBrowser.SelectIndex(index)
  9095.   
  9096.     If ImageBrowser.ImageCount > 0 Then 
  9097.       txtWidth.Text = ImageBrowser.ImageWidth
  9098.       txtHeight.Text = ImageBrowser.ImageHeight
  9099.       txtWidth.Enabled = False
  9100.       txtHeight.Enabled = False
  9101.       opt16x16.Enabled = False
  9102.       opt32x32.Enabled = False
  9103.       opt48x48.Enabled = False
  9104.       optCustom.Enabled = False
  9105.     Else 
  9106.       txtWidth.Enabled = True
  9107.       txtHeight.Enabled = True
  9108.       opt16x16.Enabled = True
  9109.       opt32x32.Enabled = True
  9110.       opt48x48.Enabled = True
  9111.       optCustom.Enabled = True
  9112.       optCustom.Value = True
  9113.       txtWidth.Text = 0
  9114.       txtHeight.Text = 0
  9115.     End If
  9116.   
  9117.   End Sub
  9118.  
  9119. End Type
  9120.  
  9121. Type ComCtlObjEditor From ObjectEditor
  9122.  
  9123.   ' METHODS for object: ComCtlObjEditor
  9124.   Function DetailedEdit(obj As Object) As Long
  9125.     If TypeOf obj Is TabStrip Then 
  9126.       TabPropertyForm.DoTabStripProps(obj)
  9127.     ElseIf TypeOf obj Is ListView Then 
  9128.       ListViewPropsForm.DoListViewProps(obj)
  9129.     ElseIf TypeOf obj Is ImageList Then 
  9130.       ImageListBuilderForm.DoImageListProps(obj)
  9131.     End If
  9132.   End Function
  9133.  
  9134. End Type
  9135.  
  9136. Type ImageSelectForm From Form
  9137.   Dim ImageBrowse As New ImageListBrowser
  9138.   Dim btnOK As New Button
  9139.   Dim btnCancel As New Button
  9140.  
  9141.   ' METHODS for object: ImageSelectForm
  9142.   Sub btnCancel_Click()
  9143.     Hide
  9144.     ModalResult -1
  9145.   End Sub
  9146.  
  9147.   Sub btnOK_Click()
  9148.     Hide
  9149.     ModalResult ImageBrowse.CurrentIndex
  9150.   End Sub
  9151.  
  9152.   Function GetSelectionFromImageList(il As ImageList) As Long
  9153.     ImageBrowse.ImageListRef = il
  9154.     ImageBrowse.SelectIndex(0)
  9155.     GetSelectionFromImageList = ShowModal
  9156.   End Function
  9157.  
  9158. End Type
  9159.  
  9160. Type TabPropertyForm From Form
  9161.   Dim Label1 As New Label
  9162.   Dim txtIndex As New TextBox
  9163.   Dim Label2 As New Label
  9164.   Dim txtCaption As New TextBox
  9165.   Dim btnAddTab As New Button
  9166.   Dim btnRemoveTab As New Button
  9167.   Dim btnOK As New Button
  9168.   Dim CurrentTabStrip As TabStrip
  9169.   Dim btnPrev As New Button
  9170.   Dim font1 As New Font
  9171.   Dim btnNext As New Button
  9172.   Dim cboImages As New ObjectCombo
  9173.   Dim btnImagesEdit As New Button
  9174.   Dim btnImagesClear As New Button
  9175.   Dim btnImagesNew As New Button
  9176.   Dim Label3 As New Label
  9177.   Dim Label4 As New Label
  9178.   Dim txtIconIndex As New TextBox
  9179.   Dim Frame1 As New Frame
  9180.   Dim Frame2 As New Frame
  9181.   Dim btnSelect As New Button
  9182.   Dim chkMultiRow As New CheckBox
  9183.   Dim chkForms As New CheckBox
  9184.  
  9185.   ' METHODS for object: TabPropertyForm
  9186.   Sub btnAddTab_Click()
  9187.     Dim newTab, tabForm As Object
  9188.     ' Embed a new tab
  9189.     newTab = EmbedObject(CurrentTabStrip, FindObject("TabStripTab"), UniqueEmbedName(CurrentTabStrip, "AutoTab"))
  9190.   
  9191.     If chkForms.Value = 1 Then 
  9192.       ' Embed a form onto the current tab striup's parent form and set the TabForm ref property
  9193.       tabForm = EmbedObject(CurrentTabStrip.Parent, FindObject("Form"), UniqueEmbedName(CurrentTabStrip.Parent, "SubForm"))
  9194.       newTab.TabForm = tabForm
  9195.   
  9196.       ' Invoke the Click method on the new tab to size the tabform
  9197.       newTab.Click
  9198.     End If
  9199.   
  9200.     UpdateForIndex(newTab.Index)
  9201.   End Sub
  9202.  
  9203.   Sub btnApply_Click()
  9204.     Dim t As TabStripTab
  9205.   
  9206.     CurrentTabStrip.ImageListRef = cboImages.SelObject
  9207.   
  9208.     t = TabFromIndex(Val(txtIndex.Text))
  9209.     If t Then 
  9210.       t.Caption = txtCaption.Text
  9211.       t.Icon = txtIconIndex.Text
  9212.     End If
  9213.   
  9214.   End Sub
  9215.  
  9216.   Sub btnImagesClear_Click()
  9217.     cboImages.SelObject = Nothing
  9218.     CurrentTabStrip.ImageListRef = Nothing
  9219.   End Sub
  9220.  
  9221.   Sub btnImagesEdit_Click()
  9222.     If cboImages.SelObject Then 
  9223.       ImageListBuilderForm.DoImageListProps(cboImages.SelObject)
  9224.       CurrentTabStrip.ImageListRef = cboImages.SelObject
  9225.     End If
  9226.   End Sub
  9227.  
  9228.   Sub btnImagesNew_Click()
  9229.     cboImages.SelObject = CreateNewImageList
  9230.     btnImagesEdit_Click
  9231.   End Sub
  9232.  
  9233.   Sub btnNext_Click()
  9234.     UpdateForIndex(Val(txtIndex.Text) + 1)
  9235.   End Sub
  9236.  
  9237.   Sub btnOK_Click()
  9238.     Dim t As TabStripTab
  9239.   
  9240.     CurrentTabStrip.ImageListRef = cboImages.SelObject
  9241.   
  9242.     t = TabFromIndex(Val(txtIndex.Text))
  9243.     If t Then 
  9244.       t.Caption = txtCaption.Text
  9245.       t.Icon = txtIconIndex.Text
  9246.     End If
  9247.   
  9248.     ModalResult IDOK
  9249.     Hide
  9250.   End Sub
  9251.  
  9252.   Sub btnPrev_Click()
  9253.     UpdateForIndex(Val(txtIndex.Text) - 1)
  9254.   End Sub
  9255.  
  9256.   Sub btnRemoveTab_Click()
  9257.     Dim t As TabStripTab
  9258.     Dim index As Integer
  9259.     index = Val(txtIndex.Text)
  9260.   
  9261.     t = TabFromIndex(index)
  9262.     If t Then 
  9263.       If t.TabForm Then DestroyObject(t.TabForm)
  9264.       DestroyObject(t)
  9265.       If index <= 0 Then index = 1
  9266.       UpdateForIndex(index - 1)
  9267.     End If
  9268.   
  9269.   End Sub
  9270.  
  9271.   Sub btnSelect_Click()
  9272.     Dim index As Integer
  9273.     If cboImages.SelObject Then 
  9274.       index = ImageSelectForm.GetSelectionFromImageList(cboImages.SelObject)
  9275.       If index >= 0 Then 
  9276.         Dim t As TabStripTab
  9277.         txtIconIndex.Text = index
  9278.         t = TabFromIndex(Val(txtIndex.Text))
  9279.         If t Then t.Icon = index
  9280.       End If
  9281.     End If
  9282.   End Sub
  9283.  
  9284.   Sub cboImages_Click()
  9285.     CurrentTabStrip.ImageListRef = cboImages.SelObject
  9286.   End Sub
  9287.  
  9288.   Sub chkMultiRow_Click()
  9289.     CurrentTabStrip.MultiRow = IIf(chkMultiRow.Value = 1, True, False)
  9290.   End Sub
  9291.  
  9292.   Function CreateNewImageList() As Object
  9293.     Dim newImageList As Object
  9294.   
  9295.     ' embed a new image list into the current list view
  9296.     newImageList = EmbedObject(CurrentTabStrip, FindObject("ImageList"), UniqueEmbedName(CurrentTabStrip, "Img"))
  9297.   
  9298.     ' add it to our combo boxes
  9299.     cboImages.AddItem(newImageList)
  9300.   
  9301.     CreateNewImageList = newImageList
  9302.   End Function
  9303.  
  9304.   Sub DoTabStripProps(ts As TabStrip)
  9305.     CurrentTabStrip = ts
  9306.     UpdateForIndex(0)
  9307.     PopulateCombo
  9308.     cboImages.SelObject = CurrentTabStrip.ImageListRef
  9309.     chkMultiRow.Value = IIf(CurrentTabStrip.MultiRow, 1, 0)
  9310.     chkForms.Value = 1
  9311.     ShowModal
  9312.   End Sub
  9313.  
  9314.   Sub PopulateCombo
  9315.     Dim name As String
  9316.     Dim i As Integer
  9317.   
  9318.     cboImages.Clear
  9319.   
  9320.     cboImages.RootObject = FindObject("ImageList")
  9321.   
  9322.     ' Filter out 'ImageList'
  9323.     For i = cboImages.ListCount - 1 To 0 Step -1
  9324.       name = cboImages.List(i)
  9325.       If name = "ImageList" Then 
  9326.         cboImages.RemoveItem(i)
  9327.         Exit For
  9328.       End If
  9329.     Next i
  9330.   End Sub
  9331.  
  9332.   Sub Preload()
  9333.     LoadForm
  9334.   End Sub
  9335.  
  9336.   Function TabFromIndex(index As Integer) As TabStripTab
  9337.     dim t as TabStripTab
  9338.   
  9339.     For Each t EmbeddedIn CurrentTabStrip
  9340.   
  9341.       If t.Index = index Then 
  9342.         TabFromIndex = t
  9343.         Exit For
  9344.       End If
  9345.   
  9346.     Next 
  9347.   
  9348.   End Function
  9349.  
  9350.   Sub txtCaption_KeyUp(keyCode As Integer, ByVal shift As Integer)
  9351.     Dim t As TabStripTab
  9352.     t = TabFromIndex(Val(txtIndex.Text))
  9353.     If t Then t.Caption = txtCaption.Text
  9354.   End Sub
  9355.  
  9356.   Sub txtIconIndex_KeyPress(keyAscii As Integer)
  9357.     ' Allow backspace straight through...
  9358.     If keyAscii = 8 Then Exit Sub
  9359.   
  9360.     ' Restrict digits to 0-9
  9361.     If Not (keyAscii >= Asc("0") && keyAscii <= Asc("9")) Then keyAscii = 0
  9362.   End Sub
  9363.  
  9364.   Sub txtIconIndex_KeyUp(keyCode As Integer, ByVal shift As Integer)
  9365.     Dim t As TabStripTab
  9366.     t = TabFromIndex(Val(txtIndex.Text))
  9367.     If t Then t.Icon = IIf(txtIconIndex.Text = "", -1, Val(txtIconIndex.Text))
  9368.   End Sub
  9369.  
  9370.   Sub UpdateForIndex(index As Integer)
  9371.     Dim t As TabStripTab
  9372.     t = TabFromIndex(index)
  9373.     If t Then 
  9374.       txtIndex.Enabled = True
  9375.       txtCaption.Enabled = True
  9376.       txtIconIndex.Enabled = True
  9377.       txtIndex.Text = index
  9378.       txtCaption.Text = t.Caption
  9379.       txtIconIndex.Text = IIf(t.Icon >= 0, t.Icon, "") 
  9380.  
  9381.       ' see if we can get the one after this...if not disble me
  9382.       If Not TabFromIndex(index + 1) Then 
  9383.         btnNext.Enabled = False
  9384.       Else 
  9385.         btnNext.Enabled = True
  9386.       End If
  9387.   
  9388.       If index = 0 Then 
  9389.         btnPrev.Enabled = False
  9390.       Else 
  9391.         btnPrev.Enabled = True
  9392.       End If
  9393.   
  9394.       CurrentTabStrip.SelectedItem = t
  9395.       If t.TabForm Then t.TabForm.BringToTop
  9396.   
  9397.     Else 
  9398.       txtIndex.Text = ""
  9399.       txtCaption.Text = ""
  9400.       txtIconIndex.Text = ""
  9401.       txtIndex.Enabled = False
  9402.       txtCaption.Enabled = False
  9403.       txtIconIndex.Enabled = False
  9404.   
  9405.     End If
  9406.   
  9407.   
  9408.   End Sub
  9409.  
  9410. End Type
  9411.  
  9412. Type ListViewPropsForm From Form
  9413.   Dim Label1 As New Label
  9414.   Dim txtIndex As New TextBox
  9415.   Dim Label2 As New Label
  9416.   Dim txtCaption As New TextBox
  9417.   Dim btnAddHdr As New Button
  9418.   Dim btnRemoveHdr As New Button
  9419.   Dim btnOK As New Button
  9420.   Dim btnPrev As New Button
  9421.   Dim font1 As New Font
  9422.   Dim btnNext As New Button
  9423.   Dim CurrentListView As ListView
  9424.   Dim Label3 As New Label
  9425.   Dim Label4 As New Label
  9426.   Dim cboSmall As New ObjectCombo
  9427.   Dim cboLarge As New ObjectCombo
  9428.   Dim btnSmallEdit As New Button
  9429.   Dim btnLargeEdit As New Button
  9430.   Dim btnSmallClear As New Button
  9431.   Dim btnLargeClear As New Button
  9432.   Dim btnSmallNew As New Button
  9433.   Dim btnLargeNew As New Button
  9434.   Dim Frame1 As New Frame
  9435.   Dim Frame2 As New Frame
  9436.   Dim Label5 As New Label
  9437.   Dim txtWidth As New TextBox
  9438.  
  9439.   ' METHODS for object: ListViewPropsForm
  9440.   Sub btnAddHdr_Click()
  9441.     Dim newHdr As Object
  9442.   
  9443.     newHdr = EmbedObject(CurrentListView, FindObject("ColumnHeader"), UniqueEmbedName(CurrentListView, "Hdr"))
  9444.     UpdateForIndex(newHdr.SubItemIndex)
  9445.     CurrentListView.Refresh
  9446.   End Sub
  9447.  
  9448.   Sub btnLargeClear_Click()
  9449.     cboLarge.SelObject = Nothing
  9450.     CurrentListView.LargeIcons = Nothing
  9451.   End Sub
  9452.  
  9453.   Sub btnLargeEdit_Click()
  9454.     If cboLarge.SelObject Then 
  9455.       ImageListBuilderForm.DoImageListProps(cboLarge.SelObject)
  9456.       CurrentListView.LargeIcons = cboLarge.SelObject
  9457.     End If
  9458.   End Sub
  9459.  
  9460.   Sub btnLargeNew_Click()
  9461.     cboLarge.SelObject = CreateNewImageList
  9462.     btnLargeEdit_Click
  9463.   End Sub
  9464.  
  9465.   Sub btnNext_Click()
  9466.     UpdateForIndex(Val(txtIndex.Text) + 1)
  9467.   End Sub
  9468.  
  9469.   Sub btnOK_Click()
  9470.     Dim h As ColumnHeader
  9471.   
  9472.     h = HeaderFromIndex(Val(txtIndex.Text))
  9473.     If h Then 
  9474.       h.Caption = txtCaption.Text
  9475.       h.Width = txtWidth.Text
  9476.     End If
  9477.     CurrentListView.SmallIcons = cboSmall.SelObject
  9478.     CurrentListView.LargeIcons = cboLarge.SelObject
  9479.     ModalResult IDOK
  9480.     Hide
  9481.   End Sub
  9482.  
  9483.   Sub btnPrev_Click()
  9484.     UpdateForIndex(Val(txtIndex.Text) - 1)
  9485.   End Sub
  9486.  
  9487.   Sub btnRemoveHdr_Click()
  9488.     Dim h As ColumnHeader
  9489.     Dim index As Integer
  9490.     index = Val(txtIndex.Text)
  9491.   
  9492.     h = HeaderFromIndex(index)
  9493.     If h Then 
  9494.       DestroyObject(h)
  9495.       If index <= 0 Then index = 1
  9496.       UpdateForIndex(index - 1)
  9497.       CurrentListView.Refresh
  9498.     End If
  9499.   
  9500.   End Sub
  9501.  
  9502.   Sub btnSmallClear_Click()
  9503.     cboSmall.SelObject = Nothing
  9504.     CurrentListView.SmallIcons = Nothing
  9505.   End Sub
  9506.  
  9507.   Sub btnSmallEdit_Click()
  9508.     If cboSmall.SelObject Then 
  9509.       ImageListBuilderForm.DoImageListProps(cboSmall.SelObject)
  9510.       CurrentListView.SmallIcons = cboSmall.SelObject
  9511.     End If
  9512.   End Sub
  9513.  
  9514.   Sub btnSmallNew_Click()
  9515.     cboSmall.SelObject = CreateNewImageList
  9516.     btnSmallEdit_Click
  9517.   End Sub
  9518.  
  9519.   Sub cboLarge_Click()
  9520.     CurrentListView.LargeIcons = cboLarge.SelObject
  9521.   End Sub
  9522.  
  9523.   Sub cboSmall_Click()
  9524.     CurrentListView.SmallIcons = cboSmall.SelObject
  9525.   End Sub
  9526.  
  9527.   Function CreateNewImageList() As Object
  9528.     Dim newImageList As Object
  9529.   
  9530.     ' embed a new image list into the current list view
  9531.     newImageList = EmbedObject(CurrentListView, FindObject("ImageList"), UniqueEmbedName(CurrentListView, "Img"))
  9532.   
  9533.     ' add it to our combo boxes
  9534.     cboSmall.AddItem(newImageList)
  9535.     cboLarge.AddItem(newImageList)
  9536.   
  9537.     CreateNewImageList = newImageList
  9538.   End Function
  9539.  
  9540.   Sub DoListViewProps(lv As ListView)
  9541.     CurrentListView = lv
  9542.     UpdateForIndex(0)
  9543.     PopulateCombos
  9544.     cboSmall.SelObject = CurrentListView.SmallIcons
  9545.     cboLarge.SelObject = CurrentListView.LargeIcons
  9546.     ShowModal
  9547.   End Sub
  9548.  
  9549.   Function HeaderFromIndex(index As Integer) As ColumnHeader
  9550.     dim h as ColumnHeader
  9551.   
  9552.     For Each h EmbeddedIn CurrentListView
  9553.   
  9554.       If h.SubItemIndex = index Then 
  9555.         HeaderFromIndex = h
  9556.         Exit For
  9557.       End If
  9558.   
  9559.     Next 
  9560.   
  9561.   End Function
  9562.  
  9563.   Sub PopulateCombos
  9564.     Dim name As String
  9565.     Dim i As Integer
  9566.   
  9567.     cboSmall.Clear
  9568.     cboLarge.Clear
  9569.   
  9570.     cboSmall.RootObject = FindObject("ImageList")
  9571.     cboLarge.RootObject = FindObject("ImageList")
  9572.   
  9573.   
  9574.     ' Filter out 'ImageList'
  9575.     For i = cboSmall.ListCount - 1 To 0 Step -1
  9576.       name = cboSmall.List(i)
  9577.       If name = "ImageList" Then 
  9578.         cboSmall.RemoveItem(i)
  9579.         cboLarge.RemoveItem(i)
  9580.         Exit For
  9581.       End If
  9582.     Next i
  9583.   End Sub
  9584.  
  9585.   Sub Preload()
  9586.     LoadForm
  9587.   End Sub
  9588.  
  9589.   Sub txtCaption_KeyUp(keyCode As Integer, ByVal shift As Integer)
  9590.     Dim h As ColumnHeader
  9591.     h = HeaderFromIndex(Val(txtIndex.Text))
  9592.     If h Then h.Caption = txtCaption.Text
  9593.   End Sub
  9594.  
  9595.   Sub txtWidth_KeyUp(keyCode As Integer, ByVal shift As Integer)
  9596.     Dim h As ColumnHeader
  9597.     h = HeaderFromIndex(Val(txtIndex.Text))
  9598.     If h Then h.Width = txtWidth.Text
  9599.   End Sub
  9600.  
  9601.   Sub UpdateForIndex(index As Integer)
  9602.     Dim h As ColumnHeader
  9603.     h = HeaderFromIndex(index)
  9604.     If h Then 
  9605.       txtIndex.Text = index
  9606.       txtCaption.Enabled = True
  9607.       txtCaption.Text = h.Caption
  9608.       txtWidth.Enabled = True
  9609.       txtWidth.Text = h.Width
  9610.   
  9611.       If index < CurrentListView.NumColumns - 1 Then 
  9612.         btnNext.Enabled = True
  9613.       Else 
  9614.         btnNext.Enabled = False
  9615.       End If
  9616.   
  9617.       If index = 0 Then 
  9618.         btnPrev.Enabled = False
  9619.       Else 
  9620.         btnPrev.Enabled = True
  9621.       End If
  9622.     Else 
  9623.       txtIndex.Text = ""
  9624.       txtCaption.Text = ""
  9625.       txtWidth.Text = ""
  9626.       txtCaption.Enabled = False
  9627.       txtWidth.Enabled = False
  9628.     End If
  9629.   
  9630.   
  9631.   End Sub
  9632.  
  9633. End Type
  9634.  
  9635. Type RegistryKey
  9636.   Dim key As Long
  9637.   Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
  9638.   Declare Function RegOpenKeyA Lib "advapi32" (ByVal hKey As Long, ByVal subKey As String, returnKey As Long) As Long
  9639.   Declare Function RegQueryValueA Lib "advapi32" (ByVal hKey As Long, ByVal subKey As String, ByVal value As String, valsiz As Long) As Long
  9640.   Dim path As String
  9641.   Dim enumcnt As Long
  9642.   Declare Function RegEnumKeyA Lib "advapi32" (ByVal hKey As Long, ByVal subKey As Long, ByVal name As String, ByVal namsiz As Long) As Long
  9643.  
  9644.   ' METHODS for object: RegistryKey
  9645.   Function Close() As Long
  9646.     Close = RegCloseKey(key)
  9647.   End Function
  9648.  
  9649.   Function NextKey(s as string) As Long
  9650.     s = Space(251)
  9651.     NextKey = RegEnumKeyA(key, enumcnt, s, 250)
  9652.     enumcnt = enumcnt + 1
  9653.   End Function
  9654.  
  9655.   Function  OpenClasses(skey as string) As Long
  9656.     dim k as long
  9657.     k = "0x80000000"
  9658.     path = skey
  9659.     OpenClasses = RegOpenKeyA(k, path, key)
  9660.   End Function
  9661.  
  9662.   Function  OpenMachine(skey as string) As Long
  9663.     dim k as long
  9664.     k = "0x80000002"
  9665.     path = skey
  9666.     OpenMachine = RegOpenKeyA(k, path, key)
  9667.   End Function
  9668.  
  9669.   Function  OpenUser(skey as string) As Long
  9670.     dim k as long
  9671.     k = "0x80000001"
  9672.     path = skey
  9673.     OpenUser = RegOpenKeyA(k, path, key)
  9674.   End Function
  9675.  
  9676.   Function  OpenUsers(skey as string) As Long
  9677.     dim k as long
  9678.     k = "0x80000003"
  9679.     path = skey
  9680.     OpenUsers = RegOpenKeyA(k, path, key)
  9681.   End Function
  9682.  
  9683.   Function Start(s as string) As Long
  9684.     enumcnt = 0
  9685.     Start = NextKey(s)
  9686.   End Function
  9687.  
  9688.   Function Value(path as string, v as string) As Long
  9689.     v = Space(251)
  9690.     Value = RegQueryValueA(key, path, v, 250)
  9691.   End Function
  9692.  
  9693. End Type
  9694.  
  9695. Type HashObjList From ListBox
  9696.   Dim HashObjs As New HashStringObject
  9697.   Dim selectedobj As Object
  9698.   Event SelectObj()
  9699.  
  9700.   ' METHODS for object: HashObjList
  9701.   Function AddObject(s as string, o as object) As Integer
  9702.     HashObjs.InsertKeyAndValue(s, o)
  9703.     AddObject = AddItem(s)
  9704.   End Function
  9705.  
  9706.   Sub Click()
  9707.     dim f as integer
  9708.     selectedobj = HashObjs.FindValue(Text, f)
  9709.     If f Then 
  9710.       SendEvent SelectObj
  9711.     End If
  9712.   End Sub
  9713.  
  9714.   Sub Empty()
  9715.     Clear
  9716.     HashObjs.Clear
  9717.     selectedobj = Nothing
  9718.   End Sub
  9719.  
  9720. End Type
  9721.  
  9722. Type OcxRegEntry
  9723.   Dim RegKey As String
  9724.   Dim ClassName As String
  9725.   Dim Tag As String
  9726.   Dim ResId As Integer
  9727.   Dim ControlName As String
  9728.   Dim BitmapFile As String
  9729.   Dim OcxFile As String
  9730.   Declare Function RegisterOcx Lib "eviui2.dll" Alias "_RegisterOcx" (ByVal s As String, ByVal r As Long) As Long
  9731.  
  9732.   ' METHODS for object: OcxRegEntry
  9733.   Sub AddOcx(r as RegistryKey, cid as string, lst as HashObjList)
  9734.     dim nocx as new OcxRegEntry
  9735.     dim spid,sfile,sicon,nn as string
  9736.     dim l as integer
  9737.     If r.Value(cid & "\Control", nocx.Tag) = 0 Then 
  9738.       spid = cid & "\ProgID"
  9739.       sicon = cid & "\ToolboxBitmap32"
  9740.       sfile = cid & "\InprocServer32"
  9741.       r.Value(spid, nocx.ClassName)
  9742.       r.Value(sicon, nocx.BitmapFile)
  9743.       r.Value(cid, nocx.Tag)
  9744.       r.Value(sfile, nocx.OcxFile)
  9745.       nocx.RegKey = "CLSID\" & cid
  9746.       l = Instr(nocx.BitmapFile, ", ")
  9747.       nocx.ResId = Val(Mid$(nocx.BitmapFile, l + 2))
  9748.       nocx.BitmapFile = Left$(nocx.BitmapFile, l - 1)
  9749.       l = Instr(nocx.ClassName, ".")
  9750.       nn = Mid$(nocx.ClassName, l + 1)
  9751.       l = Instr(nn, ".")
  9752.       If l > 0 Then 
  9753.         nn = Left$(nn, l - 1)
  9754.       End If
  9755.       nocx.ControlName = nn & "Ocx"
  9756.       lst.AddObject(nocx.Tag, nocx)
  9757.     End If
  9758.   End Sub
  9759.  
  9760.   Sub AddToPalette()
  9761.     dim ng as ToolGadget
  9762.     Dim nocx as Ocx
  9763.     Dim X as Integer
  9764.  
  9765.     ' Strip blanks from name
  9766.     Do While Instr(ControlName, " ")
  9767.       X = Instr(ControlName, " ")
  9768.       ControlName = Left$(ControlName, X - 1) & Mid$(ControlName, X + 1)
  9769.     Loop
  9770.  
  9771.     If FindEmbed(ControlTools.Palette, "GadOcx" & ControlName) Then 
  9772.        MessageBox.Message("Duplicate control error", "A control with the name, " & "GadOcx" & ControlName & ", is already on the Controls Palette")
  9773.     Else 
  9774.        ng = EmbedObject(ControlTools.Palette, ControlTools.Gadget, "GadOcx" & ControlName)
  9775.        ng.GadgetObject = ControlName
  9776.        nocx = CopyObject(Ocx, ControlName)
  9777.        nocx.OCXClassName = ClassName
  9778.        With ng.bitmap
  9779.          .LoadType = "ResourceBased"
  9780.          .FileName = BitmapFile
  9781.          .ResId = ResId
  9782.        End With
  9783.        ControlTools.Palette.ForceLayout(0)
  9784.     End If
  9785.   End Sub
  9786.  
  9787.   Sub Fill(lst as HashObjList)
  9788.     dim r as new RegistryKey
  9789.     dim s1,s2 as string
  9790.     r.OpenClasses("CLSID")
  9791.     If r.Start(s1) = 0 Then 
  9792.       While r.NextKey(s1) = 0
  9793.         AddOcx(r, s1, lst)
  9794.       Wend
  9795.     End If
  9796.     r.Close
  9797.   End Sub
  9798.  
  9799.   Function Register() As Integer
  9800.     OpenDialog.DefaultExtension = "ocx"
  9801.     OpenDialog.Filter = "OleCustomControl|*.ocx"
  9802.     If OpenDialog.Execute = IDOK Then
  9803.        MessageBox.style = 48
  9804.        If RegisterOcx(OpenDialog.FileName, 1) Then 
  9805.          MessageBox.Message("Ocx Registration", "Registration Succeeded")
  9806.          Register = -1
  9807.        Else 
  9808.          MessageBox.Message("Ocx Registration", "Registration Failed")
  9809.          Register = 0
  9810.        End If
  9811.     Else
  9812.       Register = 0
  9813.     End If
  9814.   End Function
  9815.  
  9816.   Sub RemoveFromPalette()
  9817.    Dim X as Integer
  9818.  
  9819.     ' Strip blanks from name
  9820.     Do While Instr(ControlName, " ")
  9821.       X = Instr(ControlName, " ")
  9822.       ControlName = Left$(ControlName, X - 1) & Mid$(ControlName, X + 1)
  9823.     Loop
  9824.  
  9825.     DestroyObject(FindObject(ControlName))
  9826.     DestroyObject(FindEmbed(ControlTools.Palette, "GadOcx" & ControlName))
  9827.     ControlTools.Palette.ForceLayout(0)
  9828.   End Sub
  9829.  
  9830.   Function Unregister(s as string) As Integer
  9831.     MessageBox.style = 48
  9832.     If RegisterOcx(s, 0) Then 
  9833.       MessageBox.Message("Ocx Registration", "Unregistration Succeeded")
  9834.       Unregister = -1
  9835.     Else 
  9836.       MessageBox.Message("Ocx Registration", "Unregistration Failed")
  9837.       Unregister = 0
  9838.     End If
  9839.   End Function
  9840.  
  9841. End Type
  9842.  
  9843. Type OcxTool From Form
  9844.   Dim OcxList As New HashObjList
  9845.   Dim TextBox1 As New TextBox
  9846.   Dim Image1 As New Image
  9847.   Dim Button3 As New Button
  9848.   Dim Button4 As New Button
  9849.   Dim TextBox2 As New TextBox
  9850.   Dim Button5 As New Button
  9851.   Dim Button6 As New Button
  9852.   Dim Frame1 As New Frame
  9853.   Dim Frame2 As New Frame
  9854.   Dim Frame3 As New Frame
  9855.   Dim Frame4 As New Frame
  9856.   Dim PaletteGroup As New Group
  9857.   Dim RegisterGroup As New Group
  9858.   Type TabStrip1 From TabStrip
  9859.     Dim AutoTab1 As New TabStripTab
  9860.     Dim AutoTab2 As New TabStripTab
  9861.  
  9862.     ' METHODS for object: OcxTool.TabStrip1
  9863.     Sub AutoTab1_Click()
  9864.       If OcxTool.RegisterGroup(0).Visible = False Then OcxTool.ToggleControls
  9865.     End Sub
  9866.  
  9867.     Sub AutoTab2_Click()
  9868.       If OcxTool.RegisterGroup(0).Visible = True Then OcxTool.ToggleControls
  9869.     End Sub
  9870.  
  9871.   End Type
  9872.  
  9873.   ' METHODS for object: OcxTool
  9874.   Sub Resize()
  9875.     Dim LTop as single
  9876.     ScaleMode = 3 ' Pixels
  9877.  
  9878.     ' Ensure that we have minimum size
  9879.     If (ScaleHeight < 175) Then 
  9880.       Height = 210 * Screen.TwipsPerPixelY
  9881.  
  9882.       ' The Height will cause another resize, so Exit Sub to avoid redundance
  9883.       Exit Sub
  9884.     End If
  9885.     If (ScaleWidth < 335) Then 
  9886.       Width = 345 * Screen.TwipsPerPixelX
  9887.  
  9888.       ' Ditto
  9889.       Exit Sub
  9890.     End If
  9891.  
  9892.     ' The Actual Resize Stuff
  9893.     TabStrip1.Move(10, 10, ScaleWidth - 20, ScaleHeight - 20)
  9894.     Frame4.Move(20, 40, ScaleWidth - 40, ScaleHeight - 130)
  9895.     LTop = Frame4.Top + Frame4.Height
  9896.     Frame1.Move(20, LTop, ScaleWidth - 40, 70)
  9897.     Frame2.Move(20, LTop, ScaleWidth - 160, 70)
  9898.     Frame3.Move(ScaleWidth - 140, LTop, 120, 70)
  9899.     OcxList.Move(30, 60, ScaleWidth - 60, ScaleHeight - 150)
  9900.     Image1.Move(Frame2.Left + Frame2.Width - 40, Frame2.Top + 24, 30, 30)
  9901.     TextBox1.Move(30, Frame2.Top + 20, Image1.Left - 40, 40)
  9902.     Button3.Move(Frame3.Left + 10, Frame3.Top + 20, 100, 20)
  9903.     Button4.Move(Frame3.Left + 10, Frame3.Top + 40, 100, 20)
  9904.     Button5.Move(Frame1.Left + Frame1.Width - 10 - 80, Frame1.Top + 20, 80, 20)
  9905.     Button6.Move(Button5.Left, Button5.Top + 20, 80, 20)
  9906.     TextBox2.Move(30, Frame2.Top + 20, Button5.Left - 40, Frame1.Height - 30)
  9907.     Refresh
  9908.   End Sub
  9909.  
  9910.   Sub Button1_Click()
  9911.     OcxRegEntry.Fill(OcxList)
  9912.   End Sub
  9913.  
  9914.   Sub Button2_Click()
  9915.     OcxList.Empty
  9916.     Image1.Picture = Nothing
  9917.     TextBox1.Text = ""
  9918.     TextBox2.Text = ""
  9919.   End Sub
  9920.  
  9921.   Sub Button3_Click()
  9922.     If OcxList.selectedobj <> Nothing Then 
  9923.       OcxList.selectedobj.AddToPalette
  9924.     End If
  9925.   End Sub
  9926.  
  9927.   Sub Button4_Click()
  9928.     If OcxList.selectedobj <> Nothing Then 
  9929.       OcxList.selectedobj.RemoveFromPalette
  9930.     End If
  9931.   End Sub
  9932.  
  9933.   Sub Button5_Click()
  9934.     If OcxRegEntry.Register Then 
  9935.       Button2_Click
  9936.       OcxRegEntry.Fill(OcxList)
  9937.     End If
  9938.   End Sub
  9939.  
  9940.   Sub Button6_Click()
  9941.     If OcxRegEntry.Unregister(TextBox2.Text) Then 
  9942.       Button2_Click
  9943.       OcxRegEntry.Fill(OcxList)
  9944.     End If
  9945.   End Sub
  9946.  
  9947.   Sub Load()
  9948.     OcxRegEntry.Fill(OcxList)
  9949.     TextBox1.Text = ""
  9950.     TextBox2.Text = ""
  9951.   End Sub
  9952.  
  9953.   Sub OcxList_SelectObj()
  9954.     Dim hocx as OcxRegEntry
  9955.     Dim bm as new Bitmap
  9956.     hocx = OcxList.selectedobj
  9957.     If hocx <> Nothing Then 
  9958.       TextBox1.Text = hocx.ClassName
  9959.       TextBox2.Text = hocx.OcxFile
  9960.       With bm
  9961.         .LoadType = "ResourceBased"
  9962.         .FileName = hocx.BitmapFile
  9963.         .ResId = hocx.ResId
  9964.       End With
  9965.       Image1.Picture = bm
  9966.       Image1.Refresh
  9967.     End If
  9968.   End Sub
  9969.  
  9970.   Sub ToggleControls
  9971.     Dim o as Control
  9972.     Dim PalOn as Boolean
  9973.     ' PalOn represents if the PaletteGroup is visible at the beginning
  9974.     ' of the method
  9975.     PalOn = PaletteGroup(0).Visible
  9976.     For Each o In PaletteGroup
  9977.       o.Visible = Not PalOn
  9978.     Next o
  9979.     For Each o In RegisterGroup
  9980.       o.Visible = PalOn
  9981.     Next o
  9982.   End Sub
  9983.  
  9984. End Type
  9985.  
  9986. Begin Code
  9987. ' Reconstruction commands for object: SampleMasterFormHelpMenu
  9988. '
  9989.   With SampleMasterFormHelpMenu
  9990.  
  9991.     .InsertItem("HelpContents", "&Contents", -1)
  9992.   End With  'SampleMasterFormHelpMenu
  9993. ' Reconstruction commands for object: Envelop
  9994. '
  9995.   With Envelop
  9996.     .ModulePath := "base.ebo;win32.ebo;dialogs.ebo;tools.ebo;database.ebo;dbtools.ebo;options.ebo;envelop.ebo;evhelp.ebo"
  9997.     .MainForm := EnvelopForm
  9998.     .Path := "D:\ENVELOP\PROGRAM\"
  9999.     .EXEName := "ENVELOP"
  10000.     .SplashFileName := "evsplash.bmp"
  10001.     With .Help
  10002.       .FileName := "D:\ENVELOP\PROGRAM\..\help\envelop.hlp"
  10003.       .IsShowing := -1
  10004.     End With  'Envelop.Help
  10005.     With .EBOOpen
  10006.       .FileName := "W:\source\envelop\loadtest.eto"
  10007.       .Filter := "Envelop binary (*.ebo)|*.ebo|Envelop text (*.eto)|*.eto|Envelop temp (ebo*.tmp)|ebo*.tmp|All files (*.*)|*.*|"
  10008.       .FilterIndex := 2
  10009.       .NoChangeDir := False
  10010.     End With  'Envelop.EBOOpen
  10011.     With .ETOOpen
  10012.       .FileName := "D:\envelop\My God, we're caught in quicksand.eto"
  10013.       .Filter := "Envelop text (*.eto)|*.eto|Text files (*.txt)|*.txt|All files (*.*)|*.*|"
  10014.       .FilterIndex := 1
  10015.     End With  'Envelop.ETOOpen
  10016.     With .SADlg
  10017.       .Title := "Save Module As"
  10018.       .FileName := "W:\SOURCE\ENVELOP\envelop.eto"
  10019.       .Filter := "Envelop binary (*.ebo)"
  10020.       .FilterIndex := 2
  10021.       .InitialDir := "D:\envelop\"
  10022.       .NoChangeDir := True
  10023.     End With  'Envelop.SADlg
  10024.   End With  'Envelop
  10025. ' Reconstruction commands for object: ProjectStartupOptionsDialog
  10026. '
  10027.   With ProjectStartupOptionsDialog
  10028.     .Caption := "Startup Options"
  10029.     .Move(3660, 3372, 4956, 2460)
  10030.     .DefaultButton := ProjectStartupOptionsDialog.BtnOK
  10031.     .CancelButton := ProjectStartupOptionsDialog.BtnCancel
  10032.     .MaxButton := False
  10033.     With .BtnOK
  10034.       .Caption := "OK"
  10035.       .ZOrder := 7
  10036.       .Move(3840, 60, 960, 360)
  10037.     End With  'ProjectStartupOptionsDialog.BtnOK
  10038.     With .BtnCancel
  10039.       .Caption := "Cancel"
  10040.       .ZOrder := 8
  10041.       .Move(3840, 480, 960, 360)
  10042.     End With  'ProjectStartupOptionsDialog.BtnCancel
  10043.     With .OptDefaultProj
  10044.       .Caption := "Start with automatic default project"
  10045.       .ZOrder := 2
  10046.       .Move(60, 60, 3720, 300)
  10047.       .TabGroup := True
  10048.     End With  'ProjectStartupOptionsDialog.OptDefaultProj
  10049.     With .OptShowDialog
  10050.       .Caption := "Display project startup dialog"
  10051.       .ZOrder := 3
  10052.       .Move(60, 480, 3720, 300)
  10053.     End With  'ProjectStartupOptionsDialog.OptShowDialog
  10054.     With .OptNewProj
  10055.       .Caption := "Configure new project"
  10056.       .ZOrder := 4
  10057.       .Move(60, 900, 3720, 300)
  10058.     End With  'ProjectStartupOptionsDialog.OptNewProj
  10059.     With .OptOpenProj
  10060.       .Caption := "Browse for existing project"
  10061.       .ZOrder := 5
  10062.       .Move(60, 1320, 3720, 300)
  10063.     End With  'ProjectStartupOptionsDialog.OptOpenProj
  10064.     With .OptNoProj
  10065.       .Caption := "Start with no project"
  10066.       .ZOrder := 6
  10067.       .Move(60, 1740, 3720, 300)
  10068.     End With  'ProjectStartupOptionsDialog.OptNoProj
  10069.   End With  'ProjectStartupOptionsDialog
  10070. ' Reconstruction commands for object: GadgetConfigWizard
  10071. '
  10072.   With GadgetConfigWizard
  10073.     .title_ := "Configure Tool Gadget"
  10074.     .Title := "Configure Tool Gadget"
  10075.     .GraphicFileName := "envelop.ero"
  10076.     .FirstStep := GadgetConfigWizard.ToolName
  10077.     .LastStep := GadgetConfigWizard.ToolBitmap
  10078.     With .ToolName
  10079.       .Caption := "Configure Tool Gadget"
  10080.       .Move(4860, 4770, 7155, 4815)
  10081.       .DefaultButton := GadgetConfigWizard.ToolName.BtnNext
  10082.       .CancelButton := GadgetConfigWizard.ToolName.BtnCancel
  10083.       .wizard := GadgetConfigWizard
  10084.       .NextStep := GadgetConfigWizard.ToolHintText
  10085.       .initialized := -1
  10086.       With .TBName
  10087.         .ZOrder := 1
  10088.         .Move(2850, 1350, 4050, 300)
  10089.       End With  'GadgetConfigWizard.ToolName.TBName
  10090.       With .BtnFinish
  10091.         .ZOrder := 5
  10092.         .Move(6225, 4050, 825, 300)
  10093.       End With  'GadgetConfigWizard.ToolName.BtnFinish
  10094.       With .BtnNext
  10095.         .ZOrder := 4
  10096.         .Move(5325, 4050, 825, 300)
  10097.       End With  'GadgetConfigWizard.ToolName.BtnNext
  10098.       With .BtnBack
  10099.         .Enabled := False
  10100.         .ZOrder := 3
  10101.         .Move(4500, 4050, 825, 300)
  10102.       End With  'GadgetConfigWizard.ToolName.BtnBack
  10103.       With .BtnCancel
  10104.         .ZOrder := 2
  10105.         .Move(3600, 4050, 825, 300)
  10106.       End With  'GadgetConfigWizard.ToolName.BtnCancel
  10107.       With .ImgGraphic
  10108.         .ZOrder := 8
  10109.         .Move(225, 225, 2475, 3150)
  10110.         .Picture := GadgetConfigWizard.Bitmap
  10111.       End With  'GadgetConfigWizard.ToolName.ImgGraphic
  10112.       With .LblInstruction
  10113.         .Caption := "Enter a Name for the ToolGadget."
  10114.         .ZOrder := 7
  10115.         .Move(2850, 300, 4125, 375)
  10116.       End With  'GadgetConfigWizard.ToolName.LblInstruction
  10117.       With .Frame1
  10118.         .ZOrder := 6
  10119.         .Move(75, 3825, 6975, 75)
  10120.       End With  'GadgetConfigWizard.ToolName.Frame1
  10121.     End With  'GadgetConfigWizard.ToolName
  10122.     With .ToolHintText
  10123.       .Caption := "Configure Tool Gadget"
  10124.       .Move(4860, 4770, 7155, 4815)
  10125.       .DefaultButton := GadgetConfigWizard.ToolHintText.BtnNext
  10126.       .CancelButton := Nothing
  10127.       .wizard := GadgetConfigWizard
  10128.       .NextStep := GadgetConfigWizard.ToolBitmap
  10129.       .BackStep := GadgetConfigWizard.ToolName
  10130.       With .TBHintText
  10131.         .ZOrder := 1
  10132.         .Move(2850, 1200, 4050, 600)
  10133.       End With  'GadgetConfigWizard.ToolHintText.TBHintText
  10134.       With .BtnFinish
  10135.         .ZOrder := 5
  10136.         .Move(6225, 4050, 825, 300)
  10137.       End With  'GadgetConfigWizard.ToolHintText.BtnFinish
  10138.       With .BtnNext
  10139.         .ZOrder := 4
  10140.         .Move(5325, 4050, 825, 300)
  10141.       End With  'GadgetConfigWizard.ToolHintText.BtnNext
  10142.       With .BtnBack
  10143.         .ZOrder := 3
  10144.         .Move(4500, 4050, 825, 300)
  10145.       End With  'GadgetConfigWizard.ToolHintText.BtnBack
  10146.       With .BtnCancel
  10147.         .ZOrder := 2
  10148.         .Move(3600, 4050, 825, 300)
  10149.       End With  'GadgetConfigWizard.ToolHintText.BtnCancel
  10150.       With .ImgGraphic
  10151.         .ZOrder := 8
  10152.         .Move(225, 225, 2475, 3150)
  10153.         .Picture := GadgetConfigWizard.Bitmap
  10154.       End With  'GadgetConfigWizard.ToolHintText.ImgGraphic
  10155.       With .LblInstruction
  10156.         .Caption := "Enter a HintText for the ToolGadget."
  10157.         .ZOrder := 7
  10158.         .Move(2850, 300, 4125, 300)
  10159.       End With  'GadgetConfigWizard.ToolHintText.LblInstruction
  10160.       With .Frame1
  10161.         .ZOrder := 6
  10162.         .Move(75, 3825, 6975, 75)
  10163.       End With  'GadgetConfigWizard.ToolHintText.Frame1
  10164.     End With  'GadgetConfigWizard.ToolHintText
  10165.     With .ToolBitmap
  10166.       .Caption := "Configure Tool Gadget"
  10167.       .Move(4860, 4770, 7155, 4815)
  10168.       .DefaultButton := GadgetConfigWizard.ToolBitmap.BtnFinish
  10169.       .CancelButton := Nothing
  10170.       .wizard := GadgetConfigWizard
  10171.       .BackStep := GadgetConfigWizard.ToolHintText
  10172.       With .LblBitmap
  10173.         .Caption := "Picture file:"
  10174.         .ZOrder := 5
  10175.         .Move(2850, 825, 1500, 225)
  10176.       End With  'GadgetConfigWizard.ToolBitmap.LblBitmap
  10177.       With .TBBitmap
  10178.         .Caption := "TBBitmap"
  10179.         .ZOrder := 4
  10180.         .Move(2850, 1125, 4050, 450)
  10181.       End With  'GadgetConfigWizard.ToolBitmap.TBBitmap
  10182.       With .BTNBrowse
  10183.         .Caption := "Browse..."
  10184.         .ZOrder := 3
  10185.         .Move(2850, 1725, 1050, 375)
  10186.       End With  'GadgetConfigWizard.ToolBitmap.BTNBrowse
  10187.       With .SampleBox
  10188.         .Caption := "SampleBox"
  10189.         .ZOrder := 2
  10190.         .Move(4785, 2835, 240, 240)
  10191.         .Visible := True
  10192.         With .PreviewTool
  10193.           .Position := 1
  10194.           .HintText := "New Object"
  10195.           With .bitmap
  10196.             .FileName := "envelop.ero"
  10197.             .ResId := 0
  10198.           End With  'GadgetConfigWizard.ToolBitmap.SampleBox.PreviewTool.bitmap
  10199.         End With  'GadgetConfigWizard.ToolBitmap.SampleBox.PreviewTool
  10200.       End With  'GadgetConfigWizard.ToolBitmap.SampleBox
  10201.       With .BTNPreview
  10202.         .Caption := "Preview"
  10203.         .ZOrder := 1
  10204.         .Move(5625, 1725, 1200, 375)
  10205.       End With  'GadgetConfigWizard.ToolBitmap.BTNPreview
  10206.       With .BtnFinish
  10207.         .ZOrder := 9
  10208.         .Move(6225, 4050, 825, 300)
  10209.       End With  'GadgetConfigWizard.ToolBitmap.BtnFinish
  10210.       With .BtnNext
  10211.         .Enabled := False
  10212.         .ZOrder := 8
  10213.         .Move(5325, 4050, 825, 300)
  10214.       End With  'GadgetConfigWizard.ToolBitmap.BtnNext
  10215.       With .BtnBack
  10216.         .ZOrder := 7
  10217.         .Move(4500, 4050, 825, 300)
  10218.       End With  'GadgetConfigWizard.ToolBitmap.BtnBack
  10219.       With .BtnCancel
  10220.         .ZOrder := 6
  10221.         .Move(3600, 4050, 825, 300)
  10222.       End With  'GadgetConfigWizard.ToolBitmap.BtnCancel
  10223.       With .ImgGraphic
  10224.         .ZOrder := 12
  10225.         .Move(225, 225, 2475, 3150)
  10226.         .Picture := GadgetConfigWizard.Bitmap
  10227.       End With  'GadgetConfigWizard.ToolBitmap.ImgGraphic
  10228.       With .LblInstruction
  10229.         .Caption := "Type a FileName for the bitmap or the ToolGadget, or press Browse..."
  10230.         .ZOrder := 11
  10231.         .Move(2850, 300, 4125, 450)
  10232.       End With  'GadgetConfigWizard.ToolBitmap.LblInstruction
  10233.       With .Frame1
  10234.         .ZOrder := 10
  10235.         .Move(75, 3825, 6975, 75)
  10236.       End With  'GadgetConfigWizard.ToolBitmap.Frame1
  10237.     End With  'GadgetConfigWizard.ToolBitmap
  10238.     With .TempGadget
  10239.       .HintText := "New Object"
  10240.       .PsuedoName := "NewObject"
  10241.       With .bitmap
  10242.         .FileName := "envelop.ero"
  10243.         .ResId := 244
  10244.       End With  'GadgetConfigWizard.TempGadget.bitmap
  10245.     End With  'GadgetConfigWizard.TempGadget
  10246.     With .BlankBitmap
  10247.       .LoadType := "MemoryBased"
  10248.       .FileName := "envelop.ero"
  10249.       .ResId := 488
  10250.     End With  'GadgetConfigWizard.BlankBitmap
  10251.     With .Bitmap
  10252.       .LoadType := "MemoryBased"
  10253.       .FileName := "envelop.ero"
  10254.       .ResId := 880
  10255.     End With  'GadgetConfigWizard.Bitmap
  10256.   End With  'GadgetConfigWizard
  10257. ' Reconstruction commands for object: ObjectEditor
  10258. '
  10259.   With ObjectEditor
  10260.     .Enabled := True
  10261.   End With  'ObjectEditor
  10262. ' Reconstruction commands for object: MethodEditor
  10263. '
  10264.   With MethodEditor
  10265.     .AnimateDelay := 100
  10266.     .HighlightSyntax := True
  10267.     .BackColor := 16777215
  10268.     .ForeColor := 0
  10269.     .ColorNextStmtFG := 16777215
  10270.     .ColorNextStmtBG := 32768
  10271.     .ColorEnabledBreakFG := 16777215
  10272.     .ColorEnabledBreakBG := 255
  10273.     .ColorDisabledBreakFG := 16777215
  10274.     .ColorDisabledBreakBG := 128
  10275.     .ColorCommentFG := 32768
  10276.     .ColorCommentBG := -1
  10277.     .ColorKeywordFG := 8388608
  10278.     .ColorKeywordBG := -1
  10279.     .ColorIdentifierFG := -1
  10280.     .ColorIdentifierBG := -1
  10281.     .ColorStringFG := -1
  10282.     .ColorStringBG := -1
  10283.     .ColorIntegerFG := -1
  10284.     .ColorIntegerBG := -1
  10285.     .ColorFloatFG := -1
  10286.     .ColorFloatBG := -1
  10287.     .ColorOctalFG := -1
  10288.     .ColorOctalBG := -1
  10289.     .ColorHexFG := -1
  10290.     .ColorHexBG := -1
  10291.     .ColorOperatorFG := -1
  10292.     .ColorOperatorBG := -1
  10293.   End With  'MethodEditor
  10294. ' Reconstruction commands for object: ObjectEditorMgr
  10295. '
  10296.   With ObjectEditorMgr
  10297.     .UndoLimit := 5
  10298.     .RedoLimit := 5
  10299.   End With  'ObjectEditorMgr
  10300. ' Reconstruction commands for object: SamplesBrowser
  10301. '
  10302.   With SamplesBrowser
  10303.     .Caption := "Samples Browser"
  10304.     .Font := EnvelopFont
  10305.     .Move(4065, 1815, 6570, 6720)
  10306.     .AccelForm := EnvelopForm
  10307.     .CurrentSampleModule := Nothing
  10308.     .CurrentSecondModule := Nothing
  10309.     .DirBasicTraining := "W:\BIN\..\bootcamp\basic"
  10310.     .DirAdvancedTraining := "W:\BIN\..\bootcamp\advanced"
  10311.     .DirConceptsTraining := "W:\BIN\..\bootcamp\concepts"
  10312.     .DirComponents := "W:\BIN\..\arsenal\parts"
  10313.     .DirApplications := "W:\BIN\..\arsenal\apps"
  10314.     .DirTools := "W:\BIN\..\arsenal\tools"
  10315.     .ScanCategory := ""
  10316.     .initializing := 0
  10317.     .PopulateMasterListPunchOut := 0
  10318.     With .ChkBasicTraining
  10319.       .Caption := "Basic Training"
  10320.       .ZOrder := 2
  10321.       .Move(2250, 150, 1980, 225)
  10322.     End With  'SamplesBrowser.ChkBasicTraining
  10323.     With .ChkAdvancedTraining
  10324.       .Caption := "Advanced Training"
  10325.       .ZOrder := 3
  10326.       .Move(2250, 450, 1980, 225)
  10327.     End With  'SamplesBrowser.ChkAdvancedTraining
  10328.     With .ChkConceptsTraining
  10329.       .Caption := "Concepts Training"
  10330.       .ZOrder := 4
  10331.       .Move(2250, 750, 1980, 165)
  10332.     End With  'SamplesBrowser.ChkConceptsTraining
  10333.     With .ChkComponents
  10334.       .Caption := "Components"
  10335.       .ZOrder := 5
  10336.       .Move(4650, 150, 1500, 225)
  10337.     End With  'SamplesBrowser.ChkComponents
  10338.     With .ChkApplications
  10339.       .Caption := "Applications"
  10340.       .ZOrder := 6
  10341.       .Move(4650, 450, 1500, 225)
  10342.     End With  'SamplesBrowser.ChkApplications
  10343.     With .ChkTools
  10344.       .Caption := "Tools"
  10345.       .ZOrder := 7
  10346.       .Move(4650, 750, 1500, 165)
  10347.     End With  'SamplesBrowser.ChkTools
  10348.     With .ChkKeywordSearch
  10349.       .Caption := "Search by keyword"
  10350.       .ZOrder := 8
  10351.       .Move(150, 1050, 2385, 300)
  10352.     End With  'SamplesBrowser.ChkKeywordSearch
  10353.     With .Label1
  10354.       .Caption := "Type a word, or select one from the list. Then choose Show Topics."
  10355.       .ForeColor := 16711680
  10356.       .ZOrder := 9
  10357.       .Move(705, 1425, 3960, 450)
  10358.     End With  'SamplesBrowser.Label1
  10359.     With .TxtKeySearch
  10360.       .Enabled := False
  10361.       .ZOrder := 10
  10362.       .Move(735, 1980, 3885, 345)
  10363.     End With  'SamplesBrowser.TxtKeySearch
  10364.     With .BtnShowTopics
  10365.       .Caption := "Show Topics"
  10366.       .Enabled := False
  10367.       .ZOrder := 11
  10368.       .Move(4950, 1950, 1350, 345)
  10369.     End With  'SamplesBrowser.BtnShowTopics
  10370.     With .LstKeywords
  10371.       .Caption := "LstKeywords"
  10372.       .Enabled := False
  10373.       .ZOrder := 12
  10374.       .Move(900, 2400, 5400, 1200)
  10375.     End With  'SamplesBrowser.LstKeywords
  10376.     With .Label2
  10377.       .Caption := "Select topic then choose Load Sample or Help."
  10378.       .ForeColor := 16711680
  10379.       .ZOrder := 13
  10380.       .Move(150, 3960, 4575, 270)
  10381.     End With  'SamplesBrowser.Label2
  10382.     With .BtnLoadSample
  10383.       .Caption := "Load Sample"
  10384.       .ZOrder := 14
  10385.       .Move(4950, 3900, 1380, 345)
  10386.     End With  'SamplesBrowser.BtnLoadSample
  10387.     With .BtnHelp
  10388.       .Caption := "Help"
  10389.       .Enabled := False
  10390.       .ZOrder := 15
  10391.       .Move(4950, 4350, 1380, 345)
  10392.     End With  'SamplesBrowser.BtnHelp
  10393.     With .LstTopics
  10394.       .Caption := "LstTopics"
  10395.       .ZOrder := 16
  10396.       .Move(150, 4770, 6150, 1200)
  10397.     End With  'SamplesBrowser.LstTopics
  10398.     With .LstSearchMaster
  10399.       .ZOrder := 17
  10400.       .Move(0, 0, 30, 30)
  10401.       .Visible := False
  10402.     End With  'SamplesBrowser.LstSearchMaster
  10403.     With .LstSampleNameIndex
  10404.       .ZOrder := 18
  10405.       .Move(0, 0, 705, 30)
  10406.       .Visible := False
  10407.     End With  'SamplesBrowser.LstSampleNameIndex
  10408.     With .LblTopics
  10409.       .Caption := "<category>:<sample>"
  10410.       .ZOrder := 19
  10411.       .Move(150, 4455, 3900, 240)
  10412.     End With  'SamplesBrowser.LblTopics
  10413.     With .helpfile
  10414.     End With  'SamplesBrowser.helpfile
  10415.     With .BtnUpdate
  10416.       .Caption := "Update"
  10417.       .Enabled := False
  10418.       .ZOrder := 1
  10419.       .Move(150, 150, 1350, 345)
  10420.     End With  'SamplesBrowser.BtnUpdate
  10421.   End With  'SamplesBrowser
  10422. ' Reconstruction commands for object: MenuSelector
  10423. '
  10424.   With MenuSelector
  10425.     .Caption := "Select Menu"
  10426.     .Font := DefaultDialogFont
  10427.     .Move(5160, 2295, 5340, 2295)
  10428.     .DefaultButton := MenuSelector.btnOK
  10429.     With .Label1
  10430.       .Caption := "Select the menu or menubar to modify"
  10431.       .ZOrder := 7
  10432.       .Move(150, 150, 4050, 300)
  10433.     End With  'MenuSelector.Label1
  10434.     With .btnOK
  10435.       .Caption := "OK"
  10436.       .ZOrder := 6
  10437.       .Move(4260, 150, 900, 345)
  10438.     End With  'MenuSelector.btnOK
  10439.     With .btnCancel
  10440.       .Caption := "Cancel"
  10441.       .ZOrder := 5
  10442.       .Move(4260, 600, 900, 345)
  10443.     End With  'MenuSelector.btnCancel
  10444.     With .Label2
  10445.       .Caption := "Menu Type:"
  10446.       .ZOrder := 4
  10447.       .Move(150, 600, 1050, 300)
  10448.     End With  'MenuSelector.Label2
  10449.     With .optMbar
  10450.       .Caption := "Menubar"
  10451.       .ZOrder := 2
  10452.       .Move(1350, 600, 1800, 300)
  10453.       .TabStop := True
  10454.     End With  'MenuSelector.optMbar
  10455.     With .optPopup
  10456.       .Caption := "Popup"
  10457.       .ZOrder := 3
  10458.       .Move(1350, 975, 1800, 300)
  10459.     End With  'MenuSelector.optPopup
  10460.     With .cboMenus
  10461.       .ZOrder := 1
  10462.       .Move(150, 1425, 4920, 315)
  10463.       .ShowEmbeds := True
  10464.     End With  'MenuSelector.cboMenus
  10465.   End With  'MenuSelector
  10466. ' Reconstruction commands for object: EnvelopFont
  10467. '
  10468.   With EnvelopFont
  10469.     .FaceName := "MS Sans Serif"
  10470.     .Size := 8.000000
  10471.     .Bold := True
  10472.     .Italic := False
  10473.     .Strikethru := False
  10474.   End With  'EnvelopFont
  10475. ' Reconstruction commands for object: ProjectAndModuleView
  10476. '
  10477.   With ProjectAndModuleView
  10478.     .BackColor := 12632256
  10479.     .DragMode := "LeftMouse"
  10480.     .Move(-15, 376, 3570, 6165)
  10481.     .Visible := False
  10482.     .IconBitmap := ProjectAndModuleView.bitmap
  10483.     .kIconProject := 0
  10484.     .kIconModule := 4
  10485.     .kIconObject := 8
  10486.     .kLevelProject := 0
  10487.     .kLevelModule := 0
  10488.     .kLevelObject := 0
  10489.     With .bitmap
  10490.       .LoadType := "MemoryBased"
  10491.       .FileName := "envelop.ero"
  10492.       .ResId := 2588
  10493.     End With  'ProjectAndModuleView.bitmap
  10494.   End With  'ProjectAndModuleView
  10495. ' Reconstruction commands for object: Debug
  10496. '
  10497.   With Debug
  10498.   End With  'Debug
  10499. ' Reconstruction commands for object: SourceIterator
  10500. '
  10501.   With SourceIterator
  10502.     .CurObject := Nothing
  10503.     .CurMethod := ""
  10504.     .HitStart := -1
  10505.     .SearchPattern := ""
  10506.   End With  'SourceIterator
  10507. ' Reconstruction commands for object: ApplicationEditor
  10508. '
  10509.   With ApplicationEditor
  10510.     With .form
  10511.       .Caption := "Application: Application1"
  10512.       .Font := EnvelopFont
  10513.       .Move(3735, 3480, 5550, 3495)
  10514.       .KeyPreview := True
  10515.       .AccelForm := EnvelopForm
  10516.       With .LblApp
  10517.         .Caption := "Application:"
  10518.         .ZOrder := 2
  10519.         .Move(60, 105, 1095, 270)
  10520.         .Alignment := "Right"
  10521.       End With  'ApplicationEditor.form.LblApp
  10522.       With .CBApps
  10523.         .ZOrder := 3
  10524.         .Move(1215, 60, 2250, 300)
  10525.         .RootObject := Application
  10526.         .Style := "Tree"
  10527.       End With  'ApplicationEditor.form.CBApps
  10528.       With .BtnNewApp
  10529.         .Caption := "&New Application..."
  10530.         .ZOrder := 4
  10531.         .Move(3585, 45, 1785, 330)
  10532.       End With  'ApplicationEditor.form.BtnNewApp
  10533.       With .LblMainForm
  10534.         .Caption := "Main form:"
  10535.         .ZOrder := 5
  10536.         .Move(60, 465, 1095, 270)
  10537.         .Alignment := "Right"
  10538.       End With  'ApplicationEditor.form.LblMainForm
  10539.       With .CBForms
  10540.         .ZOrder := 6
  10541.         .Move(1215, 420, 2250, 300)
  10542.         .RootObject := Form
  10543.         .Style := "Tree"
  10544.       End With  'ApplicationEditor.form.CBForms
  10545.       With .LblEXE
  10546.         .Caption := "EXE file:"
  10547.         .ZOrder := 7
  10548.         .Move(60, 855, 1095, 270)
  10549.         .Alignment := "Right"
  10550.       End With  'ApplicationEditor.form.LblEXE
  10551.       With .TEEXE
  10552.         .ZOrder := 8
  10553.         .Move(1215, 810, 2250, 300)
  10554.       End With  'ApplicationEditor.form.TEEXE
  10555.       With .BtnBrowseEXE
  10556.         .Caption := "Browse EXE..."
  10557.         .ZOrder := 9
  10558.         .Move(3585, 795, 1785, 330)
  10559.       End With  'ApplicationEditor.form.BtnBrowseEXE
  10560.       With .LblSplash
  10561.         .Caption := "Splash file:"
  10562.         .ZOrder := 10
  10563.         .Move(60, 1245, 1095, 270)
  10564.         .Alignment := "Right"
  10565.       End With  'ApplicationEditor.form.LblSplash
  10566.       With .TESplash
  10567.         .ZOrder := 11
  10568.         .Move(1215, 1200, 2250, 300)
  10569.       End With  'ApplicationEditor.form.TESplash
  10570.       With .BtnBrowseSplash
  10571.         .Caption := "Browse splash..."
  10572.         .ZOrder := 12
  10573.         .Move(3585, 1185, 1785, 330)
  10574.       End With  'ApplicationEditor.form.BtnBrowseSplash
  10575.       With .LblModules
  10576.         .Caption := "Modules:"
  10577.         .ZOrder := 13
  10578.         .Move(60, 1620, 1095, 270)
  10579.         .Alignment := "Right"
  10580.       End With  'ApplicationEditor.form.LblModules
  10581.       With .LstModules
  10582.         .ZOrder := 14
  10583.         .Move(1215, 1620, 2250, 1395)
  10584.         .Sorted := False
  10585.       End With  'ApplicationEditor.form.LstModules
  10586.       With .BtnWriteEXE
  10587.         .Caption := "Write EXE"
  10588.         .ZOrder := 15
  10589.         .Move(3585, 2700, 1785, 330)
  10590.       End With  'ApplicationEditor.form.BtnWriteEXE
  10591.       With .ChkNoMainForm
  10592.         .Caption := "No main form"
  10593.         .ZOrder := 16
  10594.         .Move(3585, 435, 1800, 300)
  10595.       End With  'ApplicationEditor.form.ChkNoMainForm
  10596.       With .BtnAddModule
  10597.         .Caption := "Add module..."
  10598.         .ZOrder := 17
  10599.         .Move(3585, 1590, 1785, 330)
  10600.       End With  'ApplicationEditor.form.BtnAddModule
  10601.       With .BtnDelModule
  10602.         .Caption := "Remove module..."
  10603.         .ZOrder := 1
  10604.         .Move(3585, 1980, 1785, 330)
  10605.       End With  'ApplicationEditor.form.BtnDelModule
  10606.     End With  'ApplicationEditor.form
  10607.   End With  'ApplicationEditor
  10608. ' Reconstruction commands for object: EnvelopScreenLayout
  10609. '
  10610.   With EnvelopScreenLayout
  10611.   End With  'EnvelopScreenLayout
  10612. ' Reconstruction commands for object: WinDebug
  10613. '
  10614.   With WinDebug
  10615.     .Window := Nothing
  10616.   End With  'WinDebug
  10617. ' Reconstruction commands for object: ObjectViewer
  10618. '
  10619.   With ObjectViewer
  10620.     .Caption := "Objects"
  10621.     .Font := EnvelopFont
  10622.     .PopupMenu := PopupMenu
  10623.     .Move(10665, 1815, 3660, 4380)
  10624.     .AccelForm := EnvelopForm
  10625.     With .ProjectView
  10626.       .ZOrder := 5
  10627.       .Move(-30, 375, 3570, 3615)
  10628.       .Visible := True
  10629.       .ExpandOnDblClick := True
  10630.       .IconBitmap := ObjectViewer.ProjectView.bitmap
  10631.       .IconHeight := 12
  10632.       .IconWidth := 20
  10633.       .IndentWidth := 12
  10634.       .kLevelModule := 1
  10635.       .kLevelObject := 2
  10636.       With .bitmap
  10637.         .ResId := 5104
  10638.       End With  'ObjectViewer.ProjectView.bitmap
  10639.     End With  'ObjectViewer.ProjectView
  10640.     With .HierView
  10641.       .BackColor := 12632256
  10642.       .DragMode := "LeftMouse"
  10643.       .ZOrder := 1
  10644.       .Move(-30, 375, 3570, 3615)
  10645.       .Visible := False
  10646.       .dirty := True
  10647.     End With  'ObjectViewer.HierView
  10648.     With .ModuleView
  10649.       .ZOrder := 2
  10650.       .Move(-30, 375, 3570, 3615)
  10651.       .ExpandOnDblClick := True
  10652.       .IconBitmap := ObjectViewer.ModuleView.bitmap
  10653.       .IconHeight := 12
  10654.       .IconWidth := 20
  10655.       .IndentWidth := 12
  10656.       .kLevelProject := -1
  10657.       .kLevelObject := 1
  10658.       With .bitmap
  10659.         .ResId := 7620
  10660.       End With  'ObjectViewer.ModuleView.bitmap
  10661.     End With  'ObjectViewer.ModuleView
  10662.     With .AlphaView
  10663.       .BackColor := 12632256
  10664.       .DragMode := "LeftMouse"
  10665.       .ZOrder := 4
  10666.       .Move(-30, 375, 3570, 3615)
  10667.       .Visible := False
  10668.       .ListIndex := 1
  10669.       .SelObject := AboutEnvelopForm
  10670.     End With  'ObjectViewer.AlphaView
  10671.     With .toolbar
  10672.       .ZOrder := 3
  10673.       .Move(-30, -30, 3570, 405)
  10674.       .LayoutStyle := "ToolBar"
  10675.       .MarginLeft := 5
  10676.       .Visible := True
  10677.       With .ViewProject
  10678.         .Position := 1
  10679.         .State := "Down"
  10680.         .ButtonType := "Exclusive"
  10681.         .HintText := "Project view"
  10682.         With .bitmap
  10683.           .FileName := "envelop.ero"
  10684.           .ResId := 10136
  10685.         End With  'ObjectViewer.toolbar.ViewProject.bitmap
  10686.       End With  'ObjectViewer.toolbar.ViewProject
  10687.       With .ViewModule
  10688.         .Position := 2
  10689.         .ButtonType := "Exclusive"
  10690.         .HintText := "Module view"
  10691.         With .bitmap
  10692.           .FileName := "envelop.ero"
  10693.           .ResId := 10380
  10694.         End With  'ObjectViewer.toolbar.ViewModule.bitmap
  10695.       End With  'ObjectViewer.toolbar.ViewModule
  10696.       With .ViewAlphabetical
  10697.         .Position := 3
  10698.         .ButtonType := "Exclusive"
  10699.         .HintText := "Objects: alphabetic view"
  10700.         With .bitmap
  10701.           .FileName := "envelop.ero"
  10702.           .ResId := 10624
  10703.         End With  'ObjectViewer.toolbar.ViewAlphabetical.bitmap
  10704.       End With  'ObjectViewer.toolbar.ViewAlphabetical
  10705.       With .ViewHierarchical
  10706.         .Separator := 10
  10707.         .Position := 4
  10708.         .ButtonType := "Exclusive"
  10709.         .HintText := "Objects: inheritance view"
  10710.         With .bitmap
  10711.           .FileName := "envelop.ero"
  10712.           .ResId := 10868
  10713.         End With  'ObjectViewer.toolbar.ViewHierarchical.bitmap
  10714.       End With  'ObjectViewer.toolbar.ViewHierarchical
  10715.       With .MakeCurrent
  10716.         .Separator := 11
  10717.         .Position := 5
  10718.         .HintText := "Make selected project/module current"
  10719.         With .bitmap
  10720.           .FileName := "envelop.ero"
  10721.           .ResId := 11112
  10722.         End With  'ObjectViewer.toolbar.MakeCurrent.bitmap
  10723.       End With  'ObjectViewer.toolbar.MakeCurrent
  10724.       With .AddModule
  10725.         .Position := 6
  10726.         .HintText := "Add module to project: Application1"
  10727.         With .bitmap
  10728.           .FileName := "envelop.ero"
  10729.           .ResId := 11356
  10730.         End With  'ObjectViewer.toolbar.AddModule.bitmap
  10731.       End With  'ObjectViewer.toolbar.AddModule
  10732.       With .NewModule
  10733.         .Position := 7
  10734.         .HintText := "New module"
  10735.         With .bitmap
  10736.           .FileName := "envelop.ero"
  10737.           .ResId := 11600
  10738.         End With  'ObjectViewer.toolbar.NewModule.bitmap
  10739.       End With  'ObjectViewer.toolbar.NewModule
  10740.       With .LoadModule
  10741.         .Position := 8
  10742.         .HintText := "Load module"
  10743.         With .bitmap
  10744.           .FileName := "envelop.ero"
  10745.           .ResId := 11844
  10746.         End With  'ObjectViewer.toolbar.LoadModule.bitmap
  10747.       End With  'ObjectViewer.toolbar.LoadModule
  10748.       With .SaveModule
  10749.         .Position := 9
  10750.         .HintText := "Save module: envelop.ebo"
  10751.         With .bitmap
  10752.           .FileName := "envelop.ero"
  10753.           .ResId := 12088
  10754.         End With  'ObjectViewer.toolbar.SaveModule.bitmap
  10755.       End With  'ObjectViewer.toolbar.SaveModule
  10756.       With .UnloadModule
  10757.         .Enabled := False
  10758.         .Position := 10
  10759.         .HintText := "Unload module"
  10760.         With .bitmap
  10761.           .FileName := "envelop.ero"
  10762.           .ResId := 12332
  10763.         End With  'ObjectViewer.toolbar.UnloadModule.bitmap
  10764.       End With  'ObjectViewer.toolbar.UnloadModule
  10765.     End With  'ObjectViewer.toolbar
  10766.     With .ObjectEditorHook
  10767.     End With  'ObjectViewer.ObjectEditorHook
  10768.     With .ObjectPopup
  10769.  
  10770.       .InsertItem("ObjCopy", "&Copy Object: ...", -1)
  10771.       .InsertItem("ObjRename", "&Rename Object...", -1)
  10772.       .AccelKey = "Ctrl+R"
  10773.       .SetAccelerator("ObjRename", .AccelKey)
  10774.       .InsertItem("ObjAbstract", "&Abstract Object...", -1)
  10775.       .InsertSeparator(-1)
  10776.       .InsertItem("ObjMoveToModule", "&Move to <Intrinsic module>", -1)
  10777.       .AccelKey = "Ctrl+M"
  10778.       .SetAccelerator("ObjMoveToModule", .AccelKey)
  10779.       .InsertSeparator(-1)
  10780.       .InsertItem("ObjDestroy", "&Destroy Object", -1)
  10781.       .AccelKey = "Ctrl+D"
  10782.       .SetAccelerator("ObjDestroy", .AccelKey)
  10783.     End With  'ObjectViewer.ObjectPopup
  10784.     With .ModulePopup
  10785.  
  10786.       .InsertItem("ModSave", "&Save Module", -1)
  10787.       .AccelKey = "Ctrl+S"
  10788.       .SetAccelerator("ModSave", .AccelKey)
  10789.       .InsertItem("ModSaveAs", "Save Module &As...", -1)
  10790.       .InsertSeparator(-1)
  10791.       .InsertItem("MakeCurrent", "Select Module as &Current Module", -1)
  10792.       .InsertItem("ModAddToProj", "Add to Current &Project", -1)
  10793.       .InsertItem("ModRemoveFromProj", "&Remove From Current Project", -1)
  10794.       .InsertSeparator(-1)
  10795.       .InsertItem("ModUnload", "&Unload Module", -1)
  10796.     End With  'ObjectViewer.ModulePopup
  10797.     With .ProjectPopup
  10798.  
  10799.       .InsertItem("ProjSave", "&Save Project", -1)
  10800.       .InsertItem("ProjSaveAs", "Save Project &As...", -1)
  10801.       .InsertItem("ProjAddModules", "Add &Modules To Project...", -1)
  10802.       .InsertSeparator(-1)
  10803.       .InsertItem("MakeCurrent", "Select Project as &Current Project", -1)
  10804.       .InsertItem("ProjWriteEXE", "Write E&XE", -1)
  10805.       .InsertSeparator(-1)
  10806.       .InsertItem("ProjClose", "&Close Project", -1)
  10807.     End With  'ObjectViewer.ProjectPopup
  10808.   End With  'ObjectViewer
  10809. ' Reconstruction commands for object: SourceSearcher
  10810. '
  10811.   With SourceSearcher
  10812.     .Caption := "Source Searcher"
  10813.     .Font := EnvelopFont
  10814.     .Move(7080, 1125, 8085, 6525)
  10815.     .KeyPreview := True
  10816.     .DefaultButton := SourceSearcher.Search
  10817.     .AccelForm := EnvelopForm
  10818.     .MaxEntries := 5
  10819.     .SearchModule := Nothing
  10820.     With .Search
  10821.       .Caption := "Search"
  10822.       .ZOrder := 1
  10823.       .Move(75, 1350, 900, 300)
  10824.     End With  'SourceSearcher.Search
  10825.     With .ModuleCombo
  10826.       .ZOrder := 2
  10827.       .Move(75, 375, 5475, 300)
  10828.       .Sorted := False
  10829.       .Style := "DropdownList"
  10830.     End With  'SourceSearcher.ModuleCombo
  10831.     With .Label3
  10832.       .Caption := "Use objects from Module:"
  10833.       .ZOrder := 3
  10834.       .Move(75, 75, 2625, 300)
  10835.     End With  'SourceSearcher.Label3
  10836.     With .SearchCombo
  10837.       .ZOrder := 4
  10838.       .Move(75, 900, 5475, 300)
  10839.       .Sorted := False
  10840.     End With  'SourceSearcher.SearchCombo
  10841.     With .HitResults
  10842.       .Caption := "HitResults"
  10843.       .BackColor := 12632256
  10844.       .ZOrder := 5
  10845.       .Move(45, 1665, 7875, 4410)
  10846.       .IconBitmap := SourceSearcher.bitmap
  10847.       .IconHeight := 12
  10848.       .IconWidth := 12
  10849.       .Sorted := True
  10850.     End With  'SourceSearcher.HitResults
  10851.     With .bitmap
  10852.       .LoadType := "MemoryBased"
  10853.       .FileName := "envelop.ero"
  10854.       .ResId := 12576
  10855.     End With  'SourceSearcher.bitmap
  10856.     With .ObjectsBtn
  10857.       .Caption := "Objects"
  10858.       .ZOrder := 6
  10859.       .Move(4650, 1350, 900, 300)
  10860.     End With  'SourceSearcher.ObjectsBtn
  10861.     With .HitFilter
  10862.       .Caption := "Only show hits"
  10863.       .ZOrder := 7
  10864.       .Move(1050, 1350, 1800, 300)
  10865.     End With  'SourceSearcher.HitFilter
  10866.     With .AutoExpand
  10867.       .Caption := "Auto Expand"
  10868.       .ZOrder := 8
  10869.       .Move(2925, 1350, 1575, 300)
  10870.     End With  'SourceSearcher.AutoExpand
  10871.     With .Help
  10872.       .Caption := "Help"
  10873.       .ZOrder := 9
  10874.       .Move(5700, 1350, 750, 300)
  10875.     End With  'SourceSearcher.Help
  10876.     With .searchGroup
  10877.       .Persistent := False
  10878.     End With  'SourceSearcher.searchGroup
  10879.     With .ListObject
  10880.       .obj := Nothing
  10881.     End With  'SourceSearcher.ListObject
  10882.     With .ListMethod
  10883.       .meth := ""
  10884.     End With  'SourceSearcher.ListMethod
  10885.     With .ListHit
  10886.       .hitStart := 0
  10887.       .hitLength := 0
  10888.     End With  'SourceSearcher.ListHit
  10889.     With .ResetCurObject
  10890.     End With  'SourceSearcher.ResetCurObject
  10891.   End With  'SourceSearcher
  10892. ' Reconstruction commands for object: ObjectBoxEditor
  10893. '
  10894.   With ObjectBoxEditor
  10895.     With .ObjBoxForm
  10896.       .Caption := "Editing: toolbar"
  10897.       .ForeColor := 0
  10898.       .Font := EnvelopFont
  10899.       .Move(1005, 1785, 7755, 840)
  10900.       .KeyPreview := True
  10901.       .MaxButton := False
  10902.       .MinButton := False
  10903.       With .Toolbox
  10904.         .ZOrder := 2
  10905.         .Move(0, 0, 4065, 420)
  10906.         .NumColumns := 10
  10907.         .LayoutStyle := "ToolBar"
  10908.         .Visible := True
  10909.         .EditOnAdd = True
  10910.         .GadgetPrototype = ToolGadget
  10911.         With .MovePrevious
  10912.           .Position := 1
  10913.           .HintText := "Previous Gadget"
  10914.           With .bitmap
  10915.             .FileName := "envelop.ero"
  10916.             .ResId := 12932
  10917.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.MovePrevious.bitmap
  10918.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.MovePrevious
  10919.         With .MoveNext
  10920.           .Position := 2
  10921.           .HintText := "Next Gadget"
  10922.           With .bitmap
  10923.             .FileName := "envelop.ero"
  10924.             .ResId := 13324
  10925.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.MoveNext.bitmap
  10926.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.MoveNext
  10927.         With .NewGadget
  10928.           .Position := 3
  10929.           .HintText := "Embed New Gadget"
  10930.           With .bitmap
  10931.             .FileName := "envelop.ero"
  10932.             .ResId := 13716
  10933.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.NewGadget.bitmap
  10934.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.NewGadget
  10935.         With .DelGadget
  10936.           .Position := 4
  10937.           With .bitmap
  10938.             .FileName := "envelop.ero"
  10939.             .ResId := 14108
  10940.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.DelGadget.bitmap
  10941.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.DelGadget
  10942.         With .Configure
  10943.           .Position := 5
  10944.           With .bitmap
  10945.             .FileName := "envelop.ero"
  10946.             .ResId := 14500
  10947.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.Configure.bitmap
  10948.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.Configure
  10949.         With .ConfigureTool
  10950.           .Position := 6
  10951.           With .bitmap
  10952.             .FileName := "envelop.ero"
  10953.             .ResId := 14892
  10954.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.ConfigureTool.bitmap
  10955.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.ConfigureTool
  10956.         With .SlidePrevious
  10957.           .Position := 7
  10958.           .HintText := "Slide Gadget Position Back"
  10959.           With .bitmap
  10960.             .FileName := "envelop.ero"
  10961.             .ResId := 15284
  10962.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SlidePrevious.bitmap
  10963.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SlidePrevious
  10964.         With .SlideNext
  10965.           .Position := 8
  10966.           .HintText := "Slide Gadget Position Forward"
  10967.           With .bitmap
  10968.             .FileName := "envelop.ero"
  10969.             .ResId := 15676
  10970.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SlideNext.bitmap
  10971.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SlideNext
  10972.         With .SeparatorInc
  10973.           .Position := 9
  10974.           .HintText := "Increase Separator"
  10975.           With .bitmap
  10976.             .FileName := "envelop.ero"
  10977.             .ResId := 16068
  10978.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SeparatorInc.bitmap
  10979.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SeparatorInc
  10980.         With .SeparatorDec
  10981.           .Position := 10
  10982.           .HintText := "Decrease Separator"
  10983.           With .bitmap
  10984.             .FileName := "envelop.ero"
  10985.             .ResId := 16460
  10986.           End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SeparatorDec.bitmap
  10987.         End With  'ObjectBoxEditor.ObjBoxForm.Toolbox.SeparatorDec
  10988.       End With  'ObjectBoxEditor.ObjBoxForm.Toolbox
  10989.       With .CBGadget
  10990.         .ZOrder := 1
  10991.         .Move(4200, 75, 3135, 315)
  10992.         .Sorted := False
  10993.         .SuppressClick := False
  10994.       End With  'ObjectBoxEditor.ObjBoxForm.CBGadget
  10995.     End With  'ObjectBoxEditor.ObjBoxForm
  10996.   End With  'ObjectBoxEditor
  10997. ' Reconstruction commands for object: MenuEditHook
  10998. '
  10999.   With MenuEditHook
  11000.   End With  'MenuEditHook
  11001. ' Reconstruction commands for object: EnvelopForm
  11002. '
  11003.   With EnvelopForm
  11004.     .Caption := "Envelop"
  11005.     .Move(15, 15, 15330, 1125)
  11006.     .Outlined := True
  11007.     .KeyPreview := True
  11008.     .MenuBar := EnvelopForm.EnvelopMenus
  11009.     .FileDrop := True
  11010.     .MaxButton := False
  11011.     With .EnvelopMenus
  11012.  
  11013.       .InsertPopup(EnvelopForm.EnvelopMenus.EnvelopFileMenu, "&File", -1)
  11014.       .InsertPopup(EnvelopForm.EnvelopMenus.EnvelopObjectMenu, "&Object", -1)
  11015.       .InsertPopup(EnvelopForm.EnvelopMenus.EnvelopOptionsMenu, "O&ptions", -1)
  11016.       .InsertPopup(EnvelopForm.EnvelopMenus.EnvelopToolsMenu, "&Tools", -1)
  11017.       .InsertPopup(EnvelopForm.EnvelopMenus.EnvelopHelpMenu, "&Help", -1)
  11018.       With .EnvelopFileMenu
  11019.  
  11020.         .InsertItem("NewProject", "New Project", -1)
  11021.         .InsertItem("OpenProject", "Open Project", -1)
  11022.         .InsertSeparator(-1)
  11023.         .InsertItem("SaveProject", "Save Project", -1)
  11024.         .InsertItem("SaveProjectAs", "Save Project As...", -1)
  11025.         .InsertItem("CloseProject", "Close Project", -1)
  11026.         .InsertSeparator(-1)
  11027.         .InsertItem("NewModule", "&New Module", -1)
  11028.         .InsertItem("LoadModule", "&Load Module", -1)
  11029.         .InsertItem("MergeModule", "&Merge Module...", -1)
  11030.         .InsertSeparator(-1)
  11031.         .InsertItem("SaveModule", "&Save Module", -1)
  11032.         .AccelKey = "Ctrl+S"
  11033.         .SetAccelerator("SaveModule", .AccelKey)
  11034.         .InsertItem("SaveModuleAs", "Save Module As...", -1)
  11035.         .InsertItem("UnloadModule", "&Unload Module", -1)
  11036.         .InsertSeparator(-1)
  11037.         .InsertItem("SaveAll", "Save &All", -1)
  11038.         .AccelKey = "Ctrl+A"
  11039.         .SetAccelerator("SaveAll", .AccelKey)
  11040.         .InsertSeparator(-1)
  11041.         .InsertItem("QuitApp", "E&xit", -1)
  11042.         .AccelKey = "Alt+End"
  11043.         .SetAccelerator("QuitApp", .AccelKey)
  11044.       End With  'EnvelopForm.EnvelopMenus.EnvelopFileMenu
  11045.       With .EnvelopObjectMenu
  11046.  
  11047.         .InsertItem("NewObject", "&New...", -1)
  11048.         .InsertItem("NewForm", "New &Form", -1)
  11049.         .InsertItem("CopyObject", "&Copy...", -1)
  11050.         .InsertItem("QuickCopy", "&Quick copy", -1)
  11051.         .AccelKey = "Ctrl+C"
  11052.         .SetAccelerator("QuickCopy", .AccelKey)
  11053.         .InsertItem("AbstractObject", "&Abstract...", -1)
  11054.         .InsertSeparator(-1)
  11055.         .InsertItem("RenameObject", "&Rename...", -1)
  11056.         .AccelKey = "Ctrl+R"
  11057.         .SetAccelerator("RenameObject", .AccelKey)
  11058.         .InsertItem("MoveObject", "Move to envelop.ebo", -1)
  11059.         .AccelKey = "Ctrl+M"
  11060.         .SetAccelerator("MoveObject", .AccelKey)
  11061.         .InsertSeparator(-1)
  11062.         .InsertItem("DeleteObject", "&Destroy Object", -1)
  11063.         .AccelKey = "Ctrl+D"
  11064.         .SetAccelerator("DeleteObject", .AccelKey)
  11065.         .InsertSeparator(-1)
  11066.         .InsertItem("WriteText", "&Save As Text...", -1)
  11067.         .AccelKey = "Ctrl+W"
  11068.         .SetAccelerator("WriteText", .AccelKey)
  11069.       End With  'EnvelopForm.EnvelopMenus.EnvelopObjectMenu
  11070.       With .EnvelopOptionsMenu
  11071.  
  11072.         .InsertItem("TrapInterp", "Trap Interpretive Exceptions", -1)
  11073.         .InsertItem("TrapSys", "Trap System Exceptions", -1)
  11074.         .InsertSeparator(-1)
  11075.         .InsertItem("ToggleEdit", "Enable Form Editor", -1)
  11076.         .AccelKey = "Ctrl+F"
  11077.         .SetAccelerator("ToggleEdit", .AccelKey)
  11078.         .InsertSeparator(-1)
  11079.         .InsertItem("ConfigureLayout", "Window Layouts...", -1)
  11080.         .InsertSeparator(-1)
  11081.         .InsertItem("StartupOptions", "Startup...", -1)
  11082.       End With  'EnvelopForm.EnvelopMenus.EnvelopOptionsMenu
  11083.       With .EnvelopHelpMenu
  11084.  
  11085.         .InsertItem("HelpTopics", "Envelop &Help Topics", -1)
  11086.         .InsertSeparator(-1)
  11087.         .InsertItem("HelpSamples", "&Samples", -1)
  11088.         .InsertSeparator(-1)
  11089.         .InsertItem("About", "About Envelop", -1)
  11090.       End With  'EnvelopForm.EnvelopMenus.EnvelopHelpMenu
  11091.       With .EnvelopToolsMenu
  11092.  
  11093.         .InsertItem("PropertyEditor", "&Property Editor", -1)
  11094.         .InsertItem("ObjectBrowser", "&Object Viewer", -1)
  11095.         .InsertItem("MethodBrowser", "&Method Editor", -1)
  11096.         .InsertItem("SourceBrowser", "&Source Searcher", -1)
  11097.         .InsertItem("MenuEditor", "Me&nu Editor", -1)
  11098.         .InsertItem("AppEditor", "&Application Editor", -1)
  11099.         .InsertItem("WorkSet", "&WorkSet", -1)
  11100.         .InsertItem("GroupEditor", "&Group Editor", -1)
  11101.         .InsertItem("OcxTool", "Oc&x Tool", -1)
  11102.         .InsertSeparator(-1)
  11103.         .InsertItem("ToolPalette", "&Tool Palette", -1)
  11104.         .InsertItem("ControlPalette", "&Controls Palette", -1)
  11105.         .InsertSeparator(-1)
  11106.         .InsertItem("DebugWindow", "&Debug Window", -1)
  11107.         .InsertSeparator(-1)
  11108.         .InsertItem("CloseAll", "Close All", -1)
  11109.       End With  'EnvelopForm.EnvelopMenus.EnvelopToolsMenu
  11110.     End With  'EnvelopForm.EnvelopMenus
  11111.     With .LblEditObj
  11112.       .Caption := "Selected:"
  11113.       .Font := EnvelopFont
  11114.       .ZOrder := 2
  11115.       .Move(10845, 60, 900, 255)
  11116.       .WordWrap := False
  11117.     End With  'EnvelopForm.LblEditObj
  11118.     With .toolbar
  11119.       .ZOrder := 3
  11120.       .Move(-30, -30, 15240, 405)
  11121.       .LayoutStyle := "ToolBar"
  11122.       .MarginLeft := 10
  11123.       .Visible := True
  11124.       With .NewProject
  11125.         .Separator := 3
  11126.         .Position := 1
  11127.         .HintText := "New project"
  11128.         With .bitmap
  11129.           .FileName := "envelop.ero"
  11130.           .ResId := 16852
  11131.         End With  'EnvelopForm.toolbar.NewProject.bitmap
  11132.       End With  'EnvelopForm.toolbar.NewProject
  11133.       With .OpenProject
  11134.         .Separator := 3
  11135.         .Position := 2
  11136.         .HintText := "Open project"
  11137.         With .bitmap
  11138.           .FileName := "envelop.ero"
  11139.           .ResId := 17096
  11140.         End With  'EnvelopForm.toolbar.OpenProject.bitmap
  11141.       End With  'EnvelopForm.toolbar.OpenProject
  11142.       With .SaveProject
  11143.         .Separator := 3
  11144.         .Position := 3
  11145.         .HintText := "Save project: Application1"
  11146.         With .bitmap
  11147.           .FileName := "envelop.ero"
  11148.           .ResId := 17340
  11149.         End With  'EnvelopForm.toolbar.SaveProject.bitmap
  11150.       End With  'EnvelopForm.toolbar.SaveProject
  11151.       With .CloseProject
  11152.         .Separator := 21
  11153.         .Position := 4
  11154.         .HintText := "Close project: Application1"
  11155.         With .bitmap
  11156.           .FileName := "envelop.ero"
  11157.           .ResId := 17584
  11158.         End With  'EnvelopForm.toolbar.CloseProject.bitmap
  11159.       End With  'EnvelopForm.toolbar.CloseProject
  11160.       With .WorksetLeft
  11161.         .Separator := 3
  11162.         .Position := 5
  11163.         .HintText := "Workset Previous"
  11164.         With .bitmap
  11165.           .FileName := "envelop.ero"
  11166.           .ResId := 17828
  11167.         End With  'EnvelopForm.toolbar.WorksetLeft.bitmap
  11168.       End With  'EnvelopForm.toolbar.WorksetLeft
  11169.       With .Finger
  11170.         .Separator := 3
  11171.         .Position := 6
  11172.         .HintText := "Find Object to Edit"
  11173.         .oldCaption := "Envelop"
  11174.         .fingerStarted := False
  11175.         .oldAutoBusy := True
  11176.         .fingerPointer := 2
  11177.         With .bitmap
  11178.           .FileName := "envelop.ero"
  11179.           .ResId := 18072
  11180.         End With  'EnvelopForm.toolbar.Finger.bitmap
  11181.       End With  'EnvelopForm.toolbar.Finger
  11182.       With .WorksetRight
  11183.         .Separator := 19
  11184.         .Position := 7
  11185.         .HintText := "Workset Next"
  11186.         With .bitmap
  11187.           .FileName := "envelop.ero"
  11188.           .ResId := 18316
  11189.         End With  'EnvelopForm.toolbar.WorksetRight.bitmap
  11190.       End With  'EnvelopForm.toolbar.WorksetRight
  11191.       With .NewForm
  11192.         .Separator := 3
  11193.         .Position := 8
  11194.         .HintText := "New Form"
  11195.         With .bitmap
  11196.           .FileName := "envelop.ero"
  11197.           .ResId := 18560
  11198.         End With  'EnvelopForm.toolbar.NewForm.bitmap
  11199.       End With  'EnvelopForm.toolbar.NewForm
  11200.       With .CopyObject
  11201.         .Separator := 3
  11202.         .Position := 10
  11203.         .HintText := "Copy Object"
  11204.         With .bitmap
  11205.           .FileName := "envelop.ero"
  11206.           .ResId := 18804
  11207.         End With  'EnvelopForm.toolbar.CopyObject.bitmap
  11208.       End With  'EnvelopForm.toolbar.CopyObject
  11209.       With .AbstractObject
  11210.         .Separator := 3
  11211.         .Position := 11
  11212.         .HintText := "Abstract Object"
  11213.         With .bitmap
  11214.           .FileName := "envelop.ero"
  11215.           .ResId := 19048
  11216.         End With  'EnvelopForm.toolbar.AbstractObject.bitmap
  11217.       End With  'EnvelopForm.toolbar.AbstractObject
  11218.       With .DeleteObject
  11219.         .Separator := 30
  11220.         .Position := 12
  11221.         .HintText := "Delete Object"
  11222.         With .bitmap
  11223.           .FileName := "envelop.ero"
  11224.           .ResId := 19292
  11225.         End With  'EnvelopForm.toolbar.DeleteObject.bitmap
  11226.       End With  'EnvelopForm.toolbar.DeleteObject
  11227.       With .ToggleEdit
  11228.         .Separator := 30
  11229.         .Position := 13
  11230.         .State := "Down"
  11231.         .ButtonType := "NonExclusive"
  11232.         With .bitmap
  11233.           .FileName := "envelop.ero"
  11234.           .ResId := 19536
  11235.         End With  'EnvelopForm.toolbar.ToggleEdit.bitmap
  11236.       End With  'EnvelopForm.toolbar.ToggleEdit
  11237.       With .RestoreLayout
  11238.         .Separator := 30
  11239.         .Position := 14
  11240.         .HintText := "Restore Default Layout"
  11241.         With .bitmap
  11242.           .FileName := "envelop.ero"
  11243.           .ResId := 19780
  11244.         End With  'EnvelopForm.toolbar.RestoreLayout.bitmap
  11245.       End With  'EnvelopForm.toolbar.RestoreLayout
  11246.       With .Help
  11247.         .Position := 15
  11248.         .HintText := "Help Contents"
  11249.         .oldAutoBusy := False
  11250.         .fingerPointer := 13
  11251.         With .bitmap
  11252.           .ResId := 20024
  11253.         End With  'EnvelopForm.toolbar.Help.bitmap
  11254.       End With  'EnvelopForm.toolbar.Help
  11255.       With .NewObject
  11256.         .Separator := 3
  11257.         .Position := 9
  11258.         .HintText := "New Object"
  11259.         With .bitmap
  11260.           .FileName := "envelop.ero"
  11261.           .ResId := 20268
  11262.         End With  'EnvelopForm.toolbar.NewObject.bitmap
  11263.       End With  'EnvelopForm.toolbar.NewObject
  11264.     End With  'EnvelopForm.toolbar
  11265.     With .CBSelectedObject
  11266.       .Font := EnvelopFont
  11267.       .ZOrder := 1
  11268.       .Move(11820, 15, 3315, 315)
  11269.     End With  'EnvelopForm.CBSelectedObject
  11270.   End With  'EnvelopForm
  11271. ' Reconstruction commands for object: ObjDebug
  11272. '
  11273.   With ObjDebug
  11274.     .Obj := Nothing
  11275.     .Descriptor := ""
  11276.   End With  'ObjDebug
  11277. ' Reconstruction commands for object: ProjectStartupDialog
  11278. '
  11279.   With ProjectStartupDialog
  11280.     .Caption := "ProjectStartupDialog"
  11281.     .ForeColor := 16711680
  11282.     .Font := ProjectStartupDialog.font1
  11283.     .Move(2868, 2112, 6540, 4992)
  11284.     .BevelInner := "Raised"
  11285.     .BevelOuter := "Raised"
  11286.     .BorderWidth := 2
  11287.     .CancelButton := ProjectStartupDialog.BTNNoProject
  11288.     .BorderStyle := "None"
  11289.     .MaxButton := False
  11290.     .MinButton := False
  11291.     With .BTNOpenProject
  11292.       .Caption := "&Open Project"
  11293.       .Font := ProjectStartupDialog.BTNNewProject.font1
  11294.       .ZOrder := 2
  11295.       .Move(216, 2076, 1872, 1284)
  11296.     End With  'ProjectStartupDialog.BTNOpenProject
  11297.     With .BTNNewProject
  11298.       .Caption := "&New Project"
  11299.       .ForeColor := 0
  11300.       .Font := ProjectStartupDialog.BTNNewProject.font1
  11301.       .ZOrder := 3
  11302.       .Move(216, 744, 1872, 1284)
  11303.       With .font1
  11304.         .FaceName := "MS Sans Serif"
  11305.         .Size := 12.000000
  11306.         .Bold := True
  11307.         .Italic := False
  11308.         .Strikethru := False
  11309.       End With  'ProjectStartupDialog.BTNNewProject.font1
  11310.     End With  'ProjectStartupDialog.BTNNewProject
  11311.     With .BTNNoProject
  11312.       .Caption := "No Project"
  11313.       .Font := ProjectStartupDialog.BTNNewProject.font1
  11314.       .ZOrder := 4
  11315.       .Move(216, 3432, 1872, 1284)
  11316.     End With  'ProjectStartupDialog.BTNNoProject
  11317.     With .LblNewProject
  11318.       .Caption := "Configure a new application or component library project."
  11319.       .ZOrder := 5
  11320.       .Move(2250, 1140, 4110, 465)
  11321.     End With  'ProjectStartupDialog.LblNewProject
  11322.     With .LblNoProject
  11323.       .Caption := "Start with no project opened."
  11324.       .ZOrder := 6
  11325.       .Move(2250, 3975, 4110, 225)
  11326.     End With  'ProjectStartupDialog.LblNoProject
  11327.     With .LblOpenProject
  11328.       .Caption := "Browse for an existing project file to open."
  11329.       .ZOrder := 7
  11330.       .Move(2250, 2475, 4110, 450)
  11331.     End With  'ProjectStartupDialog.LblOpenProject
  11332.     With .LblHeader
  11333.       .Caption := "Envelop Startup"
  11334.       .BackColor := 8421504
  11335.       .ForeColor := 0
  11336.       .Font := ProjectStartupDialog.LblHeader.font
  11337.       .ZOrder := 1
  11338.       .Move(120, 120, 6300, 444)
  11339.       .Alignment := "Center"
  11340.       With .font
  11341.         .FaceName := "MS Sans Serif"
  11342.         .Size := 18.000000
  11343.         .Bold := True
  11344.         .Italic := False
  11345.         .Strikethru := False
  11346.       End With  'ProjectStartupDialog.LblHeader.font
  11347.     End With  'ProjectStartupDialog.LblHeader
  11348.     With .font1
  11349.       .FaceName := "MS Sans Serif"
  11350.       .Size := 9.000000
  11351.       .Bold := True
  11352.       .Italic := False
  11353.       .Strikethru := False
  11354.     End With  'ProjectStartupDialog.font1
  11355.   End With  'ProjectStartupDialog
  11356. ' Reconstruction commands for object: AboutEnvelopForm
  11357. '
  11358.   With AboutEnvelopForm
  11359.     .Caption := "About Envelop"
  11360.     .Move(3144, 2808, 6000, 3600)
  11361.     .KeyPreview := True
  11362.     .BorderStyle := "None"
  11363.     With .bitmap
  11364.       .LoadType := "MemoryBased"
  11365.       .FileName := "envelop.ero"
  11366.       .ResId := 20512
  11367.     End With  'AboutEnvelopForm.bitmap
  11368.     With .imgAbout
  11369.       .ZOrder := 11
  11370.       .Move(0, 0, 6000, 3600)
  11371.       .BevelOuter := "None"
  11372.       .AutoInitCropRect := False
  11373.       .Picture := AboutEnvelopForm.bitmap
  11374.       .ResizeMode := "Clip"
  11375.       .ScrollBars := "Never"
  11376.       .ScaleX := 1
  11377.       .ScaleY := 1
  11378.     End With  'AboutEnvelopForm.imgAbout
  11379.     With .lstDLLs
  11380.       .Font := DefaultDialogFont
  11381.       .ZOrder := 1
  11382.       .Move(3984, 576, 1536, 1944)
  11383.       .Visible := False
  11384.       .Sorted := False
  11385.     End With  'AboutEnvelopForm.lstDLLs
  11386.     With .MLReadMe
  11387.       .Caption := "MLReadMe"
  11388.       .ZOrder := 2
  11389.       .Move(3984, 576, 1536, 192)
  11390.     End With  'AboutEnvelopForm.MLReadMe
  11391.     With .MLRelNotes
  11392.       .Caption := "MLRelNotes"
  11393.       .ZOrder := 3
  11394.       .Move(3984, 768, 1536, 192)
  11395.     End With  'AboutEnvelopForm.MLRelNotes
  11396.     With .MLLicense
  11397.       .Caption := "MLLicense"
  11398.       .ZOrder := 5
  11399.       .Move(3984, 1212, 1536, 192)
  11400.     End With  'AboutEnvelopForm.MLLicense
  11401.     With .MLStory
  11402.       .Caption := "MLStory"
  11403.       .ZOrder := 7
  11404.       .Move(3984, 1656, 1536, 192)
  11405.     End With  'AboutEnvelopForm.MLStory
  11406.     With .MLOK
  11407.       .Caption := "MLOK"
  11408.       .ZOrder := 9
  11409.       .Move(3984, 2100, 1536, 192)
  11410.     End With  'AboutEnvelopForm.MLOK
  11411.     With .MLVersion
  11412.       .ZOrder := 10
  11413.       .Move(3984, 2352, 1536, 192)
  11414.     End With  'AboutEnvelopForm.MLVersion
  11415.   End With  'AboutEnvelopForm
  11416. ' Reconstruction commands for object: WorkSet
  11417. '
  11418.   With WorkSet
  11419.     With .WorkSetForm
  11420.       .Caption := "WorkSet"
  11421.       .Move(6735, 2220, 3420, 2835)
  11422.       .AccelForm := EnvelopForm
  11423.       .ListMaxItems := 10
  11424.       .IgnoreClick := 0
  11425.       With .List
  11426.         .BackColor := 12632256
  11427.         .ZOrder := 1
  11428.         .Move(0, 0, 3300, 2430)
  11429.         .Sorted := False
  11430.       End With  'WorkSet.WorkSetForm.List
  11431.     End With  'WorkSet.WorkSetForm
  11432.   End With  'WorkSet
  11433. ' Reconstruction commands for object: ObjectBoxConfigWizard
  11434. '
  11435.   With ObjectBoxConfigWizard
  11436.     .title_ := "Configure ObjectBox"
  11437.     .Title := "Configure ObjectBox"
  11438.     .GraphicFileName := "envelop.ero"
  11439.     .FirstStep := ObjectBoxConfigWizard.ObjBoxMargin
  11440.     .LastStep := ObjectBoxConfigWizard.ObjBoxColumns
  11441.     With .ObjBoxMargin
  11442.       .Caption := "Configure ObjectBox"
  11443.       .Move(5850, 5595, 7155, 4815)
  11444.       .DefaultButton := ObjectBoxConfigWizard.ObjBoxMargin.BtnNext
  11445.       .CancelButton := Nothing
  11446.       .wizard := ObjectBoxConfigWizard
  11447.       .NextStep := ObjectBoxConfigWizard.ObjBoxLayout
  11448.       .initialized := -1
  11449.       With .TBTop
  11450.         .ZOrder := 8
  11451.         .Move(4200, 1500, 1200, 300)
  11452.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.TBTop
  11453.       With .TBLeft
  11454.         .ZOrder := 7
  11455.         .Move(3000, 2100, 1200, 300)
  11456.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.TBLeft
  11457.       With .TBRight
  11458.         .ZOrder := 5
  11459.         .Move(5400, 2100, 1200, 300)
  11460.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.TBRight
  11461.       With .TBBottom
  11462.         .ZOrder := 6
  11463.         .Move(4200, 2775, 1200, 300)
  11464.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.TBBottom
  11465.       With .LBLTop
  11466.         .Caption := "Top"
  11467.         .ZOrder := 4
  11468.         .Move(4200, 1200, 1200, 225)
  11469.         .Alignment := "Center"
  11470.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.LBLTop
  11471.       With .LBLLeft
  11472.         .Caption := "Left"
  11473.         .ZOrder := 3
  11474.         .Move(3000, 1800, 1200, 225)
  11475.         .Alignment := "Center"
  11476.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.LBLLeft
  11477.       With .LBLRight
  11478.         .Caption := "Right"
  11479.         .ZOrder := 1
  11480.         .Move(5400, 1800, 1200, 225)
  11481.         .Alignment := "Center"
  11482.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.LBLRight
  11483.       With .LBLBottom
  11484.         .Caption := "Bottom"
  11485.         .ZOrder := 2
  11486.         .Move(4200, 2475, 1200, 225)
  11487.         .Alignment := "Center"
  11488.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.LBLBottom
  11489.       With .BtnFinish
  11490.         .ZOrder := 12
  11491.         .Move(6225, 4050, 825, 300)
  11492.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.BtnFinish
  11493.       With .BtnNext
  11494.         .ZOrder := 11
  11495.         .Move(5325, 4050, 825, 300)
  11496.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.BtnNext
  11497.       With .BtnBack
  11498.         .Enabled := False
  11499.         .ZOrder := 10
  11500.         .Move(4500, 4050, 825, 300)
  11501.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.BtnBack
  11502.       With .BtnCancel
  11503.         .ZOrder := 9
  11504.         .Move(3600, 4050, 825, 300)
  11505.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.BtnCancel
  11506.       With .ImgGraphic
  11507.         .ZOrder := 15
  11508.         .Move(225, 225, 2475, 3150)
  11509.         .Picture := ObjectBoxConfigWizard.Bitmap
  11510.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.ImgGraphic
  11511.       With .LblInstruction
  11512.         .Caption := "Set the Top, Bottom, Left and Right Margins for the ObjectBox"
  11513.         .ZOrder := 14
  11514.         .Move(2850, 300, 4125, 450)
  11515.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.LblInstruction
  11516.       With .Frame1
  11517.         .ZOrder := 13
  11518.         .Move(75, 3825, 6975, 75)
  11519.       End With  'ObjectBoxConfigWizard.ObjBoxMargin.Frame1
  11520.     End With  'ObjectBoxConfigWizard.ObjBoxMargin
  11521.     With .ObjBoxLayout
  11522.       .Caption := "Configure ObjectBox"
  11523.       .Move(5850, 5595, 7155, 4815)
  11524.       .DefaultButton := ObjectBoxConfigWizard.ObjBoxLayout.BtnBack
  11525.       .CancelButton := Nothing
  11526.       .wizard := ObjectBoxConfigWizard
  11527.       .NextStep := ObjectBoxConfigWizard.ObjBoxColumns
  11528.       .BackStep := ObjectBoxConfigWizard.ObjBoxMargin
  11529.       With .OBToolBar
  11530.         .Caption := "ToolBar"
  11531.         .ZOrder := 2
  11532.         .Move(3000, 975, 3675, 300)
  11533.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.OBToolBar
  11534.       With .OBToolBox
  11535.         .Caption := "ToolBox"
  11536.         .ZOrder := 1
  11537.         .Move(3000, 1350, 3675, 300)
  11538.         .TabStop := True
  11539.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.OBToolBox
  11540.       With .BtnFinish
  11541.         .ZOrder := 6
  11542.         .Move(6225, 4050, 825, 300)
  11543.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.BtnFinish
  11544.       With .BtnNext
  11545.         .ZOrder := 5
  11546.         .Move(5325, 4050, 825, 300)
  11547.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.BtnNext
  11548.       With .BtnBack
  11549.         .ZOrder := 4
  11550.         .Move(4500, 4050, 825, 300)
  11551.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.BtnBack
  11552.       With .BtnCancel
  11553.         .ZOrder := 3
  11554.         .Move(3600, 4050, 825, 300)
  11555.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.BtnCancel
  11556.       With .ImgGraphic
  11557.         .ZOrder := 9
  11558.         .Move(225, 225, 2475, 3150)
  11559.         .Picture := ObjectBoxConfigWizard.Bitmap
  11560.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.ImgGraphic
  11561.       With .LblInstruction
  11562.         .Caption := "Select the LayoutStyle for the ObjectBox"
  11563.         .ZOrder := 8
  11564.         .Move(2850, 300, 4125, 225)
  11565.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.LblInstruction
  11566.       With .Frame1
  11567.         .ZOrder := 7
  11568.         .Move(75, 3825, 6975, 75)
  11569.       End With  'ObjectBoxConfigWizard.ObjBoxLayout.Frame1
  11570.     End With  'ObjectBoxConfigWizard.ObjBoxLayout
  11571.     With .ObjBoxTileDir
  11572.       .Caption := "Configure ObjectBox"
  11573.       .Move(5850, 5595, 7155, 4815)
  11574.       .DefaultButton := ObjectBoxConfigWizard.ObjBoxTileDir.BtnFinish
  11575.       .CancelButton := Nothing
  11576.       .wizard := ObjectBoxConfigWizard
  11577.       .BackStep := ObjectBoxConfigWizard.ObjBoxLayout
  11578.       With .OBHoriz
  11579.         .Caption := "Horizontal tiling"
  11580.         .ZOrder := 2
  11581.         .Move(3300, 1050, 3300, 375)
  11582.         .TabStop := True
  11583.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.OBHoriz
  11584.       With .OBVertical
  11585.         .Caption := "Vertical tiling"
  11586.         .ZOrder := 1
  11587.         .Move(3300, 1500, 3300, 375)
  11588.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.OBVertical
  11589.       With .BtnFinish
  11590.         .ZOrder := 6
  11591.         .Move(6225, 4050, 825, 300)
  11592.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.BtnFinish
  11593.       With .BtnNext
  11594.         .Enabled := False
  11595.         .ZOrder := 5
  11596.         .Move(5325, 4050, 825, 300)
  11597.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.BtnNext
  11598.       With .BtnBack
  11599.         .ZOrder := 4
  11600.         .Move(4500, 4050, 825, 300)
  11601.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.BtnBack
  11602.       With .BtnCancel
  11603.         .ZOrder := 3
  11604.         .Move(3600, 4050, 825, 300)
  11605.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.BtnCancel
  11606.       With .ImgGraphic
  11607.         .ZOrder := 9
  11608.         .Move(225, 225, 2475, 3150)
  11609.         .Picture := ObjectBoxConfigWizard.Bitmap
  11610.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.ImgGraphic
  11611.       With .LblInstruction
  11612.         .Caption := "Select Horizontal or Vertical tiling for your ToolBar."
  11613.         .ZOrder := 8
  11614.         .Move(2850, 300, 4125, 450)
  11615.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.LblInstruction
  11616.       With .Frame1
  11617.         .ZOrder := 7
  11618.         .Move(75, 3825, 6975, 75)
  11619.       End With  'ObjectBoxConfigWizard.ObjBoxTileDir.Frame1
  11620.     End With  'ObjectBoxConfigWizard.ObjBoxTileDir
  11621.     With .ObjBoxColumns
  11622.       .Caption := "Configure ObjectBox"
  11623.       .Move(5850, 5595, 7155, 4815)
  11624.       .DefaultButton := ObjectBoxConfigWizard.ObjBoxColumns.BtnFinish
  11625.       .CancelButton := Nothing
  11626.       .wizard := ObjectBoxConfigWizard
  11627.       .BackStep := ObjectBoxConfigWizard.ObjBoxLayout
  11628.       With .SBColumns
  11629.         .Caption := "SBColumns"
  11630.         .ZOrder := 2
  11631.         .Move(3000, 1800, 3675, 300)
  11632.         .SmallChange := 1
  11633.         .LargeChange := 5
  11634.         .Max := 20
  11635.         .Orientation := "Horizontal"
  11636.         .Move(3000, 1800, 3675, 300)
  11637.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.SBColumns
  11638.       With .LblColumns
  11639.         .Caption := "Columns: 2"
  11640.         .ZOrder := 1
  11641.         .Move(4200, 1500, 1350, 225)
  11642.         .Alignment := "Center"
  11643.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.LblColumns
  11644.       With .BtnFinish
  11645.         .ZOrder := 6
  11646.         .Move(6225, 4050, 825, 300)
  11647.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.BtnFinish
  11648.       With .BtnNext
  11649.         .Enabled := False
  11650.         .ZOrder := 5
  11651.         .Move(5325, 4050, 825, 300)
  11652.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.BtnNext
  11653.       With .BtnBack
  11654.         .ZOrder := 4
  11655.         .Move(4500, 4050, 825, 300)
  11656.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.BtnBack
  11657.       With .BtnCancel
  11658.         .ZOrder := 3
  11659.         .Move(3600, 4050, 825, 300)
  11660.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.BtnCancel
  11661.       With .ImgGraphic
  11662.         .ZOrder := 9
  11663.         .Move(225, 225, 2475, 3150)
  11664.         .Picture := ObjectBoxConfigWizard.Bitmap
  11665.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.ImgGraphic
  11666.       With .LblInstruction
  11667.         .Caption := "How many columns should there be in the ObjectBox."
  11668.         .ZOrder := 8
  11669.         .Move(2850, 300, 4125, 450)
  11670.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.LblInstruction
  11671.       With .Frame1
  11672.         .ZOrder := 7
  11673.         .Move(75, 3825, 6975, 75)
  11674.       End With  'ObjectBoxConfigWizard.ObjBoxColumns.Frame1
  11675.     End With  'ObjectBoxConfigWizard.ObjBoxColumns
  11676.     With .TempBox
  11677.       .Move(0, 0, 0, 0)
  11678.     End With  'ObjectBoxConfigWizard.TempBox
  11679.     With .Bitmap
  11680.       .LoadType := "MemoryBased"
  11681.       .FileName := "envelop.ero"
  11682.       .ResId := 171588
  11683.     End With  'ObjectBoxConfigWizard.Bitmap
  11684.   End With  'ObjectBoxConfigWizard
  11685. ' Reconstruction commands for object: SampleMasterFormMenuBar
  11686. '
  11687.   With SampleMasterFormMenuBar
  11688.  
  11689.     .InsertPopup(SampleMasterFormFileMenu, "&File", -1)
  11690.     .InsertPopup(SampleMasterFormHelpMenu, "&Help", -1)
  11691.   End With  'SampleMasterFormMenuBar
  11692. ' Reconstruction commands for object: SampleMasterForm
  11693. '
  11694.   With SampleMasterForm
  11695.     .Caption := "BOOT CAMP Sample"
  11696.     .Move(3840, 1170, 8370, 6060)
  11697.     .Outlined := True
  11698.     .MenuBar := SampleMasterFormMenuBar
  11699.     .SampleDir := "D:\ENVELOP\PROGRAM\"
  11700.     .SampleName := "envelop"
  11701.     With .helpfile
  11702.       .FileName := "D:\ENVELOP\PROGRAM\envelop.hlp"
  11703.     End With  'SampleMasterForm.helpfile
  11704.   End With  'SampleMasterForm
  11705. ' Reconstruction commands for object: FormEditor
  11706. '
  11707.   With FormEditor
  11708.     .ShowOrder := False
  11709.     .GridOn := True
  11710.     .GridX := 10
  11711.     .GridY := 10
  11712.     .HitMode := "RgnTouches"
  11713.     .Editing := True
  11714.   End With  'FormEditor
  11715. ' Reconstruction commands for object: SampleMasterFormFileMenu
  11716. '
  11717.   With SampleMasterFormFileMenu
  11718.  
  11719.     .InsertItem("ResetApplication", "&Reset", -1)
  11720.     .InsertSeparator(-1)
  11721.     .InsertItem("ExitApplication", "E&xit", -1)
  11722.   End With  'SampleMasterFormFileMenu
  11723. ' Reconstruction commands for object: Debugger
  11724. '
  11725.   With Debugger
  11726.     .TrapSystemExceptions := True
  11727.     .TrapInterpretiveExceptions := False
  11728.     .IgnoreExceptionsModule := 7
  11729.   End With  'Debugger
  11730. ' Reconstruction commands for object: MenuEdit
  11731. '
  11732.   With MenuEdit
  11733.     .Caption := "MenuEdit"
  11734.     .Font := DefaultDialogFont
  11735.     .Move(1185, 1815, 6540, 8655)
  11736.     .ICN_CLOSEDFOLDER := 0
  11737.     .ICN_OPENFOLDER := 1
  11738.     .ICN_MENUITEM := 2
  11739.     .ICN_SEPARATOR := 3
  11740.     .DraggingIndex := 1
  11741.     .InputMenu := Nothing
  11742.     .WorkingMenu := Nothing
  11743.     .UpdatingProperties := 0
  11744.     .SuppressUpdatingProperties := 0
  11745.     .changed := False
  11746.     With .menuList
  11747.       .Caption := "menuList"
  11748.       .BackColor := 12632256
  11749.       .DragMode := "LeftMouse"
  11750.       .ZOrder := 9
  11751.       .Move(0, 1275, 6420, 6975)
  11752.       .ExpandOnDblClick := True
  11753.       .IconBitmap := MenuEdit.menuList.bitmaps
  11754.       .IconHeight := 16
  11755.       .IconWidth := 20
  11756.       .IndentWidth := 20
  11757.       With .bitmaps
  11758.         .LoadType := "MemoryBased"
  11759.         .FileName := "envelop.ero"
  11760.         .ResId := 173296
  11761.       End With  'MenuEdit.menuList.bitmaps
  11762.     End With  'MenuEdit.menuList
  11763.     With .menutools
  11764.       .Caption := "ObjectBox1"
  11765.       .ZOrder := 8
  11766.       .Move(0, 0, 6420, 405)
  11767.       .LayoutStyle := "ToolBar"
  11768.       .Visible := True
  11769.       With .openmenu
  11770.         .Position := 1
  11771.         .HintText := "Open  new menu to edit"
  11772.         With .bitmap
  11773.           .FileName := "envelop.ero"
  11774.           .ResId := 174372
  11775.         End With  'MenuEdit.menutools.openmenu.bitmap
  11776.       End With  'MenuEdit.menutools.openmenu
  11777.       With .testdrive
  11778.         .Enabled := False
  11779.         .Position := 2
  11780.         .HintText := "Test drive your menus"
  11781.         With .bitmap
  11782.           .FileName := "envelop.ero"
  11783.           .ResId := 175704
  11784.         End With  'MenuEdit.menutools.testdrive.bitmap
  11785.       End With  'MenuEdit.menutools.testdrive
  11786.       With .apply
  11787.         .Enabled := False
  11788.         .Separator := 13
  11789.         .Position := 3
  11790.         .HintText := "Apply your changes to the orginal menu"
  11791.         With .bitmap
  11792.           .FileName := "envelop.ero"
  11793.           .ResId := 177036
  11794.         End With  'MenuEdit.menutools.apply.bitmap
  11795.       End With  'MenuEdit.menutools.apply
  11796.       With .insertitem
  11797.         .Enabled := False
  11798.         .Position := 4
  11799.         .HintText := "Insert a new command item"
  11800.         With .bitmap
  11801.           .FileName := "envelop.ero"
  11802.           .ResId := 178368
  11803.         End With  'MenuEdit.menutools.insertitem.bitmap
  11804.       End With  'MenuEdit.menutools.insertitem
  11805.       With .insertsubmenu
  11806.         .Enabled := False
  11807.         .Position := 5
  11808.         .HintText := "Insert a new sub-menu"
  11809.         With .bitmap
  11810.           .FileName := "envelop.ero"
  11811.           .ResId := 179700
  11812.         End With  'MenuEdit.menutools.insertsubmenu.bitmap
  11813.       End With  'MenuEdit.menutools.insertsubmenu
  11814.       With .insertsep
  11815.         .Enabled := False
  11816.         .Separator := 12
  11817.         .Position := 6
  11818.         .HintText := "Insert a new separator"
  11819.         With .bitmap
  11820.           .FileName := "envelop.ero"
  11821.           .ResId := 181032
  11822.         End With  'MenuEdit.menutools.insertsep.bitmap
  11823.       End With  'MenuEdit.menutools.insertsep
  11824.       With .delitem
  11825.         .Enabled := False
  11826.         .Position := 8
  11827.         .HintText := "Delete the current item"
  11828.         With .bitmap
  11829.           .FileName := "envelop.ero"
  11830.           .ResId := 182364
  11831.         End With  'MenuEdit.menutools.delitem.bitmap
  11832.       End With  'MenuEdit.menutools.delitem
  11833.       With .moveup
  11834.         .Enabled := False
  11835.         .Position := 9
  11836.         .HintText := "Move the current item up"
  11837.         With .bitmap
  11838.           .FileName := "envelop.ero"
  11839.           .ResId := 183696
  11840.         End With  'MenuEdit.menutools.moveup.bitmap
  11841.       End With  'MenuEdit.menutools.moveup
  11842.       With .movedown
  11843.         .Enabled := False
  11844.         .Position := 10
  11845.         .HintText := "Move the current item down"
  11846.         With .bitmap
  11847.           .FileName := "envelop.ero"
  11848.           .ResId := 185028
  11849.         End With  'MenuEdit.menutools.movedown.bitmap
  11850.       End With  'MenuEdit.menutools.movedown
  11851.       With .properties
  11852.         .Position := 7
  11853.         .State := "Down"
  11854.         .HintText := "Modify item properties"
  11855.         With .bitmap
  11856.           .FileName := "envelop.ero"
  11857.           .ResId := 186360
  11858.         End With  'MenuEdit.menutools.properties.bitmap
  11859.       End With  'MenuEdit.menutools.properties
  11860.     End With  'MenuEdit.menutools
  11861.     With .Label1
  11862.       .Caption := "Caption:"
  11863.       .ZOrder := 7
  11864.       .Move(0, 525, 900, 300)
  11865.       .Alignment := "Right"
  11866.     End With  'MenuEdit.Label1
  11867.     With .Label2
  11868.       .Caption := "Name:"
  11869.       .ZOrder := 6
  11870.       .Move(0, 975, 900, 300)
  11871.       .Alignment := "Right"
  11872.     End With  'MenuEdit.Label2
  11873.     With .txtCaption
  11874.       .Enabled := False
  11875.       .ZOrder := 1
  11876.       .Move(900, 450, 2400, 300)
  11877.     End With  'MenuEdit.txtCaption
  11878.     With .txtName
  11879.       .Enabled := False
  11880.       .ZOrder := 2
  11881.       .Move(900, 900, 2400, 300)
  11882.     End With  'MenuEdit.txtName
  11883.     With .Label3
  11884.       .Caption := "Shortcut:"
  11885.       .ZOrder := 5
  11886.       .Move(3600, 525, 900, 300)
  11887.       .Alignment := "Right"
  11888.     End With  'MenuEdit.Label3
  11889.     With .chkChecked
  11890.       .Caption := "Checked"
  11891.       .Enabled := False
  11892.       .ZOrder := 4
  11893.       .Move(3750, 900, 1500, 300)
  11894.     End With  'MenuEdit.chkChecked
  11895.     With .cbAccel
  11896.       .Enabled := False
  11897.       .ZOrder := 3
  11898.       .Move(4500, 450, 1800, 315)
  11899.       .Sorted := False
  11900.       .Style := "DropdownList"
  11901.     End With  'MenuEdit.cbAccel
  11902.   End With  'MenuEdit
  11903. ' Reconstruction commands for object: PropertyEditor
  11904. '
  11905.   With PropertyEditor
  11906.     .SimplePropTextStyle := "Normal"
  11907.     .SimplePropTextColor := -1
  11908.     .EmbedPropTextStyle := "Normal"
  11909.     .EmbedPropTextColor := 8388608
  11910.     .ReferencePropTextStyle := "Italic"
  11911.     .ReferencePropTextColor := 128
  11912.     .InheritedPropTextStyle := "Normal"
  11913.     .InheritedPropTextColor := -1
  11914.     .NonInheritedPropTextStyle := "Bold"
  11915.     .NonInheritedPropTextColor := -1
  11916.     With .DimensionArrayForm
  11917.       .Caption := "Dimension Array"
  11918.       .Font := EnvelopFont
  11919.       .Move(4560, 3570, 4635, 1935)
  11920.       .DefaultButton := PropertyEditor.DimensionArrayForm.BtnOK
  11921.       .CancelButton := PropertyEditor.DimensionArrayForm.BtnCancel
  11922.       .posDim := 1
  11923.       .posOpen := 7
  11924.       .posName := 4
  11925.       .posClose := 10
  11926.       .posDims := 8
  11927.       .posAs := 12
  11928.       .posType := 14
  11929.       .ignoreChange := False
  11930.       With .TBStmt
  11931.         .ZOrder := 1
  11932.         .Move(1155, 90, 2280, 285)
  11933.       End With  'PropertyEditor.DimensionArrayForm.TBStmt
  11934.       With .LblName
  11935.         .Caption := "Name:"
  11936.         .ZOrder := 10
  11937.         .Move(75, 540, 1035, 240)
  11938.         .Alignment := "Right"
  11939.       End With  'PropertyEditor.DimensionArrayForm.LblName
  11940.       With .LblDims
  11941.         .Caption := "Dimensions:"
  11942.         .ZOrder := 9
  11943.         .Move(75, 855, 1035, 240)
  11944.         .Alignment := "Right"
  11945.       End With  'PropertyEditor.DimensionArrayForm.LblDims
  11946.       With .CBType
  11947.         .ZOrder := 4
  11948.         .Move(1155, 1140, 1140, 300)
  11949.         .Sorted := False
  11950.         .Style := "DropdownList"
  11951.       End With  'PropertyEditor.DimensionArrayForm.CBType
  11952.       With .LblType
  11953.         .Caption := "Type:"
  11954.         .ZOrder := 8
  11955.         .Move(75, 1170, 1035, 240)
  11956.         .Alignment := "Right"
  11957.       End With  'PropertyEditor.DimensionArrayForm.LblType
  11958.       With .LblStmt
  11959.         .Caption := "Statement:"
  11960.         .ZOrder := 7
  11961.         .Move(75, 135, 1035, 240)
  11962.         .Alignment := "Right"
  11963.       End With  'PropertyEditor.DimensionArrayForm.LblStmt
  11964.       With .TBName
  11965.         .ZOrder := 2
  11966.         .Move(1155, 495, 2280, 285)
  11967.       End With  'PropertyEditor.DimensionArrayForm.TBName
  11968.       With .TBDims
  11969.         .ZOrder := 3
  11970.         .Move(1155, 825, 2280, 270)
  11971.       End With  'PropertyEditor.DimensionArrayForm.TBDims
  11972.       With .BtnOK
  11973.         .Caption := "OK"
  11974.         .ZOrder := 5
  11975.         .Move(3525, 90, 900, 300)
  11976.       End With  'PropertyEditor.DimensionArrayForm.BtnOK
  11977.       With .BtnCancel
  11978.         .Caption := "Cancel"
  11979.         .ZOrder := 6
  11980.         .Move(3525, 480, 900, 300)
  11981.       End With  'PropertyEditor.DimensionArrayForm.BtnCancel
  11982.     End With  'PropertyEditor.DimensionArrayForm
  11983.     With .EnumPicker
  11984.       .Caption := "Select an Enumeration type"
  11985.       .Font := EnvelopFont
  11986.       .Move(4695, 3480, 4650, 2955)
  11987.       .DefaultButton := PropertyEditor.EnumPicker.BtnOk
  11988.       .CancelButton := PropertyEditor.EnumPicker.BtnCancel
  11989.       With .EnumList
  11990.         .Caption := "EnumList"
  11991.         .BackColor := 16777215
  11992.         .ZOrder := 3
  11993.         .Move(150, 150, 2700, 2175)
  11994.       End With  'PropertyEditor.EnumPicker.EnumList
  11995.       With .BtnOk
  11996.         .Caption := "OK"
  11997.         .ZOrder := 2
  11998.         .Move(3150, 150, 1200, 375)
  11999.       End With  'PropertyEditor.EnumPicker.BtnOk
  12000.       With .BtnCancel
  12001.         .Caption := "Cancel"
  12002.         .ZOrder := 1
  12003.         .Move(3150, 675, 1200, 375)
  12004.       End With  'PropertyEditor.EnumPicker.BtnCancel
  12005.     End With  'PropertyEditor.EnumPicker
  12006.     With .ObjPicker
  12007.       .Caption := "Select Object"
  12008.       .Font := EnvelopFont
  12009.       .Move(4875, 3750, 4470, 2985)
  12010.       .BevelOuter := "Raised"
  12011.       .DefaultButton := PropertyEditor.ObjPicker.BtnOk
  12012.       .CancelButton := PropertyEditor.ObjPicker.BtnCancel
  12013.       With .BtnOk
  12014.         .Caption := "OK"
  12015.         .ZOrder := 2
  12016.         .Move(3230, 90, 1050, 300)
  12017.       End With  'PropertyEditor.ObjPicker.BtnOk
  12018.       With .BtnCancel
  12019.         .Caption := "Cancel"
  12020.         .ZOrder := 3
  12021.         .Move(3230, 480, 1050, 300)
  12022.       End With  'PropertyEditor.ObjPicker.BtnCancel
  12023.       With .ObjList
  12024.         .Caption := "ObjList"
  12025.         .ZOrder := 1
  12026.         .Move(150, 375, 2850, 1800)
  12027.       End With  'PropertyEditor.ObjPicker.ObjList
  12028.       With .Label1
  12029.         .ZOrder := 7
  12030.         .Move(150, 75, 2855, 300)
  12031.       End With  'PropertyEditor.ObjPicker.Label1
  12032.       With .CBReference
  12033.         .Caption := "&Reference"
  12034.         .ZOrder := 4
  12035.         .Move(3095, 1155, 1185, 225)
  12036.       End With  'PropertyEditor.ObjPicker.CBReference
  12037.       With .CBUntyped
  12038.         .Caption := "&Untyped"
  12039.         .ZOrder := 5
  12040.         .Move(3095, 1470, 1185, 225)
  12041.       End With  'PropertyEditor.ObjPicker.CBUntyped
  12042.       With .CBShowEmbeds
  12043.         .Caption := "Show &embedded objects"
  12044.         .ZOrder := 6
  12045.         .Move(135, 2265, 2775, 225)
  12046.       End With  'PropertyEditor.ObjPicker.CBShowEmbeds
  12047.     End With  'PropertyEditor.ObjPicker
  12048.   End With  'PropertyEditor
  12049. ' Reconstruction commands for object: MenuTester
  12050. '
  12051.   With MenuTester
  12052.     .Caption := "MenuTester"
  12053.     .ForeColor := 0
  12054.     .Font := MenuTester.font1
  12055.     .Move(7770, 1815, 6330, 1680)
  12056.     With .Label1
  12057.       .Caption := "Test Drive Your Menu"
  12058.       .ZOrder := 1
  12059.       .Move(150, 450, 6000, 600)
  12060.       .Alignment := "Center"
  12061.     End With  'MenuTester.Label1
  12062.     With .font1
  12063.       .FaceName := "Times New Roman"
  12064.       .Size := 18.000000
  12065.       .Bold := True
  12066.       .Italic := False
  12067.       .Strikethru := False
  12068.     End With  'MenuTester.font1
  12069.   End With  'MenuTester
  12070. ' Reconstruction commands for object: MenuEditor
  12071. '
  12072.   With MenuEditor
  12073.     .Enabled := False
  12074.     With .SelectPopupForm
  12075.       .Caption := "Select PopupMenu"
  12076.       .Font := DefaultDialogFont
  12077.       .Move(4395, 4260, 5415, 1905)
  12078.       .DefaultButton := MenuEditor.SelectPopupForm.BtnOK
  12079.       .CancelButton := MenuEditor.SelectPopupForm.BtnCancel
  12080.       .MaxButton := False
  12081.       .HostMenu := Nothing
  12082.       With .CBPopups
  12083.         .ZOrder := 4
  12084.         .Move(915, 570, 3225, 300)
  12085.         .Visible := False
  12086.         .ShowDynamics := True
  12087.         .ShowEmbeds := True
  12088.         .RootObject := PopupMenu
  12089.         .Style := "Tree"
  12090.       End With  'MenuEditor.SelectPopupForm.CBPopups
  12091.       With .OptExisting
  12092.         .Caption := "&Existing:"
  12093.         .ZOrder := 2
  12094.         .Move(1950, 150, 1050, 285)
  12095.         .TabStop := True
  12096.       End With  'MenuEditor.SelectPopupForm.OptExisting
  12097.       With .OptNew
  12098.         .Caption := "&New:"
  12099.         .ZOrder := 1
  12100.         .Move(900, 150, 1050, 285)
  12101.         .TabGroup := True
  12102.       End With  'MenuEditor.SelectPopupForm.OptNew
  12103.       With .LblCaption
  12104.         .Caption := "Caption:"
  12105.         .ZOrder := 9
  12106.         .Move(150, 1080, 720, 240)
  12107.         .Alignment := "Right"
  12108.       End With  'MenuEditor.SelectPopupForm.LblCaption
  12109.       With .TECaption
  12110.         .ZOrder := 5
  12111.         .Move(915, 1050, 3225, 300)
  12112.       End With  'MenuEditor.SelectPopupForm.TECaption
  12113.       With .TEName
  12114.         .ZOrder := 3
  12115.         .Move(915, 570, 3225, 300)
  12116.       End With  'MenuEditor.SelectPopupForm.TEName
  12117.       With .BtnOK
  12118.         .Caption := "OK"
  12119.         .ZOrder := 6
  12120.         .Move(4320, 90, 885, 300)
  12121.       End With  'MenuEditor.SelectPopupForm.BtnOK
  12122.       With .BtnCancel
  12123.         .Caption := "Cancel"
  12124.         .ZOrder := 7
  12125.         .Move(4320, 480, 885, 300)
  12126.       End With  'MenuEditor.SelectPopupForm.BtnCancel
  12127.       With .LblName
  12128.         .Caption := "Name:"
  12129.         .ZOrder := 8
  12130.         .Move(150, 600, 735, 300)
  12131.         .Alignment := "Right"
  12132.       End With  'MenuEditor.SelectPopupForm.LblName
  12133.     End With  'MenuEditor.SelectPopupForm
  12134.   End With  'MenuEditor
  12135. ' Reconstruction commands for object: CtrlToolGadgetWizard
  12136. '
  12137.   With CtrlToolGadgetWizard
  12138.     .title_ := "Configure ControlTools.Gadget"
  12139.     .Title := "Configure ControlTools.Gadget"
  12140.     .GraphicFileName := "envelop.ero"
  12141.     .FirstStep := CtrlToolGadgetWizard.SelectObject
  12142.     .LastStep := CtrlToolGadgetWizard.SelectBitmap
  12143.     .ng := Nothing
  12144.     With .SelectObject
  12145.       .Caption := "Configure ControlTools.Gadget"
  12146.       .Move(3585, 6150, 7155, 4815)
  12147.       .DefaultButton := CtrlToolGadgetWizard.SelectObject.BtnNext
  12148.       .CancelButton := Nothing
  12149.       .wizard := CtrlToolGadgetWizard
  12150.       .NextStep := CtrlToolGadgetWizard.SelectBitmap
  12151.       With .TextBox1
  12152.         .ZOrder := 1
  12153.         .Move(2850, 1050, 4050, 525)
  12154.       End With  'CtrlToolGadgetWizard.SelectObject.TextBox1
  12155.       With .BtnFinish
  12156.         .ZOrder := 5
  12157.         .Move(6225, 4050, 825, 300)
  12158.       End With  'CtrlToolGadgetWizard.SelectObject.BtnFinish
  12159.       With .BtnNext
  12160.         .ZOrder := 4
  12161.         .Move(5325, 4050, 825, 300)
  12162.       End With  'CtrlToolGadgetWizard.SelectObject.BtnNext
  12163.       With .BtnBack
  12164.         .Enabled := False
  12165.         .ZOrder := 3
  12166.         .Move(4500, 4050, 825, 300)
  12167.       End With  'CtrlToolGadgetWizard.SelectObject.BtnBack
  12168.       With .BtnCancel
  12169.         .ZOrder := 2
  12170.         .Move(3600, 4050, 825, 300)
  12171.       End With  'CtrlToolGadgetWizard.SelectObject.BtnCancel
  12172.       With .ImgGraphic
  12173.         .ZOrder := 8
  12174.         .Move(225, 225, 2475, 3150)
  12175.         .Picture := CtrlToolGadgetWizard.Bitmap
  12176.       End With  'CtrlToolGadgetWizard.SelectObject.ImgGraphic
  12177.       With .LblInstruction
  12178.         .Caption := "What Object should we install?"
  12179.         .ZOrder := 7
  12180.         .Move(2850, 225, 4125, 300)
  12181.       End With  'CtrlToolGadgetWizard.SelectObject.LblInstruction
  12182.       With .Frame1
  12183.         .ZOrder := 6
  12184.         .Move(75, 3825, 6975, 75)
  12185.       End With  'CtrlToolGadgetWizard.SelectObject.Frame1
  12186.     End With  'CtrlToolGadgetWizard.SelectObject
  12187.     With .SelectBitmap
  12188.       .Caption := "Configure ControlTools.Gadget"
  12189.       .Move(3585, 6150, 7155, 4815)
  12190.       .DefaultButton := CtrlToolGadgetWizard.SelectBitmap.BtnFinish
  12191.       .CancelButton := Nothing
  12192.       .wizard := CtrlToolGadgetWizard
  12193.       .BackStep := CtrlToolGadgetWizard.SelectObject
  12194.       With .TextBox1
  12195.         .Caption := "TextBox1"
  12196.         .ZOrder := 3
  12197.         .Move(2850, 1050, 4050, 525)
  12198.       End With  'CtrlToolGadgetWizard.SelectBitmap.TextBox1
  12199.       With .BTNBrowse
  12200.         .Caption := "Browse..."
  12201.         .ZOrder := 2
  12202.         .Move(2850, 1725, 900, 375)
  12203.       End With  'CtrlToolGadgetWizard.SelectBitmap.BTNBrowse
  12204.       With .BTNPreview
  12205.         .Caption := "Preview"
  12206.         .ZOrder := 1
  12207.         .Move(6000, 1725, 900, 375)
  12208.       End With  'CtrlToolGadgetWizard.SelectBitmap.BTNPreview
  12209.       With .SampleBox
  12210.         .ZOrder := 11
  12211.         .Move(4665, 2715, 480, 480)
  12212.         .Visible := True
  12213.         With .PreviewTool
  12214.           .Position := 1
  12215.           With .bitmap
  12216.             .FileName := "envelop.ero"
  12217.             .ResId := 187180
  12218.           End With  'CtrlToolGadgetWizard.SelectBitmap.SampleBox.PreviewTool.bitmap
  12219.         End With  'CtrlToolGadgetWizard.SelectBitmap.SampleBox.PreviewTool
  12220.       End With  'CtrlToolGadgetWizard.SelectBitmap.SampleBox
  12221.       With .BtnFinish
  12222.         .ZOrder := 7
  12223.         .Move(6225, 4050, 825, 300)
  12224.       End With  'CtrlToolGadgetWizard.SelectBitmap.BtnFinish
  12225.       With .BtnNext
  12226.         .Enabled := False
  12227.         .ZOrder := 6
  12228.         .Move(5325, 4050, 825, 300)
  12229.       End With  'CtrlToolGadgetWizard.SelectBitmap.BtnNext
  12230.       With .BtnBack
  12231.         .ZOrder := 5
  12232.         .Move(4500, 4050, 825, 300)
  12233.       End With  'CtrlToolGadgetWizard.SelectBitmap.BtnBack
  12234.       With .BtnCancel
  12235.         .ZOrder := 4
  12236.         .Move(3600, 4050, 825, 300)
  12237.       End With  'CtrlToolGadgetWizard.SelectBitmap.BtnCancel
  12238.       With .ImgGraphic
  12239.         .ZOrder := 10
  12240.         .Move(225, 225, 2475, 3150)
  12241.         .Picture := CtrlToolGadgetWizard.Bitmap
  12242.       End With  'CtrlToolGadgetWizard.SelectBitmap.ImgGraphic
  12243.       With .LblInstruction
  12244.         .Caption := "What Bitmap should be used in the Palette?"
  12245.         .ZOrder := 9
  12246.         .Move(2850, 225, 4125, 375)
  12247.       End With  'CtrlToolGadgetWizard.SelectBitmap.LblInstruction
  12248.       With .Frame1
  12249.         .ZOrder := 8
  12250.         .Move(75, 3825, 6975, 75)
  12251.       End With  'CtrlToolGadgetWizard.SelectBitmap.Frame1
  12252.     End With  'CtrlToolGadgetWizard.SelectBitmap
  12253.     With .Bitmap
  12254.       .LoadType := "MemoryBased"
  12255.       .FileName := "envelop.ero"
  12256.       .ResId := 187808
  12257.     End With  'CtrlToolGadgetWizard.Bitmap
  12258.   End With  'CtrlToolGadgetWizard
  12259. ' Reconstruction commands for object: GroupEditor
  12260. '
  12261.   With GroupEditor
  12262.     With .EditorForm
  12263.       .Caption := "Group: GadgetConfigWizard"
  12264.       .Move(4590, 2520, 3660, 3795)
  12265.       .AccelForm := EnvelopForm
  12266.       .GroupRef := GadgetConfigWizard
  12267.       .ParentForReal := GroupEditor
  12268.       With .GroupList
  12269.         .BackColor := 12632256
  12270.         .ZOrder := 4
  12271.         .Move(0, 255, 3540, 3390)
  12272.         .Sorted := False
  12273.       End With  'GroupEditor.EditorForm.GroupList
  12274.       With .Up
  12275.         .Caption := "Up"
  12276.         .ZOrder := 1
  12277.         .Move(0, 0, 825, 270)
  12278.       End With  'GroupEditor.EditorForm.Up
  12279.       With .Down
  12280.         .Caption := "Down"
  12281.         .ZOrder := 2
  12282.         .Move(750, 0, 855, 270)
  12283.       End With  'GroupEditor.EditorForm.Down
  12284.       With .Delete
  12285.         .Caption := "Delete"
  12286.         .ZOrder := 3
  12287.         .Move(1590, 0, 855, 270)
  12288.       End With  'GroupEditor.EditorForm.Delete
  12289.     End With  'GroupEditor.EditorForm
  12290.   End With  'GroupEditor
  12291. ' Reconstruction commands for object: NewProjectForm
  12292. '
  12293.   With NewProjectForm
  12294.     .Caption := "New Project"
  12295.     .Font := DefaultDialogFont
  12296.     .Move(4005, 3960, 4995, 2340)
  12297.     .DefaultButton := NewProjectForm.BtnOK
  12298.     .CancelButton := NewProjectForm.BtnCancel
  12299.     .MaxButton := False
  12300.     .MinButton := False
  12301.     .GeneratedName := "Application1"
  12302.     With .LblProjType
  12303.       .Caption := "Project type:"
  12304.       .ZOrder := 13
  12305.       .Move(135, 135, 1200, 300)
  12306.       .WordWrap := False
  12307.     End With  'NewProjectForm.LblProjType
  12308.     With .LblProjName
  12309.       .Caption := "Project object name:"
  12310.       .ZOrder := 12
  12311.       .Move(135, 930, 1800, 300)
  12312.       .Alignment := "Right"
  12313.     End With  'NewProjectForm.LblProjName
  12314.     With .LblProjFile
  12315.       .Caption := "Project file:"
  12316.       .ZOrder := 11
  12317.       .Move(135, 1275, 1800, 210)
  12318.       .Alignment := "Right"
  12319.     End With  'NewProjectForm.LblProjFile
  12320.     With .OptApplication
  12321.       .Caption := "&Application"
  12322.       .ZOrder := 1
  12323.       .Move(1350, 90, 1275, 270)
  12324.       .TabStop := True
  12325.       .TabGroup := True
  12326.       .Value := True
  12327.     End With  'NewProjectForm.OptApplication
  12328.     With .OptLibrary
  12329.       .Caption := "Component &Library"
  12330.       .ZOrder := 2
  12331.       .Move(1350, 420, 1935, 270)
  12332.     End With  'NewProjectForm.OptLibrary
  12333.     With .LblEXEfile
  12334.       .Caption := "Application EXE file:"
  12335.       .ZOrder := 10
  12336.       .Move(135, 1620, 1800, 240)
  12337.       .Alignment := "Right"
  12338.     End With  'NewProjectForm.LblEXEfile
  12339.     With .TEProjName
  12340.       .ZOrder := 3
  12341.       .Move(1935, 900, 1845, 300)
  12342.     End With  'NewProjectForm.TEProjName
  12343.     With .TEProjFile
  12344.       .ZOrder := 4
  12345.       .Move(1935, 1230, 1845, 300)
  12346.     End With  'NewProjectForm.TEProjFile
  12347.     With .TEEXEfile
  12348.       .ZOrder := 5
  12349.       .Move(1935, 1575, 1845, 300)
  12350.     End With  'NewProjectForm.TEEXEfile
  12351.     With .BtnOK
  12352.       .Caption := "OK"
  12353.       .ZOrder := 6
  12354.       .Move(3915, 60, 900, 315)
  12355.     End With  'NewProjectForm.BtnOK
  12356.     With .BtnCancel
  12357.       .Caption := "Cancel"
  12358.       .ZOrder := 7
  12359.       .Move(3915, 435, 900, 315)
  12360.     End With  'NewProjectForm.BtnCancel
  12361.     With .BtnBrowseProjFile
  12362.       .Caption := "Browse..."
  12363.       .ZOrder := 8
  12364.       .Move(3840, 1230, 975, 300)
  12365.     End With  'NewProjectForm.BtnBrowseProjFile
  12366.     With .BtnBrowseEXEfile
  12367.       .Caption := "Browse..."
  12368.       .ZOrder := 9
  12369.       .Move(3840, 1575, 975, 300)
  12370.     End With  'NewProjectForm.BtnBrowseEXEfile
  12371.   End With  'NewProjectForm
  12372. ' Reconstruction commands for object: SelectModuleForm
  12373. '
  12374.   With SelectModuleForm
  12375.     .Caption := "Select module to add"
  12376.     .Font := DefaultDialogFont
  12377.     .Move(5070, 4365, 3615, 2475)
  12378.     .MaxButton := False
  12379.     .MinButton := False
  12380.     .module := Nothing
  12381.     With .LstModules
  12382.       .ZOrder := 1
  12383.       .Move(90, 360, 2220, 1590)
  12384.       .Sorted := False
  12385.     End With  'SelectModuleForm.LstModules
  12386.     With .BtnOK
  12387.       .Caption := "OK"
  12388.       .ZOrder := 2
  12389.       .Move(2400, 90, 1005, 315)
  12390.     End With  'SelectModuleForm.BtnOK
  12391.     With .BtnCancel
  12392.       .Caption := "Cancel"
  12393.       .ZOrder := 3
  12394.       .Move(2400, 495, 1005, 315)
  12395.     End With  'SelectModuleForm.BtnCancel
  12396.     With .BtnBrowse
  12397.       .Caption := "&Browse..."
  12398.       .ZOrder := 5
  12399.       .Move(2400, 1665, 1005, 315)
  12400.     End With  'SelectModuleForm.BtnBrowse
  12401.     With .LblModules
  12402.       .Caption := "Modules:"
  12403.       .ZOrder := 6
  12404.       .Move(90, 90, 900, 180)
  12405.     End With  'SelectModuleForm.LblModules
  12406.     With .BtnNew
  12407.       .Caption := "&New"
  12408.       .ZOrder := 4
  12409.       .Move(2400, 1260, 1005, 315)
  12410.     End With  'SelectModuleForm.BtnNew
  12411.   End With  'SelectModuleForm
  12412. '
  12413. ' Reconstruction commands for object: ImageListBrowser
  12414. '
  12415.   With ImageListBrowser
  12416.     .Move(11760, 6780, 4620, 1710)
  12417.     .CurrentIndex := 0
  12418.     .ImageListRef := Nothing
  12419.     .Spacer := 4
  12420.     .ImageHeight := 0
  12421.     .ImageWidth := 0
  12422.     With .Images
  12423.       .Caption := "Images"
  12424.       .ZOrder := 2
  12425.       .Move(0, 0, 4500, 1005)
  12426.       .DrawMode := "Xor Pen"
  12427.     End With  'ImageListBrowser.Images
  12428.     With .ImageScrollBar
  12429.       .Caption := "ImageScrollBar"
  12430.       .ZOrder := 1
  12431.       .Move(0, 1005, 4500, 300)
  12432.       .Visible := False
  12433.       .SmallChange := 1
  12434.       .LargeChange := 5
  12435.       .Max := 1
  12436.       .Orientation := "Horizontal"
  12437.       .Move(0, 1005, 4500, 300)
  12438.     End With  'ImageListBrowser.ImageScrollBar
  12439.   End With  'ImageListBrowser
  12440. ' Reconstruction commands for object: ImageListBuilderForm
  12441. '
  12442.   With ImageListBuilderForm
  12443.     .Caption := "Image List Builder"
  12444.     .ForeColor := 0
  12445.     .Font := ImageListBuilderForm.font1
  12446.     .Move(4335, 1545, 5220, 4950)
  12447.     .CurrentImageList := Nothing
  12448.     With .opt16x16
  12449.       .Caption := "16x16"
  12450.       .ZOrder := 1
  12451.       .Move(300, 450, 900, 300)
  12452.     End With  'ImageListBuilderForm.opt16x16
  12453.     With .opt32x32
  12454.       .Caption := "32x32"
  12455.       .ZOrder := 2
  12456.       .Move(1350, 450, 900, 300)
  12457.     End With  'ImageListBuilderForm.opt32x32
  12458.     With .opt48x48
  12459.       .Caption := "48x48"
  12460.       .ZOrder := 3
  12461.       .Move(2550, 450, 900, 300)
  12462.     End With  'ImageListBuilderForm.opt48x48
  12463.     With .optCustom
  12464.       .Caption := "Custom"
  12465.       .ZOrder := 4
  12466.       .Move(3675, 390, 1050, 375)
  12467.       .TabStop := True
  12468.     End With  'ImageListBuilderForm.optCustom
  12469.     With .txtWidth
  12470.       .ZOrder := 5
  12471.       .Move(1725, 900, 450, 300)
  12472.     End With  'ImageListBuilderForm.txtWidth
  12473.     With .txtHeight
  12474.       .Enabled := False
  12475.       .ZOrder := 6
  12476.       .Move(2625, 900, 450, 300)
  12477.     End With  'ImageListBuilderForm.txtHeight
  12478.     With .btnAddImage
  12479.       .Caption := "Add Image..."
  12480.       .ZOrder := 7
  12481.       .Move(300, 3525, 1500, 300)
  12482.     End With  'ImageListBuilderForm.btnAddImage
  12483.     With .btnRemoveImage
  12484.       .Caption := "Remove Image"
  12485.       .ZOrder := 8
  12486.       .Move(3285, 3525, 1515, 300)
  12487.     End With  'ImageListBuilderForm.btnRemoveImage
  12488.     With .btnOK
  12489.       .Caption := "OK"
  12490.       .ZOrder := 9
  12491.       .Move(2175, 4125, 600, 300)
  12492.     End With  'ImageListBuilderForm.btnOK
  12493.     With .Label2
  12494.       .Caption := "X"
  12495.       .ZOrder := 10
  12496.       .Move(2250, 975, 300, 300)
  12497.       .Alignment := "Center"
  12498.     End With  'ImageListBuilderForm.Label2
  12499.     With .ImageBrowser
  12500.       .ZOrder := 11
  12501.       .Move(300, 1950, 4500, 1455)
  12502.       .Outlined := False
  12503.       .BorderStyle := "None"
  12504.       .MinButton := True
  12505.       .ControlBox := False
  12506.       .Parent := ImageListBuilderForm
  12507.       .Visible := True
  12508.       With .Images
  12509.         .ZOrder := 1
  12510.         .Move(0, 0, 4500, 1155)
  12511.       End With  'ImageListBuilderForm.ImageBrowser.Images
  12512.       With .ImageScrollBar
  12513.         .ZOrder := 2
  12514.         .Move(0, 1155, 4500, 300)
  12515.         .Move(0, 1155, 4500, 300)
  12516.       End With  'ImageListBuilderForm.ImageBrowser.ImageScrollBar
  12517.     End With  'ImageListBuilderForm.ImageBrowser
  12518.     With .Frame2
  12519.       .Caption := "Image Size"
  12520.       .ZOrder := 12
  12521.       .Move(150, 150, 4800, 1200)
  12522.     End With  'ImageListBuilderForm.Frame2
  12523.     With .Frame1
  12524.       .Caption := "Images"
  12525.       .ZOrder := 13
  12526.       .Move(150, 1575, 4800, 2400)
  12527.     End With  'ImageListBuilderForm.Frame1
  12528.     With .font1
  12529.       .FaceName := "MS Sans Serif"
  12530.       .Size := 9.000000
  12531.       .Bold := True
  12532.       .Italic := False
  12533.       .Strikethru := False
  12534.     End With  'ImageListBuilderForm.font1
  12535.     With .OpenPanel
  12536.       .Title := "Select Bitmap"
  12537.       .DefaultExtension := "BMP"
  12538.       .Filter := "Bitmap Files(*.BMP)|*.BMP|"
  12539.       .FilterIndex := 1
  12540.     End With  'ImageListBuilderForm.OpenPanel
  12541.   End With  'ImageListBuilderForm
  12542. ' Reconstruction commands for object: ComCtlObjEditor
  12543. '
  12544.   With ComCtlObjEditor
  12545.   End With  'ComCtlObjEditor
  12546. ' Reconstruction commands for object: ImageSelectForm
  12547. '
  12548.   With ImageSelectForm
  12549.     .Caption := "Image Select"
  12550.     .Move(3810, 3240, 5805, 2430)
  12551.     With .ImageBrowse
  12552.       .ZOrder := 1
  12553.       .Move(150, 150, 5400, 1455)
  12554.       .Outlined := False
  12555.       .BorderStyle := "None"
  12556.       .MinButton := True
  12557.       .ControlBox := False
  12558.       .Parent := ImageSelectForm
  12559.       .Visible := True
  12560.       With .Images
  12561.         .ZOrder := 1
  12562.         .Move(0, 0, 5400, 1155)
  12563.       End With  'ImageSelectForm.ImageBrowse.Images
  12564.       With .ImageScrollBar
  12565.         .ZOrder := 2
  12566.         .Move(0, 1155, 5400, 300)
  12567.         .Move(0, 1155, 5400, 300)
  12568.       End With  'ImageSelectForm.ImageBrowse.ImageScrollBar
  12569.     End With  'ImageSelectForm.ImageBrowse
  12570.     With .btnOK
  12571.       .Caption := "OK"
  12572.       .ZOrder := 2
  12573.       .Move(1500, 1650, 900, 300)
  12574.     End With  'ImageSelectForm.btnOK
  12575.     With .btnCancel
  12576.       .Caption := "Cancel"
  12577.       .ZOrder := 3
  12578.       .Move(3300, 1650, 900, 300)
  12579.     End With  'ImageSelectForm.btnCancel
  12580.   End With  'ImageSelectForm
  12581. ' Reconstruction commands for object: TabPropertyForm
  12582. '
  12583.   With TabPropertyForm
  12584.     .Caption := "Tab Strip Properties"
  12585.     .ForeColor := 0
  12586.     .Font := TabPropertyForm.font1
  12587.     .Move(7095, 5130, 7260, 3945)
  12588.     .CurrentTabStrip := Nothing
  12589.     With .txtIndex
  12590.       .ZOrder := 1
  12591.       .Move(1350, 525, 450, 300)
  12592.       .ReadOnly := True
  12593.     End With  'TabPropertyForm.txtIndex
  12594.     With .btnPrev
  12595.       .Caption := "<-"
  12596.       .Enabled := False
  12597.       .ZOrder := 2
  12598.       .Move(1950, 525, 300, 300)
  12599.     End With  'TabPropertyForm.btnPrev
  12600.     With .btnNext
  12601.       .Caption := "->"
  12602.       .Enabled := False
  12603.       .ZOrder := 3
  12604.       .Move(2250, 525, 300, 300)
  12605.     End With  'TabPropertyForm.btnNext
  12606.     With .btnAddTab
  12607.       .Caption := "Add Tab"
  12608.       .ZOrder := 4
  12609.       .Move(2850, 525, 1200, 300)
  12610.     End With  'TabPropertyForm.btnAddTab
  12611.     With .btnRemoveTab
  12612.       .Caption := "Remove Tab"
  12613.       .ZOrder := 5
  12614.       .Move(4350, 525, 1350, 300)
  12615.     End With  'TabPropertyForm.btnRemoveTab
  12616.     With .txtCaption
  12617.       .ZOrder := 6
  12618.       .Move(1350, 1050, 5400, 300)
  12619.     End With  'TabPropertyForm.txtCaption
  12620.     With .txtIconIndex
  12621.       .ZOrder := 7
  12622.       .Move(1350, 1575, 750, 300)
  12623.     End With  'TabPropertyForm.txtIconIndex
  12624.     With .btnSelect
  12625.       .Caption := "Select..."
  12626.       .ZOrder := 8
  12627.       .Move(2250, 1575, 975, 300)
  12628.     End With  'TabPropertyForm.btnSelect
  12629.     With .chkForms
  12630.       .Caption := "TabForms"
  12631.       .ZOrder := 9
  12632.       .Move(4350, 1500, 1200, 300)
  12633.     End With  'TabPropertyForm.chkForms
  12634.     With .chkMultiRow
  12635.       .Caption := "MultiRow"
  12636.       .ZOrder := 10
  12637.       .Move(5700, 1500, 1125, 300)
  12638.     End With  'TabPropertyForm.chkMultiRow
  12639.     With .cboImages
  12640.       .ZOrder := 11
  12641.       .Move(1350, 2475, 2850, 300)
  12642.       .ShowEmbeds := True
  12643.       .RootObject := ImageList
  12644.       .Style := "Unsorted"
  12645.     End With  'TabPropertyForm.cboImages
  12646.     With .btnImagesNew
  12647.       .Caption := "New..."
  12648.       .ZOrder := 12
  12649.       .Move(4350, 2475, 675, 300)
  12650.     End With  'TabPropertyForm.btnImagesNew
  12651.     With .btnImagesEdit
  12652.       .Caption := "Edit..."
  12653.       .ZOrder := 13
  12654.       .Move(5175, 2475, 675, 300)
  12655.     End With  'TabPropertyForm.btnImagesEdit
  12656.     With .btnImagesClear
  12657.       .Caption := "Clear"
  12658.       .ZOrder := 14
  12659.       .Move(6000, 2475, 675, 300)
  12660.     End With  'TabPropertyForm.btnImagesClear
  12661.     With .btnOK
  12662.       .Caption := "OK"
  12663.       .ZOrder := 15
  12664.       .Move(3000, 3150, 1050, 300)
  12665.     End With  'TabPropertyForm.btnOK
  12666.     With .Label1
  12667.       .Caption := "Index:"
  12668.       .ZOrder := 16
  12669.       .Move(450, 525, 900, 300)
  12670.       .Alignment := "Right"
  12671.     End With  'TabPropertyForm.Label1
  12672.     With .Label2
  12673.       .Caption := "Caption:"
  12674.       .ZOrder := 17
  12675.       .Move(450, 1050, 900, 300)
  12676.       .Alignment := "Right"
  12677.     End With  'TabPropertyForm.Label2
  12678.     With .Label4
  12679.       .Caption := "Icon Index:"
  12680.       .ZOrder := 18
  12681.       .Move(300, 1575, 1050, 300)
  12682.       .Alignment := "Right"
  12683.     End With  'TabPropertyForm.Label4
  12684.     With .Label3
  12685.       .Caption := "Icons:"
  12686.       .ZOrder := 19
  12687.       .Move(600, 2475, 750, 300)
  12688.       .Alignment := "Right"
  12689.     End With  'TabPropertyForm.Label3
  12690.     With .Frame1
  12691.       .Caption := "Tabs"
  12692.       .ZOrder := 20
  12693.       .Move(225, 150, 6675, 1800)
  12694.     End With  'TabPropertyForm.Frame1
  12695.     With .Frame2
  12696.       .Caption := "Icons"
  12697.       .ZOrder := 21
  12698.       .Move(225, 2250, 6675, 675)
  12699.     End With  'TabPropertyForm.Frame2
  12700.     With .font1
  12701.       .FaceName := "MS Sans Serif"
  12702.       .Size := 9.000000
  12703.       .Bold := True
  12704.       .Italic := False
  12705.       .Strikethru := False
  12706.     End With  'TabPropertyForm.font1
  12707.   End With  'TabPropertyForm
  12708. ' Reconstruction commands for object: ListViewPropsForm
  12709. '
  12710.   With ListViewPropsForm
  12711.     .Caption := "List View Properties"
  12712.     .ForeColor := 0
  12713.     .Font := ListViewPropsForm.font1
  12714.     .Move(7065, 5145, 7290, 3945)
  12715.     .CurrentListView := Nothing
  12716.     With .txtIndex
  12717.       .ZOrder := 1
  12718.       .Move(1050, 375, 450, 300)
  12719.       .ReadOnly := True
  12720.     End With  'ListViewPropsForm.txtIndex
  12721.     With .btnPrev
  12722.       .Caption := "<-"
  12723.       .Enabled := False
  12724.       .ZOrder := 2
  12725.       .Move(1650, 375, 300, 300)
  12726.     End With  'ListViewPropsForm.btnPrev
  12727.     With .btnNext
  12728.       .Caption := "->"
  12729.       .Enabled := False
  12730.       .ZOrder := 3
  12731.       .Move(1950, 375, 300, 300)
  12732.     End With  'ListViewPropsForm.btnNext
  12733.     With .btnAddHdr
  12734.       .Caption := "Add Column Header"
  12735.       .ZOrder := 4
  12736.       .Move(2550, 375, 1950, 300)
  12737.     End With  'ListViewPropsForm.btnAddHdr
  12738.     With .btnRemoveHdr
  12739.       .Caption := "Remove Column Header"
  12740.       .ZOrder := 5
  12741.       .Move(4650, 375, 2175, 300)
  12742.     End With  'ListViewPropsForm.btnRemoveHdr
  12743.     With .txtCaption
  12744.       .ZOrder := 6
  12745.       .Move(1125, 825, 5775, 300)
  12746.     End With  'ListViewPropsForm.txtCaption
  12747.     With .txtWidth
  12748.       .ZOrder := 7
  12749.       .Move(1125, 1275, 1575, 300)
  12750.     End With  'ListViewPropsForm.txtWidth
  12751.     With .cboSmall
  12752.       .Move(1350, 2100, 2550, 300)
  12753.       .ShowEmbeds := True
  12754.       .RootObject := ImageList
  12755.       .Style := "Unsorted"
  12756.       .ZOrder := 8
  12757.     End With  'ListViewPropsForm.cboSmall
  12758.     With .btnSmallNew
  12759.       .Caption := "New..."
  12760.       .ZOrder := 9
  12761.       .Move(4050, 2100, 675, 300)
  12762.     End With  'ListViewPropsForm.btnSmallNew
  12763.     With .btnSmallEdit
  12764.       .Caption := "Edit..."
  12765.       .ZOrder := 10
  12766.       .Move(4875, 2100, 675, 300)
  12767.     End With  'ListViewPropsForm.btnSmallEdit
  12768.     With .btnSmallClear
  12769.       .Caption := "Clear"
  12770.       .ZOrder := 11
  12771.       .Move(5700, 2100, 675, 300)
  12772.     End With  'ListViewPropsForm.btnSmallClear
  12773.     With .cboLarge
  12774.       .Move(1350, 2550, 2550, 300)
  12775.       .ShowEmbeds := True
  12776.       .RootObject := ImageList
  12777.       .Style := "Unsorted"
  12778.       .ZOrder := 12
  12779.     End With  'ListViewPropsForm.cboLarge
  12780.     With .btnLargeNew
  12781.       .Caption := "New..."
  12782.       .ZOrder := 13
  12783.       .Move(4050, 2550, 675, 300)
  12784.     End With  'ListViewPropsForm.btnLargeNew
  12785.     With .btnLargeEdit
  12786.       .Caption := "Edit..."
  12787.       .ZOrder := 14
  12788.       .Move(4050, 2550, 675, 300)
  12789.       .Move(4875, 2550, 675, 300)
  12790.     End With  'ListViewPropsForm.btnLargeEdit
  12791.     With .btnLargeClear
  12792.       .Caption := "Clear"
  12793.       .ZOrder := 15
  12794.       .Move(5700, 2550, 675, 300)
  12795.     End With  'ListViewPropsForm.btnLargeClear
  12796.     With .btnOK
  12797.       .Caption := "OK"
  12798.       .ZOrder := 16
  12799.       .Move(3150, 3150, 1050, 300)
  12800.     End With  'ListViewPropsForm.btnOK
  12801.     With .Label1
  12802.       .Caption := "Index:"
  12803.       .ZOrder := 17
  12804.       .Move(300, 375, 750, 300)
  12805.       .Alignment := "Right"
  12806.     End With  'ListViewPropsForm.Label1
  12807.     With .Label2
  12808.       .Caption := "Caption:"
  12809.       .ZOrder := 18
  12810.       .Move(300, 825, 825, 300)
  12811.       .Alignment := "Right"
  12812.     End With  'ListViewPropsForm.Label2
  12813.     With .Label5
  12814.       .Caption := "Width:"
  12815.       .ZOrder := 19
  12816.       .Move(300, 1275, 825, 300)
  12817.       .Alignment := "Right"
  12818.     End With  'ListViewPropsForm.Label5
  12819.     With .Label3
  12820.       .Caption := "Small Icons:"
  12821.       .ZOrder := 20
  12822.       .Move(225, 2100, 1125, 300)
  12823.       .Alignment := "Right"
  12824.     End With  'ListViewPropsForm.Label3
  12825.     With .Label4
  12826.       .Caption := "Large Icons:"
  12827.       .ZOrder := 21
  12828.       .Move(225, 2550, 1125, 300)
  12829.       .Alignment := "Right"
  12830.     End With  'ListViewPropsForm.Label4
  12831.     With .Frame1
  12832.       .Caption := "Column Headers"
  12833.       .ZOrder := 22
  12834.       .Move(150, 75, 6825, 1575)
  12835.     End With  'ListViewPropsForm.Frame1
  12836.     With .Frame2
  12837.       .Caption := "Icons"
  12838.       .ZOrder := 23
  12839.       .Move(150, 1800, 6825, 1200)
  12840.     End With  'ListViewPropsForm.Frame2
  12841.     With .font1
  12842.       .FaceName := "MS Sans Serif"
  12843.       .Size := 9.000000
  12844.       .Bold := True
  12845.       .Italic := False
  12846.       .Strikethru := False
  12847.     End With  'ListViewPropsForm.font1
  12848.    End With  'ListViewPropsForm
  12849. ' Reconstruction commands for object: RegistryKey
  12850. '
  12851.   With RegistryKey
  12852.     .key := 0
  12853.     .path := "0"
  12854.     .enumcnt := 0
  12855.   End With  'RegistryKey
  12856. ' Reconstruction commands for object: HashObjList
  12857. '
  12858.   With HashObjList
  12859.     .Move(0, 0, 0, 0)
  12860.     .selectedobj := Nothing
  12861.     With .HashObjs
  12862.     End With  'HashObjList.HashObjs
  12863.   End With  'HashObjList
  12864. ' Reconstruction commands for object: OcxRegEntry
  12865. '
  12866.   With OcxRegEntry
  12867.     .RegKey := ""
  12868.     .ClassName := ""
  12869.     .Tag := ""
  12870.     .ResId := 0
  12871.     .ControlName := ""
  12872.     .BitmapFile := ""
  12873.     .OcxFile := ""
  12874.   End With  'OcxRegEntry
  12875. ' Reconstruction commands for object: OcxTool
  12876. '
  12877.   With OcxTool
  12878.     .Caption := "OcxTool"
  12879.     .Move(4485, 1635, 5610, 5505)
  12880.     With .OcxList
  12881.       .Caption := "OcxList"
  12882.       .ZOrder := 8
  12883.       .Move(450, 900, 4650, 2670)
  12884.       With .HashObjs
  12885.       End With  'OcxTool.OcxList.HashObjs
  12886.     End With  'OcxTool.OcxList
  12887.     With .TextBox1
  12888.       .Caption := "TextBox1"
  12889.       .ZOrder := 7
  12890.       .Move(450, 4050, 2250, 450)
  12891.       .Visible := False
  12892.     End With  'OcxTool.TextBox1
  12893.     With .Image1
  12894.       .Caption := "Image1"
  12895.       .ZOrder := 6
  12896.       .Move(2850, 4050, 450, 450)
  12897.       .Visible := False
  12898.       .AutoInitCropRect := False
  12899.       .CropXSize := 16
  12900.       .CropYSize := 15
  12901.     End With  'OcxTool.Image1
  12902.     With .Button3
  12903.       .Caption := "Add"
  12904.       .ZOrder := 5
  12905.       .Move(3900, 4050, 1185, 300)
  12906.       .Visible := False
  12907.     End With  'OcxTool.Button3
  12908.     With .Button4
  12909.       .Caption := "Remove"
  12910.       .ZOrder := 4
  12911.       .Move(3900, 4350, 1185, 300)
  12912.       .Visible := False
  12913.     End With  'OcxTool.Button4
  12914.     With .TextBox2
  12915.       .Caption := "TextBox2"
  12916.       .ZOrder := 3
  12917.       .Move(450, 4050, 3300, 450)
  12918.     End With  'OcxTool.TextBox2
  12919.     With .Button5
  12920.       .Caption := "Register..."
  12921.       .ZOrder := 2
  12922.       .Move(3900, 4050, 1200, 300)
  12923.     End With  'OcxTool.Button5
  12924.     With .Button6
  12925.       .Caption := "Unregister"
  12926.       .ZOrder := 1
  12927.       .Move(3900, 4350, 1200, 300)
  12928.     End With  'OcxTool.Button6
  12929.     With .Frame1
  12930.       .Caption := "OCX File Name"
  12931.       .ZOrder := 9
  12932.       .Move(300, 3750, 4950, 1050)
  12933.     End With  'OcxTool.Frame1
  12934.     With .Frame2
  12935.       .Caption := "OCX Class Name"
  12936.       .ZOrder := 10
  12937.       .Move(300, 3750, 3150, 1050)
  12938.       .Visible := False
  12939.     End With  'OcxTool.Frame2
  12940.     With .Frame3
  12941.       .Caption := "Controls Palette"
  12942.       .ZOrder := 11
  12943.       .Move(3450, 3750, 1800, 1050)
  12944.       .Visible := False
  12945.     End With  'OcxTool.Frame3
  12946.     With .Frame4
  12947.       .Caption := "OCX controls list"
  12948.       .ZOrder := 12
  12949.       .Move(300, 600, 4950, 3150)
  12950.     End With  'OcxTool.Frame4
  12951.     With .PaletteGroup
  12952.       .Append(OcxTool.Frame2)
  12953.       .Append(OcxTool.TextBox1)
  12954.       .Append(OcxTool.Image1)
  12955.       .Append(OcxTool.Frame3)
  12956.       .Append(OcxTool.Button3)
  12957.       .Append(OcxTool.Button4)
  12958.     End With  'OcxTool.PaletteGroup
  12959.     With .RegisterGroup
  12960.       .Append(OcxTool.Frame1)
  12961.       .Append(OcxTool.TextBox2)
  12962.       .Append(OcxTool.Button5)
  12963.       .Append(OcxTool.Button6)
  12964.     End With  'OcxTool.RegisterGroup
  12965.     With .TabStrip1
  12966.       .Caption := "TabStrip1"
  12967.       .ZOrder := 13
  12968.       .Move(150, 150, 5250, 4800)
  12969.       .SelectedItem := OcxTool.TabStrip1.AutoTab1
  12970.       .TabWidthStyle := "Justified"
  12971.       .TabFixedWidth := 2610
  12972.       With .AutoTab1
  12973.         .Caption := "Register OCX controls"
  12974.       End With  'OcxTool.TabStrip1.AutoTab1
  12975.       With .AutoTab2
  12976.         .Caption := "Modify Control Palette"
  12977.       End With  'OcxTool.TabStrip1.AutoTab2
  12978.     End With  'OcxTool.TabStrip1
  12979.   End With  'OcxTool
  12980. End Code
  12981.