home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 February / PCWK0297.iso / envelop / envelop.5 / Tools / Arsenal / parts / pseditor / PSEDITOR.ETO < prev   
Text File  |  1996-07-08  |  37KB  |  1,180 lines

  1. Type PropertySheetEditor From Form
  2.   Type ObToolBar From ObjectBox
  3.     Dim AddSheetGadget As New ToolGadget
  4.     Dim DeleteSheetGadget As New ToolGadget
  5.     Dim MoveLeftGadget As New ToolGadget
  6.     Dim MoveRightGadget As New ToolGadget
  7.     Dim ToggleEditorGadget As New ToolGadget
  8.     Dim NewPageGadget As New ToolGadget
  9.     Dim ConfigureSheetGadget As New ToolGadget
  10.     Dim ResizeGadget As New ToolGadget
  11.   End Type
  12.   Dim CurrentPage As Object
  13.   Type CmbSheetViewer From ComboBox
  14.     Dim SupressClick As Boolean
  15.  
  16.     ' METHODS for object: PropertySheetEditor.CmbSheetViewer
  17.     Sub Change()
  18.       dim o as Object
  19.       o = FindEmbed(PropertySheetEditor.CurrentPage, Text & "Tab")
  20.       If o && TypeOf o Is PropertySheetMaster.Ptab Then 
  21.         PropertySheetEditor.CurrentPage.SetCurrentTab(o)
  22.         o.DetailedEdit
  23.       End If
  24.     End Sub
  25.  
  26.     Sub Click()
  27.       If SupressClick Then 
  28.         SupressClick = False
  29.         Exit Sub
  30.       End If
  31.       With PropertySheetEditor
  32.         .CurrentPage.SetCurrentTab(FindEmbed(.CurrentPage, List(ListIndex) & "Tab"))
  33.         .EditFocus(.CurrentPage)
  34.       End With ' PropertySheetEditor
  35.     End Sub
  36.  
  37.     Sub DropDown()
  38.       If Parent.CurrentPage Then 
  39.         Dim i as integer
  40.         Dim s As String
  41.         Clear
  42.         With Parent.CurrentPage.TabGroup
  43.           For i = .Count - 1 To 0 Step -1
  44.             s = .ObjectAt(i).sheet.Name
  45.             If s <> "" Then AddItem(s)
  46.           Next i
  47.         End With ' Parent.CurrentPage.TabGroup
  48.         If Parent.CurrentPage.CurrentTab && Parent.CurrentPage.CurrentTab.sheet.Name <> Text Then 
  49.           SupressClick = True
  50.           ListIndex = ItemIndex(Parent.CurrentPage.CurrentTab.sheet.Name)
  51.         End If
  52.       Else 
  53.         Clear
  54.       End If
  55.     End Sub
  56.  
  57.   End Type
  58.  
  59.   ' METHODS for object: PropertySheetEditor
  60.   Sub AddSheetGadget_Click()
  61.     Try
  62.       Dim nm as String
  63.       nm = GetNewSheetName()
  64.       If nm = "" Then Exit Sub
  65.       ' Create a new sheet
  66.       CurrentPage.NewSheet(nm, nm)
  67.       EditFocus(CurrentPage)
  68.     Catch DuplicateSheet
  69.       InfoBox.Message("Duplicate Sheet", "Sheet '" & nm & "' already in '" & CurrentPage & "'.")
  70.     End Try
  71.   
  72.   End Sub
  73.  
  74.   Function AddSheetGadget_Enable() As Integer
  75.     If CurrentPage Then 
  76.       AddSheetGadget_Enable = True
  77.     Else 
  78.       AddSheetGadget_Enable = False
  79.     End If
  80.   End Function
  81.  
  82.   Sub ConfigureSheetGadget_Click()
  83.     Dim newname, OldName As String
  84.     Dim Result As Long
  85.     Dim NewColumn, OrigionalColumn As Integer
  86.     Dim ptw, pth As Integer
  87.   
  88.     ' Initialize textboxes
  89.     With PropertySheetMaster.ConfigForm
  90.       .LoadForm ' Load the form so textboxes may be set.
  91.       ' This is always called on the current tab, which is always foward
  92.       OrigionalColumn = CurrentPage.TabGroup.ObjectIndex(CurrentPage.CurrentTab) + 1
  93.       .txtNewPosition.Text = Str$(OrigionalColumn)
  94.       OldName = CurrentPage.CurrentTab.sheet.Name
  95.       .txtSheetName.Text = OldName
  96.       .ShowModal
  97.     End With ' PropertySheetMaster.ConfigForm
  98.     Result = PropertySheetMaster.ConfigForm.ReturnID
  99.   
  100.     If Result <> IDOK Then 
  101.       Exit Sub
  102.     Else 
  103.       With PropertySheetMaster.ConfigForm
  104.         NewColumn = Val(.txtNewPosition.Text) - 1 ' convert to array notation
  105.         OrigionalColumn = OrigionalColumn - 1 ' convert to array notation
  106.         newname = .txtSheetName.Text
  107.         If newname <> "" && newname <> CurrentPage.CurrentTab.sheet.Name Then 
  108.           CurrentPage.CurrentTab.Name = newname & "Tab"
  109.           CurrentPage.CurrentTab.Caption = newname
  110.           CurrentPage.CurrentTab.sheet.Name = newname
  111.         End If
  112.       End With ' PropertySheetMaster.ConfigForm
  113.       ' If a position textbox was left empty, don't try to swap tabs
  114.       If NewColumn <> -1 && NewColumn <> OrigionalColumn Then 
  115.         CurrentPage.SwapTabs(NewColumn, OrigionalColumn)
  116.       End If
  117.       If newname <> "" && newname <> OldName Then 
  118.         With CurrentPage.CurrentTab
  119.           .GetTextExtent(.hDC, .Caption, ptw, pth)
  120.           .Move(CurrentPage.TabGroup.RightEdge, .sheet.Top - (.Height - 30), ptw + 180, .Height)
  121.           CurrentPage.TabGroup.AdjustTabPositions
  122.         End With ' CurrentPage.CurrentTab
  123.       End If
  124.     End If
  125.   End Sub
  126.  
  127.   Function ConfigureSheetGadget_Enable() As Integer
  128.     If CurrentPage && CurrentPage.CurrentTab Then 
  129.       ConfigureSheetGadget_Enable = True
  130.     Else 
  131.       ConfigureSheetGadget_Enable = False
  132.     End If
  133.   End Function
  134.  
  135.   Sub DeleteSheetGadget_Click()
  136.     ' Remove sheet and reset CurrentTab
  137.     CurrentPage.RemoveSheet()
  138.     EditFocus(CurrentPage)
  139.   End Sub
  140.  
  141.   Function DeleteSheetGadget_Enable() As Integer
  142.     Dim s As String
  143.     Dim ReturnValue As Integer
  144.   
  145.     If CurrentPage = Nothing Then 
  146.       ReturnValue = 0
  147.     Else 
  148.       If Not CurrentPage.CurrentTab Then 
  149.         ReturnValue = 0
  150.       Else 
  151.         ReturnValue = -1
  152.       End If
  153.     End If
  154.   
  155.     If ReturnValue Then 
  156.       s = CurrentPage.CurrentTab.sheet.Name
  157.       With CmbSheetViewer
  158.         If .ItemIndex(s) = -1 Then .AddItem(s)
  159.         If .Text <> s Then .ListIndex = .ItemIndex(s)
  160.       End With ' CmbSheetViewer
  161.       s = "Editing: " & CurrentPage
  162.       If StrComp(Caption, s) <> 0 Then Caption = s
  163.     Else 
  164.       s = "Editing: " & CurrentPage
  165.       If StrComp(Caption, s) <> 0 Then 
  166.         If CurrentPage Then Caption = s
  167.       End If
  168.     End If
  169.   
  170.     If Not CurrentPage || Not CurrentPage.CurrentTab Then CmbSheetViewer.Clear
  171.     If Not CurrentPage && StrComp(Caption, "Editing: ") <> 0 Then Caption = "Editing: "
  172.   
  173.     ' Editor shouldn't continue to edit a hidden page.
  174.     ' NOTE: there is no way to re-edit a page that has no sheets.
  175.     If CurrentPage && Not CurrentPage.Visible Then EditFocus(Nothing)
  176.     DeleteSheetGadget_Enable = ReturnValue
  177.   End Function
  178.  
  179.   Function EditFocus(page As PropertySheetMaster.Page) As Boolean
  180.   
  181.     ' default to false.
  182.     EditFocus = False
  183.   
  184.     ' If no page set editor to nothing
  185.     If Not page Then 
  186.       CurrentPage = Nothing
  187.     Else 
  188.       ' set CurrentPage to given page.
  189.       CurrentPage = page
  190.     End If
  191.   
  192.     If FindObject("FormEditor") && CurrentPage && CurrentPage.CurrentTab Then 
  193.       If FormEditor.CurForm <> CurrentPage.CurrentTab.sheet Then FormEditor.CurForm = CurrentPage.CurrentTab.sheet
  194.     End If
  195.   
  196.     PropertySheetEditor.Show
  197.     PropertySheetEditor.BringToTop
  198.   
  199.     EditFocus = True
  200.   End Function
  201.  
  202.   Function GetNewSheetName() As String
  203.     Dim indlg As New InputDialog
  204.     Dim title, instructions, defaultanswer As String
  205.     Dim tempstr As String
  206.     Dim endDigit, i As Integer
  207.   
  208.     title = "Name Sheet"
  209.     instructions = "Enter a name for the sheet"
  210.     defaultanswer = UniqueEmbedName(CurrentPage, "Sheet")
  211.   
  212.     indlg.Execute(title, instructions, defaultanswer)
  213.     ' Proceed only if OK was clicked, the answer is a valid string,
  214.     ' and the object does not already exist.
  215.     If (indlg.Response = IDOK) && ValidName(indlg.Text) && (Not FindEmbed(CurrentPage, indlg.Text)) Then 
  216.       GetNewSheetName = indlg.Text
  217.     End If
  218.   End Function
  219.  
  220.   Sub Load()
  221.     ObToolBar.AutoEnabler = True
  222.   End Sub
  223.  
  224.   Function MoveLeftGadget_Click() As Integer
  225.     CurrentPage.MoveLeft
  226.   End Function
  227.  
  228.   Function MoveLeftGadget_Enable() As Integer
  229.     If CurrentPage && CurrentPage.CurrentTab Then 
  230.       If CurrentPage.CurrentTab <> CurrentPage.TabGroup(0) Then 
  231.         If CurrentPage.TabGroup.Count > 1 Then 
  232.           MoveLeftGadget_Enable = True
  233.         End If
  234.       End If
  235.     Else 
  236.       MoveLeftGadget_Enable = False
  237.     End If
  238.   End Function
  239.  
  240.   Function MoveRightGadget_Click() As Integer
  241.     CurrentPage.MoveRight
  242.   End Function
  243.  
  244.   Function MoveRightGadget_Enable() As Integer
  245.     If CurrentPage && CurrentPage.CurrentTab Then 
  246.       With CurrentPage.TabGroup
  247.         If .Count > 1 Then 
  248.           If CurrentPage.CurrentTab <> .ObjectAt(.Count - 1) Then 
  249.             MoveRightGadget_Enable = True
  250.           End If
  251.         End If
  252.       End With ' CurrentPage.TabGroup
  253.     Else 
  254.       MoveRightGadget_Enable = False
  255.     End If
  256.   End Function
  257.  
  258.   Function NeedToHide() As Boolean
  259.     Dim i, NumberVisible As Integer
  260.   
  261.     NumberVisible = 0
  262.     With CurrentPage.TabGroup
  263.       ' count the number of visible sheets in the group
  264.       For i = 0 To .Count - 1
  265.         If .ObjectAt(i).sheet.Visible Then NumberVisible = NumberVisible + 1
  266.       Next i
  267.     End With ' CurrentPage.TabGroup
  268.   
  269.     If NumberVisible > 1 Then 
  270.       NeedToHide = True
  271.     Else 
  272.       NeedToHide = False
  273.     End If
  274.   End Function
  275.  
  276.   Sub NewPageGadget_Click()
  277.     Dim indlg As New InputDialog
  278.     Dim newname As String
  279.     Dim title, instructions, defaultanswer As String
  280.     Dim ExistingObject As Object
  281.   
  282.     title = "Create New Property Page"
  283.     instructions = "Enter a name for the new page:"
  284.     If CurrentPage && Left$(CurrentPage.Name, 4) <> "Page" Then 
  285.       defaultanswer = UniqueObjectName(CurrentPage)
  286.     Else 
  287.       defaultanswer = UniqueObjectName(PropertySheetMaster.Page)
  288.     End If
  289.   
  290.     indlg.Execute(title, instructions, defaultanswer)
  291.     newname = indlg.Text
  292.     ExistingObject = FindObject(newname)
  293.   
  294.     ' Inform the user that he has tried use the name of an existing object.
  295.     If ExistingObject Then 
  296.       If Not ExistingObject.Visible Then 
  297.         InfoBox.Message("Error creating new Property Page", "A hidden Property Page called " & newname & " already exists!")
  298.       Else 
  299.         InfoBox.Message("Error creating new Property Page", "A Property Page called " & newname & " already exists!")
  300.       End If
  301.       Exit Sub
  302.     End If
  303.   
  304.     If (indlg.Response = IDOK) && ValidName(newname) Then 
  305.       PropertySheetMaster.NewPage(newname, newname).Show
  306.       EditFocus(FindObject(newname))
  307.     End If
  308.   
  309.   End Sub
  310.  
  311.   Function NewPageGadget_Enable() As Integer
  312.     NewPageGadget_Enable = True
  313.   End Function
  314.  
  315.   Sub Resize()
  316.     Dim w, h as single
  317.     Dim tbw, mar as single
  318.     mar = 75
  319.     With ObToolBar
  320.       Dim desH As Single
  321.       desH = IIf(.Height > 400, .Height + 400, 800)
  322.       If Height <> desH Then 
  323.         Height = desH
  324.       End If
  325.       w = .Width : h = .Height
  326.     End With ' ObWith PropertySheetToolBar
  327.     ObToolBar.Move(0, 0, w, h)
  328.     tbw = IIf(ScaleWidth - w > 0, ScaleWidth - w - 2 * mar, 2 * mar)
  329.     CmbSheetViewer.Move(w + mar, mar, tbw, h - 2 * mar)
  330.   End Sub
  331.  
  332.   Sub ResizeGadget_Click()
  333.     If CurrentPage.BorderStyle <> "Sizable" Then 
  334.       CurrentPage.BorderStyle = "Sizable"
  335.     Else 
  336.       CurrentPage.BorderStyle = "Fixed Single"
  337.     End If
  338.   End Sub
  339.  
  340.   Function ResizeGadget_Enable() As Integer
  341.     If CurrentPage Then 
  342.       If CurrentPage.BorderStyle = "Sizable" Then 
  343.         ObToolBar.ResizeGadget.State = "Down"
  344.       Else 
  345.         ObToolBar.ResizeGadget.State = "Up"
  346.       End If
  347.     End If
  348.     ResizeGadget_Enable = (CurrentPage <> Nothing)
  349.   End Function
  350.  
  351.   Sub Setup()
  352.     If CurrentPage = Nothing Then EditFocus(Nothing)
  353.   End Sub
  354.  
  355.   Function TextUnload(ByVal indent As String, cmds As String) As Integer
  356.     TextUnload = False
  357.   End Function
  358.  
  359.   Sub ToggleEditorGadget_Click()
  360.     FormEditor.Editing = Not FormEditor.Editing
  361.   End Sub
  362.  
  363.   Function ToggleEditorGadget_Enable() As Integer
  364.     ObToolBar.ToggleEditorGadget.State = IIf(FormEditor.Editing, "Down", "Up")
  365.     ToggleEditorGadget_Enable = (TypeOf FormEditor.CurForm Is PropertySheetMaster.Sheet) && (CurrentPage <> Nothing)
  366.   End Function
  367.  
  368.   Function ValidName(ByVal namestr As String) As Boolean
  369.     Dim i, char As Integer
  370.   
  371.     ' Return False if empty string is entered.  Send no error message.
  372.     ' User may enter an empty string as a way to exit the dialog.
  373.     If namestr = "" Then 
  374.       ValidName = False
  375.       Exit Sub
  376.     End If
  377.   
  378.     char = Asc(Left$(namestr, 1))
  379.     If char >= 48 && char <= 57 Then 
  380.       InfoBox.Message("Invalid Name", """" & namestr & """ contains an illegal character!")
  381.       ValidName = False
  382.       Exit Function
  383.     End If
  384.   
  385.     For i = 1 To Len(namestr)
  386.       char = Asc(Mid$(namestr, i, 1))
  387.       If (char < 65 || char > 90) && (char < 97 || char > 122) Then 
  388.         If (char < 48 || char > 57) && (char <> 95) Then 
  389.           InfoBox.Message("Invalid Name", """" & namestr & """ contains an illegal character!")
  390.           ValidName = False
  391.           Exit Function
  392.         End If
  393.       End If
  394.     Next i
  395.     ValidName = True
  396.   End Function
  397.  
  398. End Type
  399.  
  400. Type PropertySheetMaster
  401.   Dim SheetFont As New Font
  402.   Type Page From Form
  403.     Property CurrentTab Get GetCurrentTab As PropertySheetMaster.Ptab
  404.     Dim Supress As Boolean
  405.     Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hFont As Long) As Long
  406.     Type TabGroup From Group
  407.  
  408.       ' METHODS for object: PropertySheetMaster.Page.TabGroup
  409.       Sub AdjustTabPositions()
  410.         Dim i As Integer
  411.         Dim ps As PropertySheetMaster.Sheet
  412.         Dim pt, prevtab As PropertySheetMaster.Ptab
  413.         Dim Edge As Single
  414.         Dim NewTop As SIngle
  415.       
  416.         ' No reason to adjust tabs if there are none
  417.         If Count = 0 Then Exit Sub
  418.       
  419.         ' Adjust tab tops
  420.         NewTop = Me(0).sheet.Top - (Me(0).Height - 30)
  421.       
  422.         ' Look at the CurrentGroup and adjust tabs accordingly
  423.         For i = 0 To Count - 1
  424.           pt = Me(i)
  425.           If i < 1 Then 
  426.             Edge = 150
  427.           Else 
  428.             prevtab = ObjectAt(i - 1)
  429.             Edge = prevtab.Left + prevtab.Width
  430.           End If
  431.           pt.Move Edge, NewTop, pt.Width, pt.Height
  432.         Next i
  433.       
  434.         pt = Me(0).page.CurrentTab
  435.         ' Supress refresh and toggle status of all controls
  436.         ' This makes pt current, all others non current
  437.         pt.SupressRefresh = True
  438.       
  439.         Me.ToggleStatus(pt)
  440.       
  441.         ' Unhide the current property sheet
  442.         pt.sheet.Show
  443.       
  444.         ' Hide all the non-current sheets
  445.         Me.HideNonCurrent
  446.       
  447.       End Sub
  448.  
  449.       Sub HideNonCurrent()
  450.         Dim i As Integer
  451.         For i = 0 To Count - 1
  452.           If Not Me(i).currenttab && Me(i).sheet.Visible Then Me(i).sheet.Hide
  453.         Next i
  454.       End Sub
  455.  
  456.       Function RightEdge() As Single
  457.         Dim ptab As PropertySheetMaster.Ptab
  458.       
  459.         If Count = 0 Then 
  460.           RightEdge = 150
  461.         Else 
  462.           ptab = ObjectAt(Count - 1)
  463.           RightEdge = ptab.Left + ptab.Width
  464.         End If
  465.       End Function
  466.  
  467.       Sub ToggleStatus(pt As PropertySheetMaster.Ptab)
  468.         Dim i As Integer
  469.         Dim o As PropertySheetMaster.Ptab
  470.       
  471.         For i = 0 To Count - 1
  472.           o = Me(i)
  473.           If o <> pt Then 
  474.             If o.currenttab = -1 Then 
  475.               ' Toggle the tab to off
  476.               o.currenttab = 0
  477.               o.TabFont.Bold = False
  478.               o.Refresh
  479.             End If
  480.           Else 
  481.             If o.currenttab = 0 Then 
  482.               o.currenttab = -1
  483.             End If
  484.             ' I always refresh myself if I'm clicked
  485.             If o.SupressRefresh Then 
  486.               o.SupressRefresh = False
  487.             Else 
  488.               o.TabFont.Bold = True
  489.               o.Refresh
  490.             End If
  491.           End If
  492.         Next i
  493.       End Sub
  494.  
  495.       Sub TrackSize(ByVal psleft, pstop, pswidth, psheight As Single)
  496.         Dim i, j As Integer
  497.         Dim pgroup As PropertySheetMaster.TabGroup
  498.       
  499.         If Count = 0 Then Exit Sub
  500.       
  501.         HostObject(Me).Supress = True
  502.         For i = 0 To Count - 1
  503.           Me(i).sheet.Move(psleft, pstop, pswidth, psheight)
  504.         Next i
  505.       
  506.         HostObject(Me).Supress = False
  507.       End Sub
  508.  
  509.     End Type
  510.  
  511.     ' METHODS for object: PropertySheetMaster.Page
  512.     Function DetailedEdit() As Boolean
  513.       DetailedEdit = False
  514.       Try
  515.         If FindObject("PropertySheetEditor") Then 
  516.           DetailedEdit = PropertySheetEditor.EditFocus(Me)
  517.         End If
  518.       Catch
  519.       End Try
  520.     End Function
  521.  
  522.     Function Edit() As Boolean
  523.       Try
  524.         Edit = PropertSheetEditor.EditFocus(Me)
  525.       Catch
  526.       End Try
  527.     
  528.     End Function
  529.  
  530.     Function GetCurrentTab() As PropertySheetMaster.Ptab
  531.       Dim hop As Integer
  532.       Dim pointer As object
  533.     
  534.       With TabGroup
  535.         For hop = 0 To .Count - 1
  536.           pointer = .ObjectAt(hop)
  537.           If pointer.currenttab Then 
  538.             GetCurrentTab = pointer
  539.             Exit Function
  540.           End If
  541.         Next hop
  542.       End With ' TabGroup
  543.     
  544.       GetCurrentTab = Nothing
  545.     End Function
  546.  
  547.     Function MoveLeft As Integer
  548.       ' use pos to hold position of Sheet to be made current after delete
  549.       Dim pos, newpos As Integer
  550.       Dim pt As PropertySheetMaster.Ptab
  551.     
  552.       With TabGroup
  553.         pos = .ObjectIndex(CurrentTab)
  554.         newpos = pos - 1
  555.         pt = .RemoveAt(pos)
  556.         .InsertAt(pt, newpos)
  557.         .AdjustTabPositions
  558.       End With ' TabGroup
  559.     End Function
  560.  
  561.     Function MoveRight As Integer
  562.       ' use pos to hold position of Sheet to be made current after delete
  563.       Dim pos, newpos As Integer
  564.       Dim pt As PropertySheetMaster.Ptab
  565.     
  566.       With TabGroup
  567.         pos = .ObjectIndex(CurrentTab)
  568.         newpos = pos + 1
  569.         pt = .RemoveAt(pos)
  570.         If newpos = .Count Then 
  571.           .Append(pt)
  572.         Else 
  573.           .InsertAt(pt, newpos)
  574.         End If
  575.         .AdjustTabPositions
  576.       End With ' TabGroup
  577.     
  578.     End Function
  579.  
  580.     Function NewSheet (name As String, title as String) As PropertySheetMaster.Sheet
  581.       Dim ptw, pth, i As Integer
  582.       Dim ps, prevsheet As PropertySheetMaster.Sheet
  583.       Dim pt As PropertySheetMaster.Ptab
  584.     
  585.       ' Verify that we don't already have sheet with this name
  586.       If FindEmbed(Me, name) Then Throw DuplicateSheet(name)
  587.     
  588.       ' Supress Resize event, otherwise all sheets will revert to
  589.       ' default size.
  590.       Supress = True
  591.     
  592.       ' Embed a property tab in the property page
  593.       pt = EmbedObject(Me, PropertySheetMaster.Ptab, name & "Tab")
  594.     
  595.       ' Move the property sheet Prototype into position
  596.       With PropertySheetMaster.Sheet
  597.         .Move(150, ScaleHeight - .Height - 150, .Width, .Height)
  598.       End With
  599.     
  600.       ' Embed a property sheet in the property page
  601.       ps = EmbedObject(Me, PropertySheetMaster.Sheet, name)
  602.     
  603.       ' Font bug work-around
  604.       pt.TabFont.FaceName = PropertySheetMaster.Ptab.TabFont.FaceName
  605.       pt.TabFont.Size = PropertySheetMaster.Ptab.TabFont.Size
  606.       pt.TabFont.Bold = PropertySheetMaster.Ptab.TabFont.Bold
  607.     
  608.       ' connect the font to the tab so tab can be sized to caption
  609.       SelectObject(pt.hDC, pt.TabFont.HFont)
  610.       pt.GetTextExtent(pt.hDC, title, ptw, pth)
  611.     
  612.       ' get the tab into position
  613.       pt.Move(TabGroup.RightEdge, ps.Top - (pt.Height - 30), ptw + 180, pt.Height)
  614.     
  615.       ' Connect pointer in the sheet to its tab
  616.       ps.ptab = pt
  617.       ' Save away the name of the sheet in the property sheets caption
  618.       ps.Caption = title
  619.     
  620.       ' Let the property tab connect to the property page. Send it the
  621.       ' sheet so it can set its sheet reference
  622.       pt.ConnectToPage(Me, ps)
  623.     
  624.       ' Hide the existing sheets if there are any
  625.       If TabGroup.Count > 1 Then 
  626.         prevsheet = TabGroup(TabGroup.Count - 2).sheet
  627.         With prevsheet
  628.           ps.Move(.Left, .Top, .Width, .Height)
  629.         End With ' prevsheet
  630.         TabGroup.HideNonCurrent
  631.       End If
  632.     
  633.       ' Unsupress the Resize Event
  634.       Supress = False
  635.     
  636.       ' Set the CurrentTab
  637.       SetCurrentTab(pt)
  638.     
  639.       ' Return the new property sheet
  640.       NewSheet = ps
  641.     End Function
  642.  
  643.     Sub RemoveSheet()
  644.       ' use pos to hold position of Sheet to be made current after delete
  645.       Dim pos As Integer
  646.       Dim oldpt, newpt As PropertySheetMaster.Ptab
  647.     
  648.       ' FInd the new CurrentTab
  649.       With TabGroup
  650.         ' look through the sheets to find our current one or bail
  651.         pos = .ObjectIndex(CurrentTab)
  652.         If pos = -1 Then Exit Sub
  653.         If pos = 0 Then 
  654.           newpt = IIf(.Count <> 1, .ObjectAt(pos + 1), Nothing)
  655.         Else 
  656.           newpt = .ObjectAt(pos - 1)
  657.         End If
  658.       End With ' TabGroup
  659.     
  660.       ' Remove this tab from the group
  661.       oldpt = TabGroup.RemoveAt(pos)
  662.     
  663.       ' Destroy the tab's sheet
  664.       DestroyObject(oldpt.sheet)
  665.     
  666.       ' Destroy the tab
  667.       DestroyObject(oldpt)
  668.     
  669.     
  670.       If TabGroup.Count > 0 Then 
  671.         SetCurrentTab(IIf(newpt, newpt, Nothing))
  672.       Else 
  673.         SetCurrentTab(Nothing)
  674.       End If
  675.     
  676.       ' Update the tab positions if more than one tab
  677.       If TabGroup.Count > 1 Then TabGroup.AdjustTabPositions
  678.     End Sub
  679.  
  680.     Sub Resize()
  681.       Dim i As Integer
  682.     
  683.       For i = 0 To TabGroup.Count - 1
  684.         With TabGroup(i).sheet
  685.           .Move(.Left, ScaleHeight - .Height - 150, .Width, .Height)
  686.         End With ' TabGroup(i).sheet
  687.       Next i
  688.       TabGroup.AdjustTabPositions
  689.     End Sub
  690.  
  691.     Sub SetCurrentTab(o As PropertySheetMaster.Ptab)
  692.     
  693.       If o = CurrentTab Then Exit Sub
  694.       If o && TypeOf o Is PropertySheetMaster.Ptab Then 
  695.         SendEvent o.Click
  696.       End If
  697.     End Sub
  698.  
  699.     Sub SwapTabs(NewColumn As Integer, OldColumn As Integer)
  700.       ' This method is on Page because it is much easier to work with
  701.       ' the required references here.
  702.       Dim temp1, temp2 As PropertySheetMaster.Ptab
  703.     
  704.       ' Make sure Column and Row contain acceptable values
  705.       ValidatePosition(NewColumn)
  706.     
  707.       ' Correct for change in position caused by removal of old tab
  708.       If NewColumn > OldColumn Then NewColumn = NewColumn - 1
  709.     
  710.       ' remove the current tab and hang on to it
  711.       temp1 = TabGroup.RemoveAt(OldColumn)
  712.       ' remove the tab being replaced and hang on to it.
  713.       temp2 = TabGroup.RemoveAt(NewColumn)
  714.     
  715.       ' Put the current tab in it's new spot
  716.       TabGroup.InsertAt(temp1, NewColumn)
  717.     
  718.       ' put the old tab in the spot left empty by the current tab
  719.       TabGroup.InsertAt(temp2, OldColumn)
  720.     
  721.       TabGroup.AdjustTabPositions ' repaint tabs
  722.       SetCurrentTab(temp2)
  723.     End Sub
  724.  
  725.     Sub UpdateDisplay (pt As PropertySheetMaster.Ptab)
  726.       ' Display the propertysheet
  727.       pt.sheet.Show
  728.     
  729.       ' Bring the propertysheet to the top of the pile.
  730.       ' This is a bug work-around
  731.       pt.sheet.BringToTop
  732.       pt.ZOrder = 1
  733.     
  734.       ' Hide all the sheets
  735.       TabGroup.HideNonCurrent
  736.     End Sub
  737.  
  738.     Sub ValidatePosition(c As Integer)
  739.       If c < 0 Then 
  740.         c = 0
  741.       ElseIf c > TabGroup.Count - 1 Then 
  742.         c = TabGroup.Count - 1
  743.       End If
  744.     End Sub
  745.  
  746.   End Type
  747.   Type Sheet From Form
  748.     Dim ptab As PropertySheetMaster.Ptab
  749.     Event OK(ok as Boolean)
  750.     Event Cancel(ok as Boolean)
  751.  
  752.     ' METHODS for object: PropertySheetMaster.Sheet
  753.     Sub Destruct()
  754.       ' If the sheet has a tab, remove the tab's sheet reference and
  755.       ' destroy the tab.
  756.       If ptab <> Nothing Then 
  757.         ptab.sheet = Nothing
  758.         DestroyObject(ptab)
  759.       End If
  760.     
  761.       Parent.TabGroup.AdjustTabPositions
  762.     End Sub
  763.  
  764.     Function DetailedEdit() As Boolean
  765.       DetailedEdit = False
  766.       Try
  767.         If Parent Then 
  768.           Parent.SetCurrentTab(Me.ptab)
  769.           If FindObject("PropertySheetEditor") Then 
  770.             DetailedEdit = PropertySheetEditor.EditFocus(Parent)
  771.           End If
  772.         End If
  773.       Catch
  774.       End Try
  775.     End Function
  776.  
  777.     Sub Resize()
  778.       If Parent.Supress Then Exit Sub
  779.     
  780.       Parent.TabGroup.TrackSize(Left, Top, Width, Height)
  781.       Parent.TabGroup.AdjustTabPositions
  782.     End Sub
  783.  
  784.   End Type
  785.   Type Ptab From PictureBox
  786.     Declare Function GetTabbedTextExtent Lib "User32.dll" Alias "GetTabbedTextExtentA" (ByVal hdc As Long, ByVal lpsz As String, ByVal cchString As Long, ByVal nTabPos As Long, ByVal lpnTabStopPos As Long) As Long
  787.     Dim SupressRefresh As Boolean
  788.     Dim page As PropertySheetMaster.Page
  789.     Dim sheet As PropertySheetMaster.Sheet
  790.     Dim currenttab As Integer
  791.     Dim TabFont As New Font
  792.  
  793.     ' METHODS for object: PropertySheetMaster.Ptab
  794.     Sub Click()
  795.     
  796.       ' If my tab is already forward, do nothing
  797.       If currenttab = -1 Then Exit Sub
  798.     
  799.       ' Tell other tabs to turn themselves off
  800.       Parent.TabGroup.ToggleStatus(Me)
  801.       Parent.UpdateDisplay(Me)
  802.     End Sub
  803.  
  804.     Sub ConnectToPage (pp as PropertySheetMaster.Page, ps As PropertySheetMaster.Sheet)
  805.     
  806.       ' connect the tab to its sheet
  807.       sheet = ps
  808.     
  809.       ' connect the tab to the page
  810.       page = pp
  811.     
  812.       ' Append us to the end of the group of tabs
  813.       page.TabGroup.Append(Me)
  814.     
  815.       ' Set the name of the tab caption
  816.       Caption = ps.Caption
  817.     End Sub
  818.  
  819.     Sub Destruct()
  820.     
  821.       Parent.TabGroup.RemoveObject(Me)
  822.     
  823.       ' If the tab has a sheet, remove the sheet's tab reference and
  824.       ' destroy the sheet.
  825.       If sheet <> Nothing Then 
  826.         sheet.ptab = Nothing
  827.         DestroyObject(sheet)
  828.       End If
  829.     
  830.       ' If we're embeded in a page, reset it's current tab
  831.       If page Then 
  832.         Dim newpt As PropertySheetMaster.Ptab
  833.         newpt = IIf(page.TabGroup(0), page.TabGroup(0), Nothing)
  834.         If newpt Then page.SetCurrentTab(newpt)
  835.       End If
  836.     
  837.       Parent.TabGroup.AdjustTabPositions
  838.     End Sub
  839.  
  840.     Function DetailedEdit() As Boolean
  841.       DetailedEdit = False
  842.       Try
  843.         If Parent Then 
  844.           Parent.SetCurrentTab(Me)
  845.           If FindObject("PropertySheetEditor") Then 
  846.             DetailedEdit = PropertySheetEditor.EditFocus(Parent)
  847.           End If
  848.         End If
  849.       Catch
  850.       End Try
  851.     End Function
  852.  
  853.     Sub DisconnectFromPage()
  854.       ' If we don't have a propertypage, our caller made a mistake
  855.       If Not page Then Throw TabNotConnected
  856.     
  857.       ' Remove us from the group of sheets in our parent
  858.       page.TabGroup.RemoveObject(Me)
  859.     End Sub
  860.  
  861.     Sub GetTextExtent(dc As Long, s As String, width, height as Integer)
  862.       dim result as long
  863.     
  864.       result = GetTabbedTextExtent(dc, s, Len(s), 0, 0)
  865.       ' The results are stored in the upper word and lower word of return value as pixels,
  866.       ' convert these numbers to twips before returning.
  867.       width = (result And &Hffff) * Screen.TwipsPerPixelX
  868.       height = ((result And &Hffff0000) / &H10000) * Screen.TwipsPerPixelY
  869.     End Sub
  870.  
  871.     Sub Paint()
  872.       Static line1x(10), line1y(10) As Single
  873.       Static line2x(10), line2y(10) As Single
  874.       Static line3x(10), line3y(10) As Single
  875.       Static line4x(10), line4y(10) As Single
  876.       Static line5x(10), line5y(10) As Single
  877.       Static line6x(10), line6y(10) As Single
  878.       Static line7x(10), line7y(10) As Single
  879.       Static line8x(10), line8y(10) As Single
  880.       Dim chamfer, crnr, inwidth As Single
  881.       Dim width, height, offset, soffset As Single
  882.     
  883.       chamfer = Height * 0.1
  884.       offset = 20
  885.       soffset = 1
  886.       width = Width - 1
  887.       height = Height - 1
  888.       crnr = chamfer + soffset
  889.       inwidth = width - chamfer - soffset
  890.       line1x(0) = soffset : line1y(0) = height
  891.       line1x(1) = soffset : line1y(1) = crnr
  892.       line1x(2) = crnr : line1y(2) = soffset
  893.       line1x(3) = inwidth : line1y(3) = soffset
  894.       line1x(4) = width : line1y(4) = crnr
  895.       line1x(5) = width : line1y(5) = height + 15
  896.     
  897.       line2x(0) = offset : line2y(0) = height
  898.       line2x(1) = offset : line2y(1) = chamfer + offset
  899.       line2x(2) = chamfer + offset : line2y(2) = offset
  900.       line2x(3) = width - chamfer - offset : line2y(3) = offset
  901.     
  902.       line3x(0) = width - chamfer - offset : line3y(0) = offset
  903.       line3x(1) = width - offset : line3y(1) = crnr
  904.       line3x(2) = width - offset : line3y(2) = height - offset + 30
  905.     
  906.       ' Draw the Black tab border
  907.       DrawColor = 0
  908.       Polyline(line1x, line1y, 6)
  909.       ' Draw the inner White tab border
  910.       DrawColor = RGB(255, 255, 255)
  911.       Polyline(line2x, line2y, 4)
  912.       ' Draw the inner Gray tab border
  913.       DrawColor = RGB(128, 128, 128)
  914.       Polyline(line3x, line3y, 3)
  915.     
  916.       ' If there is a caption, display it
  917.       If Caption <> "" Then 
  918.         Dim tw, th As Integer
  919.         DrawColor = ForeColor
  920.         page.SelectObject(hDC, Font.HFont)
  921.         GetTextExtent(hDC, Caption, tw, th)
  922.         MoveTo((Width - tw) / 2, (Height - th) / 2)
  923.         Print (Caption)
  924.       End If
  925.     End Sub
  926.  
  927.   End Type
  928.   Type ConfigForm From Form
  929.     Dim lblName As New Label
  930.     Dim lblPosition As New Label
  931.     Dim txtSheetName As New TextBox
  932.     Dim txtNewPosition As New TextBox
  933.     Dim btnOk As New Button
  934.     Dim btnCancel As New Button
  935.     Dim ReturnID As Long
  936.     Dim TextBoxFont As New Font
  937.  
  938.     ' METHODS for object: PropertySheetMaster.ConfigForm
  939.     Sub btnCancel_Click()
  940.       Hide
  941.       ReturnID = IDCANCEL
  942.     End Sub
  943.  
  944.     Sub btnOk_Click()
  945.       Hide
  946.       ReturnID = IDOK
  947.     End Sub
  948.  
  949.     Sub txtNewColumn_KeyPress(keyAscii As Integer)
  950.       ' accept Backspace and Enter keys
  951.       If keyAscii = 8 || keyAscii = 10 Then Exit Sub
  952.       ' Don't accept any other keys other than 0 - 9
  953.       If keyAscii < 48 || keyAscii > 57 Then keyAscii = 0
  954.     End Sub
  955.  
  956.     Sub txtNewPosition_KeyPress(keyAscii As Integer)
  957.       ' accept Backspace and Enter keys
  958.       If keyAscii = 8 || keyAscii = 10 Then Exit Sub
  959.       ' Don't accept any other keys other than 0 - 9
  960.       If keyAscii < 48 || keyAscii > 57 Then keyAscii = 0
  961.     End Sub
  962.  
  963.     Sub txtSheetName_KeyPress(keyAscii As Integer)
  964.       ' accept Backspace and Enter keys
  965.       If keyAscii = 8 || keyAscii = 10 Then Exit Sub
  966.       ' accept A-Z, a-z, 0-9, and _
  967.       If (keyAscii < 65 || keyAscii > 90) && (keyAscii < 97 || keyAscii > 122) Then 
  968.         If (keyAscii < 48 || keyAscii > 57) && (keyAscii <> 95) Then 
  969.           keyAscii = 0
  970.         End If
  971.       End If
  972.     End Sub
  973.  
  974.   End Type
  975.  
  976.   ' METHODS for object: PropertySheetMaster
  977.   Function NewPage(name As String, title As String) As PropertySheetMaster.Page
  978.     Dim p As PropertySheetMaster.Page
  979.   
  980.     ' Verify that the name is open
  981.     If (FindObject(name)) Then Throw DuplicatePage(name)
  982.   
  983.     ' Create a top level object with the given name as a kind of property page
  984.     p = CopyObject(Page, name)
  985.   
  986.     ' Set the property pages title
  987.     p.Caption = title
  988.   
  989.     ' Set the CurrentTab to Nothing
  990.     p.SetCurrentTab(Nothing)
  991.   
  992.     ' Return the new property page
  993.     NewPage = p
  994.   
  995.   End Function
  996.  
  997. End Type
  998.  
  999. Begin Code
  1000. ' Reconstruction commands for object: PropertySheetEditor
  1001. '
  1002.   With PropertySheetEditor
  1003.     .Caption := "Editing: "
  1004.     .Move(8940, 6840, 5265, 850)
  1005.     With .ObToolBar
  1006.       .ZOrder := 1
  1007.       .Move(0, 0, 3300, 450)
  1008.       .LayoutStyle := "ToolBar"
  1009.       .Visible := True
  1010.       With .AddSheetGadget
  1011.         .Enabled := False
  1012.         .Position := 2
  1013.         .HintText := "Add a New Property Sheet"
  1014.         With .bitmap
  1015.           .FileName := "pseditor.ero"
  1016.           .ResId := 0
  1017.         End With  'PropertySheetEditor.ObToolBar.AddSheetGadget.bitmap
  1018.       End With  'PropertySheetEditor.ObToolBar.AddSheetGadget
  1019.       With .DeleteSheetGadget
  1020.         .Enabled := False
  1021.         .Position := 3
  1022.         .HintText := "Delete a Property Sheet"
  1023.         With .bitmap
  1024.           .FileName := "pseditor.ero"
  1025.           .ResId := 392
  1026.         End With  'PropertySheetEditor.ObToolBar.DeleteSheetGadget.bitmap
  1027.       End With  'PropertySheetEditor.ObToolBar.DeleteSheetGadget
  1028.       With .MoveLeftGadget
  1029.         .Enabled := False
  1030.         .Position := 5
  1031.         .HintText := "Move Selected Sheet Left"
  1032.         With .bitmap
  1033.           .FileName := "pseditor.ero"
  1034.           .ResId := 784
  1035.         End With  'PropertySheetEditor.ObToolBar.MoveLeftGadget.bitmap
  1036.       End With  'PropertySheetEditor.ObToolBar.MoveLeftGadget
  1037.       With .MoveRightGadget
  1038.         .Enabled := False
  1039.         .Position := 6
  1040.         .HintText := "Move Selected Sheet Right"
  1041.         With .bitmap
  1042.           .FileName := "pseditor.ero"
  1043.           .ResId := 1176
  1044.         End With  'PropertySheetEditor.ObToolBar.MoveRightGadget.bitmap
  1045.       End With  'PropertySheetEditor.ObToolBar.MoveRightGadget
  1046.       With .ToggleEditorGadget
  1047.         .Enabled := False
  1048.         .Position := 7
  1049.         .ButtonType := "NonExclusive"
  1050.         .HintText := "Toggle Property Sheet Editor On/Off"
  1051.         With .bitmap
  1052.           .FileName := "pseditor.ero"
  1053.           .ResId := 1568
  1054.         End With  'PropertySheetEditor.ObToolBar.ToggleEditorGadget.bitmap
  1055.       End With  'PropertySheetEditor.ObToolBar.ToggleEditorGadget
  1056.       With .NewPageGadget
  1057.         .Position := 1
  1058.         .HintText := "Create A New Property Page"
  1059.         With .bitmap
  1060.           .FileName := "pseditor.ero"
  1061.           .ResId := 1960
  1062.         End With  'PropertySheetEditor.ObToolBar.NewPageGadget.bitmap
  1063.       End With  'PropertySheetEditor.ObToolBar.NewPageGadget
  1064.       With .ConfigureSheetGadget
  1065.         .Enabled := False
  1066.         .Position := 4
  1067.         .HintText := "Configure Current Sheet"
  1068.         With .bitmap
  1069.           .FileName := "pseditor.ero"
  1070.           .ResId := 2352
  1071.         End With  'PropertySheetEditor.ObToolBar.ConfigureSheetGadget.bitmap
  1072.       End With  'PropertySheetEditor.ObToolBar.ConfigureSheetGadget
  1073.       With .ResizeGadget
  1074.         .Enabled := False
  1075.         .Position := 8
  1076.         .State := "Down"
  1077.         .ButtonType := "NonExclusive"
  1078.         .HintText := "Toggle Page Resize On/Off"
  1079.         With .bitmap
  1080.           .FileName := "pseditor.ero"
  1081.           .ResId := 2744
  1082.         End With  'PropertySheetEditor.ObToolBar.ResizeGadget.bitmap
  1083.       End With  'PropertySheetEditor.ObToolBar.ResizeGadget
  1084.     End With  'PropertySheetEditor.ObToolBar
  1085.     With .CmbSheetViewer
  1086.       .ZOrder := 2
  1087.       .Move(3375, 75, 1695, 360)
  1088.       .Style := "DropdownList"
  1089.       .SupressClick := False
  1090.     End With  'PropertySheetEditor.CmbSheetViewer
  1091.   End With  'PropertySheetEditor
  1092. ' Reconstruction commands for object: PropertySheetMaster
  1093. '
  1094.   With PropertySheetMaster
  1095.     With .SheetFont
  1096.       .FaceName := "MS Sans Serif"
  1097.       .Size := 8.000000
  1098.       .Bold := True
  1099.       .Italic := False
  1100.       .Strikethru := False
  1101.     End With  'PropertySheetMaster.SheetFont
  1102.     With .Page
  1103.       .Move(3210, 1260, 8610, 5790)
  1104.       .MaxButton := False
  1105.       .MinButton := False
  1106.       .Supress := False
  1107.       With .TabGroup
  1108.       End With  'PropertySheetMaster.Page.TabGroup
  1109.     End With  'PropertySheetMaster.Page
  1110.     With .Sheet
  1111.       .Font := PropertySheetMaster.SheetFont
  1112.       .Move(150, 1500, 7200, 3735)
  1113.       .BevelInner := "Raised"
  1114.       .BevelOuter := "Line"
  1115.       .BevelWidth := 1
  1116.       .ptab := Nothing
  1117.     End With  'PropertySheetMaster.Sheet
  1118.     With .Ptab
  1119.       .ForeColor := 3289650
  1120.       .Font := PropertySheetMaster.Ptab.TabFont
  1121.       .Move(4170, 900, 1800, 345)
  1122.       .DrawColor := 8421504
  1123.       .SupressRefresh := False
  1124.       .page := Nothing
  1125.       .sheet := Nothing
  1126.       .currenttab := 0
  1127.       With .TabFont
  1128.         .FaceName := "MS Sans Serif"
  1129.         .Size := 9.000000
  1130.         .Bold := False
  1131.         .Italic := False
  1132.         .Strikethru := False
  1133.       End With  'PropertySheetMaster.Ptab.TabFont
  1134.     End With  'PropertySheetMaster.Ptab
  1135.     With .ConfigForm
  1136.       .Caption := "Configure Sheet"
  1137.       .Move(6855, 3540, 2805, 2220)
  1138.       .DefaultButton := PropertySheetMaster.ConfigForm.btnOk
  1139.       .ReturnID := 1
  1140.       With .lblName
  1141.         .Caption := "Name:"
  1142.         .ZOrder := 1
  1143.         .Move(150, 675, 900, 300)
  1144.       End With  'PropertySheetMaster.ConfigForm.lblName
  1145.       With .lblPosition
  1146.         .Caption := "Position:"
  1147.         .ZOrder := 2
  1148.         .Move(150, 150, 900, 300)
  1149.       End With  'PropertySheetMaster.ConfigForm.lblPosition
  1150.       With .txtSheetName
  1151.         .Font := PropertySheetMaster.ConfigForm.TextBoxFont
  1152.         .ZOrder := 3
  1153.         .Move(1050, 675, 1425, 300)
  1154.       End With  'PropertySheetMaster.ConfigForm.txtSheetName
  1155.       With .txtNewPosition
  1156.         .Font := PropertySheetMaster.ConfigForm.TextBoxFont
  1157.         .ZOrder := 4
  1158.         .Move(1050, 150, 375, 300)
  1159.       End With  'PropertySheetMaster.ConfigForm.txtNewPosition
  1160.       With .btnOk
  1161.         .Caption := "Ok"
  1162.         .ZOrder := 5
  1163.         .Move(150, 1200, 1050, 450)
  1164.       End With  'PropertySheetMaster.ConfigForm.btnOk
  1165.       With .btnCancel
  1166.         .Caption := "Cancel"
  1167.         .ZOrder := 6
  1168.         .Move(1500, 1200, 975, 450)
  1169.       End With  'PropertySheetMaster.ConfigForm.btnCancel
  1170.       With .TextBoxFont
  1171.         .FaceName := "MS Sans Serif"
  1172.         .Size := 9.000000
  1173.         .Bold := True
  1174.         .Italic := False
  1175.         .Strikethru := False
  1176.       End With  'PropertySheetMaster.ConfigForm.TextBoxFont
  1177.     End With  'PropertySheetMaster.ConfigForm
  1178.   End With  'PropertySheetMaster
  1179. End Code
  1180.