home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 August / PCWorld_2000-08_cd.bin / Software / TemaCD / xbasic / xbpro.exe / xb / abuffer.x next >
Text File  |  1999-09-16  |  33KB  |  754 lines

  1. '
  2. ' ####################
  3. ' #####  PROLOG  #####
  4. ' ####################
  5. '
  6. PROGRAM    "abuffer"
  7. VERSION    "0.0007"
  8. '
  9. IMPORT    "xst"        ' Standard
  10. IMPORT    "xma"        ' Mathematics
  11. IMPORT    "xgr"        ' GraphicsDesigner
  12. IMPORT    "xui"        ' GuiDesigner
  13. '
  14. '
  15. ' This program is the same as acircle.x except for a short marked section
  16. ' of code added to the "SUB Resize" subroutine of grid function Circle().
  17. ' The added code attaches an "image grid" to "buffer" the main drawing grid.
  18. ' Once attached to the drawing grid, all graphics drawing on the drawing grid
  19. ' is automatically drawn onto the "buffer grid" also.  When the drawing grid
  20. ' is covered then uncovered by another window, the drawn graphics in the
  21. ' drawing grid are lost.  But the attached buffer grid still contains the
  22. ' drawn graphics and GraphicsDesigner automatically restores the graphics
  23. ' to the drawing grid by copying the buffer grid onto the drawing grid.
  24. ' Thus this program shows how a few lines of code on place in a program
  25. ' can capture and automatically restore arbitrary graphics to any grid.
  26. ' Again, the only difference between this program and acircle.x is the
  27. ' short marked section in the Resize subroutine in grid function Circle().
  28. ' This code also resizes the buffer grid when the drawing grid is resized.
  29. '
  30. ' To clearly see the difference the buffer grid makes, do the following
  31. ' in acircle.x then in abuffer.x (this program).
  32. '
  33. ' 1. Run the program.
  34. ' 2. Click "Pause" to freeze some drawn graphics on the drawing grid.
  35. ' 3. Cover part of the graphics on the drawing grid with another window.
  36. ' 4. Remove the window to uncover the drawing grid.
  37. ' 5. Look at the graphics.
  38. '
  39. ' In acircle.x the drawn graphics is lost where the drawing grid was uncovered.
  40. ' In abuffer.x the drawn graphics is automatically restored.
  41. '
  42. '
  43. '
  44. DECLARE  FUNCTION  Entry         ()
  45. INTERNAL FUNCTION  InitGui       ()
  46. INTERNAL FUNCTION  InitProgram   ()
  47. INTERNAL FUNCTION  CreateWindows ()
  48. INTERNAL FUNCTION  Circle        (grid, message, v0, v1, v2, v3, r0, ANY)
  49. INTERNAL FUNCTION  CircleCode    (grid, message, v0, v1, v2, v3, r0, ANY)
  50. '
  51. '
  52. ' ######################
  53. ' #####  Entry ()  #####
  54. ' ######################
  55. '
  56. FUNCTION  Entry ()
  57.     SHARED  terminateProgram
  58.     SHARED    paused
  59. '
  60.     InitGui ()                                        ' initialize messages
  61.     InitProgram ()                                ' initialize this program
  62.     CreateWindows ()                            ' create main window and others
  63. '
  64. ' This message loop is modified to draw the circle pattern continuously
  65. ' when not paused, but still process messages whenever they occur.
  66. '
  67.     DO                                                        ' the message loop
  68.         count = 1                                        ' wait for 1+ messages, then process 1
  69.         IFZ paused THEN                            ' if circle drawing not paused
  70.             CircleCode (0, #Redraw, 0, 0, 0, 0, 0, 0)        ' draw a few circles
  71.             count = 0                                    ' avoid hang up in XgrProcessMessages()
  72.         END IF
  73.         XgrProcessMessages (count)    ' process zero or one message
  74.     LOOP UNTIL terminateProgram        ' and repeats until program is terminated
  75. END FUNCTION
  76. '
  77. '
  78. ' ########################
  79. ' #####  InitGui ()  #####
  80. ' ########################
  81. '
  82. ' InitGui() initializes cursor, icon, message, and display variables.
  83. ' Programs can reference these variables, but must never change them.
  84. '
  85. FUNCTION  InitGui ()
  86. '
  87. ' ***************************************
  88. ' *****  Register Standard Cursors  *****
  89. ' ***************************************
  90. '
  91.     XgrRegisterCursor (@"Arrow",            @#cursorArrow)
  92.     XgrRegisterCursor (@"UpArrow",        @#cursorArrowN)
  93.     XgrRegisterCursor (@"Arrow",            @#cursorArrowNW)
  94.     XgrRegisterCursor (@"SizeNS",            @#cursorArrowsNS)
  95.     XgrRegisterCursor (@"SizeWE",            @#cursorArrowsWE)
  96.     XgrRegisterCursor (@"SizeNWSE",        @#cursorArrowsNWSE)
  97.     XgrRegisterCursor (@"SizeNESW",        @#cursorArrowsNESW)
  98.     XgrRegisterCursor (@"SizeAll",        @#cursorArrowsAll)
  99.     XgrRegisterCursor (@"CrossHair",    @#cursorCrosshair)
  100.     XgrRegisterCursor (@"Arrow",            @#cursorDefault)
  101.     XgrRegisterCursor (@"Wait",                @#cursorHourglass)
  102.     XgrRegisterCursor (@"Insert",            @#cursorInsert)
  103.     XgrRegisterCursor (@"No",                    @#cursorNo)
  104.     XgrRegisterCursor (@"Arrow",            @#defaultCursor)
  105. '
  106. '
  107. ' ********************************************
  108. ' *****  Register Standard Window Icons  *****
  109. ' ********************************************
  110. '
  111.     XgrRegisterIcon (@"hand",                    @#iconHand)
  112.     XgrRegisterIcon (@"asterisk",            @#iconAsterisk)
  113.     XgrRegisterIcon (@"question",            @#iconQuestion)
  114.     XgrRegisterIcon (@"exclamation",    @#iconExclamation)
  115.     XgrRegisterIcon (@"application",    @#iconApplication)
  116. '
  117.     XgrRegisterIcon (@"hand",                    @#iconStop)                        ' alias
  118.     XgrRegisterIcon (@"asterisk",            @#iconInformation)        ' alias
  119.     XgrRegisterIcon (@"application",  @#iconBlank)                    ' alias
  120. '
  121.     XgrRegisterIcon (@"window",                @#iconWindow)                    ' custom
  122. '
  123. '
  124. ' ******************************
  125. ' *****  Register Messages *****  Create message numbers for message names
  126. ' ******************************
  127. '
  128.     XgrRegisterMessage (@"Blowback",                                        @#Blowback)
  129.     XgrRegisterMessage (@"Callback",                                        @#Callback)
  130.     XgrRegisterMessage (@"Cancel",                                            @#Cancel)
  131.     XgrRegisterMessage (@"Change",                                            @#Change)
  132.     XgrRegisterMessage (@"CloseWindow",                                    @#CloseWindow)
  133.     XgrRegisterMessage (@"ContextChange",                                @#ContextChange)
  134.     XgrRegisterMessage (@"Create",                                            @#Create)
  135.     XgrRegisterMessage (@"CreateValueArray",                        @#CreateValueArray)
  136.     XgrRegisterMessage (@"CreateWindow",                                @#CreateWindow)
  137.     XgrRegisterMessage (@"CursorH",                                            @#CursorH)
  138.     XgrRegisterMessage (@"CursorV",                                            @#CursorV)
  139.     XgrRegisterMessage (@"Deselected",                                    @#Deselected)
  140.     XgrRegisterMessage (@"Destroy",                                            @#Destroy)
  141.     XgrRegisterMessage (@"Destroyed",                                        @#Destroyed)
  142.     XgrRegisterMessage (@"DestroyWindow",                                @#DestroyWindow)
  143.     XgrRegisterMessage (@"Disable",                                            @#Disable)
  144.     XgrRegisterMessage (@"Disabled",                                        @#Disabled)
  145.     XgrRegisterMessage (@"Displayed",                                        @#Displayed)
  146.     XgrRegisterMessage (@"DisplayWindow",                                @#DisplayWindow)
  147.     XgrRegisterMessage (@"Enable",                                            @#Enable)
  148.     XgrRegisterMessage (@"Enabled",                                            @#Enabled)
  149.     XgrRegisterMessage (@"Enter",                                                @#Enter)
  150.     XgrRegisterMessage (@"ExitMessageLoop",                            @#ExitMessageLoop)
  151.     XgrRegisterMessage (@"Find",                                                @#Find)
  152.     XgrRegisterMessage (@"FindForward",                                    @#FindForward)
  153.     XgrRegisterMessage (@"FindReverse",                                    @#FindReverse)
  154.     XgrRegisterMessage (@"Forward",                                            @#Forward)
  155.     XgrRegisterMessage (@"GetAlign",                                        @#GetAlign)
  156.     XgrRegisterMessage (@"GetBorder",                                        @#GetBorder)
  157.     XgrRegisterMessage (@"GetBorderOffset",                            @#GetBorderOffset)
  158.     XgrRegisterMessage (@"GetCallback",                                    @#GetCallback)
  159.     XgrRegisterMessage (@"GetCallbackArgs",                            @#GetCallbackArgs)
  160.     XgrRegisterMessage (@"GetCan",                                            @#GetCan)
  161.     XgrRegisterMessage (@"GetCharacterMapArray",                @#GetCharacterMapArray)
  162.     XgrRegisterMessage (@"GetClipGrid",                                    @#GetClipGrid)
  163.     XgrRegisterMessage (@"GetColor",                                        @#GetColor)
  164.     XgrRegisterMessage (@"GetColorExtra",                                @#GetColorExtra)
  165.     XgrRegisterMessage (@"GetCursor",                                        @#GetCursor)
  166.     XgrRegisterMessage (@"GetCursorXY",                                    @#GetCursorXY)
  167.     XgrRegisterMessage (@"GetDisplay",                                    @#GetDisplay)
  168.     XgrRegisterMessage (@"GetEnclosedGrids",                        @#GetEnclosedGrids)
  169.     XgrRegisterMessage (@"GetEnclosingGrid",                        @#GetEnclosingGrid)
  170.     XgrRegisterMessage (@"GetFocusColor",                                @#GetFocusColor)
  171.     XgrRegisterMessage (@"GetFocusColorExtra",                    @#GetFocusColorExtra)
  172.     XgrRegisterMessage (@"GetFont",                                            @#GetFont)
  173.     XgrRegisterMessage (@"GetFontNumber",                                @#GetFontNumber)
  174.     XgrRegisterMessage (@"GetGridFunction",                            @#GetGridFunction)
  175.     XgrRegisterMessage (@"GetGridFunctionName",                    @#GetGridFunctionName)
  176.     XgrRegisterMessage (@"GetGridName",                                    @#GetGridName)
  177.     XgrRegisterMessage (@"GetGridNumber",                                @#GetGridNumber)
  178.     XgrRegisterMessage (@"GetGridType",                                    @#GetGridType)
  179.     XgrRegisterMessage (@"GetGridTypeName",                            @#GetGridTypeName)
  180.     XgrRegisterMessage (@"GetGroup",                                        @#GetGroup)
  181.     XgrRegisterMessage (@"GetHelp",                                            @#GetHelp)
  182.     XgrRegisterMessage (@"GetHelpFile",                                    @#GetHelpFile)
  183.     XgrRegisterMessage (@"GetHelpString",                                @#GetHelpString)
  184.     XgrRegisterMessage (@"GetHelpStrings",                            @#GetHelpStrings)
  185.     XgrRegisterMessage (@"GetHintString",                                @#GetHintString)
  186.     XgrRegisterMessage (@"GetImage",                                        @#GetImage)
  187.     XgrRegisterMessage (@"GetImageCoords",                            @#GetImageCoords)
  188.     XgrRegisterMessage (@"GetIndent",                                        @#GetIndent)
  189.     XgrRegisterMessage (@"GetInfo",                                            @#GetInfo)
  190.     XgrRegisterMessage (@"GetJustify",                                    @#GetJustify)
  191.     XgrRegisterMessage (@"GetKeyboardFocus",                        @#GetKeyboardFocus)
  192.     XgrRegisterMessage (@"GetKeyboardFocusGrid",                @#GetKeyboardFocusGrid)
  193.     XgrRegisterMessage (@"GetKidNumber",                                @#GetKidNumber)
  194.     XgrRegisterMessage (@"GetKids",                                            @#GetKids)
  195.     XgrRegisterMessage (@"GetKidArray",                                    @#GetKidArray)
  196.     XgrRegisterMessage (@"GetKind",                                            @#GetKind)
  197.     XgrRegisterMessage (@"GetMaxMinSize",                                @#GetMaxMinSize)
  198.     XgrRegisterMessage (@"GetMessageFunc",                            @#GetMessageFunc)
  199.     XgrRegisterMessage (@"GetMessageFuncArray",                    @#GetMessageFuncArray)
  200.     XgrRegisterMessage (@"GetMessageSub",                                @#GetMessageSub)
  201.     XgrRegisterMessage (@"GetMessageSubArray",                    @#GetMessageSubArray)
  202.     XgrRegisterMessage (@"GetModalInfo",                                @#GetModalInfo)
  203.     XgrRegisterMessage (@"GetModalWindow",                            @#GetModalWindow)
  204.     XgrRegisterMessage (@"GetParent",                                        @#GetParent)
  205.     XgrRegisterMessage (@"GetPosition",                                    @#GetPosition)
  206.     XgrRegisterMessage (@"GetProtoInfo",                                @#GetProtoInfo)
  207.     XgrRegisterMessage (@"GetRedrawFlags",                            @#GetRedrawFlags)
  208.     XgrRegisterMessage (@"GetSize",                                            @#GetSize)
  209.     XgrRegisterMessage (@"GetSmallestSize",                            @#GetSmallestSize)
  210.     XgrRegisterMessage (@"GetState",                                        @#GetState)
  211.     XgrRegisterMessage (@"GetStyle",                                        @#GetStyle)
  212.     XgrRegisterMessage (@"GetTabArray",                                    @#GetTabArray)
  213.     XgrRegisterMessage (@"GetTabWidth",                                    @#GetTabWidth)
  214.     XgrRegisterMessage (@"GetTextArray",                                @#GetTextArray)
  215.     XgrRegisterMessage (@"GetTextArrayBounds",                    @#GetTextArrayBounds)
  216.     XgrRegisterMessage (@"GetTextArrayLine",                        @#GetTextArrayLine)
  217.     XgrRegisterMessage (@"GetTextArrayLines",                        @#GetTextArrayLines)
  218.     XgrRegisterMessage (@"GetTextCursor",                                @#GetTextCursor)
  219.     XgrRegisterMessage (@"GetTextFilename",                            @#GetTextFilename)
  220.     XgrRegisterMessage (@"GetTextPosition",                            @#GetTextPosition)
  221.     XgrRegisterMessage (@"GetTextSelection",                        @#GetTextSelection)
  222.     XgrRegisterMessage (@"GetTextString",                                @#GetTextString)
  223.     XgrRegisterMessage (@"GetTextStrings",                            @#GetTextStrings)
  224.     XgrRegisterMessage (@"GetTexture",                                    @#GetTexture)
  225.     XgrRegisterMessage (@"GetTimer",                                        @#GetTimer)
  226.     XgrRegisterMessage (@"GetValue",                                        @#GetValue)
  227.     XgrRegisterMessage (@"GetValues",                                        @#GetValues)
  228.     XgrRegisterMessage (@"GetValueArray",                                @#GetValueArray)
  229.     XgrRegisterMessage (@"GetWindow",                                        @#GetWindow)
  230.     XgrRegisterMessage (@"GetWindowFunction",                        @#GetWindowFunction)
  231.     XgrRegisterMessage (@"GetWindowGrid",                                @#GetWindowGrid)
  232.     XgrRegisterMessage (@"GetWindowIcon",                                @#GetWindowIcon)
  233.     XgrRegisterMessage (@"GetWindowSize",                                @#GetWindowSize)
  234.     XgrRegisterMessage (@"GetWindowTitle",                            @#GetWindowTitle)
  235.     XgrRegisterMessage (@"GotKeyboardFocus",                        @#GotKeyboardFocus)
  236.     XgrRegisterMessage (@"GrabArray",                                        @#GrabArray)
  237.     XgrRegisterMessage (@"GrabTextArray",                                @#GrabTextArray)
  238.     XgrRegisterMessage (@"GrabTextString",                            @#GrabTextString)
  239.     XgrRegisterMessage (@"GrabValueArray",                            @#GrabValueArray)
  240.     XgrRegisterMessage (@"Help",                                                @#Help)
  241.     XgrRegisterMessage (@"Hidden",                                            @#Hidden)
  242.     XgrRegisterMessage (@"HideTextCursor",                            @#HideTextCursor)
  243.     XgrRegisterMessage (@"HideWindow",                                    @#HideWindow)
  244.     XgrRegisterMessage (@"Initialize",                                    @#Initialize)
  245.     XgrRegisterMessage (@"Initialized",                                    @#Initialized)
  246.     XgrRegisterMessage (@"Inline",                                            @#Inline)
  247.     XgrRegisterMessage (@"InquireText",                                    @#InquireText)
  248.     XgrRegisterMessage (@"KeyboardFocusBackward",                @#KeyboardFocusBackward)
  249.     XgrRegisterMessage (@"KeyboardFocusForward",                @#KeyboardFocusForward)
  250.     XgrRegisterMessage (@"KeyDown",                                            @#KeyDown)
  251.     XgrRegisterMessage (@"KeyUp",                                                @#KeyUp)
  252.     XgrRegisterMessage (@"LostKeyboardFocus",                        @#LostKeyboardFocus)
  253.     XgrRegisterMessage (@"LostTextSelection",                        @#LostTextSelection)
  254.     XgrRegisterMessage (@"Maximized",                                        @#Maximized)
  255.     XgrRegisterMessage (@"MaximizeWindow",                            @#MaximizeWindow)
  256.     XgrRegisterMessage (@"Maximum",                                            @#Maximum)
  257.     XgrRegisterMessage (@"Minimized",                                        @#Minimized)
  258.     XgrRegisterMessage (@"MinimizeWindow",                            @#MinimizeWindow)
  259.     XgrRegisterMessage (@"Minimum",                                            @#Minimum)
  260.     XgrRegisterMessage (@"MonitorContext",                            @#MonitorContext)
  261.     XgrRegisterMessage (@"MonitorHelp",                                    @#MonitorHelp)
  262.     XgrRegisterMessage (@"MonitorKeyboard",                            @#MonitorKeyboard)
  263.     XgrRegisterMessage (@"MonitorMouse",                                @#MonitorMouse)
  264.     XgrRegisterMessage (@"MouseDown",                                        @#MouseDown)
  265.     XgrRegisterMessage (@"MouseDrag",                                        @#MouseDrag)
  266.     XgrRegisterMessage (@"MouseEnter",                                    @#MouseEnter)
  267.     XgrRegisterMessage (@"MouseExit",                                        @#MouseExit)
  268.     XgrRegisterMessage (@"MouseMove",                                        @#MouseMove)
  269.     XgrRegisterMessage (@"MouseUp",                                            @#MouseUp)
  270.     XgrRegisterMessage (@"MuchLess",                                        @#MuchLess)
  271.     XgrRegisterMessage (@"MuchMore",                                        @#MuchMore)
  272.     XgrRegisterMessage (@"OneLess",                                            @#OneLess)
  273.     XgrRegisterMessage (@"OneMore",                                            @#OneMore)
  274.     XgrRegisterMessage (@"PokeArray",                                        @#PokeArray)
  275.     XgrRegisterMessage (@"PokeTextArray",                                @#PokeTextArray)
  276.     XgrRegisterMessage (@"PokeTextString",                            @#PokeTextString)
  277.     XgrRegisterMessage (@"PokeValueArray",                            @#PokeValueArray)
  278.     XgrRegisterMessage (@"Print",                                                @#Print)
  279.     XgrRegisterMessage (@"Redraw",                                            @#Redraw)
  280.     XgrRegisterMessage (@"RedrawGrid",                                    @#RedrawGrid)
  281.     XgrRegisterMessage (@"RedrawLines",                                    @#RedrawLines)
  282.     XgrRegisterMessage (@"RedrawText",                                    @#RedrawText)
  283.     XgrRegisterMessage (@"RedrawWindow",                                @#RedrawWindow)
  284.     XgrRegisterMessage (@"Replace",                                            @#Replace)
  285.     XgrRegisterMessage (@"ReplaceForward",                            @#ReplaceForward)
  286.     XgrRegisterMessage (@"ReplaceReverse",                            @#ReplaceReverse)
  287.     XgrRegisterMessage (@"Reset",                                                @#Reset)
  288.     XgrRegisterMessage (@"Resize",                                            @#Resize)
  289.     XgrRegisterMessage (@"Resized",                                            @#Resized)
  290.     XgrRegisterMessage (@"ResizeNot",                                        @#ResizeNot)
  291.     XgrRegisterMessage (@"ResizeWindow",                                @#ResizeWindow)
  292.     XgrRegisterMessage (@"ResizeWindowToGrid",                    @#ResizeWindowToGrid)
  293.     XgrRegisterMessage (@"Resized",                                            @#Resized)
  294.     XgrRegisterMessage (@"Reverse",                                            @#Reverse)
  295.     XgrRegisterMessage (@"ScrollH",                                            @#ScrollH)
  296.     XgrRegisterMessage (@"ScrollV",                                            @#ScrollV)
  297.     XgrRegisterMessage (@"Select",                                            @#Select)
  298.     XgrRegisterMessage (@"Selected",                                        @#Selected)
  299.     XgrRegisterMessage (@"Selection",                                        @#Selection)
  300.     XgrRegisterMessage (@"SelectWindow",                                @#SelectWindow)
  301.     XgrRegisterMessage (@"SetAlign",                                        @#SetAlign)
  302.     XgrRegisterMessage (@"SetBorder",                                        @#SetBorder)
  303.     XgrRegisterMessage (@"SetBorderOffset",                            @#SetBorderOffset)
  304.     XgrRegisterMessage (@"SetCallback",                                    @#SetCallback)
  305.     XgrRegisterMessage (@"SetCan",                                            @#SetCan)
  306.     XgrRegisterMessage (@"SetCharacterMapArray",                @#SetCharacterMapArray)
  307.     XgrRegisterMessage (@"SetClipGrid",                                    @#SetClipGrid)
  308.     XgrRegisterMessage (@"SetColor",                                        @#SetColor)
  309.     XgrRegisterMessage (@"SetColorAll",                                    @#SetColorAll)
  310.     XgrRegisterMessage (@"SetColorExtra",                                @#SetColorExtra)
  311.     XgrRegisterMessage (@"SetColorExtraAll",                        @#SetColorExtraAll)
  312.     XgrRegisterMessage (@"SetCursor",                                        @#SetCursor)
  313.     XgrRegisterMessage (@"SetCursorXY",                                    @#SetCursorXY)
  314.     XgrRegisterMessage (@"SetDisplay",                                    @#SetDisplay)
  315.     XgrRegisterMessage (@"SetFocusColor",                                @#SetFocusColor)
  316.     XgrRegisterMessage (@"SetFocusColorExtra",                    @#SetFocusColorExtra)
  317.     XgrRegisterMessage (@"SetFont",                                            @#SetFont)
  318.     XgrRegisterMessage (@"SetFontNumber",                                @#SetFontNumber)
  319.     XgrRegisterMessage (@"SetGridFunction",                            @#SetGridFunction)
  320.     XgrRegisterMessage (@"SetGridFunctionName",                    @#SetGridFunctionName)
  321.     XgrRegisterMessage (@"SetGridName",                                    @#SetGridName)
  322.     XgrRegisterMessage (@"SetGridType",                                    @#SetGridType)
  323.     XgrRegisterMessage (@"SetGridTypeName",                            @#SetGridTypeName)
  324.     XgrRegisterMessage (@"SetGroup",                                        @#SetGroup)
  325.     XgrRegisterMessage (@"SetHelp",                                            @#SetHelp)
  326.     XgrRegisterMessage (@"SetHelpFile",                                    @#SetHelpFile)
  327.     XgrRegisterMessage (@"SetHelpString",                                @#SetHelpString)
  328.     XgrRegisterMessage (@"SetHelpStrings",                            @#SetHelpStrings)
  329.     XgrRegisterMessage (@"SetHintString",                                @#SetHintString)
  330.     XgrRegisterMessage (@"SetImage",                                        @#SetImage)
  331.     XgrRegisterMessage (@"SetImageCoords",                            @#SetImageCoords)
  332.     XgrRegisterMessage (@"SetIndent",                                        @#SetIndent)
  333.     XgrRegisterMessage (@"SetInfo",                                            @#SetInfo)
  334.     XgrRegisterMessage (@"SetJustify",                                    @#SetJustify)
  335.     XgrRegisterMessage (@"SetKeyboardFocus",                        @#SetKeyboardFocus)
  336.     XgrRegisterMessage (@"SetKeyboardFocusGrid",                @#SetKeyboardFocusGrid)
  337.     XgrRegisterMessage (@"SetMaxMinSize",                                @#SetMaxMinSize)
  338.     XgrRegisterMessage (@"SetMessageFunc",                            @#SetMessageFunc)
  339.     XgrRegisterMessage (@"SetMessageFuncArray",                    @#SetMessageFuncArray)
  340.     XgrRegisterMessage (@"SetMessageSub",                                @#SetMessageSub)
  341.     XgrRegisterMessage (@"SetMessageSubArray",                    @#SetMessageSubArray)
  342.     XgrRegisterMessage (@"SetModalWindow",                            @#SetModalWindow)
  343.     XgrRegisterMessage (@"SetParent",                                        @#SetParent)
  344.     XgrRegisterMessage (@"SetPosition",                                    @#SetPosition)
  345.     XgrRegisterMessage (@"SetRedrawFlags",                            @#SetRedrawFlags)
  346.     XgrRegisterMessage (@"SetSize",                                            @#SetSize)
  347.     XgrRegisterMessage (@"SetState",                                        @#SetState)
  348.     XgrRegisterMessage (@"SetStyle",                                        @#SetStyle)
  349.     XgrRegisterMessage (@"SetTabArray",                                    @#SetTabArray)
  350.     XgrRegisterMessage (@"SetTabWidth",                                    @#SetTabWidth)
  351.     XgrRegisterMessage (@"SetTextArray",                                @#SetTextArray)
  352.     XgrRegisterMessage (@"SetTextArrayLine",                        @#SetTextArrayLine)
  353.     XgrRegisterMessage (@"SetTextArrayLines",                        @#SetTextArrayLines)
  354.     XgrRegisterMessage (@"SetTextCursor",                                @#SetTextCursor)
  355.     XgrRegisterMessage (@"SetTextFilename",                            @#SetTextFilename)
  356.     XgrRegisterMessage (@"SetTextSelection",                        @#SetTextSelection)
  357.     XgrRegisterMessage (@"SetTextString",                                @#SetTextString)
  358.     XgrRegisterMessage (@"SetTextStrings",                            @#SetTextStrings)
  359.     XgrRegisterMessage (@"SetTexture",                                    @#SetTexture)
  360.     XgrRegisterMessage (@"SetTimer",                                        @#SetTimer)
  361.     XgrRegisterMessage (@"SetValue",                                        @#SetValue)
  362.     XgrRegisterMessage (@"SetValues",                                        @#SetValues)
  363.     XgrRegisterMessage (@"SetValueArray",                                @#SetValueArray)
  364.     XgrRegisterMessage (@"SetWindowFunction",                        @#SetWindowFunction)
  365.     XgrRegisterMessage (@"SetWindowIcon",                                @#SetWindowIcon)
  366.     XgrRegisterMessage (@"SetWindowTitle",                            @#SetWindowTitle)
  367.     XgrRegisterMessage (@"ShowTextCursor",                            @#ShowTextCursor)
  368.     XgrRegisterMessage (@"ShowWindow",                                    @#ShowWindow)
  369.     XgrRegisterMessage (@"SomeLess",                                        @#SomeLess)
  370.     XgrRegisterMessage (@"SomeMore",                                        @#SomeMore)
  371.     XgrRegisterMessage (@"StartTimer",                                    @#StartTimer)
  372.     XgrRegisterMessage (@"SystemMessage",                                @#SystemMessage)
  373.     XgrRegisterMessage (@"TextDelete",                                    @#TextDelete)
  374.     XgrRegisterMessage (@"TextEvent",                                        @#TextEvent)
  375.     XgrRegisterMessage (@"TextInsert",                                    @#TextInsert)
  376.     XgrRegisterMessage (@"TextModified",                                @#TextModified)
  377.     XgrRegisterMessage (@"TextReplace",                                    @#TextReplace)
  378.     XgrRegisterMessage (@"TimeOut",                                            @#TimeOut)
  379.     XgrRegisterMessage (@"Update",                                            @#Update)
  380.     XgrRegisterMessage (@"WindowClose",                                    @#WindowClose)
  381.     XgrRegisterMessage (@"WindowCreate",                                @#WindowCreate)
  382.     XgrRegisterMessage (@"WindowDeselected",                        @#WindowDeselected)
  383.     XgrRegisterMessage (@"WindowDestroy",                                @#WindowDestroy)
  384.     XgrRegisterMessage (@"WindowDestroyed",                            @#WindowDestroyed)
  385.     XgrRegisterMessage (@"WindowDisplay",                                @#WindowDisplay)
  386.     XgrRegisterMessage (@"WindowDisplayed",                            @#WindowDisplayed)
  387.     XgrRegisterMessage (@"WindowGetDisplay",                        @#WindowGetDisplay)
  388.     XgrRegisterMessage (@"WindowGetFunction",                        @#WindowGetFunction)
  389.     XgrRegisterMessage (@"WindowGetIcon",                                @#WindowGetIcon)
  390.     XgrRegisterMessage (@"WindowGetKeyboardFocusGrid",    @#WindowGetKeyboardFocusGrid)
  391.     XgrRegisterMessage (@"WindowGetSelectedWindow",            @#WindowGetSelectedWindow)
  392.     XgrRegisterMessage (@"WindowGetSize",                                @#WindowGetSize)
  393.     XgrRegisterMessage (@"WindowGetTitle",                            @#WindowGetTitle)
  394.     XgrRegisterMessage (@"WindowHelp",                                    @#WindowHelp)
  395.     XgrRegisterMessage (@"WindowHide",                                    @#WindowHide)
  396.     XgrRegisterMessage (@"WindowHidden",                                @#WindowHidden)
  397.     XgrRegisterMessage (@"WindowKeyDown",                                @#WindowKeyDown)
  398.     XgrRegisterMessage (@"WindowKeyUp",                                    @#WindowKeyUp)
  399.     XgrRegisterMessage (@"WindowMaximize",                            @#WindowMaximize)
  400.     XgrRegisterMessage (@"WindowMaximized",                            @#WindowMaximized)
  401.     XgrRegisterMessage (@"WindowMinimize",                            @#WindowMinimize)
  402.     XgrRegisterMessage (@"WindowMinimized",                            @#WindowMinimized)
  403.     XgrRegisterMessage (@"WindowMonitorContext",                @#WindowMonitorContext)
  404.     XgrRegisterMessage (@"WindowMonitorHelp",                        @#WindowMonitorHelp)
  405.     XgrRegisterMessage (@"WindowMonitorKeyboard",                @#WindowMonitorKeyboard)
  406.     XgrRegisterMessage (@"WindowMonitorMouse",                    @#WindowMonitorMouse)
  407.     XgrRegisterMessage (@"WindowMouseDown",                            @#WindowMouseDown)
  408.     XgrRegisterMessage (@"WindowMouseDrag",                            @#WindowMouseDrag)
  409.     XgrRegisterMessage (@"WindowMouseEnter",                        @#WindowMouseEnter)
  410.     XgrRegisterMessage (@"WindowMouseExit",                            @#WindowMouseExit)
  411.     XgrRegisterMessage (@"WindowMouseMove",                            @#WindowMouseMove)
  412.     XgrRegisterMessage (@"WindowMouseUp",                                @#WindowMouseUp)
  413.     XgrRegisterMessage (@"WindowRedraw",                                @#WindowRedraw)
  414.     XgrRegisterMessage (@"WindowRegister",                            @#WindowRegister)
  415.     XgrRegisterMessage (@"WindowResize",                                @#WindowResize)
  416.     XgrRegisterMessage (@"WindowResized",                                @#WindowResized)
  417.     XgrRegisterMessage (@"WindowResizeToGrid",                    @#WindowResizeToGrid)
  418.     XgrRegisterMessage (@"WindowSelect",                                @#WindowSelect)
  419.     XgrRegisterMessage (@"WindowSelected",                            @#WindowSelected)
  420.     XgrRegisterMessage (@"WindowSetFunction",                        @#WindowSetFunction)
  421.     XgrRegisterMessage (@"WindowSetIcon",                                @#WindowSetIcon)
  422.     XgrRegisterMessage (@"WindowSetKeyboardFocusGrid",    @#WindowSetKeyboardFocusGrid)
  423.     XgrRegisterMessage (@"WindowSetTitle",                            @#WindowSetTitle)
  424.     XgrRegisterMessage (@"WindowShow",                                    @#WindowShow)
  425.     XgrRegisterMessage (@"WindowSystemMessage",                    @#WindowSystemMessage)
  426.     XgrRegisterMessage (@"LastMessage",                                    @#LastMessage)
  427. '
  428.     XgrGetDisplaySize ("", @#displayWidth, @#displayHeight, @#windowBorderWidth, @#windowTitleHeight)
  429. END FUNCTION
  430. '
  431. '
  432. ' ############################
  433. ' #####  InitProgram ()  #####
  434. ' ############################
  435. '
  436. FUNCTION  InitProgram ()
  437. '        Initialize everything your program needs to initialize
  438. END FUNCTION
  439. '
  440. '
  441. ' ##############################
  442. ' #####  CreateWindows ()  #####
  443. ' ##############################
  444. '
  445. FUNCTION  CreateWindows ()
  446.     SHARED  Circle
  447. '
  448.     wt = 0
  449. '    wt = $$WindowTypeNoFrame
  450.     Circle (@Circle, #CreateWindow, 0, 0, 0, 0, wt, 0)
  451.     Circle ( Circle, #SetCallback, Circle, &CircleCode(), -1, -1, -1, -1)
  452.     XuiSendMessage (Circle, #DisplayWindow, 0, 0, 0, 0, 0, 0)
  453. '    XuiSendMessage (Circle, #MaximizeWindow, 0, 0, 0, 0, 0, 0)
  454. END FUNCTION
  455. '
  456. '
  457. ' #######################
  458. ' #####  Circle ()  #####
  459. ' #######################
  460. '
  461. FUNCTION  Circle (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  462.   STATIC    designX,  designY,  designWidth,  designHeight
  463.   STATIC    SUBADDR  sub[]
  464.     STATIC    upperMessage
  465.   STATIC    Circle
  466. '
  467.   $Circle       =   0  ' kid   0 grid type = Circle
  468.   $DrawingArea  =   1  ' kid   1 grid type = XuiArea
  469.   $ClearButton  =   2  ' kid   2 grid type = XuiPushButton
  470.   $PauseButton  =   3  ' kid   3 grid type = XuiPushButton
  471.   $QuitButton   =   4  ' kid   4 grid type = XuiPushButton
  472.   $UpperKid     =   4  ' kid maximum
  473. '
  474.   IFZ sub[] THEN GOSUB Initialize
  475. ' XuiReportMessage (grid, message, v0, v1, v2, v3, r0, r1)
  476.   IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, Circle) THEN RETURN
  477.   IF (message <= upperMessage) THEN GOSUB @sub[message]
  478.   RETURN
  479. '
  480. '
  481. ' *****  Callback  *****  message = Callback : r1 = original message
  482. '
  483. SUB Callback
  484.   message = r1
  485.   IF (message <= upperMessage) THEN GOSUB @sub[message]
  486. END SUB
  487. '
  488. '
  489. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  490. '
  491. SUB Create
  492.   IF (v0 <= 0) THEN v0 = 0
  493.   IF (v1 <= 0) THEN v1 = 0
  494.   IF (v2 <= 0) THEN v2 = designWidth
  495.   IF (v3 <= 0) THEN v3 = designHeight
  496.   XuiCreateGrid (@grid, Circle, @v0, @v1, @v2, @v3, r0, r1, &Circle())
  497.   XuiSendMessage ( grid, #SetGridName, 0, 0, 0, 0, 0, @"Circle")
  498.     XuiSendMessage ( grid, #SetBorder, 0, 0, 0, 0, 0, 0)
  499.   XuiArea        (@g, #Create, 4, 4, 444, 444, r0, grid)
  500.   XuiSendMessage ( g, #SetCallback, grid, &Circle(), -1, -1, $DrawingArea, grid)
  501.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"DrawingArea")
  502.   XuiSendMessage ( g, #SetColor, $$Black, $$White, $$Black, $$White, 0, 0)
  503.   XuiPushButton  (@g, #Create, 4, 448, 148, 20, r0, grid)
  504.   XuiSendMessage ( g, #SetCallback, grid, &Circle(), -1, -1, $ClearButton, grid)
  505.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"ClearButton")
  506.   XuiSendMessage ( g, #SetColor, $$BrightGreen, $$Black, $$Black, $$White, 0, 0)
  507.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @" Clear ")
  508.   XuiPushButton  (@g, #Create, 152, 448, 148, 20, r0, grid)
  509.   XuiSendMessage ( g, #SetCallback, grid, &Circle(), -1, -1, $PauseButton, grid)
  510.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"PauseButton")
  511.   XuiSendMessage ( g, #SetColor, 110, $$Black, $$Black, $$White, 0, 0)
  512.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @" Pause ")
  513.   XuiPushButton  (@g, #Create, 300, 448, 148, 20, r0, grid)
  514.   XuiSendMessage ( g, #SetCallback, grid, &Circle(), -1, -1, $QuitButton, grid)
  515.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"QuitButton")
  516.   XuiSendMessage ( g, #SetColor, 102, $$Black, $$Black, $$White, 0, 0)
  517.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @" Quit ")
  518.   GOSUB Resize
  519. END SUB
  520. '
  521. '
  522. ' *****  CreateWindow  *****  v0123 = xywh : r0 = windowType : r1$ = display$
  523. '
  524. SUB CreateWindow
  525.   IF (v0 =  0) THEN v0 = designX
  526.   IF (v1 =  0) THEN v1 = designY
  527.   IF (v2 <= 0) THEN v2 = designWidth
  528.   IF (v3 <= 0) THEN v3 = designHeight
  529.   XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  530.   v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  531.   GOSUB Create
  532.     r1 = 0 : ATTACH display$ TO r1$
  533.   XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"Circle")
  534. END SUB
  535. '
  536. '
  537. ' *****  GetSmallestSize  *****
  538. '
  539. SUB GetSmallestSize
  540.     v2 = 100
  541.     v3 = 120
  542.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  543.     FOR i = 2 TO 4
  544.         XuiSendMessage (grid, #GetSmallestSize, 0, 0, @ww, @hh, i, 0)
  545.         w = MAX (w, ww) : h = MAX (h, hh)
  546.     NEXT i
  547.     w = w + 4 AND -4
  548.     h = h + 4 AND -4
  549.     innerWidth = w + w + w
  550.     innerHeight = innerWidth + h
  551.     totalWidth = bw + bw + innerWidth
  552.     totalHeight = bw + bw + innerHeight
  553.     v2 = totalWidth
  554.     v3 = totalHeight
  555. END SUB
  556. '
  557. '
  558. ' *****  Resize  *****
  559. '
  560. SUB Resize
  561.     v2Entry = v2
  562.     v3Entry = v3
  563.     GOSUB GetSmallestSize
  564.     v2 = MAX (v2, v2Entry)
  565.     v3 = MAX (v3, v3Entry)
  566. '
  567.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  568. '
  569.     innerWidth = v2 - bw - bw
  570.     innerHeight = v3 - bw - bw
  571.     gw = innerWidth
  572.     gh = innerHeight - h
  573.     bw0 = innerWidth / 3
  574.     bw1 = bw0
  575.     bw2 = innerWidth - bw1 - bw0
  576.     bx0 = bw
  577.     bx1 = bx0 + bw0
  578.     bx2 = bx1 + bw1
  579.     by = v3-h-bw
  580. '
  581.     XuiSendMessage (grid, #Resize,  bw, bw,  gw, gh, 1, 0)
  582.     XuiSendMessage (grid, #Resize, bx0, by, bw0,  h, 2, 0)
  583.     XuiSendMessage (grid, #Resize, bx1, by, bw1,  h, 3, 0)
  584.     XuiSendMessage (grid, #Resize, bx2, by, bw2,  h, 4, 0)
  585.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, 0, 0, 0, 0, 0, 0)
  586. '
  587. ' start new code : create buffer grid first time through this subroutine
  588. '
  589.     XuiGetValues (grid, #GetValues, @g, @i, 0, 0, 0, 0)
  590. '
  591.     IFZ i THEN
  592.         XuiSendMessage (grid, #GetGridNumber, @g, 0, 0, 0, $DrawingArea, 0)
  593.         XgrCreateGrid  (@i, 1, 0, 0, v2, v3, r0, g, 0)
  594.         XgrSetGridBuffer (g, i, 0, 0)
  595.         XgrClearGrid (g, 0)
  596.         XuiSetValues (grid, #SetValues, g, i, 0, 0, 0, 0)
  597.     END IF
  598. '
  599.     XgrSetGridPositionAndSize (i, 0, 0, gw, gh)
  600. '
  601. ' end new code : buffer grid resized same as $DrawingArea kid grid
  602. '
  603.     XuiGetSize (grid, #GetSize, 0, 0, @width, @height, 0, 0)
  604.     XuiCallback (grid, #Resized, 0, 0, width, height, 0, 0)
  605. END SUB
  606. '
  607. '
  608. ' *****  Initialize  *****
  609. '
  610. SUB Initialize
  611.   XuiGetDefaultMessageFuncArray (@func[])
  612.   XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  613. '
  614.   func[#Callback]           = &XuiCallback()
  615.   func[#Resize]             = &XuiResizeNot()
  616.   func[#Selection]          = &XuiCallback()
  617.     func[#GetSmallestSize]    = 0
  618.     func[#Resize]             = 0
  619. '
  620.   DIM sub[upperMessage]
  621.   sub[#Create]              = SUBADDRESS (Create)
  622.   sub[#CreateWindow]        = SUBADDRESS (CreateWindow)
  623.   sub[#GetSmallestSize]     = SUBADDRESS (GetSmallestSize)
  624.   sub[#Resize]              = SUBADDRESS (Resize)
  625. '
  626.     IF func[0] THEN PRINT "Circle(): Initialize: Error::: (Undefined Message)"
  627.     IF sub[0] THEN PRINT "Circle(): Initialize: Error::: (Undefined Message)"
  628.   XuiRegisterGridType (@Circle, "Circle", &Circle(), @func[], @sub[])
  629. '
  630.   designX = 568
  631.   designY = 23
  632.   designWidth = 452
  633.   designHeight = 472
  634. '
  635.     gridType = Circle
  636.     XuiSetGridTypeValue (gridType, @"x",           designX)
  637.     XuiSetGridTypeValue (gridType, @"y",           designY)
  638.     XuiSetGridTypeValue (gridType, @"width",       designWidth)
  639.     XuiSetGridTypeValue (gridType, @"height",      designHeight)
  640.     XuiSetGridTypeValue (gridType, @"border",      $$BorderFrame)
  641.     XuiSetGridTypeValue (gridType, @"can",         $$Focus OR $$Respond OR $$Callback)
  642.   IFZ message THEN RETURN
  643. END SUB
  644. END FUNCTION
  645. '
  646. '
  647. ' ###########################
  648. ' #####  CircleCode ()  #####
  649. ' ###########################
  650. '
  651. FUNCTION  CircleCode (grid, message, v0, v1, v2, v3, r0, r1)
  652.     SHARED    Circle,  CircleGrid
  653.     SHARED    paused,  circleWidth,  circleHeight
  654.     STATIC    entry,  color,  dx,  dy,  half,  rad,  jjj
  655.     STATIC    s1#,  s2#,  a1#,  a2#
  656. '
  657.   $Circle       =   0  ' kid   0 grid type = Circle
  658.   $DrawingArea  =   1  ' kid   1 grid type = XuiArea
  659.   $ClearButton  =   2  ' kid   2 grid type = XuiPushButton
  660.   $PauseButton  =   3  ' kid   3 grid type = XuiPushButton
  661.   $QuitButton   =   4  ' kid   4 grid type = XuiPushButton
  662.   $UpperKid     =   4  ' kid maximum
  663. '
  664.     IFZ entry THEN entry = $$TRUE : GOSUB Resized
  665. ' XuiReportMessage (grid, message, v0, v1, v2, v3, r0, r1)
  666.     IF (message = #Callback) THEN message = r1
  667. '
  668.     SELECT CASE message
  669. '        CASE #Help:                GOSUB Help
  670.         CASE #Redraw:            GOSUB Redraw
  671.         CASE #Resized:        GOSUB Resized
  672.         CASE #Selection:    GOSUB Selection
  673.     END SELECT
  674.     RETURN
  675. '
  676. '
  677. ' ***********************
  678. ' *****  Selection  *****  Callbacks from Circle() pushbuttons
  679. ' ***********************
  680. '
  681. SUB Selection
  682.     SELECT CASE r0
  683.         CASE $ClearButton    : XgrClearGrid (CircleGrid, -1)
  684.         CASE $PauseButton    : paused = NOT paused
  685.         CASE $QuitButton    : QUIT (0)
  686.     END SELECT
  687. END SUB
  688. '
  689. '
  690. ' *********************
  691. ' *****  Resized  *****  Callbacks from Circle() resize routine
  692. ' *********************
  693. '
  694. SUB Resized
  695.     entry = $$TRUE
  696.     XuiSendMessage (Circle, #GetKidArray, 0, 0, 0, 0, 0, @kid[])
  697.     XuiSendMessage (Circle, #GetSize, 0, 0, @circleWidth, @circleHeight, 1, 0)
  698.     CircleGrid = kid[1]
  699.     s1#        = $$PI / 256#
  700.     s2#        = 4.9# * s1#
  701.     a1#        = 0#
  702.     a2#        = $$PI / 4#
  703.     dx        = circleWidth >> 1
  704.     dy        = circleHeight >> 1
  705.     rad        = MIN (circleWidth, circleHeight) >> 1
  706.     rad        = rad - 6
  707.     color = 0
  708.     XgrClearGrid (CircleGrid, -1)
  709. END SUB
  710. '
  711. '
  712. ' ********************
  713. ' *****  Redraw  *****  Messages from Entry ()
  714. ' ********************
  715. '
  716. SUB Redraw
  717.     INC jjj
  718.     IF (jjj > 100) THEN jjj = 0
  719.     IF (jjj < 50) THEN XgrClearGrid (CircleGrid, -1)        ' comment out or in for variety
  720.     FOR i = 0 TO 99
  721.         GOSUB Circle
  722.     NEXT i
  723.     INC color
  724. END SUB
  725. '
  726. '
  727. ' ********************
  728. ' *****  Circle  *****  Drawing subroutine
  729. ' ********************
  730. '
  731. SUB Circle
  732.     IF (a1# >= $$TWOPI) THEN
  733.         a1# = a1# - $$TWOPI
  734.         color = (color + 3)
  735.         IF (color > 124) THEN color = color - 124
  736.     END IF
  737.     IF (a2# >= $$TWOPI) THEN
  738.         a2# = a2# - $$TWOPI
  739.         INC i
  740.     END IF
  741.     IFZ color THEN INC color
  742.     p1x    = SIN (a1#) * rad + dx
  743.     p1y    = COS (a1#) * rad + dy
  744.     p2x    = SIN (a2#) * rad + dx
  745.     p2y    = COS (a2#) * rad + dy
  746.     XgrDrawLine (CircleGrid, color, p1x, p1y, p2x, p2y)
  747.     a1#    = a1# + s1#
  748.     a2#    = a2# + s2#
  749.     s2# = 1.0002# * s2#
  750.     IF (s2# > $$TWOPI) THEN s2# = s2# - $$TWOPI
  751. END SUB
  752. END FUNCTION
  753. END PROGRAM
  754.