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

  1. Type ScreenLayout
  2.   Dim curItem As Integer
  3.   Dim ScreenWidth As Integer
  4.   Dim ScreenHeight As Integer
  5.  
  6.   ' METHODS for object: ScreenLayout
  7.   Sub Clear
  8.     ' Destroy all embedded layout items
  9.     Dim wli As WindowLayoutItem
  10.     For Each wli EmbeddedIn Me
  11.       DestroyObject(wli)
  12.     Next 
  13.   End Sub
  14.  
  15.   Sub DebugRestoreLayout()
  16.     Dim wli As WindowLayoutItem
  17.   
  18.     ' Restore the saved visibility of all the windows.
  19.     For Each wli EmbeddedIn Me
  20.       If (wli.wnd) Then wli.wnd.Visible = wli.visible
  21.     Next 
  22.   End Sub
  23.  
  24.   Sub DebugShowLayout()
  25.     Dim wli As WindowLayoutItem
  26.   
  27.     ' Make all the windows visible, so we can see if they fit in layout.
  28.     For Each wli EmbeddedIn Me
  29.       If (wli.wnd) Then wli.wnd.Visible = True
  30.     Next 
  31.   End Sub
  32.  
  33.   Sub EnsurePixels()
  34.     ' The heuristic we'll use to decide whether an item needs to be scaled
  35.     ' from twips to pixels is whether either of height or width is greater
  36.     ' than 2000. This gets us away from the dangerous boundary cases where
  37.     ' an item is saved in pixels, but is still near 1000 pixels in size, and
  38.     ' also stays away from dependencies on the current screen resolution.
  39.     ' It does introduce the possibility that a small form saved in twips
  40.     ' may grow to be huge because we failed to scale it here. Tough.
  41.     ' Furthermore, if I'm an EnvelopScreenLayout, then I was made at 15
  42.     ' twips per pixel, period. Otherwise go ahead and use the tpp figure
  43.     ' from the current display settings (found on Screen object).
  44.     Dim WLI as WindowLayoutItem
  45.     Dim factorX, factorY As Single
  46.     If TypeOf Me Is EnvelopScreenLayout Then 
  47.       factorX = 15 : factorY = 15
  48.     Else 
  49.       factorX = Screen.TwipsPerPixelX : factorY = Screen.TwipsPerPixelY
  50.     End If
  51.   
  52.     For Each WLI EmbeddedIn Me
  53.       If (WLI.height > 2000) || (WLI.width > 2000) Then 
  54.         WLI.left_ = WLI.left_ / factorX
  55.         WLI.top = WLI.top / factorY
  56.         WLI.width = WLI.width / factorX
  57.         WLI.height = WLI.height / factorY
  58.       End If
  59.     Next WLI
  60.   End Sub
  61.  
  62.   Function FitsScreen As Boolean
  63.     FitsScreen = (ScreenWidth <= Screen.pixelWidth) && (ScreenHeight <= Screen.pixelHeight)
  64.   End Function
  65.  
  66.   Sub Mark
  67.     ' Mark all embedded items as not-visited
  68.     Dim wli As WindowLayoutItem
  69.     For Each wli EmbeddedIn Me
  70.       wli.wnd = Nothing
  71.     Next 
  72.   End Sub
  73.  
  74.   Sub Purge
  75.     ' Destroy all embedded items that don't have a window recorded.
  76.     Dim wli As WindowLayoutItem
  77.     For Each wli EmbeddedIn Me
  78.       If (wli.wnd = Nothing) Then DestroyObject(wli)
  79.     Next 
  80.   End Sub
  81.  
  82.   Sub RestoreLayout()
  83.     ' Restore windows' position/visibility as recorded by embedded items.
  84.     Dim suspend as new SuspendDebugExceptionTrapping
  85.     Dim wli As WindowLayoutItem
  86.   
  87.     EnsurePixels
  88.     For Each wli EmbeddedIn Me
  89.       If wli.wnd Then 
  90.         Try
  91.           ' For non-Form objects, we know they need to be created first.
  92.           If Not TypeOf wli.wnd Is Form Then wli.wnd.Visible = wli.visible
  93.           If TypeOf wli.wnd Is Window Then 
  94.             ' Children of Window use twip coordinates
  95.             With Screen
  96.               wli.wnd.Move(wli.left_ * .TwipsPerPixelX, wli.top * .TwipsPerPixelY, wli.width * .TwipsPerPixelX, wli.height * .TwipsPerPixelY)
  97.             End With
  98.           Else 
  99.             ' Objects that don't inherit from Window use pixel coordinates
  100.             wli.wnd.Move(wli.left_, wli.top, wli.width, wli.height)
  101.           End If
  102.           wli.wnd.Visible = wli.visible
  103.   
  104.           ' Notify the window itself, if it has a "ScreenLayoutRestore" method.
  105.           If (MethodExists(wli.wnd, "ScreenLayoutRestore")) Then wli.wnd.ScreenLayoutRestore()
  106.   
  107.         catch NotFound(s as string)
  108.         End Try
  109.       End If
  110.     Next 
  111.   End Sub
  112.  
  113.   Sub SaveExplicitWindow(nm As String)
  114.     dim o as Object
  115.     ' Given the string-name of an object, if it refers to an real object
  116.     ' and it isn't already recorded, then save it.
  117.     o = FindObject(nm)
  118.     If o Then 
  119.       dim wli As WindowLayoutItem
  120.       For Each wli EmbeddedIn Me
  121.         If wli.wnd = o Then Exit Sub
  122.       Next 
  123.     End If
  124.     SaveWindow(o)
  125.   End Sub
  126.  
  127.   Sub SaveExplicitWindows()
  128.     ' This method is meant to be overridden to get certain windows saved explicitly.
  129.   End Sub
  130.  
  131.   Sub SaveLayout()
  132.     ' For each window record size/location and visibility information
  133.     Dim suspend as new SuspendDebugExceptionTrapping
  134.     curItem = 1
  135.   
  136.     Mark ' Mark all items as not-visited
  137.   
  138.     ' Save all created windows (have a Windows HWND)
  139.     Screen.EnumWindows(Me, "SaveWindowFromHwnd")
  140.     ' Save some windows explicitly
  141.     SaveExplicitWindows()
  142.   
  143.     Purge ' Purge items which where not visited by the Save
  144.   
  145.     ' Record the screen width & height this layout was saved on
  146.     ScreenWidth = Screen.pixelWidth
  147.     ScreenHeight = Screen.pixelHeight
  148.   End Sub
  149.  
  150.   Sub SaveWindow(wnd As Object)
  151.     dim wndItem as WindowLayoutItem
  152.     dim wndItemName As String
  153.     dim factorX, factorY as Single
  154.   
  155.     ' If wnd is a child of Window, its coordinates will be in twips, it will
  156.     ' need to be converted since all saved coordinates are in pixels.
  157.     If TypeOf wnd Is Window Then 
  158.       factorX = 1.0 / Screen.TwipsPerPixelX
  159.       factorY = 1.0 / Screen.TwipsPerPixelY
  160.     Else 
  161.       factorX = 1
  162.       factorY = 1
  163.     End If
  164.   
  165.     wndItemName = "Item" & curItem
  166.   
  167.     ' Find or make a WindowLayoutItem object to hold the information
  168.     wndItem = FindEmbed(Me, wndItemName)
  169.     If Not wndItem Then wndItem = EmbedObject(Me, WindowLayoutItem, wndItemName)
  170.   
  171.     ' Fill in the information
  172.     Try
  173.       wndItem.wnd = wnd
  174.       wndItem.left_ = wnd.Left * factorX
  175.       wndItem.top = wnd.Top * factorY
  176.       wndItem.width = wnd.Width * factorX
  177.       wndItem.height = wnd.Height * factorY
  178.       wndItem.visible = wnd.Visible
  179.       curItem = curItem + 1
  180.     catch NotFound(s as string)
  181.       ' This window could not be saved successfully, disregard it.
  182.     End Try
  183.   End Sub
  184.  
  185.   Sub SaveWindowFromHwnd(ByVal hWnd As Long)
  186.     dim o as Object
  187.     o = FindObjectFromWindow(hWnd)
  188.     If o Then SaveWindow(o)
  189.   End Sub
  190.  
  191.   Function ShortName As String
  192.     Dim name As String
  193.     Dim pos, nextPos As Integer
  194.     pos = 1
  195.     name = Me
  196.     Do
  197.       nextPos = Instr(pos, name, ".")
  198.       If nextPos > 0 Then pos = nextPos + 1
  199.     Loop While nextPos > 0
  200.     name = Mid(name, pos)
  201.     ShortName = name
  202.   End Function
  203.  
  204. End Type
  205.  
  206. Type ToolGadget From ButtonGadget
  207.   Dim bitmap As New Bitmap
  208.   Dim HintText As String
  209.  
  210.   ' METHODS for object: ToolGadget
  211.   Sub DragAndDrop(o as XferData, x,y as single, state as OleDropState, effect as OleDropEffect)
  212.     ' Forward all Drag&Drop stuff to ObjectBox
  213.     If Parent Then SendEvent Parent.DragAndDrop(o, x, y, state, effect)
  214.   End Sub
  215.  
  216.   Sub DragStart(o as XferData, x,y as single)
  217.     o.ObjectRef = Me
  218.     o.Drag(1)
  219.   End Sub
  220.  
  221. End Type
  222.  
  223. Type InstallButton From Image
  224.   Dim installObject As Window
  225.   Dim BmpOpen As New OpenDialog
  226.   Dim installBitmap As New Bitmap
  227.   Dim SourceModule As String
  228.   Dim InstalledSomething As Boolean
  229.   Dim TargetPalette As ObjectBox
  230.   Dim DefaultBitmap As New Bitmap
  231.   Type InstallPair
  232.     Dim bitmap As Bitmap
  233.     Dim obj As Object
  234.   End Type
  235.   Property InstallName Get getInstallName As String
  236.   Event Install
  237.  
  238.   ' METHODS for object: InstallButton
  239.   Sub Click()
  240.     dim CheckOf as New SuspendDebugExceptionTrapping
  241.   
  242.     BevelOuter = "Inset"
  243.     InstalledSomething = False
  244.     EnumObjectEmbeds(Me, Me, "EnumMethod")
  245.     If Not InstalledSomething Then 
  246.       InfoBox.Message("Install not setup", "Installation configuration not correct.")
  247.     End If
  248.     BevelOuter = "Raised"
  249.   End Sub
  250.  
  251.   Function Config(g as Object) As Boolean
  252.     Dim ng as new ControlTools.Gadget
  253.   
  254.     ' If we were given an object, then take a guess about
  255.     ' intended Object, apply it to a local ControlTools.Gadget,
  256.     ' and call Detailed Edit to give a chance to Reconfigure
  257.     If g Then 
  258.       If IsPrototype(g) Then 
  259.         ng.GadgetObject = g
  260.       Else 
  261.         Dim od as new ObjDebug
  262.         od.Obj = g
  263.         ng.GadgetObject = od.ParentObject
  264.       End If
  265.     Else 
  266.       ng.GadgetObject = installObject
  267.     End If
  268.   
  269.     ' Set the bitmap default
  270.     ng.bitmap.SetPicture installBitmap.GetPicture
  271.   
  272.     ' Edit the gadget. Cancel will leave the GadgetObject empty.
  273.     ' If not cancel, configure the install object and bitmap
  274.     ng.DetailedEdit
  275.     If ng.GadgetObject = "" Then 
  276.       Config = False
  277.       Exit Function
  278.     Else 
  279.       installObject = FindObject(ng.GadgetObject)
  280.       installBitmap.SetPicture ng.bitmap.GetPicture
  281.   
  282.       Picture = installBitmap
  283.       Refresh
  284.       Config = True
  285.     End If
  286.   End Function
  287.  
  288.   Function DetailedEdit() As Long
  289.     DetailedEdit = Config(Nothing)
  290.   End Function
  291.  
  292.   Sub DragAndDrop(source As XferData, x As Single, y As Single, state As OleDropState, effect As OleDropEffect)
  293.     dim g as object
  294.     g = source.ObjectRef
  295.   
  296.     ' Default to "don't accept"
  297.     effect = 0
  298.   
  299.     ' If DROP ...
  300.     If state = "Drop" Then 
  301.       If Config(g) Then effect = 1
  302.     Else  ' DRAG OVER
  303.       ' Accept drop of gadgets and windows
  304.       If TypeOf g Is Window Then effect = 1
  305.     End If
  306.   End Sub
  307.  
  308.   Sub EnumMethod(o as object)
  309.     If TypeOf o Is InstallButton.InstallPair && o.obj && o.bitmap Then 
  310.       installObject = o.obj
  311.       installBitmap.SetPicture(o.bitmap.GetPicture)
  312.       If InstallSelObj Then InstalledSomething = True
  313.     End If
  314.   End Sub
  315.  
  316.   Function getInstallName As String
  317.     If installObject Then 
  318.       getInstallName = IIf(HostObject(installObject), installObject.Name, installObject)
  319.     Else 
  320.       getInstallName = ""
  321.     End If
  322.   End Function
  323.  
  324.   Sub Install()
  325.     dim o as Object
  326.     Dim f as New File
  327.     ' This is the MOVEMODULECODE
  328.     Dim m as ObjectModule
  329.     m = ModuleManager.ModuleContaining(installObject)
  330.     f.FileName = m.FileName
  331.     f.FileName = App.Path & f.Name & f.Extension
  332.     If f.Exists && Not InstalledSomething Then 
  333.       If YesNoBox.Message("Duplicate Module", f.FileName & " already exists, are you sure you want to overwrite?") = IDYES Then 
  334.         m.SaveAs(f.FileName, False)
  335.         SourceModule = f.FileName
  336.       End If
  337.     Else 
  338.       m.SaveAs(f.FileName, False)
  339.       SourceModule = f.FileName
  340.     End If
  341.     SendEvent TargetPalette.Install(Me)
  342.   End Sub
  343.  
  344.   Sub InstallSample(o as Object, b as Bitmap)
  345.     dim ng as ControlTools.Gadget
  346.   
  347.     ' Move the object into the module containing the "TargetPalette"
  348.     AttachObjectToModule(o, TargetPalette)
  349.   
  350.     ' Insert a new gadget, at the bottom of the TargetPalette
  351.     ng = EmbedObject(TargetPalette, ControlTools.Gadget, UniqueEmbedName(ControlTools.Palette, "SampleGadget"))
  352.     ng.GadgetObject = o
  353.     ng.bitmap.SetPicture(b.GetPicture)
  354.     TargetPalette.ForceLayout(False)
  355.   
  356.   End Sub
  357.  
  358.   Function InstallSelObj As Boolean
  359.     dim CheckOf as New SuspendDebugExceptionTrapping
  360.     If YesNoBox.Message("Install", "Do you want to install '" & InstallName & "'?") = IDYES Then 
  361.       Dim obj as Object
  362.       obj = installObject
  363.       If TargetPalette = Nothing Then TargetPalette = ControlTools.Palette
  364.       Try
  365.         Dim okContinue as long
  366.         Dim CacheMod as ObjectModule
  367.         CacheMod = ModuleManager.CurrentModule
  368.         okContinue = False
  369.         SendEvent TargetPalette.PreInstall(Me, okContinue)
  370.         If okContinue Then 
  371.           SendEvent Install()
  372.           ModuleManager.CurrentModule = CacheMod
  373.         End If
  374.       Catch InstallFail(reason as string)
  375.         MessageBox.Message("Install Failure", reason)
  376.       End Try
  377.       installObject = obj
  378.       InstallSelObj = True
  379.     End If
  380.   End Function
  381.  
  382.   Sub Reset()
  383.     installObject = Nothing
  384.     installBitmap.LoadType = "FileBased"
  385.     installBitmap.FileName = ""
  386.     installBitmap.LoadType = "MemoryBased"
  387.     Picture = DefaultBitmap
  388.     Refresh
  389.   End Sub
  390.  
  391. End Type
  392.  
  393. Type SuspendDebugExceptionTrapping
  394.   Dim debugger As Object
  395.   Dim TrapInterpretiveExceptions As Boolean
  396.   Dim TrapSystemExceptions As Boolean
  397.  
  398.   ' METHODS for object: SuspendDebugExceptionTrapping
  399.   Sub Construct(o As Object)
  400.     ' This code is constructed so it will work whether or not
  401.     ' the "Debugger" object is present in the system.
  402.     debugger = FindObject("Debugger")
  403.     If debugger Then 
  404.       TrapInterpretiveExceptions = debugger.TrapInterpretiveExceptions
  405.       TrapSystemExceptions = debugger.TrapSystemExceptions
  406.       debugger.TrapInterpretiveExceptions = False
  407.       debugger.TrapSystemExceptions = False
  408.     End If
  409.   End Sub
  410.  
  411.   Sub Destruct()
  412.     If debugger Then 
  413.       debugger.TrapInterpretiveExceptions = TrapInterpretiveExceptions
  414.       debugger.TrapSystemExceptions = TrapSystemExceptions
  415.     End If
  416.   End Sub
  417.  
  418. End Type
  419.  
  420. Type HyperControl From Form
  421.  
  422.   ' METHODS for object: HyperControl
  423.   Sub Resize()
  424.     ' Place holder for resize code, to get initial size behavior.
  425.   End Sub
  426.  
  427. End Type
  428.  
  429. Type ScreenLayoutConfigForm From Form
  430.   Type BtnDone From Button
  431.  
  432.     ' METHODS for object: ScreenLayoutConfigForm.BtnDone
  433.     Sub Click
  434.       Parent.Hide
  435.       Parent.ModalResult IDOK
  436.     End Sub
  437.  
  438.   End Type
  439.   Dim BtnSave As New Button
  440.   Dim CbLayouts As New ComboBox
  441.   Dim LayoutSet As ScreenLayoutSet
  442.   Dim BtnRestore As New Button
  443.   Dim BtnSetDefault As New Button
  444.   Dim LblLegend As New Label
  445.   Dim BtnDelete As New Button
  446.   Dim BtnNewLayout As New Button
  447.  
  448.   ' METHODS for object: ScreenLayoutConfigForm
  449.   Sub AddLayoutToList(o As Object)
  450.     ' Add last name-component of embedded layout to list.
  451.     If o && TypeOf o Is ScreenLayout Then 
  452.       Dim item, sn As String
  453.       sn = o.ShortName
  454.       item = IIf(o = LayoutSet.Default__Layout__, "*" & sn, sn)
  455.       CbLayouts.AddItem item
  456.     End If
  457.   End Sub
  458.  
  459.   Sub BtnDelete_Click()
  460.     Dim layout As ScreenLayout
  461.     layout = SelectedLayout
  462.     If layout Then 
  463.       Dim ynBox As New YesNoBox
  464.       If ynBox.Message("Confirm delete layout", "Delete layout: " & SelectedLayoutName & "?") = IDYES Then 
  465.         DestroyObject(layout)
  466.         SaveLayoutSetModule
  467.         ResetList
  468.       End If
  469.     Else 
  470.       CbLayouts.Text = ""
  471.     End If
  472.   End Sub
  473.  
  474.   Sub BtnNewLayout_Click()
  475.     If CbLayouts.Text <> "" && CbLayouts.ItemIndex(CbLayouts.Text) = -1 Then 
  476.       ' The user has typed and name and hasn't saved it.
  477.       ' Pretend the Save button was clicked
  478.       BtnSave_Click
  479.       If IsIdentifierValid(CbLayouts.Text) Then BtnSetDefault_Click
  480.     Else 
  481.       ' The text in the combobox is an existing layout, or doesn't
  482.       ' exist, bring up a input dialog to name the layout
  483.       Dim id as New InputDialog
  484.       Dim HaveGoodName as Boolean
  485.       Dim LastBadName as string
  486.       HaveGoodName = False
  487.       LastBadName = ""
  488.       While Not HaveGoodName
  489.         If id.Execute("Layout Name", "Enter a name for the new layout", LastBadName) = IDOK Then 
  490.           If Not IsIdentifierValid(id.Text) Then 
  491.             Dim err As New MessageBox
  492.             err.SetIconExclamation
  493.             err.Message("Invalid Identifier", """" & id.Text & """ is not a valid identifier")
  494.             LastBadName = id.Text
  495.           Else 
  496.             ' User typed a valid name
  497.             HaveGoodName = True
  498.           End If
  499.         Else 
  500.           ' User hit cancel from the input dialog
  501.           Exit Sub
  502.         End If
  503.       Wend
  504.       ' User type a valid name and hit OK from the input dialog. Put
  505.       ' the name into the ComboBox, then click the Save then SetDefault
  506.       ' buttons
  507.       CbLayouts.Text = id.Text
  508.       BtnSave_Click
  509.       BtnSetDefault_Click
  510.     End If
  511.   End Sub
  512.  
  513.   Sub BtnRestore_Click()
  514.     RestoreSelectedLayout
  515.     Show : BringToTop
  516.   End Sub
  517.  
  518.   Sub BtnSave_Click()
  519.     If LayoutSet Then 
  520.       Dim layoutName As String
  521.       layoutName = SelectedLayoutName
  522.       If layoutName <> "" Then 
  523.         Hide
  524.         LayoutSet.SaveLayout(layoutName)
  525.         SaveLayoutSetModule
  526.         ResetList : CbLayouts.Text = layoutName
  527.         Show : BringToTop
  528.       End If
  529.     End If
  530.   End Sub
  531.  
  532.   Sub BtnSetDefault_Click()
  533.     If LayoutSet Then 
  534.       If CbLayouts.Text = "" Then  ' Clear default layout
  535.         LayoutSet.Default__Layout__ = Nothing
  536.         SaveLayoutSetModule
  537.         ResetList
  538.       Else 
  539.         Dim layout As ScreenLayout
  540.         layout = SelectedLayout ' Set default to selected layout
  541.         If layout Then 
  542.           LayoutSet.Default__Layout__ = layout
  543.           SaveLayoutSetModule
  544.           ResetList
  545.         End If
  546.       End If
  547.     End If
  548.   End Sub
  549.  
  550.   Sub CbLayouts_DblClick()
  551.     RestoreSelectedLayout
  552.   End Sub
  553.  
  554.   Sub Execute(layoutSet As ScreenLayoutSet)
  555.     If layoutSet Then 
  556.       ' Ensure me and my list are made before resetting the list.
  557.       LayoutSet = layoutSet
  558.       LoadForm
  559.       ResetList
  560.       Show
  561.       BringToTop
  562.     End If
  563.   End Sub
  564.  
  565.   Sub ResetList
  566.     CbLayouts.Clear
  567.     If LayoutSet Then EnumObjectEmbeds(LayoutSet, Me, "AddLayoutToList")
  568.   End Sub
  569.  
  570.   Sub Resize()
  571.     Dim m, mm, hm, l, t, w, h, effWidth As Single
  572.     hm = 45 : m = 90 : mm = 180
  573.     effWidth = IIf(ScaleWidth < 3500, 3500, ScaleWidth)
  574.     w = BtnDone.Width
  575.     h = BtnDone.Height
  576.     l = effWidth - w - m
  577.     BtnDone.Move(l, m, w, h)
  578.     t = h + mm
  579.     BtnSave.Move(l, t, w, h)
  580.     t = t + h + hm
  581.     BtnRestore.Move(l, t, w, h)
  582.     t = t + h + hm
  583.     BtnSetDefault.Move(l, t, w, h)
  584.     t = t + h + hm
  585.     BtnDelete.Move(l, t, w, h)
  586.     t = t + h + hm
  587.     BtnNewLayout.Move(l, t, w, h)
  588.     LblLegend.Top = ScaleHeight - LblLegend.Height - m
  589.     CbLayouts.Move(m, m, l - mm, ScaleHeight - LblLegend.Height - mm)
  590.   End Sub
  591.  
  592.   Sub RestoreSelectedLayout()
  593.     Dim layout As ScreenLayout
  594.   
  595.     If CbLayouts.Text = "" Then 
  596.       ' If no layout is selected, just do what envelop normally does on startup
  597.       EnvelopLayoutSet.AutoRestoreLayout
  598.     Else 
  599.       layout = SelectedLayout
  600.       If layout Then 
  601.         layout.RestoreLayout
  602.       Else 
  603.         CbLayouts.Text = ""
  604.       End If
  605.     End If
  606.   End Sub
  607.  
  608.   Sub SaveLayoutSetModule
  609.     If LayoutSet Then 
  610.       ModuleManager.ModuleContaining(LayoutSet).Save
  611.     End If
  612.   End Sub
  613.  
  614.   Function SelectedLayout() As ScreenLayout
  615.     SelectedLayout = Nothing
  616.     If LayoutSet Then 
  617.       Dim layoutName As String
  618.       layoutName = SelectedLayoutName
  619.       If layoutName <> "" Then SelectedLayout = FindEmbed(LayoutSet, layoutName)
  620.     End If
  621.   End Function
  622.  
  623.   Function SelectedLayoutName As String
  624.     SelectedLayoutName = ""
  625.     If LayoutSet Then 
  626.       Dim layoutName As String
  627.       Dim layout As ScreenLayout
  628.       layoutName = CbLayouts.Text
  629.       If layoutName = "" Then 
  630.         layoutName = LayoutSet.DefaultScreenLayoutName
  631.         CbLayouts.Text = layoutName
  632.       Else 
  633.         If Instr(layoutName, "*") = 1 Then layoutName = Mid(layoutName, 2)
  634.         If Not IsIdentifierValid(layoutName) Then 
  635.           Dim err As New MessageBox
  636.           err.SetIconExclamation
  637.           err.Message("Invalid Identifier", """" & layoutName & """ is not a valid identifier")
  638.           Exit Function
  639.         End If
  640.       End If
  641.       SelectedLayoutName = layoutName
  642.     End If
  643.   End Function
  644.  
  645. End Type
  646.  
  647. Type ControlTools
  648.   Type Gadget From ToolGadget
  649.     Property HintText Get getHintText As String
  650.     Property GadgetObject Get getGadgetObject Set setGadgetObject As String
  651.     Dim gadgetObject_ As String
  652.     Dim SourceModule As String
  653.  
  654.     ' METHODS for object: ControlTools.Gadget
  655.     Sub Click()
  656.       If VerifyExistence Then FormEditor.AddObject = FindObject(GadgetObject)
  657.       ' Register with ControlTools.Palette so we pushed back up after add is done.
  658.       If (TypeOf Parent Is ControlTools.Palette) Then Parent.addingGadget = Me
  659.     End Sub
  660.  
  661.     Sub DblClick()
  662.       ' Auto-embed a copy of our control
  663.       dim newObject, addObject As Window
  664.       dim name As String
  665.       dim suspendTrap As New SuspendDebugExceptionTrapping
  666.       dim OldMode As Integer
  667.       dim OldLeft, OldTop, OldHeight, OldWidth As Single
  668.     
  669.       With FormEditor
  670.         ' Cache away the forms old scale mode, then change it to pixels
  671.         OldMode = .CurForm.ScaleMode
  672.         If OldMode = 0 Then 
  673.           OldLeft = .CurForm.ScaleLeft
  674.           OldTop = .CurForm.ScaleTop
  675.           OldWidth = .CurForm.ScaleWidth
  676.           OldHeight = .CurForm.ScaleHeight
  677.         End If
  678.         .CurForm.ScaleMode = 3 ' Pixels
  679.     
  680.         ' Clear "adding" state of FormEditor, but remember object to add
  681.         addObject = FindObject(GadgetObject)
  682.         FormEditor.AddObject = Nothing
  683.     
  684.         name = UniqueEmbedName(.CurForm, addObject)
  685.         newObject = EmbedObject(.CurForm, addObject, name)
  686.         newObject.Left := 5 : newObject.Top := 5
  687.         newObject.Width := 60 : newObject.Height := 30
  688.         newObject.Caption := name
  689.         FormEditor.SelectControl(newObject, False)
  690.         FormEditor.Raise()
  691.     
  692.         ' Bring back the old ScaleMode
  693.         .CurForm.ScaleMode = OldMode
  694.         If OldMode = 0 Then 
  695.           .CurForm.ScaleLeft = OldLeft
  696.           .CurForm.ScaleTop = OldTop
  697.           .CurForm.ScaleWidth = OldWidth
  698.           .CurForm.ScaleHeight = OldHeight
  699.         End If
  700.       End With
  701.     End Sub
  702.  
  703.     Sub Destruct()
  704.       dim o as Window
  705.     
  706.       ' If we represent an object in the controls module, offer to delete it.
  707.       o = FindObject(GadgetObject)
  708.       If o && (ModuleManager.ModuleContaining(Me) = ModuleManager.ModuleContaining(o)) Then 
  709.         Dim YNB as new YesNoBox
  710.         YNB.message = "Would you like to Destroy '" & GadgetObject & "'?"
  711.         YNB.Execute
  712.         If YNB.result = IDYES Then DestroyObject(o)
  713.       End If
  714.     
  715.     End Sub
  716.  
  717.     Function DetailedEdit() as long
  718.       Dim outcome as long
  719.       ' Display Wizard Modally if present
  720.       Try
  721.         CtrlToolGadgetWizard.ng = Me
  722.         outcome = CtrlToolGadgetWizard.ShowModal
  723.         If outcome = IDCANCEL Then 
  724.           DetailedEdit = False
  725.         Else 
  726.           DetailedEdit = True
  727.         End If
  728.       Catch
  729.       End Try
  730.     End Function
  731.  
  732.     Sub DragStart(o as XferData, x,y as single)
  733.       o.ObjectRef = Me
  734.       o.Drag(1)
  735.     End Sub
  736.  
  737.     Function Enable() As Integer
  738.       ' Enabling of Control icons is based on a Form being edited.
  739.       Enable = FormEditor.Editing && FormEditor.CurForm
  740.     End Function
  741.  
  742.     Function getGadgetObject() As String
  743.       getGadgetObject = gadgetObject_
  744.     End Function
  745.  
  746.     Function getHintText() As String
  747.       ' If the GadgetObject is not set or can be found, that is the
  748.       ' hint, otherwise make hint be "<GadgetObject>*" to indicate
  749.       ' that the object is not available.
  750.       getHintText = IIf(Len(GadgetObject) = 0 || FindObject(GadgetObject), GadgetObject, GadgetObject & "*")
  751.     End Function
  752.  
  753.     Sub setGadgetObject(s As String)
  754.       ' Don't allow names of "dynamic"-objects
  755.       If (Not Instr(s, "@")) Then gadgetObject_ = s
  756.     End Sub
  757.  
  758.     Function VerifyExistence As Long
  759.     
  760.       ' Designer's note:
  761.       ' Would it be worthwile to have VerifyExistence return an
  762.       ' "error value" (say 1 if NoSourceModule, 2 if BadSourceModule...)
  763.       ' Instead of the simple True/False?
  764.     
  765.       If FindObject(GadgetObject) Then 
  766.         ' The control exists
  767.         VerifyExistence = True
  768.       Else 
  769.         ' The control doesn't exist
  770.         ' Check for SourceModule
  771.         If SourceModule <> "" Then 
  772.           ' We know where the control originally came from
  773.           ' Try to load it
  774.           Dim o as Object
  775.           o = ModuleManager.LoadModule(SourceModule, False)
  776.           If o = Nothing Then 
  777.             ' Something failed in the LoadModule
  778.             ' We don't have the control and can't get it
  779.             VerifyExistence = False
  780.           Else 
  781.             ' We loaded the module we expect the control to be in
  782.             If FindObject(GadgetObject) Then 
  783.               ' We found the control
  784.               VerifyExistence = True
  785.             Else 
  786.               ' It's not where we expected
  787.               ' We don't have the control and it's not where we thought
  788.               VerifyExistence = False
  789.               ' Unload the module that we loaded
  790.               o.Unload
  791.             End If
  792.           End If
  793.         Else 
  794.           ' We don't have the control and don't know where to get it
  795.           VerifyExistence = False
  796.         End If
  797.       End If
  798.     End Function
  799.  
  800.   End Type
  801.   Type Palette From ObjectBox
  802.     Dim addingGadget As ControlTools.Gadget
  803.     Dim templateGadget As ButtonGadget
  804.     Type GadArrow From ToolGadget
  805.  
  806.       ' METHODS for object: ControlTools.Palette.GadArrow
  807.       Sub Click()
  808.         FormEditor.AddObject = Nothing
  809.         State = "Up"
  810.       End Sub
  811.  
  812.       Sub DragStart(o as XferData, x,y as single)
  813.         ' Override ToolGadget's
  814.       End Sub
  815.  
  816.       Function Enable() As Integer
  817.         Enable = FormEditor.Editing
  818.         If (Parent.addingGadget && Not FormEditor.AddObject) Then 
  819.           Parent.addingGadget.State = "Up"
  820.           Parent.addingGadget = Nothing
  821.         End If
  822.       End Function
  823.  
  824.     End Type
  825.     Dim GadButton As New ControlTools.Gadget
  826.     Dim GadOptionButton As New ControlTools.Gadget
  827.     Dim GadCheckBox As New ControlTools.Gadget
  828.     Dim GadLabel As New ControlTools.Gadget
  829.     Dim GadTextBox As New ControlTools.Gadget
  830.     Dim GadListBox As New ControlTools.Gadget
  831.     Dim GadComboBox As New ControlTools.Gadget
  832.     Dim GadHScrollBar As New ControlTools.Gadget
  833.     Dim GadScrollBar As New ControlTools.Gadget
  834.     Dim GadFrame As New ControlTools.Gadget
  835.     Dim GadGauge As New ControlTools.Gadget
  836.     Dim GadOle As New ControlTools.Gadget
  837.     Dim GadMarkupLayer As New ControlTools.Gadget
  838.     Dim GadPictureBox As New ControlTools.Gadget
  839.     Dim GadImage As New ControlTools.Gadget
  840.     Dim GadIndentedList As New ControlTools.Gadget
  841.     Dim GadObjectHierarchy As New ControlTools.Gadget
  842.     Dim GadObjectList As New ControlTools.Gadget
  843.     Dim GadObjectCombo As New ControlTools.Gadget
  844.     Dim GadFileListBox As New ControlTools.Gadget
  845.     Dim GadFileComboBox As New ControlTools.Gadget
  846.     Dim GadDataControl As New ControlTools.Gadget
  847.     Dim GadGLControl As New ControlTools.Gadget
  848.     Dim GadRichTextBox As New ControlTools.Gadget
  849.     Dim GadListView As New ControlTools.Gadget
  850.     Dim GadTabStrip As New ControlTools.Gadget
  851.     Dim GadTreeView As New ControlTools.Gadget
  852.     Dim GadHyperControl As New ControlTools.Gadget
  853.     Dim GadMenu As New ToolGadget
  854.     Dim GadInstallButton As New ControlTools.Gadget
  855.     Dim GadObjectBox As New ControlTools.Gadget
  856.     Dim Empty As New ControlTools.Gadget
  857.  
  858.     Dim lastGad_ As ButtonGadget
  859.     Property DropFeedbackGadget Get getLastGadget Set setLastGadget As Object
  860.     Event Install(Package as Object)
  861.     Event PreInstall(Package as Object, ok as long, LastMod as Long)
  862.  
  863.     ' METHODS for object: ControlTools.Palette
  864.     Sub DragAndDrop(o as XferData, x,y as single, state as OleDropState, effect as OleDropEffect)
  865.       Dim nm as String
  866.       Dim dropObj as object
  867.       Dim underPoint As ButtonGadget
  868.       Dim suspend as new SuspendDebugExceptionTrapping
  869.     
  870.       ' Remember the object dropped and the gadget it was dropped on
  871.       dropObj = o.ObjectRef
  872.       underPoint = AtPoint(x, y)
  873.     
  874.       ' Default to "don't accept"
  875.       effect = 0
  876.     
  877.       ' Don't allow a gadget to be dropped on itself. If no object dropped,
  878.       ' forget it, also if no gadget under point forget it also.
  879.       If Not dropObj || Not underPoint || dropObj = underPoint Then Exit Sub
  880.     
  881.       ' If DROP ...
  882.       If state = "Drop" Then 
  883.         ' Disable feedback for drop location
  884.         DropFeedbackGadget = Nothing
  885.     
  886.         ' If gadget from this palette is dropped on another gadget in this
  887.         ' palette...
  888.         If TypeOf dropObj Is ButtonGadget And dropObj.Parent = Me Then 
  889.           ' Swap the positions of control gadgets on same palette
  890.           dropObj.Position = underPoint.Position
  891.     
  892.         ElseIf TypeOf dropObj Is Window Then 
  893.           ' If a "Window" is dropped on the palette, make a gadget at the
  894.           ' drop location, set its "GadgetObject" to the dropped window
  895.           ' and allow the user to edit it.
  896.           Dim ng as ControlTools.Gadget
  897.           Dim name as String
  898.           Dim installObj as Object
  899.     
  900.           name = IIf(HostObject(dropObj), dropObj.Name, dropObj)
  901.     
  902.           Try
  903.             ng = EmbedObject(Me, ControlTools.Gadget, "Gad" & name)
  904.             ng.Position = underPoint.Position + 1
  905.           catch MatchingFieldCollision
  906.             InfoBox.Message("Install Failed", "A control by this name is already installed.")
  907.             Exit Sub
  908.           End Try
  909.     
  910.           ' do a forec layout to ensure that the new addition shows up
  911.           ForceLayout(0)
  912.           ng.GadgetObject = dropObj
  913.           ng.DetailedEdit
  914.     
  915.           ' If the edit comes back successfully, move the object into the palette.
  916.           ' Otherwise, remove the gadget.
  917.           installObj = IIf(ng.GadgetObject <> "", FindObject(ng.GadgetObject), Nothing)
  918.           If Not installObj Then 
  919.             DestroyObject(ng)
  920.           Else 
  921.             Dim f as New File
  922.             ' This is the MOVEMODULECODE
  923.             Dim m as ObjectModule
  924.             m = ModuleManager.ModuleContaining(FindObject(ng.GadgetObject))
  925.             f.FileName = m.FileName
  926.             f.FileName = App.Path & f.Name & f.Extension
  927.             If f.Exists Then 
  928.               If YesNoBox.Message("Duplicate Module", f.FileName & " already exists, are you sure you want to overwrite?") = IDYES Then 
  929.                 m.SaveAs(f.FileName, False)
  930.                 ng.SourceModule = f.FileName
  931.               End If
  932.             Else 
  933.               m.SaveAs(f.FileName, False)
  934.               ng.SourceModule = f.FileName
  935.             End If
  936.           End If
  937.         Else 
  938.           ' Reject the drop
  939.           Exit Sub
  940.         End If
  941.     
  942.         ' Accept the drop
  943.         effect = 1
  944.     
  945.       ElseIf state = 1 Then  ' DRAG LEAVE
  946.         ' Disable feedback for drop location
  947.         DropFeedbackGadget = Nothing
  948.     
  949.       Else  ' DRAG OVER
  950.         ' Accept drop of gadgets and windows
  951.         If Not TypeOf underPoint Is ControlTools.Gadget Then Exit Sub
  952.         If (TypeOf dropObj Is ButtonGadget && dropObj.Parent = Me) || TypeOf dropObj Is Window Then 
  953.           ' Provide feedback for drop location
  954.           effect = 1
  955.           DropFeedbackGadget = underPoint
  956.     
  957.         End If
  958.       End If
  959.     End Sub
  960.  
  961.     Sub GadMenu_Click()
  962.       ' If there is a form under the sway of the form editor,
  963.       ' then embed a menu bar within the form if it isn't there
  964.       ' already
  965.       If FormEditor.Editing && FormEditor.CurForm && FormEditor.CurForm.Visible Then 
  966.         Dim f as Form
  967.         DIm m as Menu
  968.         f = FormEditor.CurForm
  969.         If f.MenuBar = Nothing Then 
  970.           f.MenuBar = EmbedObject(f, MenuBar, UniqueEmbedName(f, "menubar"))
  971.           m = EmbedObject(f.MenuBar, FindObject("PopupMenu"), "Popup1")
  972.           f.MenuBar.InsertPopup(m, "&File", -1)
  973.         End If
  974.         MenuEdit.ProcessMenu f.MenuBar
  975.         MenuEdit.Show
  976.         MenuEdit.BringToTop
  977.       End If
  978.     End Sub
  979.  
  980.     Function GadMenu_Enable() As Integer
  981.       GadMenu_Enable = FormEditor.Editing && FormEditor.CurForm && FormEditor.CurForm.Visible
  982.     End Function
  983.  
  984.     Function getLastGadget() as ButtonGadget
  985.       getLastGadget = lastGad_
  986.     End Function
  987.  
  988.     Sub Install(Package as Object)
  989.       If TypeOf Package Is InstallButton Then 
  990.         dim o as Object
  991.         dim b as Bitmap
  992.         dim ng as ControlTools.Gadget
  993.     
  994.         o = Package.installObject
  995.         b = Package.installBitmap
  996.     
  997.         ' Insert a new gadget, at the bottom of the TargetPalette
  998.         ng = EmbedObject(Me, ControlTools.Gadget, "Gad" & Package.InstallName)
  999.         ng.GadgetObject = o
  1000.         ng.bitmap.SetPicture(b.GetPicture)
  1001.         ng.SourceModule = Package.SourceModule
  1002.         ForceLayout(False)
  1003.     
  1004.       Else 
  1005.         Throw InstallFail("Object sent to Install is not an InstallButton")
  1006.       End If
  1007.     End Sub
  1008.  
  1009.     Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  1010.       If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Controls_Palette")
  1011.     End Sub
  1012.  
  1013.     Sub PreInstall(Package as Object, ok as long)
  1014.       If TypeOf Package Is InstallButton Then 
  1015.         If FindEmbed(Me, "Gad" & Package.InstallName) Then 
  1016.           ok = False
  1017.           Throw InstallFail("A ToolGadget already exists for " & Package.InstallName)
  1018.         Else 
  1019.           ModuleManager.CurrentModule = ModuleManager.ModuleContaining(Me)
  1020.           ok = True
  1021.         End If
  1022.       Else 
  1023.         Throw InstallFail("Object sent to PreInstall is not an InstallButton")
  1024.       End If
  1025.     End Sub
  1026.  
  1027.     Sub setLastGadget(g as ButtonGadget)
  1028.       If lastGad_ And g <> lastGad_ Then lastGad_.State = 0
  1029.       lastGad_ = g
  1030.       If lastGad_ Then lastGad_.State = 1
  1031.     End Sub
  1032.  
  1033.   End Type
  1034. End Type
  1035.  
  1036. Type ToolBitmap From Form
  1037.   Dim LblBitmap As New Label
  1038.   Dim TBBitmap As New TextBox
  1039.   Dim BtnFinish As New Button
  1040.   Type ImgGraphic From Image
  1041.     Dim bitmap As New Bitmap
  1042.   End Type
  1043.   Dim LblInstruction As New Label
  1044.   Dim Frame1 As New Frame
  1045.   Type BTNBrowse From Button
  1046.  
  1047.     ' METHODS for object: ToolBitmap.BTNBrowse
  1048.     Sub BtnBrowse_Click()
  1049.       Dim open as New OpenDialog
  1050.     
  1051.       ' Set the title of the open dialog just before we display it.
  1052.       open.Title = "Configure Tool Gadget"
  1053.     
  1054.       ' Set the filter to look for bitmaps
  1055.       open.Filter = "Bitmap files|*.bmp"
  1056.     
  1057.       ' If a filename was picked, then remember it
  1058.       ' Let the picture on this wizard preview it
  1059.       If open.Execute <> IDCANCEL Then 
  1060.         TBBitmap.Text = open.FileName
  1061.       End If
  1062.     End Sub
  1063.  
  1064.   End Type
  1065.   Type SampleBox From ObjectBox
  1066.     Dim PreviewTool As New ToolGadget
  1067.  
  1068.     ' METHODS for object: ToolBitmap.SampleBox
  1069.     Sub Reposition
  1070.       dim l,t,w,h as long
  1071.       w = PreviewTool.bitmap.Width * 15
  1072.       If w > 4125 Then w = 4125
  1073.       If w < 150 Then w = 150
  1074.       h = PreviewTool.bitmap.Height * 15
  1075.       If h > 1575 Then h = 1575
  1076.       If h < 150 Then h = 150
  1077.       l = 2850 + ((4125 - w) / 2)
  1078.       t = 2175 + ((1575 - h) / 2)
  1079.       Move(l, t, w, h)
  1080.       PreviewTool.Refresh
  1081.       ForceLayout(True)
  1082.     End Sub
  1083.  
  1084.   End Type
  1085.   Dim BTNPreview As New Button
  1086.   Dim Caller As InstallButton
  1087.  
  1088.   ' METHODS for object: ToolBitmap
  1089.   Sub BTNBrowse_Click()
  1090.     Dim length As Integer
  1091.     Dim open as New OpenDialog
  1092.   
  1093.     ' Set the title of the open dialog just before we display it.
  1094.     open.Title = "Configure Tool Gadget"
  1095.   
  1096.     ' Set the filter to look for bitmaps
  1097.     open.Filter = "Bitmap files|*.bmp"
  1098.   
  1099.     ' If a filename was picked, then remember it
  1100.     ' Let the picture on this wizard preview it
  1101.     If open.Execute <> IDCANCEL Then 
  1102.       TBBitmap.Text = open.FileName
  1103.       BTNPreview_Click
  1104.     End If
  1105.   End Sub
  1106.  
  1107.   Sub BtnFinish_Click()
  1108.     If Caller = Nothing Then 
  1109.       Throw NoCaller
  1110.     Else 
  1111.       Caller.installBitmap.LoadType = "FileBased"
  1112.       Caller.installBitmap.FileName = TBBitmap.Text
  1113.       Caller.installBitmap.LoadType = "MemoryBased"
  1114.       Caller.Refresh
  1115.       Caller = Nothing
  1116.       Hide
  1117.     End If
  1118.   End Sub
  1119.  
  1120.   Sub BTNPreview_Click()
  1121.     SampleBox.PreviewTool.bitmap.FileName = TBBitmap.Text
  1122.     SampleBox.Reposition
  1123.   End Sub
  1124.  
  1125. End Type
  1126.  
  1127. Type ToolPalette From ObjectBox
  1128.   Property DropFeedbackGadget Get getLastGadget Set setLastGadget As Object
  1129.   Dim lastGad_ As ButtonGadget
  1130.   Type AlignGadget From ToolGadget
  1131.     Dim alignType As Long
  1132.  
  1133.     ' METHODS for object: ToolPalette.AlignGadget
  1134.     Sub Click()
  1135.       FormEditor.Align(alignType)
  1136.     End Sub
  1137.  
  1138.     Function Enable() As Integer
  1139.       Enable = FormEditor.NumSelected > 1
  1140.     End Function
  1141.  
  1142.   End Type
  1143.   Dim AlignR As New ToolPalette.AlignGadget
  1144.   Dim AlignT As New ToolPalette.AlignGadget
  1145.   Dim AlignB As New ToolPalette.AlignGadget
  1146.   Dim AlignLR As New ToolPalette.AlignGadget
  1147.   Dim AlignTB As New ToolPalette.AlignGadget
  1148.   Type SpaceH From ToolGadget
  1149.  
  1150.     ' METHODS for object: ToolPalette.SpaceH
  1151.     Sub Click()
  1152.       FormEditor.AlignHorizontally(5)
  1153.     End Sub
  1154.  
  1155.     Function Enable() As Integer
  1156.       Enable = FormEditor.NumSelected > 1
  1157.     End Function
  1158.  
  1159.   End Type
  1160.   Type SpaceV From ToolGadget
  1161.  
  1162.     ' METHODS for object: ToolPalette.SpaceV
  1163.     Sub Click()
  1164.       FormEditor.AlignVertically(5)
  1165.     End Sub
  1166.  
  1167.     Function Enable() As Integer
  1168.       Enable = FormEditor.NumSelected > 1
  1169.     End Function
  1170.  
  1171.   End Type
  1172.   Type ToggleGrid From ToolGadget
  1173.  
  1174.     ' METHODS for object: ToolPalette.ToggleGrid
  1175.     Sub Click()
  1176.       FormEditor.GridOn = Not FormEditor.GridOn
  1177.     End Sub
  1178.  
  1179.     Function Enable() As Integer
  1180.       Enable = FormEditor.Editing && FormEditor.CurForm
  1181.       If (FormEditor.GridOn) Then State = "Down" Else State = "Up"
  1182.     End Function
  1183.  
  1184.   End Type
  1185.   Type FormEditorUndo From ToolGadget
  1186.     Property HintText Get getHintText As String
  1187.  
  1188.     ' METHODS for object: ToolPalette.FormEditorUndo
  1189.     Sub Click()
  1190.       FormEditor.Undo()
  1191.     End Sub
  1192.  
  1193.     Function Enable() As Integer
  1194.       Enable = ObjectEditorMgr.NextUndoItem <> "None"
  1195.     End Function
  1196.  
  1197.     Function getHintText() As String
  1198.       getHintText = "Undo: " & ObjectEditorMgr.NextUndoItem
  1199.     End Function
  1200.  
  1201.   End Type
  1202.   Type FormEditorRedo From ToolGadget
  1203.     Property HintText Get getHintText As String
  1204.  
  1205.     ' METHODS for object: ToolPalette.FormEditorRedo
  1206.     Sub Click()
  1207.       FormEditor.Redo()
  1208.     End Sub
  1209.  
  1210.     Function Enable() As Integer
  1211.       Enable = ObjectEditorMgr.NextRedoItem <> "None"
  1212.     End Function
  1213.  
  1214.     Function getHintText() As String
  1215.       getHintText = "Redo: " & ObjectEditorMgr.NextRedoItem
  1216.     End Function
  1217.  
  1218.   End Type
  1219.   Type TouchMode From ToolGadget
  1220.  
  1221.     ' METHODS for object: ToolPalette.TouchMode
  1222.     Sub Click()
  1223.       FormEditor.HitMode = "RgnTouches"
  1224.     End Sub
  1225.  
  1226.     Function Enable() As Integer
  1227.       Enable = FormEditor.Editing && FormEditor.CurForm
  1228.       If (FormEditor.HitMode = "RgnTouches") Then 
  1229.         State = "Down"
  1230.       Else 
  1231.         State = "Up"
  1232.       End If
  1233.     End Function
  1234.  
  1235.   End Type
  1236.   Type ContainsMode From ToolGadget
  1237.  
  1238.     ' METHODS for object: ToolPalette.ContainsMode
  1239.     Sub Click()
  1240.       FormEditor.HitMode = "RgnContains"
  1241.     End Sub
  1242.  
  1243.     Function Enable() As Integer
  1244.       Enable = FormEditor.Editing && FormEditor.CurForm
  1245.       If (FormEditor.HitMode = "RgnContains") Then State = "Down" Else State = "Up"
  1246.     End Function
  1247.  
  1248.   End Type
  1249.   Type CopyGadget From ToolGadget
  1250.  
  1251.     ' METHODS for object: ToolPalette.CopyGadget
  1252.     Sub Click()
  1253.       FormEditor.CopyControls()
  1254.     End Sub
  1255.  
  1256.     Function Enable() As Integer
  1257.       Enable = FormEditor.NumSelected > 0
  1258.     End Function
  1259.  
  1260.   End Type
  1261.   Type Arrange From ToolGadget
  1262.  
  1263.     ' METHODS for object: ToolPalette.Arrange
  1264.     Sub Click()
  1265.       If (FormEditor.NumSelected > 0) Then 
  1266.         FedArray.ShowModal()
  1267.       End If
  1268.     End Sub
  1269.  
  1270.     Function Enable() As Integer
  1271.       Enable = FormEditor.NumSelected > 0
  1272.     End Function
  1273.  
  1274.   End Type
  1275.   Type Raise From ToolGadget
  1276.  
  1277.     ' METHODS for object: ToolPalette.Raise
  1278.     Sub Click()
  1279.       FormEditor.Raise()
  1280.     End Sub
  1281.  
  1282.     Function Enable() As Integer
  1283.       Enable = FormEditor.NumSelected > 0
  1284.     End Function
  1285.  
  1286.   End Type
  1287.   Type Lower From ToolGadget
  1288.  
  1289.     ' METHODS for object: ToolPalette.Lower
  1290.     Sub Click()
  1291.       FormEditor.Lower()
  1292.     End Sub
  1293.  
  1294.     Function Enable() As Integer
  1295.       Enable = FormEditor.NumSelected > 0
  1296.     End Function
  1297.  
  1298.   End Type
  1299.   Type ToggleTab From ToolGadget
  1300.  
  1301.     ' METHODS for object: ToolPalette.ToggleTab
  1302.     Sub Click()
  1303.       FormEditor.ShowOrder = Not FormEditor.ShowOrder
  1304.     End Sub
  1305.  
  1306.     Function Enable() As Integer
  1307.       Enable = FormEditor.Editing && FormEditor.CurForm
  1308.     End Function
  1309.  
  1310.   End Type
  1311.   Type FontSet From ToolGadget
  1312.  
  1313.     ' METHODS for object: ToolPalette.FontSet
  1314.     Sub Click()
  1315.       ' Post common font panel to select font
  1316.       If (FontPicker.Execute() = 1) Then 
  1317.         If FormEditor.NumSelected Then 
  1318.           Dim i As Integer
  1319.           For i = 0 To FormEditor.NumSelected - 1
  1320.             FormEditor.GetSelected(i).Font = FontPicker.FontRef
  1321.           Next i
  1322.         Else 
  1323.           FormEditor.CurForm.Font = FontPicker.FontRef
  1324.         End If
  1325.       End If
  1326.     End Sub
  1327.  
  1328.     Function Enable() As Integer
  1329.       Enable = FormEditor.Editing && FormEditor.CurForm
  1330.     End Function
  1331.  
  1332.   End Type
  1333.   Type FColorSet From ToolGadget
  1334.  
  1335.     ' METHODS for object: ToolPalette.FColorSet
  1336.     Sub Click()
  1337.       ' Post common font panel to select font
  1338.       If (ColorDialog.Execute() = 1) Then 
  1339.         If FormEditor.NumSelected Then 
  1340.           Dim i As Integer
  1341.           For i = 0 To FormEditor.NumSelected - 1
  1342.             FormEditor.GetSelected(i).ForeColor = ColorDialog.Color
  1343.           Next i
  1344.         End If
  1345.       End If
  1346.     End Sub
  1347.  
  1348.     Function Enable() As Integer
  1349.       Enable = FormEditor.NumSelected > 0
  1350.     End Function
  1351.  
  1352.   End Type
  1353.   Type BColorSet From ToolGadget
  1354.  
  1355.     ' METHODS for object: ToolPalette.BColorSet
  1356.     Sub Click()
  1357.       ' Post common font panel to select font
  1358.       If (ColorDialog.Execute() = 1) Then 
  1359.         If FormEditor.NumSelected Then 
  1360.           Dim i As Integer
  1361.           For i = 0 To FormEditor.NumSelected - 1
  1362.             FormEditor.GetSelected(i).BackColor = ColorDialog.Color
  1363.           Next i
  1364.         Else 
  1365.           FormEditor.CurForm.BackColor = ColorDialog.Color
  1366.         End If
  1367.       End If
  1368.     End Sub
  1369.  
  1370.     Function Enable() As Integer
  1371.       Enable = FormEditor.Editing && FormEditor.CurForm
  1372.     End Function
  1373.  
  1374.   End Type
  1375.   Type ToggleObjectBoxEdit From ToolGadget
  1376.  
  1377.     ' METHODS for object: ToolPalette.ToggleObjectBoxEdit
  1378.     Sub Click()
  1379.       ObjectBoxEditor.ObjBoxForm.Visible = (State = "Down")
  1380.       If ObjectBoxEditor.ObjBoxForm.Visible Then ObjectBoxEditor.ObjBoxForm.SetCaption
  1381.     End Sub
  1382.  
  1383.   End Type
  1384.  
  1385.   ' METHODS for object: ToolPalette
  1386.   Sub DragAndDrop(o as XferData, x,y as single, state as OleDropState, effect as OleDropEffect)
  1387.     Dim nm as String
  1388.     dim dropObj as object
  1389.     dim underPoint As ButtonGadget
  1390.   
  1391.     dropObj = o.ObjectRef
  1392.     underPoint = AtPoint(x, y)
  1393.   
  1394.     ' Default to "don't accept"
  1395.     effect = 0
  1396.   
  1397.     ' Don't allow a gadget to be dropped on itself. If no object dropped,
  1398.     ' forget it.
  1399.     If Not dropObj || dropObj = underPoint Then Exit Sub
  1400.   
  1401.     ' If DROP ...
  1402.     If state = 3 Then 
  1403.       ' Disable feedback for drop location
  1404.       DropFeedbackGadget = Nothing
  1405.   
  1406.       ' Dropped gadget...
  1407.       If TypeOf dropObj Is ButtonGadget && dropObj.Parent = Me Then 
  1408.         ' Swap the positions of gadgets on same palette
  1409.         dropObj.Position = underPoint.Position
  1410.   
  1411.         ' Accept the drop
  1412.         effect = 1
  1413.       End If
  1414.   
  1415.     ElseIf state = 1 Then  ' DRAG LEAVE
  1416.       ' Disable feedback for drop location
  1417.       DropFeedbackGadget = Nothing
  1418.   
  1419.     Else  ' DRAG OVER
  1420.       ' Accept drop of ButtonGadgets from OUR PALETTE.
  1421.       If TypeOf dropObj Is ButtonGadget && dropObj.Parent = Me Then 
  1422.         effect = 1
  1423.   
  1424.         ' Provide feedback for drop location
  1425.         DropFeedbackGadget = underPoint
  1426.   
  1427.       End If
  1428.     End If
  1429.   End Sub
  1430.  
  1431.   Function getLastGadget() as ButtonGadget
  1432.     getLastGadget = lastGad_
  1433.   End Function
  1434.  
  1435.   Sub KeyDown(keyCode As Integer, ByVal shift As Integer)
  1436.     If (keyCode = VK_F1) Then Envelop.Help.ShowTopicHelp("Tools_Palette")
  1437.   End Sub
  1438.  
  1439.   Sub setLastGadget(g as ButtonGadget)
  1440.     If lastGad_ And g <> lastGad_ Then lastGad_.State = 0
  1441.     lastGad_ = g
  1442.     If lastGad_ Then lastGad_.State = 1
  1443.   End Sub
  1444.  
  1445. End Type
  1446.  
  1447. Type FedArray From Form
  1448.   Dim Label1 As New Label
  1449.   Dim Label2 As New Label
  1450.   Dim Rows As New TextBox
  1451.   Dim Label3 As New Label
  1452.   Dim Columns As New TextBox
  1453.   Dim Label4 As New Label
  1454.   Dim WidthBox As New TextBox
  1455.   Dim Label5 As New Label
  1456.   Dim HeightBox As New TextBox
  1457.   Dim Label6 As New Label
  1458.   Dim ResizeBox As New CheckBox
  1459.   Dim Xoffset As New TextBox
  1460.   Dim Label7 As New Label
  1461.   Dim Yoffset As New TextBox
  1462.   Dim Label8 As New Label
  1463.   Dim OK As New Button
  1464.   Dim Cancel As New Button
  1465.   Dim runMode As Integer
  1466.  
  1467.   ' METHODS for object: FedArray
  1468.   Sub Cancel_Click()
  1469.     ModalResult(-1) : Hide
  1470.   End Sub
  1471.  
  1472.   Sub OK_Click()
  1473.     dim r,c,rs,cs,w,h,rz as integer
  1474.     r = Rows.Text
  1475.     c = Columns.Text
  1476.     cs = Xoffset.Text
  1477.     rs = Yoffset.Text
  1478.     w = WidthBox.Text
  1479.     h = HeightBox.Text
  1480.     rz = ResizeBox.Value
  1481.     ModalResult(0) : Hide
  1482.   
  1483.     If (runMode) Then 
  1484.       FormEditor.ArrangeArray(r, c, rs, cs, w, h, rz)
  1485.     Else 
  1486.       FormEditor.CreateArray(r, c, rs, cs, w, h, rz)
  1487.     End If
  1488.   End Sub
  1489.  
  1490.   Function ShowModal() As Long
  1491.     dim f strictly as Form
  1492.     dim w as Window
  1493.   
  1494.     ' Make sure Form is created, so configurations below stick.
  1495.     LoadForm()
  1496.   
  1497.     If (FormEditor.NumSelected = 1) Then 
  1498.       Caption = "Duplicate control in array pattern"
  1499.       runMode = 0
  1500.     ElseIf (FormEditor.NumSelected > 1) Then 
  1501.       Caption = "Arrange controls as an array"
  1502.       runMode = 1
  1503.     Else 
  1504.       ShowModal = 0
  1505.       Exit Function
  1506.     End If
  1507.   
  1508.     w = FormEditor.GetSelected(0)
  1509.     Columns.Text = 1
  1510.     Rows.Text = FormEditor.NumSelected
  1511.     Xoffset.Text = 1
  1512.     Yoffset.Text = 1
  1513.     WidthBox.Text = w.Width / Screen.TwipsPerPixelX
  1514.     HeightBox.Text = w.Height / Screen.TwipsPerPixelY
  1515.     ResizeBox.Value = 0
  1516.   
  1517.     f = Me
  1518.     ShowModal = f.ShowModal()
  1519.   
  1520.   End Function
  1521.  
  1522. End Type
  1523.  
  1524. Type DataControl From HyperControl
  1525.   Dim DataMoveFirst As New Button
  1526.   Dim DataMovePrev As New Button
  1527.   Dim DataMoveNext As New Button
  1528.   Dim DataMoveLast As New Button
  1529.   Dim DataLabel As New TextBox
  1530.   Dim ButtonScale As Single
  1531.   Dim RecordSet As New RecordSet
  1532.  
  1533.   ' METHODS for object: DataControl
  1534.   Sub DataMoveFirst_Click()
  1535.     RecordSet.MoveFirst
  1536.   End Sub
  1537.  
  1538.   Sub DataMoveLast_Click()
  1539.     RecordSet.MoveLast
  1540.   End Sub
  1541.  
  1542.   Sub DataMoveNext_Click()
  1543.     RecordSet.MoveNext
  1544.     If RecordSet.EOF Then RecordSet.MovePrev
  1545.   End Sub
  1546.  
  1547.   Sub DataMovePrev_Click()
  1548.     RecordSet.MovePrev
  1549.     If RecordSet.BOF Then RecordSet.MoveNext
  1550.   End Sub
  1551.  
  1552.   Function DetailedEdit() As Long
  1553.     DataConConfigureWizard.Edit(Me)
  1554.     DetailedEdit = True
  1555.   End Function
  1556.  
  1557.   Sub Refresh()
  1558.     Dim f Strictly as Form
  1559.     f = Me
  1560.     f.Refresh
  1561.     RecordSet.Refresh
  1562.   End Sub
  1563.  
  1564.   Sub Resize()
  1565.     DataMoveFirst.Move(0, 0, ScaleWidth / ButtonScale, ScaleHeight)
  1566.     DataMovePrev.Move(DataMoveFirst.Width, 0, ScaleWidth / ButtonScale, ScaleHeight)
  1567.     DataLabel.Move(DataMovePrev.Left + DataMovePrev.Width, 0, ScaleWidth * (ButtonScale - 4) / ButtonScale, ScaleHeight)
  1568.     DataMoveNext.Move(DataLabel.Left + DataLabel.Width, 0, ScaleWidth / ButtonScale, ScaleHeight)
  1569.     DataMoveLast.Move(DataMoveNext.Left + DataMoveNext.Width, 0, ScaleWidth / ButtonScale, ScaleHeight)
  1570.   End Sub
  1571.  
  1572. End Type
  1573.  
  1574. Type WindowLayoutItem
  1575.   Dim wnd As Object
  1576.   Dim top As Single
  1577.   Dim width As Single
  1578.   Dim height As Single
  1579.   Dim visible As Boolean
  1580.   Dim left_ As Single
  1581. End Type
  1582.  
  1583. Type HScrollBar From ScrollBar
  1584. End Type
  1585.  
  1586. Type HelpFile From File
  1587.   Dim IsShowing As Integer
  1588.  
  1589.   ' METHODS for object: HelpFile
  1590.   Sub Contents()
  1591.     If Exists Then 
  1592.       WinHelp(App.MainForm.hWnd, FileName, HELP_FORCEFILE, 0)
  1593.       WinHelp(App.MainForm.hWnd, FileName, HELP_CONTENTS, 0)
  1594.       IsShowing = True
  1595.     End If
  1596.   End Sub
  1597.  
  1598.   Sub GotoContext(context As Long)
  1599.     If Exists Then 
  1600.       WinHelp(App.MainForm.hWnd, FileName, HELP_CONTEXT, context)
  1601.       IsShowing = True
  1602.     End If
  1603.   End Sub
  1604.  
  1605.   Sub HelpTopics()
  1606.     If Exists Then 
  1607.       WinHelp(App.MainForm.hWnd, FileName, HELP_FINDER, 0)
  1608.       IsShowing = True
  1609.     End If
  1610.   End Sub
  1611.  
  1612.   Sub Index()
  1613.     If Exists Then 
  1614.       WinHelp(App.MainForm.hWnd, FileName, HELP_INDEX, 0)
  1615.       IsShowing = True
  1616.     End If
  1617.   End Sub
  1618.  
  1619.   Sub Quit()
  1620.     If IsShowing Then 
  1621.       WinHelp(App.MainForm.hWnd, FileName, HELP_QUIT, 0)
  1622.       IsShowing = False
  1623.     End If
  1624.   End Sub
  1625.  
  1626. End Type
  1627.  
  1628. Type FontPicker From Form
  1629.   Dim Cancel As New Button
  1630.   Dim OK As New Button
  1631.   Dim NothingButton As New Button
  1632.   Dim FontRef As Font
  1633.   Dim Workaround As Font
  1634.   Dim Sample As New TextBox
  1635.   Dim ObjList As New ObjectList
  1636.   Dim BtnNewFont As New Button
  1637.   Dim AllowNewFont As Boolean
  1638.  
  1639.   ' METHODS for object: FontPicker
  1640.   Sub BtnNewFont_Click()
  1641.     Dim ID As New InputDialog
  1642.     Dim FName As String
  1643.     Dim GoodName, Cancelled As Boolean
  1644.     Dim MB As New MessageBox
  1645.     GoodName = False
  1646.     Cancelled = False
  1647.     FName = ""
  1648.     While Not GoodName && Not Cancelled
  1649.       If ID.Execute("New Font", "Please Enter a Name for the New Top-Level Font", FName) = IDOK Then 
  1650.         ' User Clicked OK. Verify that Font is legal...
  1651.         FName = ID.Text
  1652.         If Not ValidName(FName) Then 
  1653.           MB.Message("Invalid Name", FName & " is not valid, please try again.")
  1654.         Else 
  1655.           ' Name is a legal identifier, now check to see if it exists
  1656.           If FindObject(FName) Then 
  1657.             MB.Message("Invalid Name", "An object named " & FName & " already exists. Please try again.")
  1658.           Else 
  1659.             ' Name is a legal identifier, and isn't used. We're set!
  1660.             GoodName = True
  1661.           End If
  1662.         End If
  1663.       Else 
  1664.         Cancelled = True
  1665.       End If
  1666.     Wend
  1667.     ' If the user cancelled, this block will be skipped
  1668.     If GoodName Then 
  1669.       Dim FD As New FontDialog
  1670.       ' Need to use FindObject to get the top-level font, and not the
  1671.       ' font reference on the button
  1672.       FD.Font = CopyObject(FindObject("Font"), FName)
  1673.       If Not FD.Font Then 
  1674.         ' FD.Font should ALWAYS be something at this point
  1675.       Else 
  1676.         If FD.Execute = IDOK Then 
  1677.           ' Configuration complete. Reset the ObjList, and select the
  1678.           ' user's new font.
  1679.           ObjList.Reset
  1680.           ObjList.SelObject = FD.Font
  1681.         Else 
  1682.           ' They cancelled the FontDialog, ask if they want to keep the font
  1683.           Dim YNB As New YesNoBox
  1684.           If YNB.Message("Keep Old Font?", "Do you want to keep " & FName) = IDNO Then 
  1685.             ' User doesn't want the font, and it's still in the FontDialog. Whack it!
  1686.             DestroyObject(FD.Font)
  1687.           End If
  1688.         End If
  1689.       End If
  1690.     End If
  1691.   End Sub
  1692.  
  1693.   Sub Cancel_Click()
  1694.     Hide() : ModalResult(0)
  1695.   End Sub
  1696.  
  1697.   Function Execute() As Integer
  1698.     Show()
  1699.     ObjList.SelObject = FontRef
  1700.     ObjList_Click()
  1701.     BtnNewFont.Visible = AllowNewFont
  1702.   
  1703.     Execute = ShowModal()
  1704.   End Function
  1705.  
  1706.   Sub Load()
  1707.     ' Overcome a serious name conflict
  1708.     ObjList.RootObject = Workaround
  1709.   End Sub
  1710.  
  1711.   Sub NothingButton_Click()
  1712.     FontRef = Nothing
  1713.     OK_Click()
  1714.   End Sub
  1715.  
  1716.   Sub ObjList_Click()
  1717.     FontRef = ObjList.SelObject
  1718.     Sample.Font = FontRef
  1719.   End Sub
  1720.  
  1721.   Sub ObjList_DblClick()
  1722.     ' Use font dialog to set it
  1723.     Dim FD As New FontDialog
  1724.     FD.Title = ObjList.SelObject
  1725.     FD.Font = ObjList.SelObject
  1726.     FD.Color = 0
  1727.     FD.Execute
  1728.   End Sub
  1729.  
  1730.   Sub OK_Click()
  1731.     Hide() : ModalResult(1)
  1732.   End Sub
  1733.  
  1734.   Function ValidName(ByVal namestr As String) As Boolean
  1735.     Dim i, char As Integer
  1736.   
  1737.     ' The Empty string is invalid
  1738.     If namestr = "" Then 
  1739.       ValidName = False
  1740.       Exit Sub
  1741.     End If
  1742.   
  1743.     ' Make sure the first Char isn't a number or _
  1744.     char = Asc(Left$(namestr, 1))
  1745.     If (char >= 48 && char <= 57) || (char = 95) Then 
  1746.       ValidName = False
  1747.       Exit Function
  1748.     End If
  1749.   
  1750.     ' Only legal Chars are Letters (Either Case), Numbers and _. Verify
  1751.     ' That EVERY char in the string is one of these cases.
  1752.     For i = 1 To Len(namestr)
  1753.       char = Asc(Mid$(namestr, i, 1))
  1754.       If (char < 65 || char > 90) && (char < 97 || char > 122) Then 
  1755.         If (char < 48 || char > 57) && (char <> 95) Then 
  1756.           ValidName = False
  1757.           Exit Function
  1758.         End If
  1759.       End If
  1760.     Next i
  1761.     ValidName = True
  1762.   End Function
  1763.  
  1764. End Type
  1765.  
  1766. Type ScreenLayoutSet
  1767.   Dim Default__Layout__ As ScreenLayout
  1768.  
  1769.   ' METHODS for object: ScreenLayoutSet
  1770.   Sub AutoRestoreLayout
  1771.     Dim layout As ScreenLayout
  1772.   
  1773.     ' First check our cached default layout
  1774.     layout = Default__Layout__
  1775.     If Not layout || Not layout.FitsScreen Then 
  1776.       ' See if there's a layout named exactly "ScreenWxH"
  1777.       Dim layoutName As String
  1778.       layoutName = DefaultScreenLayoutName
  1779.       layout = FindEmbed(Me, layoutName)
  1780.   
  1781.       If Not layout Then 
  1782.         ' OK, last shot. Pick the biggest layout that fits. Uses the
  1783.         ' Default__Layout__ as a scratch-pad reference.
  1784.         Dim tmpLayout As ScreenLayout
  1785.         tmpLayout = Default__Layout__
  1786.         Default__Layout__ = Nothing
  1787.         EnumObjectEmbeds(Me, Me, "FindBestLayout")
  1788.         layout = Default__Layout__
  1789.         Default__Layout__ = tmpLayout
  1790.       End If
  1791.     End If
  1792.   
  1793.     If layout Then layout.RestoreLayout
  1794.   End Sub
  1795.  
  1796.   Sub Clear
  1797.     ' Destroy all embedded layouts
  1798.     Dim sl As ScreenLayout
  1799.     For Each sl EmbeddedIn Me
  1800.       DestroyObject(o)
  1801.     Next 
  1802.   End Sub
  1803.  
  1804.   Function DefaultScreenLayoutName As String
  1805.     DefaultScreenLayoutName = IIf(Default__Layout__, Default__Layout__.ShortName, "ScreenLayout" & Screen.pixelWidth & "x" & Screen.pixelHeight)
  1806.   End Function
  1807.  
  1808.   Sub FindBestLayout(o As Object)
  1809.     ' Compare layout to the previous best layout. If this layout fits
  1810.     ' on screen and covers more area, then it's better. See "AutoRestoreLayout" method
  1811.     If (TypeOf o Is ScreenLayout) && o.FitsScreen Then 
  1812.       If Not Default__Layout__ Then 
  1813.         Default__Layout__ = o
  1814.       Else 
  1815.         Dim areaPrev, areaThis As Double
  1816.         areaPrev = Default__Layout__.ScreenWidth * Default__Layout__.ScreenHeight
  1817.         areaThis = o.ScreenWidth * o.ScreenHeight
  1818.         If areaThis > areaPrev Then Default__Layout__ = o
  1819.       End If
  1820.     End If
  1821.   End Sub
  1822.  
  1823.   Function SaveLayout(layoutName As String) As ScreenLayout
  1824.     Dim layout As ScreenLayout
  1825.     SaveLayout = Nothing
  1826.   
  1827.     ' Find or create the embedded layout in me.
  1828.     layout = FindEmbed(Me, layoutName)
  1829.     If Not layout Then 
  1830.       layout = EmbedObject(Me, ScreenLayout, layoutName)
  1831.       If Not layout Then Exit Function
  1832.     End If
  1833.   
  1834.     ' Tell the layout to save the current screen.
  1835.     layout.SaveLayout
  1836.     SaveLayout = layout
  1837.   End Function
  1838.  
  1839. End Type
  1840.  
  1841. Type SuspendIgnoreExceptions
  1842.   Dim debugger As Object
  1843.   Dim IgnoreExceptionsModule As Integer
  1844.  
  1845.   ' METHODS for object: SuspendIgnoreExceptions
  1846.   Sub Construct(o As Object)
  1847.     ' This code is constructed so it will work whether or not
  1848.     ' the "Debugger" object is present in the system.
  1849.     debugger = FindObject("Debugger")
  1850.     If debugger Then 
  1851.       IgnoreExceptionsModule = debugger.IgnoreExceptionsModule
  1852.       debugger.IgnoreExceptionsModule = -1
  1853.     End If
  1854.   End Sub
  1855.  
  1856.   Sub Destruct()
  1857.     If debugger Then debugger.IgnoreExceptionsModule = IgnoreExceptionsModule
  1858.   End Sub
  1859.  
  1860. End Type
  1861.  
  1862.  
  1863. Type TempBinaryFile From BinaryFile
  1864.   Dim prefix As String
  1865.  
  1866.   ' METHODS for object: TempBinaryFile
  1867.   Sub Destruct()
  1868.     ' Delete the file.
  1869.     Delete
  1870.   End Sub
  1871.  
  1872.   Function Init() As Boolean
  1873.     ' Generate a unique file name in the TEMP dir.
  1874.     InitializeFileName("")
  1875.   
  1876.     ' OK, we have a unique filename (which might exist).
  1877.     ' Create & open the file empty.
  1878.     Create(True)
  1879.     Init = Exists && IsOpen
  1880.   End Function
  1881.  
  1882.   Sub InitializeFileName(name As String)
  1883.     ' 
  1884.     ' Does nothing if FileName is already set.
  1885.     ' Otherwise, sets FileName up one of two ways:
  1886.     ' - No given name: generates a unique name of form %TEMP%\tmpXXXXX.tmp
  1887.     ' - Given name: sets name to %TEMP%\name
  1888.     ' 
  1889.     If FileName = "" Then 
  1890.       Dim result As Long
  1891.       Dim tmpBuf As New DataBuffer
  1892.       Dim tempPath As String
  1893.       Dim pfx As String
  1894.       tmpBuf.Size = 260
  1895.       pfx = IIf(prefix = "", "tmp", prefix)
  1896.   
  1897.       ' Get TEMP dir.
  1898.       result = GetTempPath(tmpBuf.Size, tmpBuf.Data)
  1899.       If result = 0 || result > tmpBuf.Size Then Exit Sub
  1900.       tempPath = tmpBuf.GetString(0)
  1901.   
  1902.       If name = "" Then 
  1903.         ' Generate temp file name in TEMP dir.
  1904.         result = GetTempFileName(tempPath, pfx, 0, tmpBuf.Data)
  1905.         If result = 0 Then Exit Sub
  1906.         FileName = tmpBuf.GetString(0)
  1907.       Else 
  1908.         FileName = tempPath & name
  1909.       End If
  1910.     End If
  1911.   End Sub
  1912.  
  1913.   Function InitWithName(name As String) As Boolean
  1914.     ' Prepend the TEMP dir to name and set FileName to that.
  1915.     InitializeFileName(name)
  1916.   
  1917.     ' OK, we have a filename in the TEMP dir (which might exist).
  1918.     ' Create & open the file empty. Caller beware! We don't try
  1919.     ' to be nice here: if we can get it, it's gone.
  1920.     If Exists && ReadOnly Then ReadOnly = False
  1921.     Create(True)
  1922.     InitWithName = Exists && IsOpen
  1923.   End Function
  1924.  
  1925. End Type
  1926.  
  1927. Type TempTextFile From TextFile
  1928.   Dim prefix As String
  1929.  
  1930.   ' METHODS for object: TempTextFile
  1931.   Sub Destruct()
  1932.     ' Delete the file.
  1933.     Delete
  1934.   End Sub
  1935.  
  1936.   Function Init() As Boolean
  1937.     ' Generate a unique file name in the TEMP dir.
  1938.     InitializeFileName("")
  1939.   
  1940.     ' OK, we have a unique filename (which might exist).
  1941.     ' Create & open the file empty.
  1942.     Create(True)
  1943.     Init = Exists && IsOpen
  1944.   End Function
  1945.  
  1946.   Sub InitializeFileName(name As String)
  1947.     ' 
  1948.     ' Does nothing if FileName is already set.
  1949.     ' Otherwise, sets FileName up one of two ways:
  1950.     ' - No given name: generates a unique name of form %TEMP%\tmpXXXXX.tmp
  1951.     ' - Given name: sets name to %TEMP%\name
  1952.     ' 
  1953.     If FileName = "" Then 
  1954.       Dim result As Long
  1955.       Dim tmpBuf As New DataBuffer
  1956.       Dim tempPath As String
  1957.       Dim pfx As String
  1958.       tmpBuf.Size = 260
  1959.       pfx = IIf(prefix = "", "tmp", prefix)
  1960.   
  1961.       ' Get TEMP dir.
  1962.       result = GetTempPath(tmpBuf.Size, tmpBuf.Data)
  1963.       If result = 0 || result > tmpBuf.Size Then 
  1964.         Init = False
  1965.         Exit Function
  1966.       End If
  1967.       tempPath = tmpBuf.GetString(0)
  1968.   
  1969.       If name = "" Then 
  1970.         ' Generate temp file name in TEMP dir.
  1971.         result = GetTempFileName(tempPath, pfx, 0, tmpBuf.Data)
  1972.         If result = 0 Then 
  1973.           Init = False
  1974.           Exit Function
  1975.         End If
  1976.         FileName = tmpBuf.GetString(0)
  1977.       Else 
  1978.         FileName = tempPath & name
  1979.       End If
  1980.     End If
  1981.   End Sub
  1982.  
  1983.   Function InitWithName(name As String) As Boolean
  1984.     ' Prepend the TEMP dir to name and set FileName to that.
  1985.     InitializeFileName(name)
  1986.   
  1987.     ' OK, we have a filename in the TEMP dir (which might exist).
  1988.     ' Create & open the file empty. Caller beware! We don't try
  1989.     ' to be nice here: if we can get it, it's gone.
  1990.     If Exists && ReadOnly Then ReadOnly = False
  1991.     Create(True)
  1992.     InitWithName = Exists && IsOpen
  1993.   End Function
  1994.  
  1995. End Type
  1996.  
  1997. Begin Code
  1998. ' Reconstruction commands for object: ScreenLayout
  1999. '
  2000.   With ScreenLayout
  2001.     .curItem := 0
  2002.     .ScreenWidth := 0
  2003.     .ScreenHeight := 0
  2004.   End With  'ScreenLayout
  2005. ' Reconstruction commands for object: ToolGadget
  2006. '
  2007.   With ToolGadget
  2008.     .HintText := ""
  2009.     With .bitmap
  2010.       .LoadType := "MemoryBased"
  2011.     End With  'ToolGadget.bitmap
  2012.   End With  'ToolGadget
  2013. ' Reconstruction commands for object: InstallButton
  2014. '
  2015.   With InstallButton
  2016.     .Move(0, 0, 450, 450)
  2017.     .BevelOuter := "Raised"
  2018.     .Outlined := True
  2019.     .Picture := InstallButton.DefaultBitmap
  2020.     .installObject := Nothing
  2021.     .SourceModule := ""
  2022.     .InstalledSomething := False
  2023.     .TargetPalette := Nothing
  2024.     With .BmpOpen
  2025.       .Title := "Specify bitmap for Sample Icon"
  2026.       .NoChangeDir := False
  2027.     End With  'InstallButton.BmpOpen
  2028.     With .installBitmap
  2029.       .LoadType := "MemoryBased"
  2030.     End With  'InstallButton.installBitmap
  2031.     With .DefaultBitmap
  2032.       .LoadType := "MemoryBased"
  2033.     End With  'InstallButton.DefaultBitmap
  2034.     With .InstallPair
  2035.       .bitmap := Nothing
  2036.       .obj := Nothing
  2037.     End With  'InstallButton.InstallPair
  2038.   End With  'InstallButton
  2039. ' Reconstruction commands for object: SuspendDebugExceptionTrapping
  2040. '
  2041.   With SuspendDebugExceptionTrapping
  2042.     .debugger := Nothing
  2043.     .TrapInterpretiveExceptions := False
  2044.     .TrapSystemExceptions := False
  2045.   End With  'SuspendDebugExceptionTrapping
  2046. ' Reconstruction commands for object: HyperControl
  2047. '
  2048.   With HyperControl
  2049.     .Move(0, 0, 3600, 4320)
  2050.     .Outlined := True
  2051.     .MaxButton := False
  2052.     .MinButton := False
  2053.   End With  'HyperControl
  2054. ' Reconstruction commands for object: ScreenLayoutConfigForm
  2055. '
  2056.   With ScreenLayoutConfigForm
  2057.     .Caption := "Configure Layouts"
  2058.     .Font := DefaultDialogFont
  2059.     .Move(4110, 1905, 3810, 2745)
  2060.     .CancelButton := ScreenLayoutConfigForm.BtnDone
  2061.     .MaxButton := False
  2062.     .LayoutSet := Nothing
  2063.     With .BtnDone
  2064.       .Caption := "Done"
  2065.       .ZOrder := 7
  2066.       .Move(2505, 90, 1095, 315)
  2067.     End With  'ScreenLayoutConfigForm.BtnDone
  2068.     With .BtnSave
  2069.       .Caption := "&Save"
  2070.       .ZOrder := 6
  2071.       .Move(2505, 495, 1095, 315)
  2072.     End With  'ScreenLayoutConfigForm.BtnSave
  2073.     With .CbLayouts
  2074.       .ZOrder := 5
  2075.       .Move(90, 90, 2325, 1905)
  2076.       .Style := "SimpleCombo"
  2077.     End With  'ScreenLayoutConfigForm.CbLayouts
  2078.     With .BtnRestore
  2079.       .Caption := "&Restore"
  2080.       .ZOrder := 4
  2081.       .Move(2505, 855, 1095, 315)
  2082.     End With  'ScreenLayoutConfigForm.BtnRestore
  2083.     With .BtnSetDefault
  2084.       .Caption := "Set de&fault"
  2085.       .ZOrder := 3
  2086.       .Move(2505, 1215, 1095, 315)
  2087.     End With  'ScreenLayoutConfigForm.BtnSetDefault
  2088.     With .LblLegend
  2089.       .Caption := "* = default screen layout"
  2090.       .ZOrder := 2
  2091.       .Move(240, 1995, 2130, 195)
  2092.     End With  'ScreenLayoutConfigForm.LblLegend
  2093.     With .BtnDelete
  2094.       .Caption := "&Delete"
  2095.       .ZOrder := 1
  2096.       .Move(2505, 1575, 1095, 315)
  2097.     End With  'ScreenLayoutConfigForm.BtnDelete
  2098.     With .BtnNewLayout
  2099.       .Caption := "&New"
  2100.       .ZOrder := 1
  2101.       .Move(2505, 1965, 1095, 315)
  2102.     End With  'ScreenLayoutConfigForm.BtnNewLayout
  2103.   End With  'ScreenLayoutConfigForm
  2104. ' Reconstruction commands for object: ControlTools
  2105. '
  2106.   With ControlTools
  2107.     With .Gadget
  2108.       .ButtonType := "Exclusive"
  2109.       .GadgetObject := ""
  2110.       .gadgetObject_ := ""
  2111.       .SourceModule := ""
  2112.       With .bitmap
  2113.       End With  'ControlTools.Gadget.bitmap
  2114.     End With  'ControlTools.Gadget
  2115.     With .Palette
  2116.       .Caption := "Controls"
  2117.       .ZOrder := 1
  2118.       .Move(14370, 1125, 915, 6945)
  2119.       .addingGadget := Nothing
  2120.       .templateGadget := ControlTools.Gadget
  2121.       .lastGad_ := Nothing
  2122.       .DropFeedbackGadget := Nothing
  2123.       With .GadArrow
  2124.         .Position := 1
  2125.         .HintText := "Cancel Add Control"
  2126.         With .bitmap
  2127.           .FileName := "tools.ero"
  2128.           .ResId := 0
  2129.         End With  'ControlTools.Palette.GadArrow.bitmap
  2130.       End With  'ControlTools.Palette.GadArrow
  2131.       With .GadButton
  2132.         .Position := 2
  2133.         .GadgetObject := "Button"
  2134.         .gadgetObject_ := "Button"
  2135.         With .bitmap
  2136.           .FileName := "tools.ero"
  2137.           .ResId := 404
  2138.         End With  'ControlTools.Palette.GadButton.bitmap
  2139.       End With  'ControlTools.Palette.GadButton
  2140.       With .GadOptionButton
  2141.         .Position := 3
  2142.         .GadgetObject := "OptionButton"
  2143.         .gadgetObject_ := "OptionButton"
  2144.         With .bitmap
  2145.           .FileName := "tools.ero"
  2146.           .ResId := 808
  2147.         End With  'ControlTools.Palette.GadOptionButton.bitmap
  2148.       End With  'ControlTools.Palette.GadOptionButton
  2149.       With .GadCheckBox
  2150.         .Position := 4
  2151.         .GadgetObject := "CheckBox"
  2152.         .gadgetObject_ := "CheckBox"
  2153.         With .bitmap
  2154.           .FileName := "tools.ero"
  2155.           .ResId := 1212
  2156.         End With  'ControlTools.Palette.GadCheckBox.bitmap
  2157.       End With  'ControlTools.Palette.GadCheckBox
  2158.       With .GadLabel
  2159.         .Position := 5
  2160.         .GadgetObject := "Label"
  2161.         .gadgetObject_ := "Label"
  2162.         With .bitmap
  2163.           .FileName := "tools.ero"
  2164.           .ResId := 1616
  2165.         End With  'ControlTools.Palette.GadLabel.bitmap
  2166.       End With  'ControlTools.Palette.GadLabel
  2167.       With .GadTextBox
  2168.         .Position := 6
  2169.         .GadgetObject := "TextBox"
  2170.         .gadgetObject_ := "TextBox"
  2171.         With .bitmap
  2172.           .FileName := "tools.ero"
  2173.           .ResId := 2020
  2174.         End With  'ControlTools.Palette.GadTextBox.bitmap
  2175.       End With  'ControlTools.Palette.GadTextBox
  2176.       With .GadListBox
  2177.         .Position := 7
  2178.         .GadgetObject := "ListBox"
  2179.         .gadgetObject_ := "ListBox"
  2180.         With .bitmap
  2181.           .FileName := "tools.ero"
  2182.           .ResId := 2424
  2183.         End With  'ControlTools.Palette.GadListBox.bitmap
  2184.       End With  'ControlTools.Palette.GadListBox
  2185.       With .GadComboBox
  2186.         .Position := 8
  2187.         .GadgetObject := "ComboBox"
  2188.         .gadgetObject_ := "ComboBox"
  2189.         With .bitmap
  2190.           .FileName := "tools.ero"
  2191.           .ResId := 2828
  2192.         End With  'ControlTools.Palette.GadComboBox.bitmap
  2193.       End With  'ControlTools.Palette.GadComboBox
  2194.       With .GadHScrollBar
  2195.         .Position := 9
  2196.         .GadgetObject := "HScrollBar"
  2197.         .gadgetObject_ := "HScrollBar"
  2198.         With .bitmap
  2199.           .FileName := "tools.ero"
  2200.           .ResId := 3232
  2201.         End With  'ControlTools.Palette.GadHScrollBar.bitmap
  2202.       End With  'ControlTools.Palette.GadHScrollBar
  2203.       With .GadScrollBar
  2204.         .Position := 10
  2205.         .GadgetObject := "ScrollBar"
  2206.         .gadgetObject_ := "ScrollBar"
  2207.         With .bitmap
  2208.           .FileName := "tools.ero"
  2209.           .ResId := 3636
  2210.         End With  'ControlTools.Palette.GadScrollBar.bitmap
  2211.       End With  'ControlTools.Palette.GadScrollBar
  2212.       With .GadFrame
  2213.         .Position := 11
  2214.         .GadgetObject := "Frame"
  2215.         .gadgetObject_ := "Frame"
  2216.         With .bitmap
  2217.           .FileName := "tools.ero"
  2218.           .ResId := 4040
  2219.         End With  'ControlTools.Palette.GadFrame.bitmap
  2220.       End With  'ControlTools.Palette.GadFrame
  2221.       With .GadGauge
  2222.         .Position := 12
  2223.         .GadgetObject := "Gauge"
  2224.         .gadgetObject_ := "Gauge"
  2225.         With .bitmap
  2226.           .FileName := "tools.ero"
  2227.           .ResId := 4444
  2228.         End With  'ControlTools.Palette.GadGauge.bitmap
  2229.       End With  'ControlTools.Palette.GadGauge
  2230.       With .GadOle
  2231.         .Position := 13
  2232.         .GadgetObject := "Ole"
  2233.         .gadgetObject_ := "Ole"
  2234.         With .bitmap
  2235.           .FileName := "tools.ero"
  2236.           .ResId := 4848
  2237.         End With  'ControlTools.Palette.GadOle.bitmap
  2238.       End With  'ControlTools.Palette.GadOle
  2239.       With .GadMarkupLayer
  2240.         .Position := 14
  2241.         .GadgetObject := "MarkupLayer"
  2242.         .gadgetObject_ := "MarkupLayer"
  2243.         With .bitmap
  2244.           .FileName := "tools.ero"
  2245.           .ResId := 5252
  2246.         End With  'ControlTools.Palette.GadMarkupLayer.bitmap
  2247.       End With  'ControlTools.Palette.GadMarkupLayer
  2248.       With .GadPictureBox
  2249.         .Position := 15
  2250.         .GadgetObject := "PictureBox"
  2251.         .gadgetObject_ := "PictureBox"
  2252.         With .bitmap
  2253.           .FileName := "tools.ero"
  2254.           .ResId := 5656
  2255.         End With  'ControlTools.Palette.GadPictureBox.bitmap
  2256.       End With  'ControlTools.Palette.GadPictureBox
  2257.       With .GadImage
  2258.         .Position := 16
  2259.         .GadgetObject := "Image"
  2260.         .gadgetObject_ := "Image"
  2261.         With .bitmap
  2262.           .FileName := "tools.ero"
  2263.           .ResId := 6060
  2264.         End With  'ControlTools.Palette.GadImage.bitmap
  2265.       End With  'ControlTools.Palette.GadImage
  2266.       With .GadIndentedList
  2267.         .Position := 17
  2268.         .GadgetObject := "IndentedList"
  2269.         .gadgetObject_ := "IndentedList"
  2270.         With .bitmap
  2271.           .FileName := "tools.ero"
  2272.           .ResId := 6464
  2273.         End With  'ControlTools.Palette.GadIndentedList.bitmap
  2274.       End With  'ControlTools.Palette.GadIndentedList
  2275.       With .GadObjectHierarchy
  2276.         .Position := 18
  2277.         .GadgetObject := "ObjectHierarchy"
  2278.         .gadgetObject_ := "ObjectHierarchy"
  2279.         With .bitmap
  2280.           .FileName := "tools.ero"
  2281.           .ResId := 6868
  2282.         End With  'ControlTools.Palette.GadObjectHierarchy.bitmap
  2283.       End With  'ControlTools.Palette.GadObjectHierarchy
  2284.       With .GadObjectList
  2285.         .Position := 19
  2286.         .GadgetObject := "ObjectList"
  2287.         .gadgetObject_ := "ObjectList"
  2288.         With .bitmap
  2289.           .FileName := "tools.ero"
  2290.           .ResId := 7272
  2291.         End With  'ControlTools.Palette.GadObjectList.bitmap
  2292.       End With  'ControlTools.Palette.GadObjectList
  2293.       With .GadObjectCombo
  2294.         .Position := 20
  2295.         .GadgetObject := "ObjectCombo"
  2296.         .gadgetObject_ := "ObjectCombo"
  2297.         With .bitmap
  2298.           .FileName := "tools.ero"
  2299.           .ResId := 7676
  2300.         End With  'ControlTools.Palette.GadObjectCombo.bitmap
  2301.       End With  'ControlTools.Palette.GadObjectCombo
  2302.       With .GadFileListBox
  2303.         .Position := 21
  2304.         .GadgetObject := "FileListBox"
  2305.         .gadgetObject_ := "FileListBox"
  2306.         With .bitmap
  2307.           .FileName := "tools.ero"
  2308.           .ResId := 8080
  2309.         End With  'ControlTools.Palette.GadFileListBox.bitmap
  2310.       End With  'ControlTools.Palette.GadFileListBox
  2311.       With .GadFileComboBox
  2312.         .Position := 22
  2313.         .GadgetObject := "FileComboBox"
  2314.         .gadgetObject_ := "FileComboBox"
  2315.         With .bitmap
  2316.           .FileName := "tools.ero"
  2317.           .ResId := 8484
  2318.         End With  'ControlTools.Palette.GadFileComboBox.bitmap
  2319.       End With  'ControlTools.Palette.GadFileComboBox
  2320.       With .GadGLControl
  2321.         .Position := 23
  2322.         .GadgetObject := "GLControl"
  2323.         .gadgetObject_ := "GLControl"
  2324.         With .bitmap
  2325.           .FileName := "tools.ero"
  2326.           .ResId := 9292
  2327.         End With  'ControlTools.Palette.GadGLControl.bitmap
  2328.       End With  'ControlTools.Palette.GadGLControl
  2329.       With .GadDataControl
  2330.         .Position := 24
  2331.         .GadgetObject := "DataControl"
  2332.         .gadgetObject_ := "DataControl"
  2333.         With .bitmap
  2334.           .FileName := "tools.ero"
  2335.           .ResId := 8888
  2336.         End With  'ControlTools.Palette.GadDataControl.bitmap
  2337.       End With  'ControlTools.Palette.GadDataControl
  2338.       With .GadRichTextBox
  2339.         .Position := 25
  2340.         .GadgetObject := "RichTextBox"
  2341.         .gadgetObject_ := "RichTextBox"
  2342.         With .bitmap
  2343.           .FileName := "tools.ero"
  2344.           .ResId := 9696
  2345.         End With  'ControlTools.Palette.GadRichTextBox.bitmap
  2346.       End With  'ControlTools.Palette.GadRichTextBox
  2347.       With .GadListView
  2348.         .Position := 26
  2349.         .GadgetObject := "ListView"
  2350.         .gadgetObject_ := "ListView"
  2351.         With .bitmap
  2352.           .FileName := "tools.ero"
  2353.           .ResId := 10088
  2354.         End With  'ControlTools.Palette.GadListView.bitmap
  2355.       End With  'ControlTools.Palette.GadListView
  2356.       With .GadTabStrip
  2357.         .Position := 27
  2358.         .GadgetObject := "TabStrip"
  2359.         .gadgetObject_ := "TabStrip"
  2360.         With .bitmap
  2361.           .FileName := "tools.ero"
  2362.           .ResId := 10480
  2363.         End With  'ControlTools.Palette.GadTabStrip.bitmap
  2364.       End With  'ControlTools.Palette.GadTabStrip
  2365.       With .GadTreeView
  2366.         .Position := 28
  2367.         .GadgetObject := "TreeView"
  2368.         .gadgetObject_ := "TreeView"
  2369.         With .bitmap
  2370.           .FileName := "tools.ero"
  2371.           .ResId := 15096
  2372.         End With  'ControlTools.Palette.GadTreeView.bitmap
  2373.       End With  'ControlTools.Palette.GadTreeView
  2374.       With .GadHyperControl
  2375.         .Position := 29
  2376.         .GadgetObject := "HyperControl"
  2377.         .gadgetObject_ := "HyperControl"
  2378.         With .bitmap
  2379.           .FileName := "tools.ero"
  2380.           .ResId := 10872
  2381.         End With  'ControlTools.Palette.GadHyperControl.bitmap
  2382.       End With  'ControlTools.Palette.GadHyperControl
  2383.       With .GadMenu
  2384.         .Position := 30
  2385.         .HintText := "Embed Menubar"
  2386.         With .bitmap
  2387.           .FileName := "tools.ero"
  2388.           .ResId := 11276
  2389.         End With  'ControlTools.Palette.GadMenu.bitmap
  2390.       End With  'ControlTools.Palette.GadMenu
  2391.       With .GadInstallButton
  2392.         .Position := 31
  2393.         .GadgetObject := "InstallButton"
  2394.         .gadgetObject_ := "InstallButton"
  2395.         With .bitmap
  2396.           .FileName := "tools.ero"
  2397.           .ResId := 11680
  2398.         End With  'ControlTools.Palette.GadInstallButton.bitmap
  2399.       End With  'ControlTools.Palette.GadInstallButton
  2400.       With .GadObjectBox
  2401.         .Position := 32
  2402.         .GadgetObject := "ObjectBox"
  2403.         .gadgetObject_ := "ObjectBox"
  2404.         With .bitmap
  2405.           .FileName := "tools.ero"
  2406.           .ResId := 13388
  2407.         End With  'ControlTools.Palette.GadObjectBox.bitmap
  2408.       End With  'ControlTools.Palette.GadObjectBox
  2409.       With .Empty
  2410.         .Position := 33
  2411.         With .bitmap
  2412.         End With  'ControlTools.Palette.Empty.bitmap
  2413.       End With  'ControlTools.Palette.Empty
  2414.     End With  'ControlTools.Palette
  2415.   End With  'ControlTools
  2416. ' Reconstruction commands for object: ToolBitmap
  2417. '
  2418.   With ToolBitmap
  2419.     .Caption := "Configure Tool Gadget"
  2420.     .Move(1905, 5850, 7245, 4815)
  2421.     .DefaultButton := ToolBitmap.BtnFinish
  2422.     .BorderStyle := "Fixed Single"
  2423.     .Caller := Nothing
  2424.     With .LblBitmap
  2425.       .Caption := "Picture file:"
  2426.       .ZOrder := 5
  2427.       .Move(2850, 825, 1500, 225)
  2428.     End With  'ToolBitmap.LblBitmap
  2429.     With .TBBitmap
  2430.       .ZOrder := 4
  2431.       .Move(2850, 1125, 4050, 450)
  2432.     End With  'ToolBitmap.TBBitmap
  2433.     With .BtnFinish
  2434.       .Caption := "Done..."
  2435.       .ZOrder := 6
  2436.       .Move(6225, 4050, 825, 300)
  2437.     End With  'ToolBitmap.BtnFinish
  2438.     With .ImgGraphic
  2439.       .ZOrder := 7
  2440.       .Move(225, 225, 2475, 3150)
  2441.       .AutoInitCropRect := False
  2442.       .Picture := ToolBitmap.ImgGraphic.bitmap
  2443.       .ScrollBars := "Never"
  2444.       .CropXSize := 165
  2445.       .CropYSize := 210
  2446.       With .bitmap
  2447.         .LoadType := "MemoryBased"
  2448.       End With  'ToolBitmap.ImgGraphic.bitmap
  2449.     End With  'ToolBitmap.ImgGraphic
  2450.     With .LblInstruction
  2451.       .Caption := "Type a FileName for the bitmap or the ToolGadget, or press Browse..."
  2452.       .ZOrder := 8
  2453.       .Move(2850, 300, 4125, 450)
  2454.     End With  'ToolBitmap.LblInstruction
  2455.     With .Frame1
  2456.       .ZOrder := 9
  2457.       .Move(75, 3825, 6975, 75)
  2458.     End With  'ToolBitmap.Frame1
  2459.     With .BTNBrowse
  2460.       .Caption := "Browse..."
  2461.       .ZOrder := 3
  2462.       .Move(2850, 1725, 1050, 375)
  2463.     End With  'ToolBitmap.BTNBrowse
  2464.     With .SampleBox
  2465.       .Caption := "SampleBox"
  2466.       .ZOrder := 2
  2467.       .Move(4740, 2790, 345, 345)
  2468.       .Visible := True
  2469.       With .PreviewTool
  2470.         .Position := 1
  2471.         .HintText := "I am a frog"
  2472.         With .bitmap
  2473.           .LoadType := "FileBased"
  2474.           .FileName := "W:\test\objbox\objbox.bmp"
  2475.         End With  'ToolBitmap.SampleBox.PreviewTool.bitmap
  2476.       End With  'ToolBitmap.SampleBox.PreviewTool
  2477.     End With  'ToolBitmap.SampleBox
  2478.     With .BTNPreview
  2479.       .Caption := "Preview"
  2480.       .ZOrder := 1
  2481.       .Move(5625, 1725, 1200, 375)
  2482.     End With  'ToolBitmap.BTNPreview
  2483.   End With  'ToolBitmap
  2484.   ' Reconstruction commands for object: ToolPalette
  2485.   '
  2486.   With ToolPalette
  2487.     .Caption := "Tools"
  2488.     .ZOrder := 1
  2489.     .Move(5025, 1125, 9315, 645)
  2490.     .NumColumns := -1
  2491.     .NumRows := 1
  2492.     .DropFeedbackGadget := Nothing
  2493.     .lastGad_ := Nothing
  2494.     With .AlignGadget
  2495.       .Enabled := False
  2496.       .Position := 1
  2497.       .HintText := "Align Left Edges"
  2498.       .alignType := 1
  2499.       With .bitmap
  2500.         .FileName := "tools.ero"
  2501.         .ResId := 15500
  2502.       End With  'ToolPalette.AlignGadget.bitmap
  2503.     End With  'ToolPalette.AlignGadget
  2504.     With .AlignR
  2505.       .Position := 2
  2506.       .HintText := "Align Right Edges"
  2507.       .alignType := 2
  2508.       With .bitmap
  2509.         .ResId := 15904
  2510.       End With  'ToolPalette.AlignR.bitmap
  2511.     End With  'ToolPalette.AlignR
  2512.     With .AlignT
  2513.       .Position := 3
  2514.       .HintText := "Align Top Edges"
  2515.       .alignType := 4
  2516.       With .bitmap
  2517.         .ResId := 16308
  2518.       End With  'ToolPalette.AlignT.bitmap
  2519.     End With  'ToolPalette.AlignT
  2520.     With .AlignB
  2521.       .Position := 4
  2522.       .HintText := "Align Bottom Edges"
  2523.       .alignType := 8
  2524.       With .bitmap
  2525.         .ResId := 16712
  2526.       End With  'ToolPalette.AlignB.bitmap
  2527.     End With  'ToolPalette.AlignB
  2528.     With .AlignLR
  2529.       .Position := 5
  2530.       .HintText := "Align Left&Right Edges"
  2531.       .alignType := 19
  2532.       With .bitmap
  2533.         .ResId := 17116
  2534.       End With  'ToolPalette.AlignLR.bitmap
  2535.     End With  'ToolPalette.AlignLR
  2536.     With .AlignTB
  2537.       .Position := 6
  2538.       .HintText := "Align Top&Bottom Edges"
  2539.       .alignType := 28
  2540.       With .bitmap
  2541.         .ResId := 17520
  2542.       End With  'ToolPalette.AlignTB.bitmap
  2543.     End With  'ToolPalette.AlignTB
  2544.     With .SpaceH
  2545.       .Enabled := False
  2546.       .Position := 7
  2547.       .HintText := "Proportional Horizontal Spacing"
  2548.       With .bitmap
  2549.         .FileName := "tools.ero"
  2550.         .ResId := 17924
  2551.       End With  'ToolPalette.SpaceH.bitmap
  2552.     End With  'ToolPalette.SpaceH
  2553.     With .SpaceV
  2554.       .Enabled := False
  2555.       .Position := 8
  2556.       .HintText := "Proportional Vertical Spacing"
  2557.       With .bitmap
  2558.         .FileName := "tools.ero"
  2559.         .ResId := 18328
  2560.       End With  'ToolPalette.SpaceV.bitmap
  2561.     End With  'ToolPalette.SpaceV
  2562.     With .ToggleGrid
  2563.       .Position := 9
  2564.       .State := "Down"
  2565.       .ButtonType := "NonExclusive"
  2566.       .HintText := "Toggle Grid"
  2567.       With .bitmap
  2568.         .FileName := "tools.ero"
  2569.         .ResId := 18732
  2570.       End With  'ToolPalette.ToggleGrid.bitmap
  2571.     End With  'ToolPalette.ToggleGrid
  2572.     With .FormEditorUndo
  2573.       .Enabled := False
  2574.       .Position := 10
  2575.       With .bitmap
  2576.         .FileName := "tools.ero"
  2577.         .ResId := 19136
  2578.       End With  'ToolPalette.FormEditorUndo.bitmap
  2579.     End With  'ToolPalette.FormEditorUndo
  2580.     With .FormEditorRedo
  2581.       .Enabled := False
  2582.       .Position := 11
  2583.       With .bitmap
  2584.         .FileName := "tools.ero"
  2585.         .ResId := 19540
  2586.       End With  'ToolPalette.FormEditorRedo.bitmap
  2587.     End With  'ToolPalette.FormEditorRedo
  2588.     With .TouchMode
  2589.       .Position := 12
  2590.       .State := "Down"
  2591.       .ButtonType := "Exclusive"
  2592.       .HintText := "Selection mode: Region Touches"
  2593.       With .bitmap
  2594.         .FileName := "tools.ero"
  2595.         .ResId := 19944
  2596.       End With  'ToolPalette.TouchMode.bitmap
  2597.     End With  'ToolPalette.TouchMode
  2598.     With .ContainsMode
  2599.       .Position := 13
  2600.       .ButtonType := "Exclusive"
  2601.       .HintText := "Selection mode: Region Contains"
  2602.       With .bitmap
  2603.         .FileName := "tools.ero"
  2604.         .ResId := 20348
  2605.       End With  'ToolPalette.ContainsMode.bitmap
  2606.     End With  'ToolPalette.ContainsMode
  2607.     With .CopyGadget
  2608.       .Enabled := False
  2609.       .Position := 14
  2610.       .HintText := "Copy Controls"
  2611.       With .bitmap
  2612.         .FileName := "tools.ero"
  2613.         .ResId := 20752
  2614.       End With  'ToolPalette.CopyGadget.bitmap
  2615.     End With  'ToolPalette.CopyGadget
  2616.     With .Arrange
  2617.       .Enabled := False
  2618.       .Position := 15
  2619.       .HintText := "Arrange Controls"
  2620.       With .bitmap
  2621.         .FileName := "tools.ero"
  2622.         .ResId := 21156
  2623.       End With  'ToolPalette.Arrange.bitmap
  2624.     End With  'ToolPalette.Arrange
  2625.     With .Raise
  2626.       .Enabled := False
  2627.       .Position := 16
  2628.       .HintText := "Raise Controls"
  2629.       With .bitmap
  2630.         .FileName := "tools.ero"
  2631.         .ResId := 21560
  2632.       End With  'ToolPalette.Raise.bitmap
  2633.     End With  'ToolPalette.Raise
  2634.     With .Lower
  2635.       .Enabled := False
  2636.       .Position := 17
  2637.       .HintText := "Lower Controls"
  2638.       With .bitmap
  2639.         .FileName := "tools.ero"
  2640.         .ResId := 21964
  2641.       End With  'ToolPalette.Lower.bitmap
  2642.     End With  'ToolPalette.Lower
  2643.     With .ToggleTab
  2644.       .Position := 18
  2645.       .HintText := "Toggle Tab Order Display"
  2646.       With .bitmap
  2647.         .FileName := "tools.ero"
  2648.         .ResId := 22368
  2649.       End With  'ToolPalette.ToggleTab.bitmap
  2650.     End With  'ToolPalette.ToggleTab
  2651.     With .FontSet
  2652.       .Position := 19
  2653.       .HintText := "Set Font on Selected Controls"
  2654.       With .bitmap
  2655.         .FileName := "tools.ero"
  2656.         .ResId := 22772
  2657.       End With  'ToolPalette.FontSet.bitmap
  2658.     End With  'ToolPalette.FontSet
  2659.     With .FColorSet
  2660.       .Enabled := False
  2661.       .Position := 20
  2662.       .HintText := "Set ForeColor on Selected Controls"
  2663.       With .bitmap
  2664.         .FileName := "tools.ero"
  2665.         .ResId := 23176
  2666.       End With  'ToolPalette.FColorSet.bitmap
  2667.     End With  'ToolPalette.FColorSet
  2668.     With .BColorSet
  2669.       .Position := 21
  2670.       .HintText := "Set BackColor on Selected Controls"
  2671.       With .bitmap
  2672.         .FileName := "tools.ero"
  2673.         .ResId := 23580
  2674.       End With  'ToolPalette.BColorSet.bitmap
  2675.     End With  'ToolPalette.BColorSet
  2676.     With .ToggleObjectBoxEdit
  2677.       .Position := 22
  2678.       .State := "Down"
  2679.       .ButtonType := "NonExclusive"
  2680.       .HintText := "Toggle ObjectBox Editing On/Off"
  2681.       With .bitmap
  2682.         .FileName := "tools.ero"
  2683.         .ResId := 23984
  2684.       End With  'ToolPalette.ToggleObjectBoxEdit.bitmap
  2685.     End With  'ToolPalette.ToggleObjectBoxEdit
  2686.   End With  'ToolPalette
  2687. ' Reconstruction commands for object: FedArray
  2688. '
  2689.   With FedArray
  2690.     .Caption := "Duplicate control in array pattern"
  2691.     .Move(4215, 3180, 5235, 3975)
  2692.     .Outlined := True
  2693.     .DefaultButton := FedArray.OK
  2694.     .CancelButton := FedArray.Cancel
  2695.     .runMode := 0
  2696.     With .Label1
  2697.       .Caption := "Cell layout"
  2698.       .ZOrder := 8
  2699.       .Move(150, 150, 1515, 375)
  2700.     End With  'FedArray.Label1
  2701.     With .Label2
  2702.       .Caption := "Cell size"
  2703.       .ZOrder := 9
  2704.       .Move(2550, 150, 1515, 375)
  2705.     End With  'FedArray.Label2
  2706.     With .Rows
  2707.       .ZOrder := 2
  2708.       .Move(1050, 1125, 1050, 360)
  2709.     End With  'FedArray.Rows
  2710.     With .Label3
  2711.       .Caption := "Columns"
  2712.       .ZOrder := 10
  2713.       .Move(150, 675, 840, 360)
  2714.     End With  'FedArray.Label3
  2715.     With .Columns
  2716.       .ZOrder := 1
  2717.       .Move(1050, 675, 1050, 375)
  2718.     End With  'FedArray.Columns
  2719.     With .Label4
  2720.       .Caption := "Rows"
  2721.       .ZOrder := 11
  2722.       .Move(150, 1125, 900, 375)
  2723.     End With  'FedArray.Label4
  2724.     With .WidthBox
  2725.       .ZOrder := 3
  2726.       .Move(3525, 675, 1110, 360)
  2727.     End With  'FedArray.WidthBox
  2728.     With .Label5
  2729.       .Caption := "Width"
  2730.       .ZOrder := 12
  2731.       .Move(2550, 675, 750, 360)
  2732.     End With  'FedArray.Label5
  2733.     With .HeightBox
  2734.       .ZOrder := 4
  2735.       .Move(3525, 1125, 1110, 360)
  2736.     End With  'FedArray.HeightBox
  2737.     With .Label6
  2738.       .Caption := "Height"
  2739.       .ZOrder := 13
  2740.       .Move(2550, 1125, 900, 360)
  2741.     End With  'FedArray.Label6
  2742.     With .ResizeBox
  2743.       .Caption := "Size controls to cell"
  2744.       .ZOrder := 5
  2745.       .Move(2550, 1650, 2400, 450)
  2746.     End With  'FedArray.ResizeBox
  2747.     With .Xoffset
  2748.       .ZOrder := 6
  2749.       .Move(1050, 1725, 1050, 360)
  2750.     End With  'FedArray.Xoffset
  2751.     With .Label7
  2752.       .Caption := "X offset"
  2753.       .ZOrder := 14
  2754.       .Move(150, 1725, 750, 360)
  2755.     End With  'FedArray.Label7
  2756.     With .Yoffset
  2757.       .ZOrder := 7
  2758.       .Move(1050, 2175, 1050, 360)
  2759.     End With  'FedArray.Yoffset
  2760.     With .Label8
  2761.       .Caption := "Y offset"
  2762.       .ZOrder := 15
  2763.       .Move(150, 2175, 900, 360)
  2764.     End With  'FedArray.Label8
  2765.     With .OK
  2766.       .Caption := "OK"
  2767.       .ZOrder := 16
  2768.       .Move(450, 3000, 1650, 450)
  2769.     End With  'FedArray.OK
  2770.     With .Cancel
  2771.       .Caption := "Cancel"
  2772.       .ZOrder := 17
  2773.       .Move(3000, 3000, 1650, 450)
  2774.     End With  'FedArray.Cancel
  2775.   End With  'FedArray
  2776. ' Reconstruction commands for object: DataControl
  2777. '
  2778.   With DataControl
  2779.     .Move(7515, 5970, 2595, 765)
  2780.     .ButtonScale := 8
  2781.     With .DataMoveFirst
  2782.       .Caption := "<<"
  2783.       .ZOrder := 2
  2784.       .Move(0, 0, 309, 360)
  2785.     End With  'DataControl.DataMoveFirst
  2786.     With .DataMovePrev
  2787.       .Caption := "<"
  2788.       .ZOrder := 3
  2789.       .Move(309, 0, 309, 360)
  2790.     End With  'DataControl.DataMovePrev
  2791.     With .DataMoveNext
  2792.       .Caption := ">"
  2793.       .ZOrder := 4
  2794.       .Move(1855, 0, 309, 360)
  2795.     End With  'DataControl.DataMoveNext
  2796.     With .DataMoveLast
  2797.       .Caption := ">>"
  2798.       .ZOrder := 5
  2799.       .Move(2164, 0, 309, 360)
  2800.     End With  'DataControl.DataMoveLast
  2801.     With .DataLabel
  2802.       .BackColor := 12632256
  2803.       .DragMode := "No Drag"
  2804.       .ZOrder := 6
  2805.       .Move(618, 0, 1237, 360)
  2806.     End With  'DataControl.DataLabel
  2807.   End With  'DataControl
  2808. ' Reconstruction commands for object: WindowLayoutItem
  2809. '
  2810.   With WindowLayoutItem
  2811.     .wnd := Nothing
  2812.     .top := 0
  2813.     .width := 0
  2814.     .height := 0
  2815.     .visible := False
  2816.     .left_ := 0
  2817.   End With  'WindowLayoutItem
  2818. ' Reconstruction commands for object: HScrollBar
  2819. '
  2820.   With HScrollBar
  2821.     .Move(0, 0, 0, 0)
  2822.     .Orientation := "Horizontal"
  2823.     .Move(0, 0, 0, 0)
  2824.   End With  'HScrollBar
  2825. ' Reconstruction commands for object: HelpFile
  2826. '
  2827.   With HelpFile
  2828.     .IsShowing := 0
  2829.   End With  'HelpFile
  2830. ' Reconstruction commands for object: FontPicker
  2831. '
  2832.   With FontPicker
  2833.     .Caption := "Select Font"
  2834.     .Move(7530, 6855, 3135, 4110)
  2835.     .Outlined := True
  2836.     .FontRef := Nothing
  2837.     .Workaround := Font
  2838.     .AllowNewFont := True
  2839.     With .Cancel
  2840.       .Caption := "Cancel"
  2841.       .ForeColor := 4227327
  2842.       .ZOrder := 2
  2843.       .Move(2115, 3225, 750, 375)
  2844.     End With  'FontPicker.Cancel
  2845.     With .OK
  2846.       .Caption := "OK"
  2847.       .ForeColor := 4227327
  2848.       .ZOrder := 3
  2849.       .Move(150, 3225, 750, 375)
  2850.     End With  'FontPicker.OK
  2851.     With .NothingButton
  2852.       .Caption := "Set to ""Nothing"""
  2853.       .ZOrder := 4
  2854.       .Move(75, 2700, 2850, 300)
  2855.     End With  'FontPicker.NothingButton
  2856.     With .Sample
  2857.       .Caption := "AaBbYyZz"
  2858.       .ZOrder := 5
  2859.       .Move(75, 75, 2850, 825)
  2860.     End With  'FontPicker.Sample
  2861.     With .ObjList
  2862.       .Caption := "ObjList"
  2863.       .ZOrder := 6
  2864.       .Move(75, 975, 2850, 1650)
  2865.       .ShowEmbeds := True
  2866.       .RootObject := Font
  2867.     End With  'FontPicker.ObjList
  2868.     With .BtnNewFont
  2869.       .Caption := "New"
  2870.       .ZOrder := 1
  2871.       .Move(1050, 3225, 900, 375)
  2872.     End With  'FontPicker.BtnNewFont
  2873.   End With  'FontPicker
  2874. ' Reconstruction commands for object: ScreenLayoutSet
  2875. '
  2876.   With ScreenLayoutSet
  2877.     .Default__Layout__ := Nothing
  2878.   End With  'ScreenLayoutSet
  2879. ' Reconstruction commands for object: SuspendIgnoreExceptions
  2880. '
  2881.   With SuspendIgnoreExceptions
  2882.     .debugger := Nothing
  2883.     .IgnoreExceptionsModule := 0
  2884.   End With  'SuspendIgnoreExceptions
  2885. ' Reconstruction commands for object: TempTextFile
  2886. '
  2887.   With TempTextFile
  2888.     .prefix := ""
  2889.   End With  'TempTextFile
  2890. End Code
  2891.