home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / database / pk4pak.zip / HELPMAN.SC < prev    next >
Text File  |  1993-03-12  |  46KB  |  1,480 lines

  1. ;==============================================================================
  2. ; (c) Copyright Elect Software International Inc., 1992, Toronto. Anyone can
  3. ; use this code for anything as long as it is not resold as a software
  4. ; development resource, as long as the copyright notice isn't removed, as
  5. ; long as changes are clearly marked as to authorship, and as long as users
  6. ; indemnify Elect from any liability.
  7. ; Comments welcome. Henrik Bechmann, CIS:72701,3717; Tel:416-534-8176.
  8. ;==============================================================================
  9.  
  10. ;==============================================================================
  11. ;                             HELPMAN INTERFACE
  12. ;==============================================================================
  13.  
  14. ; Methods:
  15. ; HelpMan.Constructor()
  16. ; HelpMan.Interact()
  17. ; HelpMan.Destructor()
  18.  
  19. ; Properties:
  20. ; HelpMan.FormColorBag[]
  21. ; HelpPanel.ColorBag[]
  22.  
  23. ;==============================================================================
  24. ;                           HELPMAN IMPLEMENTATION
  25. ;==============================================================================
  26.  
  27. Proc HelpMan.Constructor()
  28.    EventMan.Constructor()
  29.    EventMan.SetObjectTagProc = "EventMan.SetIndexedObjectTag"
  30.  
  31.    HelpMan.Directory = "Generic\\helpman\\data\\"
  32.    HelpMan.CodeDirectory = "Generic\\helpman\\source\\"
  33.    HelpMan.HelpTabName = "help"
  34.    HelpMan.HelpListTabName = "helplist"
  35.    HelpMan.HelpSpecTabName = "helpspec"
  36.  
  37.    Dynarray HelpMan.FormColorBag[]
  38.    HelpMan.FormColorBag[0] = 8 + 112
  39.    HelpMan.FormColorBag[1] = 8 + 112
  40.    HelpMan.FormColorBag[2] = 8 + 112
  41.    HelpMan.FormColorBag[3] = 8 + 112
  42.    HelpMan.FormColorBag[4] = 8 + 112
  43.  
  44.    HelpMan_WasListForm = True
  45.  
  46.    HyperMemo.Constructor()
  47.    HelpTable.Constructor()
  48.    ListTable.Constructor()
  49.    ListForm.Constructor()
  50.    SpecTable.Constructor()
  51.    SpecForm.Constructor()
  52.    HelpPanel.Constructor()
  53.    HelpGen.Constructor()
  54.    HyperMemo.SetFocusProc = "HelpPanel.SetFocus"
  55.  
  56.    Dynarray HelpMan.HandlerBag[]
  57.    HelpMan.HandlerBag["LeftDown"]       = "HelpMan.SelectWindow"
  58.    HelpMan.HandlerBag["RightDown"]      = "HelpMan.SelectWindow"
  59.    HelpMan.HandlerBag["BothDown"]       = "HelpMan.SelectWindow"
  60.    HelpMan.HandlerBag[Asc("Dos")]       = "EventMan.DisableEvent"
  61.    HelpMan.HandlerBag[Asc("DosBig")]    = "EventMan.DisableEvent"
  62.    HelpMan.HandlerBag[Asc("WinNext")]   = "HelpMan.WinNext"
  63.    EventMan.SetHandlersFrom(HelpMan.HandlerBag) ; sets default handlers
  64.  
  65. EndProc ; HelpMan.Constructor
  66.  
  67. Proc HelpMan.Destructor()
  68.  
  69.    Message "Ending Help System Maintenance..."
  70.  
  71.    If IsFieldView() Then
  72.       FieldView
  73.    Endif
  74.    If IsFormView() Then
  75.       FormKey
  76.    Endif
  77.    EventMan.ClearHandlersWith(HelpMan.HandlerBag)
  78.    HyperMemo.Destructor()
  79.    HelpTable.Destructor()
  80.    ListTable.Destructor()
  81.    ListForm.Destructor()
  82.    SpecTable.Destructor()
  83.    SpecForm.Destructor()
  84.    HelpPanel.Destructor()
  85.    HelpGen.Destructor()
  86.  
  87.    Release Vars
  88.       HelpMan.FormColorBag,
  89.       HelpMan.HelpTabName,
  90.       HelpMan_WasListForm,
  91.       HelpMan.Directory,
  92.       HelpMan.CodeDirecory,
  93.       HelpMan.HelpSpecTabName,
  94.       HelpMan.HelpListTabName,
  95.       HelpMan.HandlerBag
  96.  
  97.    While IsWindow(GetWindow())
  98.       Window Close
  99.    EndWhile
  100.    EventMan.Destructor()
  101. EndProc ; HelpMan.Destructor
  102.  
  103. Proc HelpMan.SelectWindow()
  104.    Private
  105.       WindowBag,
  106.       EditorBag,
  107.       WindowHandle
  108.    If IsWindow(EventMan.TargetWindow) And
  109.       GetWindow() <> EventMan.TargetWindow Then
  110.       If SysMode() = "CoEdit" Then
  111.          If EventMan.WindowObjectTag[EventMan.TargetWindow] = "ListForm" Then
  112.             Message "Cannot select list form during edit"
  113.             Return 1
  114.          Endif
  115.          If EventMan.WindowObjectTag[GetWindow()] = "HelpPanel" Then
  116.             Window GetAttributes GetWindow() To WindowBag
  117.             Editor Info To EditorBag
  118.             Window Handle Form to WindowHandle
  119.             Window Select WindowHandle
  120.             HelpPanel.UpdateReferences(WindowBag,EditorBag)
  121.             Window Select EventMan.TargetWindow
  122.          Endif
  123.       Endif
  124.       EventMan.ObjectTag = EventMan.WindowObjectTag[EventMan.TargetWindow]
  125.       EventMan.EventTag = "SetFocus"
  126.       ExecProc EventMan.DispatchEventTagProc
  127.       Return EventMan.ReturnCode
  128.    Else
  129.       Return 0
  130.    Endif
  131. EndProc ; HelpMan.SelectWindow
  132.  
  133. Proc HelpMan.WinNext()
  134.    Private
  135.       TargetWindow,
  136.       WindowBag,
  137.       EditorBag
  138.  
  139.    If IsWindow(EventMan.ObjectTagWindow["HelpPanel"]) And
  140.       GetWindow() <> EventMan.ObjectTagWindow["HelpPanel"] Then
  141.       HelpPanel.SetFocus()
  142.    Else
  143.       Window Handle Form To TargetWindow
  144.       If Not IsWindow(TargetWindow) Then
  145.          TargetWindow = EventMan.ObjectTagWindow[HelpPanel.FormName]
  146.       Endif
  147.       If TargetWindow <> GetWindow() Then ; This is a memo
  148.          If SysMode() = "CoEdit" Then
  149.             Window GetAttributes GetWindow() To WindowBag
  150.             Editor Info To EditorBag
  151.             Window Select TargetWindow
  152.             HelpPanel.UpdateReferences(WindowBag,EditorBag)
  153.          Endif
  154.          EventMan.ObjectTag = EventMan.WindowObjectTag[TargetWindow]
  155.          EventMan.EventTag = "SetFocus"
  156.          ExecProc EventMan.DispatchEventTagProc
  157.          Return EventMan.ReturnCode
  158.       Else
  159.          Return 1
  160.       Endif
  161.    Endif
  162. EndProc ; HelpMan.WinNext
  163.  
  164. Proc HelpMan.HideWindow()
  165.    Window Move GetWindow() To 500,500
  166. EndProc ; HelpMan.HideWindow
  167.  
  168. ;--------------------------- HELP MAINTENANCE -------------------------------
  169.  
  170. Proc HelpMan.Interact()
  171.  
  172.    ListForm.SetFocus()
  173.  
  174.    Echo Normal
  175.    Wait WorkSpace
  176.       Proc "EventMan.CatchTrigger"
  177.    EndWait
  178.  
  179. EndProc ; HelpMan.Interact
  180.  
  181. Proc HelpMan.Quit()
  182.    Private
  183.       Command
  184.    ShowPopUp "Quit help system?" Centered
  185.       "No":"Do NOT quit editing help Panels":"Cancel",
  186.       "Yes":"Quit editing help Panels":"OK"
  187.    EndMenu
  188.    To Command
  189.    If Command = "OK" Then
  190.       Return 2
  191.    Else
  192.       Return 1
  193.    Endif
  194. EndProc ; HelpMan.Quit
  195.  
  196. ;---------------------------- HELPTABLE -------------------------------------
  197.  
  198. Proc HelpTable.Constructor()
  199.    View HelpMan.Directory + HelpMan.HelpTabName
  200.    EventMan.WindowObjectTag[GetWindow()] = "HelpTable"
  201.    EventMan.ObjectTagWindow["HelpTable"] = GetWindow()
  202.    HelpMan.HideWindow()
  203. EndProc ; HelpTable.Constructor
  204.  
  205. Proc HelpTable.Destructor()
  206.    Moveto HelpMan.Directory + HelpMan.HelpTabName
  207.    ClearImage
  208.    Release Vars
  209.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["HelpTable"]],
  210.       EventMan.ObjectTagWindow["HelpTable"]
  211. EndProc ; HelpTable.Destructor
  212.  
  213. ;---------------------------- LISTTABLE -------------------------------------
  214.  
  215. Proc ListTable.Constructor()
  216.    Moveto HelpMan.Directory + HelpMan.HelpListTabName
  217.    EventMan.WindowObjectTag[GetWindow()] = "ListTable"
  218.    EventMan.ObjectTagWindow["ListTable"] = GetWindow()
  219.    Dynarray ListTable.HandlerBag[]
  220.    ListTable.HandlerBag[Asc("EditKey")] = "ListTable.Edit"
  221.    ListTable.HandlerBag["ObjectTag"] = "ListTable"
  222.    EventMan.SetHandlersFrom(ListTable.HandlerBag)
  223. EndProc ; ListTable.Constructor
  224.  
  225. Proc ListTable.Destructor()
  226.    EventMan.ClearHandlersWith(ListTable.HandlerBag)
  227.    Release vars
  228.       ListTable.HandlerBag,
  229.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["ListTable"]],
  230.       EventMan.ObjectTagWindow["ListTable"]
  231. EndProc ; ListTable.Destructor
  232.  
  233. Proc ListTable.Edit()
  234.    ExecProc HelpPanel.FormName + ".Edit"
  235. EndProc ; ListTable.Edit
  236.  
  237. ;---------------------------- LISTFORM --------------------------------------
  238.  
  239. Proc ListForm.Constructor()
  240.    EventMan.ObjectTagWindow["ListForm"] = 0
  241.    Dynarray ListForm.HandlerBag[]
  242.    ListForm.HandlerBag[Asc("Esc")]        = "HelpMan.Quit"
  243.    ListForm.HandlerBag[Asc("F1")]         = "ListForm.CallExpand"
  244.    ListForm.HandlerBag[Asc("EditKey")]    = "ListForm.Edit"
  245.    ListForm.HandlerBag[Asc("FieldView")]  = "ListForm.FieldView"
  246.    ListForm.HandlerBag[Asc("F11")]        = "HelpPanel.Display"
  247.    ListForm.HandlerBag[-108]              = "ListForm.FieldView" ; AltF5
  248.    ListForm.HandlerBag["LeftDoubleDown"]  = "ListForm.CallExpand"
  249.    ListForm.HandlerBag["Close"]           = "HelpMan.Quit"
  250.    ListForm.HandlerBag["MenuTag:Quit"]    = "HelpMan.Quit"
  251.    ListForm.HandlerBag["MenuTag:Specs"]   = "ListForm.Expand"
  252.    ListForm.HandlerBag["MenuTag:Edit"]    = "ListForm.Edit"
  253.    ListForm.HandlerBag["MenuTag:Display"] = "HelpPanel.Display"
  254.    ListForm.HandlerBag["MenuTag:Generate"] = "ListForm.Generate"
  255.    ListForm.HandlerBag["MenuTag:TableBased"] = "ListForm.TableBasedDemo"
  256.    ListForm.HandlerBag["MenuTag:CodeBased"] = "ListForm.CodeBasedDemo"
  257.    ListForm.HandlerBag["MenuTag:RunLib"] = "ListForm.RunLib"
  258.    ListForm.HandlerBag["ArriveRow"]       = "ListForm.ArriveRow"
  259.    ListForm.HandlerBag["SetFocus"]        = "ListForm.SetFocus"
  260.    ListForm.HandlerBag["ObjectTag"]       = "ListForm"
  261.    EventMan.SetHandlersFrom(ListForm.HandlerBag)
  262. EndProc ; ListForm.Constructor
  263.  
  264. Proc ListForm.Destructor()
  265.    EventMan.ClearHandlersWith(ListForm.HandlerBag)
  266.    Release vars
  267.       ListForm.LibrarySpec,
  268.       ListForm.PanelName,
  269.       ListForm.HandlerBag,
  270.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["ListForm"]],
  271.       EventMan.ObjectTagWindow["ListForm"]
  272. EndProc ; ListForm.Destructor
  273.  
  274. Proc ListForm.SetFocus()
  275.    Private
  276.       WindowBag
  277.    If IsWindow(EventMan.ObjectTagWindow["ListForm"]) Then
  278.       Window Select EventMan.ObjectTagWindow["ListForm"]
  279.       If Table() <> HelpMan.Directory + HelpMan.HelpListTabName Then
  280.          DownImage
  281.       Endif
  282.    Else
  283.       Message "Working..."
  284.       Echo off
  285.       If IsFormView() Then
  286.          FormKey
  287.       Endif
  288.       Window Select EventMan.ObjectTagWindow["HelpTable"]
  289.       PickForm 1
  290.       Release Vars
  291.          EventMan.WindowObjectTag[EventMan.ObjectTagWindow["ListForm"]]
  292.       EventMan.ObjectTagWindow["ListForm"] = GetWindow()
  293.       EventMan.WindowObjectTag[GetWindow()] = "ListForm"
  294. ;      Dynarray WindowBag[]
  295. ;      WindowBag["CanMaximize"] = False
  296. ;      WindowBag["CanResize"] = False
  297. ;      Window SetAttributes GetWindow() From WindowBag
  298.       Window SetColors GetWindow() From HelpMan.FormColorBag
  299.       DownImage
  300.       Echo normal
  301.       Message ""
  302.    Endif
  303.    If SysMode() = "Main" Then
  304.       ShowPullDown
  305.          "HelpPanel":"View help text":"Display",
  306.          "Specs":"View help Panel specification details":"Specs",
  307.          "Edit":"Edit the help panel specs":"Edit",
  308. ;        "Demo":"Demonstrate the two forms of presenting help screens":"Demo"
  309. ;           SubMenu
  310. ;              "Code based":"Code based hypertext demo":"CodeBased",
  311. ;              "Table based":"Table based hypertext demo":"TableBased"
  312. ;           EndSubMenu,
  313.          "Generate":"Generate library for help panels":"Generate",
  314.          "RunLib":"Run generated help screens":"RunLib",
  315.          "Quit":"Quit editing help Panels":"Quit"
  316.       EndMenu
  317.       Prompt "[Esc]-Quit Help Maintenance; [F1]-Help Panel detail; " +
  318.                 "[ShiftF1]-Help panel"
  319.    Else
  320.       Debug ; Not in main mode on list
  321.    Endif
  322.    Return 1
  323. EndProc ; ListForm.SetFocus
  324.  
  325. Proc ListForm.CallExpand()
  326.    If Substr(FieldType(),1,1) <> "M" Then
  327.       Return ListForm.Expand()
  328.    Else
  329.       Return HelpPanel.Display()
  330.    Endif
  331. EndProc ; ListForm.CallExpand
  332.  
  333. Proc ListForm.FieldView()
  334.    If Substr(FieldType(),1,1) = "M" Then
  335.       Return HelpPanel.Display()
  336.    Else
  337.       Return 0
  338.    Endif
  339. EndProc ; ListForm.FieldView
  340.  
  341. Proc ListForm.Expand()
  342.    If Table() <> HelpMan.Directory + HelpMan.HelpListTabName Then
  343.       DownImage
  344.    Endif
  345.    If Recno() > 0 Then
  346.       SpecForm.SetFocus()
  347.    Else
  348.       Message "No records to expand"
  349.    Endif
  350.    Return 1
  351. EndProc ; ListForm.Expand
  352.  
  353. Proc ListForm.ArriveRow()
  354.    Private
  355.       WindowBag
  356.    If Table() = HelpMan.Directory + HelpMan.HelpListTabName And
  357.       IsWindow(EventMan.ObjectTagWindow["HelpPanel"]) Then
  358.       Dynarray WindowBag[]
  359.       WindowBag["Title"] = [Help Title]
  360.       Window SetAttributes EventMan.ObjectTagWindow["HelpPanel"] From WindowBag
  361.       If SysMode() = "Main" Then
  362.          HyperMemo.SetStack()
  363.       Endif
  364.    Endif
  365.    Return 0
  366. EndProc ; ListForm.ArriveRow
  367.  
  368. Proc ListForm.Edit()
  369.    Private
  370.       WasHelpPanel
  371.    HelpMan_WasListForm = True
  372.    WasHelpPanel = (GetWindow() = EventMan.ObjectTagWindow["HelpPanel"])
  373.    If WasHelpPanel Then
  374.       ListForm.SetFocus()
  375.    Endif
  376.    If Recno() = 0 Then
  377.       UpImage
  378.    Endif
  379.    CoEditKey
  380.    SpecForm.SetFocus()
  381.    SpecForm.SetImageRights()
  382.    If WasHelpPanel Then
  383.       HelpPanel.SetFocus()
  384.    Endif
  385.    Return 1
  386. EndProc ; ListForm.Edit()
  387.  
  388. Proc ListForm.Generate()
  389.    If HelpGen.GetDirName() Then
  390.       FormKey
  391.       HelpGen.GenerateScript()
  392.       ListForm.SetFocus()
  393.    Endif
  394.    Return 1
  395. EndProc ; ListForm.Generate
  396.  
  397. Proc ListForm.TableBasedDemo()
  398.    FormKey
  399.    HyperMemo.SetFocusProc = "HyperMemo!SetFocus"
  400.    HyperMemo.ShowPanel("HTEXT_BASICS")
  401.    HyperMemo.SetFocusProc = "HelpPanel.SetFocus"
  402.    ListForm.SetFocus()
  403.    Return 1
  404. EndProc ; ListForm.TableBasedDemo
  405.  
  406. Proc ListForm.CodeBasedDemo()
  407.    Private
  408.       Autolib
  409.    FormKey
  410.    Autolib = "Help\\helpdemo\\helpdemo"
  411.    Hypertext.Constructor()
  412.    Hypertext.ShowPanel("HTEXT_BASICS")
  413.    Hypertext.Destructor()
  414.    ListForm.SetFocus()
  415.    Return 1
  416. EndProc ; ListForm.TableBasedDemo
  417.  
  418. Proc ListForm.RunLib()
  419.    Private
  420.       Autolib,
  421.       ListForm_ErrorCode,
  422.       ErrorProc
  423.    If ListForm!GetLibSpec() Then
  424.       Autolib = Substr(ListForm.LibrarySpec,1,Len(ListForm.LibrarySpec) - 4)
  425.       ErrorProc = "ListForm!RunLibErrorProc"
  426.       ListForm_ErrorCode = 0
  427.       Hypertext.StartWithPanel(ListForm.PanelName)
  428.       If ListForm_ErrorCode = 34 Then
  429.          Message ListForm.LibrarySpec," is an invalid hypertext help library"
  430.       Endif
  431.       ListForm.SetFocus()
  432.    Endif
  433.    Return 1
  434. EndProc ; ListForm.RunLib
  435.  
  436. Proc ListForm!RunLibErrorProc()
  437.    ListForm_ErrorCode = ErrorCode()
  438.    Return 1
  439. EndProc ; ListForm!RunLibErrorProc
  440.  
  441. Proc ListForm!GetLibSpec()
  442.    Private
  443.       ListForm.LibControlVar
  444.    ShowDialog ""
  445.       Proc "ListForm!GetLibProc" Trigger "Accept"
  446.       @5,20 Height 8 Width 41
  447.       @1,3 ?? "Enter library directory and name:"
  448.       Accept @2,3 Width 33 "A64" Picture "*{?,#,-,_,%,&,;?,\\,.,:}" Required
  449.          Tag "Library"
  450.          To ListForm.LibrarySpec
  451.       PushButton @4,5 Width 12 "~O~K"
  452.          OK Default
  453.          Value "OK"
  454.          Tag "OK" To
  455.          ListForm.LibControlVar
  456.       PushButton @4,22 Width 12 "~C~ancel"
  457.          Cancel
  458.          Value "Cancel"
  459.          Tag "Cancel" To
  460.          ListForm.LibControlVar
  461.    EndDialog
  462.    Return Retval
  463. EndProc ; ListForm!GetLibSpec
  464.  
  465. Proc ListForm!GetLibProc(TriggerType,TagValue,EventValue,ElementValue)
  466.    If Len(ListForm.LibrarySpec) < 4 or
  467.       Upper(Substr(ListForm.LibrarySpec,Len(ListForm.LibrarySpec) - 3,4)) <>
  468.          ".LIB" Then
  469.       ListForm.LibrarySpec = ListForm.LibrarySpec + ".LIB"
  470.       RefreshControl("Library")
  471.    Endif
  472.    Switch
  473.       Case DirExists(ListForm.LibrarySpec) = -1:
  474.          Message "Error in library specification"
  475.          SelectControl "Library"
  476.          Return False
  477.       Case Not IsFile(ListForm.LibrarySpec):
  478.          Message "Library does not exist"
  479.          SelectControl "Library"
  480.          Return False
  481.       Otherwise:
  482.          If Not ListForm!GetPanelName() Then
  483.             SelectControl "Library"
  484.             Return False
  485.          Else
  486.             Return True
  487.          Endif
  488.     EndSwitch
  489. EndProc ; ListForm!GetLibProc
  490.  
  491. Proc ListForm!GetPanelName()
  492.    Private
  493.       ListForm.PanelControlVar
  494.    ShowDialog ""
  495.       @9,24 Height 8 Width 41
  496.       @1,3 ?? "Enter starting panel name:"
  497.       Accept @2,3 Width 33 "A12" Picture "*{&,.,$,;!,_,#}" Required
  498.          Tag "Panel"
  499.          To ListForm.PanelName
  500.       PushButton @4,5 Width 12 "~O~K"
  501.          OK Default
  502.          Value "OK"
  503.          Tag "OK" To
  504.          ListForm.PanelControlVar
  505.       PushButton @4,22 Width 12 "~C~ancel"
  506.          Cancel
  507.          Value "Cancel"
  508.          Tag "Cancel" To
  509.          ListForm.PanelControlVar
  510.    EndDialog
  511.    Return Retval
  512. EndProc ; ListForm!GetPanelName
  513.  
  514. ;---------------------------- SPECTABLE -------------------------------------
  515.  
  516. Proc SpecTable.Constructor()
  517.    Moveto HelpMan.Directory + HelpMan.HelpSpecTabName
  518.    EventMan.WindowObjectTag[GetWindow()] = "SpecTable"
  519.    EventMan.ObjectTagWindow["SpecTable"] = GetWindow()
  520. EndProc ; SpecTable.Constructor
  521.  
  522. Proc SpecTable.Destructor()
  523.    Release Vars
  524.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["SpecTable"]],
  525.       EventMan.ObjectTagWindow["SpecTable"]
  526. EndProc ; SpecTable.Destructor
  527.  
  528. ;---------------------------- SPECFORM --------------------------------------
  529.  
  530. Proc SpecForm.Constructor()
  531.    EventMan.ObjectTagWindow["SpecForm"] = 0
  532.    Dynarray SpecForm.HandlerBag[]
  533.    SpecForm.HandlerBag[Asc("Esc")]        = "SpecForm.CallEscape"
  534.    SpecForm.HandlerBag[Asc("F1")]         = "SpecForm.Expand"
  535.    SpecForm.HandlerBag[Asc("Ins")]        = "SpecForm.Insert"
  536.    SpecForm.HandlerBag[Asc("Del")]        = "SpecForm.Delete"
  537.    SpecForm.HandlerBag[Asc("Undo")]       = "SpecForm.Undo"
  538.    SpecForm.HandlerBag[Asc("EditKey")]    = "SpecForm.Edit"
  539.    SpecForm.HandlerBag[Asc("Do_It!")]     = "SpecForm.Commit"
  540.    SpecForm.HandlerBag[Asc("FieldView")]  = "SpecForm.FieldView"
  541.    SpecForm.HandlerBag[Asc("F11")]        = "HelpPanel.Display"
  542.    SpecForm.HandlerBag[-108]              = "SpecForm.FieldView" ; AltF5
  543.    SpecForm.HandlerBag["LeftDoubleDown"]  = "SpecForm.Expand"
  544.    SpecForm.HandlerBag["Close"]           = "ListForm.SetFocus"
  545.    SpecForm.HandlerBag["MenuTag:Quit"]    = "HelpMan.Quit"
  546.    SpecForm.HandlerBag["MenuTag:List"]    = "ListForm.SetFocus"
  547.    SpecForm.HandlerBag["MenuTag:Insert"]  = "SpecForm.Insert"
  548.    SpecForm.HandlerBag["MenuTag:Delete"]  = "SpecForm.Delete"
  549.    SpecForm.HandlerBag["MenuTag:Undo"]    = "SpecForm.Undo"
  550.    SpecForm.HandlerBag["MenuTag:Edit"]    = "SpecForm.Edit"
  551.    SpecForm.HandlerBag["MenuTag:DO-IT!"]  = "SpecForm.Commit"
  552.    SpecForm.HandlerBag["MenuTag:Cancel"]  = "SpecForm.AbandonEdit"
  553.    SpecForm.HandlerBag["MenuTag:Display"] = "HelpPanel.Display"
  554.    SpecForm.HandlerBag["ArriveRow"]       = "SpecForm.ArriveRow"
  555.    SpecForm.HandlerBag["Valcheck"]        = "SpecForm.ResolveNewRef"
  556.    SpecForm.HandlerBag["PostRecord"]      = "SpecForm.CheckDomain"
  557.    SpecForm.HandlerBag["TouchRecord"]     = "SpecForm.TouchRecord"
  558.    SpecForm.HandlerBag["SetFocus"]        = "SpecForm.SetFocus"
  559.    SpecForm.HandlerBag["ObjectTag"]       = "SpecForm"
  560.    EventMan.SetHandlersFrom(SpecForm.HandlerBag)
  561. EndProc ; SpecForm.Constructor
  562.  
  563. Proc SpecForm.Destructor()
  564.    EventMan.ClearHandlersWith(SpecForm.HandlerBag)
  565.    Release vars
  566.       SpecForm.Record,
  567.       SpecForm.HandlerBag,
  568.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["SpecForm"]],
  569.       EventMan.ObjectTagWindow["SpecForm"]
  570. EndProc ; SpecForm.Destructor
  571.  
  572. Proc SpecForm.SetFocus()
  573.    Private
  574.       WindowBag
  575.    If IsWindow(EventMan.ObjectTagWindow["SpecForm"]) Then
  576.       Window Select EventMan.ObjectTagWindow["SpecForm"]
  577.    Else
  578.       Message "Working..."
  579.       Echo off
  580.       If IsFormView() Then
  581.          FormKey
  582.       Endif
  583.       Window Select EventMan.ObjectTagWindow["ListTable"]
  584.       If SysMode() = "CoEdit" And RecNo() = 0 Then
  585.          Ins
  586.       Endif
  587.       PickForm 2
  588.       Release Vars
  589.          EventMan.WindowObjectTag[EventMan.ObjectTagWindow["SpecForm"]]
  590.       EventMan.ObjectTagWindow["SpecForm"] = GetWindow()
  591.       EventMan.WindowObjectTag[GetWindow()] = "SpecForm"
  592. ;      Dynarray WindowBag[]
  593. ;      WindowBag["CanMaximize"] = False
  594. ;      WindowBag["CanResize"] = False
  595. ;      Window SetAttributes GetWindow() From WindowBag
  596.       Window SetColors GetWindow() From HelpMan.FormColorBag
  597.       Echo normal
  598.       Message ""
  599.    Endif
  600.    If SysMode() = "Main" Then
  601.       ShowPullDown
  602.          "HelpPanel":"View help text":"Display",
  603.          "List":"View the help Panel list":"List",
  604.          "Edit":"Edit the selected help Panel":"Edit",
  605.          "Quit":"Quit editing help Panels":"Quit"
  606.       EndMenu
  607.       Prompt "[Esc]-previous panel; [ShiftF1]-Help panel"
  608.    Else
  609.       ShowPullDown
  610.          "Insert":"Insert a new help Panel":"Insert",
  611.          "D~e~lete":"Delete the selected help Panel":"Delete",
  612.          "Panel":"Edit help text":"Display",
  613.          "DO-IT!":"Return from edit mode.":"DO-IT!",
  614.          "Cancel":"Cancel edit":"Cancel",
  615.          "Undo":"Undo last change":"Undo"
  616.       EndMenu
  617.       Prompt "[Esc]-Undo last edit change; [F2]-Do-it!"
  618.    Endif
  619.    Return 1
  620. EndProc ; SpecForm.SetFocus
  621.  
  622. Proc SpecForm.CallEscape()
  623.    If Sysmode() = "Main" Then
  624.       Return ListForm.SetFocus()
  625.    Else
  626.       Return SpecForm.AbandonEdit()
  627.    Endif
  628. EndProc ; SpecForm.CallEscape
  629.  
  630. Proc SpecForm.Expand()
  631.    If Table() = HelpMan.Directory + HelpMan.HelpSpecTabName Then
  632.       If Recno() > 0 Then
  633.          If Sysmode() = "CoEdit" And
  634.             Field() = "Referenced help panel" Then
  635.             Return 0
  636.          Else
  637.             Code = [Referenced help panel]
  638.             UpImage
  639.             Moveto [Help panel name]
  640.             Locate Code
  641.             DownImage
  642.             Return 1
  643.          Endif
  644.       Endif
  645.    Else
  646.       If Field() = "Help text" Then
  647.          HelpPanel.Display()
  648.       Endif
  649.       Return 1
  650.    Endif
  651. EndProc ; SpecForm.Expand
  652.  
  653. Proc SpecForm.FieldView()
  654.    If Substr(FieldType(),1,1) = "M" Then
  655.       Return HelpPanel.Display()
  656.    Else
  657.       Return 0
  658.    Endif
  659. EndProc ; SpecForm.FieldView
  660.  
  661. ;------------------------- SPECFORM EDIT PROCS ------------------------------
  662.  
  663. Proc SpecForm.Edit()
  664.    Private
  665.       WasHelpPanel
  666.    If SysMode() = "Main" Then
  667.       HelpMan_WasListForm = False
  668.       WasHelpPanel = (GetWindow() = EventMan.ObjectTagWindow["HelpPanel"])
  669.       CoEditKey
  670.       SpecForm.SetFocus()
  671.       SpecForm.SetImageRights()
  672.       If WasHelpPanel Then
  673.          HelpPanel.SetFocus()
  674.       Endif
  675.    Endif
  676.    Return 1
  677. EndProc ; SpecForm.Edit()
  678.  
  679. Proc SpecForm.ArriveRow()
  680.    ListForm.ArriveRow()
  681.    Return SpecForm.SetImageRights()
  682. EndProc ; SpecForm.ArriveRow
  683.  
  684. Proc SpecForm.SetImageRights()
  685.    If SysMode() = "CoEdit" Then
  686.       If Table() = HelpMan.Directory + HelpMan.HelpListTabName Then
  687.          If RecordStatus("New") Then
  688.             ImageRights
  689.          Else
  690.             ImageRights Update
  691.          Endif
  692.       Endif
  693.    Endif
  694.    Return 0
  695. EndProc ; SpecForm.SetImageRights
  696.  
  697. Proc SpecForm.ResolveNewRef()
  698.    Private
  699.       ControlVar,
  700.       PanelName,
  701.       CurrentPanel,
  702.       Keyword
  703.  
  704.    If Field() <> "Referenced help panel" Then
  705.       Return 0
  706.    Endif
  707.    ShowDialog "Warning"
  708.       @10,20 Height 9 Width 45
  709.       @1,1 ?? "The following Panel name does not exist:"
  710.       @3,1 ?? [Referenced help Panel]
  711.       PushButton
  712.          @5,10 Width 10
  713.          "~A~dd"
  714.          OK
  715.          Default
  716.          Value "Add"
  717.          Tag "Add"
  718.          To ControlVar
  719.       PushButton
  720.          @5,25 Width 10
  721.          "~R~eturn"
  722.          Cancel
  723.          Value "Return"
  724.          Tag "Return"
  725.          To ControlVar
  726.    EndDialog
  727.    If RetVal Then
  728.       PanelName = [Referenced help panel]
  729.       KeyWord = [Keyword]
  730.       CtrlBackSpace
  731.       UpImage
  732.       CurrentPanel = [Help Panel name]
  733.       ImageRights
  734.       Ins
  735.       [Help panel name] = PanelName
  736.       Moveto [Help Panel name]
  737.       Locate Indexorder CurrentPanel
  738.       DownImage
  739.       Locate IndexOrder CurrentPanel,Keyword
  740.       Moveto [Referenced help panel]
  741.       [Referenced help panel] = PanelName
  742.       Return 0
  743.    Else
  744.       Return 1
  745.    Endif
  746. EndProc ; SpecForm.ResolveNewRef
  747.  
  748. Proc SpecForm.TouchRecord()
  749.    If Not IsFieldView() Then
  750.       CopyToArray SpecForm.Record
  751.       If RecordStatus("New") Then
  752.          [Wordwrap] = "Y"
  753.       Endif
  754.    Else
  755.       Echo Off
  756.       FieldView
  757.       CopyToArray SpecForm.Record
  758.       FieldView
  759.       Echo Normal
  760.    Endif
  761.    Return 0
  762. EndProc ; SpecForm.TouchRecord
  763.  
  764. Proc SpecForm.CheckDomain()
  765.    Private
  766.       OK,
  767.       ReturnCode
  768.  
  769.    ReturnCode = 0
  770.    If Not (RecordStatus("New") And (Not RecordStatus("Modified"))) Then
  771.       Switch
  772.          Case table() = HelpMan.Directory + HelpMan.HelpListTabName:
  773.             If IsBlank([Help panel name]) Then
  774.                Message "Cannot post with blank panel name field"
  775.                ReturnCode = 1
  776.             Endif
  777.          Case table() = HelpMan.Directory + HelpMan.HelpSpecTabName:
  778.             OK = true
  779.             If Field() = "Referenced help Panel" Then
  780.                If Not IsValid() Then
  781.                   OK = (HelpMan!ResolveNewRef() = 0)
  782.                   If Not OK Then
  783.                      ReturnCode = 1
  784.                   Endif
  785.                Endif
  786.             Endif
  787.             If OK And IsBlank([Keyword]) Then
  788.                OK = False
  789.                Message "Cannot post with blank keyword field"
  790.                ReturnCode = 1
  791.             Endif
  792.             If OK And [Help Panel name] = [Referenced help panel] Then
  793.                Message "Cannot link help Panel to itself"
  794.                ReturnCode = 1
  795.             Endif
  796.             If OK And
  797.                RecordStatus("Modified") And (Not RecordStatus("New")) And
  798.                [Keyword] <> SpecForm.Record["Keyword"] And
  799.                [Status] = "Active" Then
  800.                Message "Cannot change active keyword"
  801.                ReturnCode = 1
  802.             Endif
  803.          Otherwise:
  804.             ReturnCode = 0
  805.       EndSwitch
  806.    Endif
  807.    Return ReturnCode
  808. EndProc ; SpecForm.CheckDomain
  809.  
  810. Proc SpecForm.PostRecord()
  811.    Private
  812.       OK
  813.    OK = True
  814.    If SysMode() = "CoEdit" And RecordStatus("Modified") Then
  815.       PostRecord NoPost LeaveLocked
  816.       If Not Retval Then
  817.          Message "Key exists -- you can't overwrite master and details"
  818.          OK = False
  819.       Endif
  820.    Endif
  821.    Return OK
  822. EndProc ; SpecForm.PostRecord
  823.  
  824. Proc SpecForm.Insert()
  825.    If (SpecForm.CheckDomain() = 0) And SpecForm.PostRecord() Then
  826.       ImageRights
  827.       Ins
  828.    Endif
  829.    Return 1
  830. EndProc ; SpecForm.Insert
  831.  
  832. Proc SpecForm.Delete()
  833.    Private
  834.       Command,
  835.       ReturnCode,
  836.       OK
  837.    If SysMode() <> "CoEdit" Then
  838.       Return 1
  839.    Endif
  840.    ReturnCode = 1
  841.    If (Not IsFieldView()) And (Not RecordStatus("New")) Then
  842.       If Table() = HelpMan.Directory + HelpMan.HelpListTabName Then
  843.          ShowPopup "Delete panel record?" Centered
  844.             "No":"Do NOT delete current Panel record":"No",
  845.             "Yes":"Delete current Panel record":"Yes"
  846.          EndMenu
  847.          To Command
  848.          If Command = "Yes" Then
  849.             OK = SpecForm.IntegrityCheck()
  850.             If OK Then
  851.                Moveto HelpMan.Directory + HelpMan.HelpSpecTabName
  852.                ImageRights
  853.                While Not RecordStatus("New")
  854.                   Del
  855.                EndWhile
  856.                Moveto HelpMan.Directory + HelpMan.HelpListTabName
  857.                ImageRights
  858.                Del
  859.             Else
  860.                Message "Cannot delete -- other panels use this panel"
  861.                ReturnCode = 1
  862.             Endif
  863.          Else
  864.             ReturnCode = 1
  865.          Endif
  866.       Else
  867.          If [Status] = "Active" Then
  868.             Message "Cannot delete an active reference"
  869.             ReturnCode = 1
  870.          Else
  871.             Del
  872.          Endif
  873.       Endif
  874.    Else
  875.       If RecordStatus("New") Then
  876.          ImageRights
  877.          Del
  878.          SpecForm.SetImagerights()
  879.          ReturnCode = 1
  880.       Endif
  881.    Endif
  882.    Return ReturnCode
  883. EndProc ; SpecForm.Delete
  884.  
  885. Proc SpecForm.IntegrityCheck()
  886.    Private
  887.       PanelName,
  888.       OK
  889.    OK = True
  890.    If Not RecordStatus("New") Then
  891.       If RecordStatus("Modified") Then
  892.          OK = SpecForm.PostRecord()
  893.       Endif
  894.       If OK Then
  895.          UnlockRecord
  896.          PanelName = [Help Panel name]
  897.          FormKey
  898.          Moveto HelpMan.Directory + HelpMan.HelpSpecTabName
  899.          Moveto [Referenced help panel]
  900.          Locate IndexOrder PanelName
  901.          OK = Not Retval
  902.          Moveto HelpMan.Directory + HelpMan.HelpListTabName
  903.          FormKey
  904.       Endif
  905.    Endif
  906.    Return OK
  907. EndProc ; SpecForm.IntegrityCheck
  908.  
  909. Proc SpecForm.Undo()
  910.    If SysMode() = "CoEdit" Then
  911.       If Not IsFieldView() Then
  912.          ShowPopup "Undo changes?" Centered
  913.             "No":"Do NOT undo change":"No",
  914.             "Yes":"Undo change":"Yes"
  915.          EndMenu
  916.          To Command
  917.          If Command = "Yes" Then
  918.             ImageRights
  919.             Menu {Undo}{Yes}
  920.             SpecForm.SetImageRights()
  921.          Endif
  922.       Else
  923.          Message "End Field View before Undoing."
  924.       Endif
  925.    Endif
  926.    Return 1
  927. EndProc ; SpecForm.Undo
  928.  
  929. Proc SpecForm.Commit()
  930.    Private
  931.       OK,
  932.       CurrentTable,
  933.       ReturnCode
  934.    ReturnCode = 0
  935.    If SysMode() = "CoEdit" Then
  936.       If Not (RecordStatus("New") And (Not RecordStatus("Modified"))) Then
  937.          OK = (SpecForm.CheckDomain() = 0)
  938.          If OK Then
  939.             OK = SpecForm.PostRecord()
  940.          Endif
  941.       Else
  942.          ImageRights
  943.          Del
  944.          OK = true
  945.       Endif
  946.       If OK Then
  947.          ImageRights
  948.          CurrentTable = Table()
  949.          Do_It!
  950.          If HelpMan_WasListForm Then
  951.             ListForm.SetFocus()
  952.          Else
  953.             Moveto CurrentTable
  954.             SpecForm.SetFocus()
  955.          Endif
  956.          ReturnCode = 1
  957.       Else
  958.          ReturnCode = 1
  959.       Endif
  960.    Endif
  961.    Return ReturnCode
  962. EndProc ; SpecForm.Commit
  963.  
  964. Proc SpecForm.AbandonEdit()
  965.    Private
  966.       OK
  967.    If RecordStatus("Modified") Then
  968.       ShowPopUp "Abandon edit?" Centered
  969.          "No":"Do NOT undo edit changes":"No",
  970.          "Yes":"Undo edit changes":"Yes"
  971.       EndMenu
  972.       To Command
  973.       If Command = "Yes" Then
  974.          ImageRights
  975.          Menu {Undo}{Yes}
  976.          OK = True
  977.       Else
  978.          OK = False
  979.       Endif
  980.    Else
  981.       OK = True
  982.    Endif
  983.    If OK Then
  984.       Do_It!
  985.       If HelpMan_WasListForm Then
  986.          ListForm.SetFocus()
  987.       Else
  988.          SpecForm.SetFocus()
  989.       Endif
  990.    Endif
  991.    Return 1
  992. EndProc ; SpecForm.AbandonEdit
  993.  
  994. ;----------------------------- PANEL ----------------------------------------
  995.  
  996. Proc HelpPanel.Constructor()
  997.    EventMan.ObjectTagWindow["HelpPanel"] = 0
  998.    Dynarray HelpPanel.HandlerBag[]
  999.    HelpPanel.HandlerBag[Asc("Do_It!")]        = "HelpPanel.CloseWithSave"
  1000.    HelpPanel.HandlerBag[Asc("Enter")]         = "HelpPanel.SelectHotSpot"
  1001.    HelpPanel.HandlerBag[Asc("Help")]          = "HelpPanel.SelectHotSpot"
  1002.    HelpPanel.HandlerBag[Asc("Esc")]           = "HelpPanel.CallEscape"
  1003.    HelpPanel.HandlerBag[19]                   = "HelpPanel.SetHotSpotStart" ; ^S
  1004.    HelpPanel.HandlerBag[5]                    = "HelpPanel.SetHotSpotEnd" ; ^E
  1005.    HelpPanel.HandlerBag[Asc("FieldView")]     = "HelpMan.WinNext"
  1006.    HelpPanel.HandlerBag[Asc("Tab")]           = "HelpPanel.GotoNextHotSpot"
  1007.    HelpPanel.HandlerBag[Asc("ReverseTab")]    = "HelpPanel.GotoPrevHotSpot"
  1008.    HelpPanel.HandlerBag[-108]                 = "HelpMan.WinNext" ; AltF5
  1009.    HelpPanel.HandlerBag["RightDown"]          = "HelpPanel.CallEscape"
  1010.    HelpPanel.HandlerBag["LeftDoubleDown"]     = "HelpPanel.SelectHotSpot"
  1011.    HelpPanel.HandlerBag["Close"]              = "HelpPanel.Close"
  1012.    HelpPanel.HandlerBag["MenuTag:List"]       = "HelpPanel.SelectList"
  1013.    HelpPanel.HandlerBag["MenuTag:Specs"]      = "HelpPanel.SelectSpecs"
  1014.    HelpPanel.HandlerBag["MenuTag:Edit"]       = "HelpPanel.Edit"
  1015.    HelpPanel.HandlerBag["MenuTag:Quit"]       = "HelpMan.Quit"
  1016.    HelpPanel.HandlerBag["MenuTag:DO-IT!"]     = "HelpPanel.CloseWithSave"
  1017.    HelpPanel.HandlerBag["MenuTag:Start"]      = "HelpPanel.SetHotSpotStart"
  1018.    HelpPanel.HandlerBag["MenuTag:End"]        = "HelpPanel.SetHotSpotEnd"
  1019.    HelpPanel.HandlerBag["MenuTag:Cancel"]     = "HelpPanel.Close"
  1020.    HelpPanel.HandlerBag["MenuTag:Save"]       = "HelpPanel.Save"
  1021.    HelpPanel.HandlerBag["MenuTag:CopyToFile"] = "HelpPanel.CopyToFile"
  1022.    HelpPanel.HandlerBag["MenuTag:InsertFile"] = "HelpPanel.InsertFile"
  1023.    HelpPanel.HandlerBag["MenuTag:WriteBlock"] = "HelpPanel.WriteBlock"
  1024.    HelpPanel.HandlerBag["MenuTag:Print"]      = "HelpPanel.Print"
  1025.    HelpPanel.HandlerBag["SetFocus"]           = "HelpPanel.SetFocus"
  1026.    HelpPanel.HandlerBag["ObjectTag"]          = "HelpPanel"
  1027.    EventMan.SetHandlersFrom(HelpPanel.HandlerBag)
  1028.  
  1029.    Dynarray HelpPanel.ColorBag[]
  1030.    HelpPanel.ColorBag[0] = 8 + 32
  1031.    HelpPanel.ColorBag[1] = 8 + 32
  1032.    HelpPanel.ColorBag[2] = 8 + 32
  1033.    HelpPanel.ColorBag[3] = 8 + 32
  1034.    HelpPanel.ColorBag[4] = 8 + 32
  1035. EndProc ; HelpPanel.Constructor
  1036.  
  1037. Proc HelpPanel.Destructor()
  1038.    EventMan.ClearHandlersWith(HelpPanel.HandlerBag)
  1039.    Release vars
  1040.       HelpPanel.Name,
  1041.       HelpPanel.FormName,
  1042.       HelpPanel.ColorBag,
  1043.       HelpPanel.HandlerBag,
  1044.       EventMan.WindowObjectTag[EventMan.ObjectTagWindow["HelpPanel"]],
  1045.       EventMan.ObjectTagWindow["HelpPanel"]
  1046. EndProc ; HelpPanel.Destructor
  1047.  
  1048. Proc HelpPanel.SetFocus()
  1049.    Private
  1050.       WindowBag
  1051.    If IsWindow(EventMan.ObjectTagWindow["HelpPanel"]) Then
  1052.       If Table() <> HelpMan.Directory + HelpMan.HelpListTabName Then
  1053.          Moveto HelpMan.Directory + HelpMan.HelpListTabName
  1054.       Endif
  1055.       If HelpPanel.Name <> [Help panel name] Then
  1056.          HelpPanel.Name = [Help panel name]
  1057.          Echo off
  1058.          If SysMode() = "Main" And IsFormView() Then
  1059.             HelpPanel.FormName = EventMan.WindowObjectTag[GetWindow()]
  1060.             FormKey
  1061.          Endif
  1062.          Window Select EventMan.ObjectTagWindow["HelpPanel"]
  1063.          HelpPanel.SetAttributes()
  1064.          Echo normal
  1065.       Else
  1066.          Window Select EventMan.ObjectTagWindow["HelpPanel"]
  1067.       Endif
  1068.    Else
  1069.       Message "Working..."
  1070.       Echo off
  1071.       If SysMode() = "Main" And IsFormView() Then
  1072.          HelpPanel.FormName = EventMan.WindowObjectTag[GetWindow()]
  1073.          Formkey
  1074.       Endif
  1075.       Moveto HelpMan.Directory + HelpMan.HelpListTabName
  1076.       HelpPanel.Name = [Help panel name]
  1077.       Moveto [Help text]
  1078.       FieldView
  1079.       HelpPanel.SetAttributes()
  1080.       If SysMode() = "Main" Then
  1081.          HyperMemo.SetStack()
  1082.       Endif
  1083.       Window SetColors GetWindow() From HelpPanel.ColorBag
  1084.       Release Vars
  1085.          EventMan.WindowObjectTag[EventMan.ObjectTagWindow["HelpPanel"]]
  1086.       EventMan.ObjectTagWindow["HelpPanel"] = GetWindow()
  1087.       EventMan.WindowObjectTag[GetWindow()] = "HelpPanel"
  1088.       Echo Normal
  1089.       Message ""
  1090.    Endif
  1091.    If SysMode() = "Main" Then
  1092.       ShowPullDown
  1093.          "List":"View the help panel list":"List",
  1094.          "Specs":"View the help panel specs":"Specs",
  1095.          "Edit":"Edit the selected help Panel":"Edit",
  1096.          "Quit":"Quit editing help Panels":"Quit"
  1097.       EndMenu
  1098.       Prompt "[Esc]-return to help Panel list; [ShiftF1]-Explain"
  1099.       HyperMemo.CollectHotSpots()
  1100.    Else
  1101.       ShowPullDown
  1102.          "~S~ave":"Save changes to memo field":"Save",
  1103.          "~C~opyToFile":"Copy text to a file":"CopyToFile",
  1104.          "~I~nsertFile":"Insert file in text":"InsertFile",
  1105.          "~W~riteBlock":"Write marked block to file":"WriteBlock",
  1106.          "~P~rint":"Print text":"Print",
  1107.          "~H~otspot":"Mark start or end of hotspot":"HotSpot"
  1108.             SubMenu
  1109.                "Start":"Mark start of hotspot":"Start",
  1110.                "End":"Mark end of hotspot":"End"
  1111.             EndSubMenu,
  1112.          "~D~O-IT!": "Save changes to the help text":"DO-IT!",
  1113.          "C~a~ncel":"Cancel edit":"Cancel"
  1114.       EndMenu
  1115.       Prompt "[F2]-Accept; [Esc]-Reject; [^S]-Start hotspot; [^E]-End hotspot",""
  1116.    Endif
  1117.    Return 1
  1118. EndProc ; HelpPanel.SetFocus
  1119.  
  1120. Proc HelpPanel.Edit()
  1121.    If HelpPanel.FormName = "ListForm" Then
  1122.       Return ListForm.Edit()
  1123.    Else
  1124.       Return SpecForm.Edit()
  1125.    Endif
  1126. EndProc ; HelpPanel.Edit
  1127.  
  1128. Proc HelpPanel.SetAttributes()
  1129.    Private
  1130.       WindowBag
  1131.    Message "Setting window attributes..."
  1132.    If [Wordwrap] = "Y" Then
  1133.       Menu {Options}{WordWrap}{Set}
  1134.    Else
  1135.       Menu {Options}{WordWrap}{Clear}
  1136.    Endif
  1137.    Dynarray WindowBag[]
  1138.    WindowBag["Title"] = [Help title]
  1139.    If Not IsBlank([Origin row]) Then
  1140.       WindowBag["OriginRow"] = [Origin row]
  1141.    Endif
  1142.    If Not IsBlank([Origin col]) Then
  1143.       WindowBag["OriginCol"] = [Origin col]
  1144.    Endif
  1145.    If Not IsBlank([Height]) Then
  1146.       WindowBag["Height"] = [Height]
  1147.    Endif
  1148.    If Not IsBlank([Width]) Then
  1149.       WindowBag["Width"] = [Width]
  1150.    Endif
  1151.    Window SetAttributes GetWindow() From WindowBag
  1152. EndProc ; HelpPanel.SetAttributes
  1153.  
  1154. Proc HelpPanel.SelectList()
  1155.    Private
  1156.       WindowHandle
  1157.    Window Handle Form To WindowHandle
  1158.    If Not IsWindow(WindowHandle) Then
  1159.       WindowHandle = EventMan.ObjectTagWindow[HelpPanel.FormName]
  1160.    Endif
  1161.    EventMan.ObjectTag = EventMan.WindowObjectTag[WindowHandle]
  1162.    EventMan.EventTag = "SetFocus"
  1163.    ExecProc EventMan.DispatchEventTagProc
  1164.    If EventMan.WindowObjectTag[GetWindow()] = "ListForm" Then
  1165.       Return EventMan.ReturnCode
  1166.    Else
  1167.       Return ListForm.SetFocus()
  1168.    Endif
  1169. EndProc ; HelpPanel.SelectList
  1170.  
  1171. Proc HelpPanel.SelectSpecs()
  1172.    Private
  1173.       WindowHandle
  1174.    Window Handle Form To WindowHandle
  1175.    If Not IsWindow(WindowHandle) Then
  1176.       WindowHandle = EventMan.ObjectTagWindow[HelpPanel.FormName]
  1177.    Endif
  1178.    EventMan.ObjectTag = EventMan.WindowObjectTag[WindowHandle]
  1179.    EventMan.EventTag = "SetFocus"
  1180.    ExecProc EventMan.DispatchEventTagProc
  1181.    If EventMan.WindowObjectTag[GetWindow()] = "SpecForm" Then
  1182.       Return EventMan.ReturnCode
  1183.    Else
  1184.       Return SpecForm.SetFocus()
  1185.    Endif
  1186. EndProc ; HelpPanel.SelectSpecs
  1187.  
  1188. Proc HelpPanel.Display()
  1189.    Private
  1190.       OK
  1191.    Moveto HelpMan.Directory + HelpMan.HelpListTabName
  1192.    If IsBlank([Help Panel name]) Then
  1193.        Message "Panel name must exist before editing Panel"
  1194.    Else
  1195.       If SysMode() = "CoEdit" Then
  1196.          OK = (SpecForm.CheckDomain() = 0) And SpecForm.PostRecord()
  1197.          If OK Then
  1198.             HelpPanel.SetFocus()
  1199.          Endif
  1200.       Else
  1201.          HelpPanel.SetFocus()
  1202.       Endif
  1203.    Endif
  1204.    Return 1
  1205. EndProc ; HelpPanel.Display
  1206.  
  1207. Proc HelpPanel.SelectHotSpot()
  1208.    If SysMode() = "Main" Then
  1209.       Return HyperMemo.SelectHotSpot()
  1210.    Else
  1211.       Return 0
  1212.    Endif
  1213. EndProc ; HelpPanel.SelectHotSpot
  1214.  
  1215. Proc HelpPanel.GotoNextHotSpot()
  1216.    If SysMode() = "Main" Then
  1217.       Return HyperMemo.GotoNextHotSpot()
  1218.    Else
  1219.       Return 0
  1220.    Endif
  1221. EndProc ; HelpPanel.GotoNextHotSpot
  1222.  
  1223. Proc HelpPanel.GotoPrevHotSpot()
  1224.    If SysMode() = "Main" Then
  1225.       Return HyperMemo.GotoPrevHotSpot()
  1226.    Else
  1227.       Return 0
  1228.    Endif
  1229. EndProc ; HelpPanel.GotoPrevHotSpot
  1230.  
  1231. Proc HelpPanel.CallEscape()
  1232.    If SysMode() = "Main" Then
  1233.       If Not HyperMemo.PrevPanel() Then
  1234.          Return HelpPanel.Close()
  1235.       Else
  1236.          Return 1
  1237.       Endif
  1238.    Else
  1239.       Return HelpPanel.Close()
  1240.    Endif
  1241. EndProc ; HelpPanel.CallEscape
  1242.  
  1243. Proc HelpPanel.Close()
  1244.    If HelpPanel.CloseWindow() Then
  1245.       If Not IsFormView() Then
  1246.          EventMan.ObjectTag = HelpPanel.FormName
  1247.       Else
  1248.          EventMan.ObjectTag = EventMan.WindowObjectTag[GetWindow()]
  1249.       Endif
  1250.       EventMan.EventTag = "SetFocus"
  1251.       ExecProc EventMan.DispatchEventTagProc
  1252.       Return EventMan.ReturnCode
  1253.    Else
  1254.       Return 1
  1255.    Endif
  1256. EndProc ; HelpPanel.Close
  1257.  
  1258. Proc HelpPanel.CloseWindow()
  1259.    Private
  1260.       EditorWindow,
  1261.       EventBag
  1262.    EditorWindow = GetWindow()
  1263.    WinClose
  1264.    While IsWindow(EditorWindow) And (GetWindow() <> EditorWindow)
  1265.       ;--------------------------------------------------------------
  1266.       ; MenuChoice() could be used to detect presence of menu, ie. "No"
  1267.       ; if the confirmation menu were up, and "Error" or "View" or "File"
  1268.       ; or something if not, kind of mushy though, so I prefer the above.
  1269.       ;--------------------------------------------------------------
  1270.       ; ie. we're on a confirmation menu, so eat events until
  1271.       ; accept or deny of winclose is indirectly confirmed. Accept is
  1272.       ; detected by absence of EditorWindow; deny is detected by
  1273.       ; return to the EditorWindow.
  1274.       ;--------------------------------------------------------------
  1275.       GetEvent to EventBag
  1276.       ExecEvent EventBag
  1277.    EndWhile
  1278.    If IsWindow(EditorWindow) Then
  1279.       Return false
  1280.    Else
  1281.       Return true
  1282.    Endif
  1283. EndProc ; HelpPanel.CloseWindow
  1284.  
  1285. Proc HelpPanel.CloseWithSave()
  1286.    Private
  1287.       WindowBag,
  1288.       EditorBag
  1289.    If SysMode() = "CoEdit" Then
  1290.       Window GetAttributes GetWindow() To WindowBag
  1291.       Editor Info To EditorBag
  1292.       Do_It!
  1293.       HelpPanel.UpdateReferences(WindowBag,EditorBag)
  1294.    Else
  1295.       Do_It!
  1296.    Endif
  1297.    If IsWindow(GetWindow()) Then
  1298.       If Not IsFormView() Then
  1299.          EventMan.ObjectTag = HelpPanel.FormName
  1300.       Else
  1301.          EventMan.ObjectTag = EventMan.WindowObjectTag[GetWindow()]
  1302.       Endif
  1303.       EventMan.EventTag = "SetFocus"
  1304.       ExecProc EventMan.DispatchEventTagProc
  1305.       Return EventMan.ReturnCode
  1306.    Else
  1307.       Return 1
  1308.    Endif
  1309. EndProc ; HelpPanel.CloseWithSave
  1310.  
  1311. Proc HelpPanel.UpdateReferences(WindowBag,EditorBag)
  1312.    Private
  1313.       EditorBag,
  1314.       PanelName,
  1315.       HelpText,
  1316.       ScanPos,
  1317.       LeftMarkPos,
  1318.       RightMarkPos,
  1319.       Found,
  1320.       Scanning,
  1321.       Length,
  1322.       WorkString,
  1323.       HotSpots,
  1324.       WasFormView,
  1325.       OK
  1326.  
  1327.    If Not EditorBag["Changed"] Then
  1328.       Return
  1329.    Endif
  1330.    Message "Working..."
  1331.    Dynarray HotSpots[]
  1332.    PanelName = [Help Panel name]
  1333.    HelpText = [Help text]
  1334.    WasFormView = IsFormView()
  1335.    If WasFormView Then
  1336.       If RecordStatus("Locked") Or
  1337.          (RecordStatus("New") And RecordStatus("Modified")) Then
  1338.          UnlockRecord
  1339.       Endif
  1340.       FormKey
  1341.    Endif
  1342.    Moveto HelpMan.Directory + HelpMan.HelpSpecTabName
  1343.    ScanPos = 1
  1344.    Scanning = True
  1345.    While Scanning
  1346.       LeftMarkPos = SearchFrom("»",HelpText,ScanPos)
  1347.       Found = (LeftMarkPos <> 0)
  1348.       Scanning = Found
  1349.       If Found Then
  1350.          ScanPos = LeftMarkPos
  1351.          RightMarkPos = SearchFrom("«",HelpText,ScanPos)
  1352.          Found = (RightMarkPos <> 0)
  1353.          If Found Then
  1354.             Length = RightMarkPos - LeftMarkPos + 1 - 2
  1355.             OK = (Length <= 32 And Length > 0)
  1356.             If OK Then
  1357.                WorkString = Substr(HelpText,LeftMarkPos + 1,Length)
  1358.                OK = (Substr(WorkString,1,1) <> " ")
  1359.                If OK Then
  1360.                   OK = (Substr(WorkString,Length,1) <> " ")
  1361.                   If OK Then
  1362.                      OK = (Search("\010",WorkString) = 0)
  1363.                   Endif
  1364.                Endif
  1365.             Endif
  1366.             If OK Then
  1367.                Locate PanelName, WorkString
  1368.                If Not Retval Then
  1369.                   Imagerights
  1370.                   Ins
  1371.                   [Help Panel name] = PanelName
  1372.                   [Keyword] = WorkString
  1373.                Endif
  1374.                [Status] = "Active"
  1375.                ScanPos = RightMarkPos + 1
  1376.                HotSpots[WorkString] = True
  1377.                UnlockRecord
  1378.             Else
  1379.                ScanPos = LeftMarkPos + 1
  1380.             Endif
  1381.          Endif ; Found
  1382.       Endif
  1383.    EndWhile
  1384.    Scan For [Help Panel name] = PanelName
  1385.       If Not IsAssigned(HotSpots[[Keyword]]) Then
  1386.          [Status] = "Absent"
  1387.       EndIf
  1388.    EndScan
  1389.    Moveto HelpMan.Directory + HelpMan.HelpListTabName
  1390.    [Origin row] = WindowBag["OriginRow"]
  1391.    [Origin col] = WindowBag["OriginCol"]
  1392.    [Height] = WindowBag["Height"]
  1393.    [Width] = WindowBag["Width"]
  1394.    UnlockRecord
  1395.    If WasFormView Then
  1396.       FormKey
  1397.    Endif
  1398.    Message ""
  1399. EndProc ; HelpPanel.UpdateReferences
  1400.  
  1401. Proc HelpPanel.SetHotSpotStart()
  1402.    If SysMode() = "CoEdit" Then
  1403.       Editor insert "»"
  1404.    Endif
  1405.    Return 1
  1406. EndProc ; HelpPanel.SetHotSpotStart
  1407.  
  1408. Proc HelpPanel.SetHotSpotEnd()
  1409.    If SysMode() = "CoEdit" Then
  1410.       Editor insert "«"
  1411.    Endif
  1412.    Return 1
  1413. EndProc ; HelpPanel.SetHotSpotEnd
  1414.  
  1415. Proc HelpPanel.Save()
  1416.    Private
  1417.       WindowBag,
  1418.       EditorBag
  1419.    Echo off
  1420.    Window GetAttributes GetWindow() To WindowBag
  1421.    Editor Info To EditorBag
  1422.    Menu {File}{Save}
  1423.    FieldView
  1424.    HelpPanel.UpdateReferences(WindowBag,EditorBag)
  1425.    Moveto [Help text]
  1426.    FieldView
  1427.    Echo Normal
  1428.    Return 1
  1429. EndProc ; HelpPanel.Save
  1430.  
  1431. Proc HelpPanel.CopyToFile()
  1432.    Menu {File}{CopyToFile}
  1433.    HelpPanel.ProgressThroughMenu()
  1434.    Return 1
  1435. EndProc ; HelpPanel.CopyToFile
  1436.  
  1437. Proc HelpPanel.InsertFile()
  1438.    Menu {File}{InsertFile}
  1439.    HelpPanel.ProgressThroughMenu()
  1440.    Return 1
  1441. EndProc ; HelpPanel.InsertFile
  1442.  
  1443. Proc HelpPanel.WriteBlock()
  1444.    Menu {File}{WriteBlock}
  1445.    HelpPanel.ProgressThroughMenu()
  1446.    Return 1
  1447. EndProc ; HelpPanel.WriteBlock
  1448.  
  1449. Proc HelpPanel.Print()
  1450.    If PrinterStatus() Then
  1451.       Echo off
  1452.       Menu {File}{Print}
  1453.       Echo Normal
  1454.    Else
  1455.       Message "Printer not ready"
  1456.    Endif
  1457.    Return 1
  1458. EndProc ; HelpPanel.Print
  1459.  
  1460. Proc HelpPanel.ProgressThroughMenu()
  1461.    While GetWindow() = 0
  1462.       GetEvent To EventBag
  1463.       If EventBag["Type"] = "KEY" And
  1464.          EventBag["Keycode"] = Asc("Esc") Then
  1465.          CtrlBreak
  1466.          Quitloop
  1467.       Else
  1468.          ExecEvent EventBag
  1469.       Endif
  1470.    EndWhile
  1471. EndProc ; HelpPanel.ProgressThroughMenu
  1472.  
  1473. ;-------------------------- MAINLINE ----------------------------------------
  1474.  
  1475. If Not IsAssigned(Librarian.HasControl) Then
  1476.    Play "PopHelp"
  1477.    HelpMan.Constructor()
  1478.    HelpMan.Interact()
  1479.    HelpMan.Destructor()
  1480. Endif