home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 August / PCWorld_2000-08_cd.bin / Software / TemaCD / xbasic / xbpro.exe / xb / xgrids.x < prev    next >
Encoding:
Text File  |  1995-04-20  |  172.1 KB  |  5,425 lines

  1. '
  2. ' #######################
  3. ' #####  IMPORTANT  #####
  4. ' #######################
  5. '
  6. ' !!! This is NOT a program !!!
  7. ' !!! This file will not compile or execute !!!
  8. '
  9. ' This is a collection of grids aka grid functions.
  10. ' This is meant to help you design / modify your own grid functions.
  11. '
  12. ' These functions work, but are not guaranteed to be bug-free, since
  13. ' this file is not kept up to date when bugs are fixed and enhancements
  14. ' made in subsequent GraphicsDesigner and GuiDesigner releases.
  15. '
  16. ' Note that you cannot imbed these functions in your programs without
  17. ' renaming the functions and grid types because the function and grid
  18. ' type names are already defined in GuiDesigner.
  19. '
  20. DECLARE FUNCTION  XuiCheckBox     (grid, message, v0, v1, v2, v3, r0, ANY)
  21. DECLARE FUNCTION  XuiColor        (grid, message, v0, v1, v2, v3, r0, ANY)
  22. DECLARE FUNCTION  XuiDialog2B     (grid, message, v0, v1, v2, v3, r0, ANY)
  23. DECLARE FUNCTION  XuiDialog3B     (grid, message, v0, v1, v2, v3, r0, ANY)
  24. DECLARE FUNCTION  XuiDialog4B     (grid, message, v0, v1, v2, v3, r0, ANY)
  25. DECLARE FUNCTION  XuiDropBox      (grid, message, v0, v1, v2, v3, r0, ANY)
  26. DECLARE FUNCTION  XuiDropButton   (grid, message, v0, v1, v2, v3, r0, ANY)
  27. DECLARE FUNCTION  XuiLabel        (grid, message, v0, v1, v2, v3, r0, ANY)
  28. DECLARE FUNCTION  XuiListBox      (grid, message, v0, v1, v2, v3, r0, ANY)
  29. DECLARE FUNCTION  XuiListButton   (grid, message, v0, v1, v2, v3, r0, ANY)
  30. DECLARE FUNCTION  XuiListDialog2B (grid, message, v0, v1, v2, v3, r0, ANY)
  31. DECLARE FUNCTION  XuiMessage1B    (grid, message, v0, v1, v2, v3, r0, ANY)
  32. DECLARE FUNCTION  XuiMessage2B    (grid, message, v0, v1, v2, v3, r0, ANY)
  33. DECLARE FUNCTION  XuiMessage3B    (grid, message, v0, v1, v2, v3, r0, ANY)
  34. DECLARE FUNCTION  XuiMessage4B    (grid, message, v0, v1, v2, v3, r0, ANY)
  35. DECLARE FUNCTION  XuiPressButton  (grid, message, v0, v1, v2, v3, r0, ANY)
  36. DECLARE FUNCTION  XuiProgress     (grid, message, v0, v1, v2, v3, r0, ANY)
  37. DECLARE FUNCTION  XuiPushButton   (grid, message, v0, v1, v2, v3, r0, ANY)
  38. DECLARE FUNCTION  XuiRadioBox     (grid, message, v0, v1, v2, v3, r0, ANY)
  39. DECLARE FUNCTION  XuiRadioButton  (grid, message, v0, v1, v2, v3, r0, ANY)
  40. DECLARE FUNCTION  XuiRange        (grid, message, v0, v1, v2, v3, r0, ANY)
  41. DECLARE FUNCTION  XuiScrollBarH   (grid, message, v0, v1, v2, v3, r0, ANY)
  42. DECLARE FUNCTION  XuiScrollBarV   (grid, message, v0, v1, v2, v3, r0, ANY)
  43. DECLARE FUNCTION  XuiToggleButton (grid, message, v0, v1, v2, v3, r0, ANY)
  44. '
  45. '
  46. ' ############################
  47. ' #####  XuiCheckBox ()  #####
  48. ' ############################
  49. '
  50. FUNCTION  XuiCheckBox (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  51.   STATIC    designX,  designY,  designWidth,  designHeight
  52.     STATIC    SUBADDR        sub[]
  53.     STATIC    upperMessage
  54.     STATIC    XuiCheckBox
  55. '
  56.     IFZ sub[] THEN GOSUB Initialize
  57.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiCheckBox) THEN RETURN
  58.     GOSUB @sub[message]
  59.     RETURN
  60. '
  61. '
  62. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  63. '
  64. SUB Create
  65.     IF (v0 <= 0) THEN v0 = 0
  66.     IF (v1 <= 0) THEN v1 = 0
  67.     IF (v2 <= 0) THEN v2 = designWidth
  68.     IF (v3 <= 0) THEN v3 = designHeight
  69.     XuiCreateGrid (@grid, XuiCheckBox, @v0, @v1, @v2, @v3, r0, r1, &XuiCheckBox())
  70. END SUB
  71. '
  72. '
  73. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  74. '
  75. SUB CreateWindow
  76.     IF (v0  = 0) THEN v0 = designX
  77.     IF (v1  = 0) THEN v1 = designY
  78.     IF (v2 <= 0) THEN v2 = designWidth
  79.     IF (v3 <= 0) THEN v3 = designHeight
  80.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  81.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  82.     GOSUB Create
  83.     r1 = 0 : ATTACH display$ TO r1$
  84.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiCheckBox")
  85. END SUB
  86. '
  87. '
  88. ' *****  KeyDown  *****  #Selection callback on $$KeyEnter
  89. '
  90. SUB KeyDown
  91.     XuiGetState (grid, #GetState, @state, @keyboard, 0, 0, 0, 0)
  92.     IFZ (state AND keyboard) THEN EXIT SUB
  93.     state = v2                                                                            ' v2 = state
  94.     key = state{8,24}                                                                ' virtual key
  95.     IF (state AND $$AltBit) THEN EXIT SUB                        ' disallow Alt+Enter
  96.     IF (key = $$KeyEnter) THEN GOSUB Selected                ' got Enter
  97. END SUB
  98. '
  99. '
  100. ' *****  MouseDown  *****
  101. '
  102. SUB MouseDown
  103.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  104.     IFZ (state AND mouse) THEN EXIT SUB
  105.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  106.     GOSUB Selected
  107. END SUB
  108. '
  109. '
  110. ' *****  Selected  *****
  111. '
  112. SUB Selected
  113.     XuiGetValue (grid, #GetValue, @state, 0, 0, 0, 0, 0)
  114.     IF state THEN state = $$FALSE ELSE state = $$TRUE
  115.     XuiSetValue (grid, #SetValue, state, 0, 0, 0, 0, 0)
  116.     GOSUB RedrawGrid
  117.     XuiCallback (grid, #Selection, state, 0, v2, v3, 0, grid)
  118. END SUB
  119. '
  120. '
  121. ' *****  RedrawGrid  *****
  122. '
  123. SUB RedrawGrid
  124.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  125.     IFZ (state AND redraw) THEN EXIT SUB
  126.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  127.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  128.     width = x2 - x1 + 1 : height = y2 - y1 + 1
  129.     XuiGetValue (grid, #GetValue, @state, 0, 0, 0, 0, 0)
  130.     XuiGetColor (grid, #GetColor, @back, @draw, @lo, @hi, 0, 0)
  131.     XuiGetColorExtra (grid, #GetColorExtra, 0, @acc, 0, 0, 0, 0)
  132.     XuiGetIndent (grid, #GetIndent, @inX, @inY, 0, 0, 0, @bw)
  133.     xx = x1 + ((inX - 12) >> 1) + bw - 1 : yy = y1 + (height >> 1) - 6
  134.     XgrDrawBorder (grid, $$BorderLower2, back, lo, hi, xx, yy, xx+11, yy+11)
  135.     IF state THEN base = acc ELSE base = back
  136.     XgrFillBox (grid, base, xx+2, yy+2, xx+9, yy+9)
  137.     IF state THEN
  138.         XgrDrawLine (grid, draw, xx+4, yy+3, xx+8, yy+7)
  139.         XgrDrawLine (grid, draw, xx+3, yy+3, xx+8, yy+8)
  140.         XgrDrawLine (grid, draw, xx+3, yy+4, xx+7, yy+8)
  141.         XgrDrawLine (grid, draw, xx+3, yy+7, xx+7, yy+3)
  142.         XgrDrawLine (grid, draw, xx+3, yy+8, xx+8, yy+3)
  143.         XgrDrawLine (grid, draw, xx+4, yy+8, xx+8, yy+4)
  144.     END IF
  145. END SUB
  146. '
  147. '
  148. ' *****  Initialize  ****
  149. '
  150. SUB Initialize
  151.     XuiGetDefaultMessageFuncArray (@func[])
  152.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  153. '
  154.     func[#Redraw]                            = 0
  155.     func[#RedrawGrid]                    = 0
  156. '
  157.     DIM sub[upperMessage]
  158.     sub[#Create]                            = SUBADDRESS (Create)
  159.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  160.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  161.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  162.     sub[#Redraw]                            = SUBADDRESS (RedrawGrid)
  163.     sub[#RedrawGrid]                    = SUBADDRESS (RedrawGrid)
  164. '
  165.     IF func[0] THEN PRINT "XuiCheckBox() : Initialize : error ::: (undefined message)"
  166.     IF sub[0] THEN PRINT "XuiCheckBox() : Initialize : error ::: (undefined message)"
  167.     XuiRegisterGridType (@XuiCheckBox, @"XuiCheckBox", &XuiCheckBox(), @func[], @sub[])
  168. '
  169.     designX = 0
  170.     designY = 0
  171.     designWidth = 80
  172.     designHeight = 20
  173. '
  174.     gridType = XuiCheckBox
  175.     XuiSetGridTypeValue (gridType, @"x",            designX)
  176.     XuiSetGridTypeValue (gridType, @"y",            designY)
  177.     XuiSetGridTypeValue (gridType, @"width",        designWidth)
  178.     XuiSetGridTypeValue (gridType, @"height",       designHeight)
  179.     XuiSetGridTypeValue (gridType, @"minWidth",     32)
  180.     XuiSetGridTypeValue (gridType, @"minHeight",    16)
  181.     XuiSetGridTypeValue (gridType, @"indentLeft",   24)
  182.     XuiSetGridTypeValue (gridType, @"align",        $$AlignMiddleLeft)
  183.     XuiSetGridTypeValue (gridType, @"border",       $$BorderRaise1)
  184.     XuiSetGridTypeValue (gridType, @"borderUp",     $$BorderRaise1)
  185.     XuiSetGridTypeValue (gridType, @"borderDown",   $$BorderRaise1)
  186.     XuiSetGridTypeValue (gridType, @"texture",      $$TextureLower1)
  187.     XuiSetGridTypeValue (gridType, @"can",          $$Focus OR $$Respond OR $$Callback)
  188.     XuiSetGridTypeValue (gridType, @"redrawFlags",  $$RedrawDefault)
  189.     IFZ message THEN RETURN
  190. END SUB
  191. END FUNCTION
  192. '
  193. '
  194. ' #########################
  195. ' #####  XuiColor ()  #####
  196. ' #########################
  197. '
  198. FUNCTION  XuiColor (grid, message, v0, v1, v2, v3, r0, r1)
  199.   STATIC    designX,  designY,  designWidth,  designHeight
  200.     STATIC    SUBADDR        sub[]
  201.     STATIC    upperMessage
  202.     STATIC    XuiColor
  203. '
  204.     IFZ sub[] THEN GOSUB Initialize
  205.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiColor) THEN RETURN
  206.     GOSUB @sub[message]
  207.     RETURN
  208. '
  209. '
  210. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  211. '
  212. SUB Create
  213.     IF (v0 <= 0) THEN v0 = 0
  214.     IF (v1 <= 0) THEN v1 = 0
  215.     IF (v2 <= 0) THEN v2 = designWidth
  216.     IF (v3 <= 0) THEN v3 = designHeight
  217.     XuiCreateGrid (@grid, XuiColor, @v0, @v1, @v2, @v3, r0, r1, &XuiColor())
  218. END SUB
  219. '
  220. '
  221. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  222. '
  223. SUB CreateWindow
  224.     IF (v0  = 0) THEN v0 = designX
  225.     IF (v1  = 0) THEN v1 = designY
  226.     IF (v2 <= 0) THEN v2 = designWidth
  227.     IF (v3 <= 0) THEN v3 = designHeight
  228.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  229.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  230.     GOSUB Create
  231.     r1 = 0 : ATTACH display$ TO r1$
  232.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiColor")
  233. END SUB
  234. '
  235. '
  236. ' *****  MouseDown  *****
  237. '
  238. SUB MouseDown
  239.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  240.     IFZ (state AND redraw) THEN EXIT SUB
  241.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  242.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  243.     top = y1
  244.     left = x1
  245.     right = x2
  246.     bottom = y2
  247.     IF (v1 < top) THEN EXIT SUB
  248.     IF (v0 < left) THEN EXIT SUB
  249.     IF (v0 > right) THEN EXIT SUB
  250.     IF (v1 > bottom) THEN EXIT SUB
  251.     row = (v1 - top) >> 4
  252.     col = (v0 - left) >> 3
  253.     color = row * 25 + col
  254.     XgrConvertColorToRGB (color, @red, @green, @blue)
  255.     XuiCallback (grid, #Selection, color, red, green, blue, color, grid)
  256. END SUB
  257. '
  258. '
  259. ' *****  Redraw  *****
  260. '
  261. SUB Redraw
  262.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  263.     IFZ (state AND redraw) THEN EXIT SUB
  264.     colorNumber = 0
  265.     FOR i = 0 TO 4
  266.         FOR j = 0 TO 24
  267.             x1 = j *  8:    x2 = x1 +  7
  268.             y1 = i * 16:    y2 = y1 + 15
  269.             XgrFillBox (grid, colorNumber, x1, y1, x2, y2)
  270.             INC colorNumber
  271.         NEXT j
  272.     NEXT i
  273. END SUB
  274. '
  275. '
  276. ' *****  Initialize  ****
  277. '
  278. SUB Initialize
  279.     XuiGetDefaultMessageFuncArray (@func[])
  280.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  281. '
  282.     func[#GetSmallestSize]        = &XuiGetMaxMinSize ()
  283.     func[#Redraw]                            = 0
  284.     func[#RedrawGrid]                    = 0
  285. '
  286.     DIM sub[upperMessage]
  287.     sub[#Create]                            = SUBADDRESS (Create)
  288.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  289.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  290.     sub[#Redraw]                            = SUBADDRESS (Redraw)
  291.     sub[#RedrawGrid]                    = SUBADDRESS (Redraw)
  292. '
  293.     IF func[0] THEN PRINT "XuiColor() : Initialize : error ::: (undefined message)"
  294.     IF sub[0] THEN PRINT "XuiColor() : Initialize : error ::: (undefined message)"
  295.     XuiRegisterGridType (@XuiColor, @"XuiColor", &XuiColor(), @func[], @sub[])
  296. '
  297.     designX = 0
  298.     designY = 0
  299.     designWidth = 200
  300.     designHeight = 80
  301. '
  302.     gridType = XuiColor
  303.     XuiSetGridTypeValue (gridType, @"x",              designX)
  304.     XuiSetGridTypeValue (gridType, @"y",              designY)
  305.     XuiSetGridTypeValue (gridType, @"width",          designWidth)
  306.     XuiSetGridTypeValue (gridType, @"height",         designHeight)
  307.     XuiSetGridTypeValue (gridType, @"minWidth",       designWidth)
  308.     XuiSetGridTypeValue (gridType, @"minHeight",      designHeight)
  309.     XuiSetGridTypeValue (gridType, @"maxWidth",       designWidth)
  310.     XuiSetGridTypeValue (gridType, @"maxHeight",      designHeight)
  311.     XuiSetGridTypeValue (gridType, @"can",            $$Respond OR $$Callback)
  312.     XuiSetGridTypeValue (gridType, @"redrawFlags",    $$RedrawNone)
  313.     IFZ message THEN RETURN
  314. END SUB
  315. END FUNCTION
  316. '
  317. '
  318. ' ############################
  319. ' #####  XuiDialog2B ()  #####  Label, TextLine, and 2 PushButtons
  320. ' ############################
  321. '
  322. FUNCTION  XuiDialog2B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  323.     STATIC    designX,  designY,  designWidth,  designHeight
  324.     STATIC    SUBADDR  sub[]
  325.     STATIC    upperMessage
  326.     STATIC    XuiDialog2B
  327. '
  328.     $XuiDialog2B    = 0
  329.     $Label                = 1
  330.     $TextLine            = 2
  331.     $Button0            = 3
  332.     $Button1            = 4
  333. '
  334.     IFZ sub[] THEN GOSUB Initialize
  335.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiDialog2B) THEN RETURN
  336.     GOSUB @sub[message]
  337.     RETURN
  338. '
  339. '
  340. ' *****  Callback  *****  message = Callback : r1 = original message
  341. '
  342. SUB Callback
  343.     message = r1
  344.     callback = message
  345.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  346. END SUB
  347. '
  348. '
  349. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  350. '
  351. SUB Create
  352.     IF (v0 <= 0) THEN v0 = 0
  353.     IF (v1 <= 0) THEN v1 = 0
  354.     IF (v2 <= 0) THEN v2 = designWidth
  355.     IF (v3 <= 0) THEN v3 = designHeight
  356.     XuiCreateGrid  (@grid, XuiDialog2B, @v0, @v1, @v2, @v3, r0, r1, &XuiDialog2B())
  357.     XuiLabel       (@g, #Create, 0, 0, 0, 0, r0, grid)
  358.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  359.     XuiTextLine    (@g, #Create, 0, 0, 0, 0, r0, grid)
  360.     XuiSendMessage ( g, #SetCallback, grid, &XuiDialog2B(), -1, -1, $TextLine, grid)
  361.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  362.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  363.     XuiSendMessage ( g, #SetCallback, grid, &XuiDialog2B(), -1, -1, $Button0, grid)
  364.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  365.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  366.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  367.     XuiSendMessage ( g, #SetCallback, grid, &XuiDialog2B(), -1, -1, $Button1, grid)
  368.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  369.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  370.     GOSUB Resize
  371. END SUB
  372. '
  373. '
  374. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  375. '
  376. SUB CreateWindow
  377.     IF (v0  = 0) THEN v0 = designX
  378.     IF (v1  = 0) THEN v1 = designY
  379.     IF (v2 <= 0) THEN v2 = designWidth
  380.     IF (v3 <= 0) THEN v3 = designHeight
  381.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  382.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  383.     GOSUB Create
  384.     r1 = 0 : ATTACH display$ TO r1$
  385.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiDialog2B")
  386. END SUB
  387. '
  388. '
  389. ' *****  GetSmallestSize  *****
  390. '
  391. SUB GetSmallestSize
  392.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  393.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @labelWidth, @labelHeight, $Label, 8)
  394.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @textWidth, @textHeight, $TextLine, 8)
  395. '
  396.     buttonWidth = 8
  397.     buttonHeight = 8
  398.     FOR i = $Button0 TO $Button1
  399.         XuiSendToKid (grid, #GetSmallestSize, 0, 0, @width, @height, i, 8)
  400.         IF (width > buttonWidth) THEN buttonWidth = width
  401.         IF (height > buttonHeight) THEN buttonHeight = height
  402.     NEXT i
  403.     width = buttonWidth + buttonWidth
  404.     IF (width < labelWidth) THEN width = labelWidth
  405.     v2 = width + bw + bw
  406.     v3 = labelHeight + buttonHeight + textHeight + bw + bw
  407. END SUB
  408. '
  409. '
  410. ' *****  Resize  *****
  411. '
  412. SUB Resize
  413.     vv2 = v2
  414.     vv3 = v3
  415.     GOSUB GetSmallestSize                ' returns bw and heights
  416.     v2 = MAX (vv2, v2)
  417.     v3 = MAX (vv3, v3)
  418. '
  419.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  420. '
  421.     h = labelHeight + buttonHeight + textHeight + bw + bw
  422.     IF (v3 >= h + 4) THEN
  423.         buttonHeight = buttonHeight + 4 : h = h + 4
  424.         IF (v3 >= h + 4) THEN textHeight = textHeight + 4
  425.     END IF
  426. '
  427.     labelWidth    = v2 - bw - bw
  428.     labelHeight    = v3 - buttonHeight - textHeight - bw - bw
  429.     buttonWidth    = labelWidth >> 1
  430.     w0                    = buttonWidth
  431.     w1                    = labelWidth - w0
  432. '
  433.     x = bw
  434.     y = bw
  435.     w = labelWidth
  436.     XuiSendToKid (grid, #Resize, x, y, w, labelHeight, $Label, 0)
  437. '
  438.     y = y + labelHeight
  439.     XuiSendToKid (grid, #Resize, x, y, w, textHeight, $TextLine, 0)
  440. '
  441.     h = buttonHeight
  442.     y = y + textHeight
  443.     XuiSendToKid (grid, #Resize, x, y, w0, h, $Button0, 0) : x = x + w0
  444.     XuiSendToKid (grid, #Resize, x, y, w1, h, $Button1, 0) : x = x + w1
  445.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  446. END SUB
  447. '
  448. '
  449. ' *****  Selection  *****
  450. '
  451. SUB Selection
  452. END SUB
  453. '
  454. '
  455. ' *****  Initialize  ****
  456. '
  457. SUB Initialize
  458.     XuiGetDefaultMessageFuncArray (@func[])
  459.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  460. '
  461.     func[#Callback]           = &XuiCallback()
  462.     func[#GetSmallestSize]    = 0
  463.     func[#Resize]             = 0
  464. '
  465.     DIM sub[upperMessage]
  466.   sub[#Callback]            = SUBADDRESS (Callback)
  467.     sub[#Create]              = SUBADDRESS (Create)
  468.     sub[#CreateWindow]        = SUBADDRESS (CreateWindow)
  469.     sub[#GetSmallestSize]     = SUBADDRESS (GetSmallestSize)
  470.     sub[#Resize]              = SUBADDRESS (Resize)
  471.   sub[#Selection]                        = SUBADDRESS (Selection)
  472. '
  473.     IF func[0] THEN PRINT "XuiDialog2B() : Initialize : error ::: (undefined message)"
  474.     IF sub[0] THEN PRINT "XuiDialog2B() : Initialize : error ::: (undefined message)"
  475.     XuiRegisterGridType (@XuiDialog2B, @"XuiDialog2B", &XuiDialog2B(), @func[], @sub[])
  476. '
  477.     designX = 0
  478.     designY = 0
  479.     designWidth = 160
  480.     designHeight = 68
  481. '
  482.     gridType = XuiDialog2B
  483.     XuiSetGridTypeValue (gridType, @"x",               designX)
  484.     XuiSetGridTypeValue (gridType, @"y",               designY)
  485.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  486.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  487.     XuiSetGridTypeValue (gridType, @"minWidth",        64)
  488.     XuiSetGridTypeValue (gridType, @"minHeight",       24)
  489. '    XuiSetGridTypeValue (gridType, @"minWidth",        designWidth)
  490. '    XuiSetGridTypeValue (gridType, @"minHeight",       designHeight)
  491. '    XuiSetGridTypeValue (gridType, @"maxWidth",        designWidth)
  492. '    XuiSetGridTypeValue (gridType, @"maxHeight",       designHeight)
  493.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  494.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  495.     XuiSetGridTypeValue (gridType, @"focusKid",        $TextLine)
  496.     XuiSetGridTypeValue (gridType, @"inputTextString", $TextLine)
  497.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  498.     IFZ message THEN RETURN
  499. END SUB
  500. END FUNCTION
  501. '
  502. '
  503. ' ############################
  504. ' #####  XuiDialog3B ()  #####  Label, TextLine, 3 PushButtons
  505. ' ############################
  506. '
  507. FUNCTION  XuiDialog3B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  508.   STATIC    designX,  designY,  designWidth,  designHeight
  509.   STATIC    SUBADDR  sub[]
  510.     STATIC    upperMessage
  511.   STATIC    XuiDialog3B
  512. '
  513.   $XuiDialog3B   =  0  ' kid  0 grid type = XuiDialog3B
  514.   $Label         =  1  ' kid  1 grid type = XuiLabel
  515.   $TextLine      =  2  ' kid  2 grid type = XuiTextLine
  516.   $Button0       =  3  ' kid  3 grid type = XuiPushButton
  517.   $Button1       =  4  ' kid  4 grid type = XuiPushButton
  518.   $Button2       =  5  ' kid  5 grid type = XuiPushButton
  519. '
  520.   IFZ sub[] THEN GOSUB Initialize
  521.   IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiDialog3B) THEN RETURN
  522.   GOSUB @sub[message]
  523.   RETURN
  524. '
  525. '
  526. ' *****  Callback  *****  message = Callback : r1 = original message
  527. '
  528. SUB Callback
  529.   message = r1
  530.     callback = message
  531.   IF (message <= upperMessage) THEN GOSUB @sub[message]
  532. END SUB
  533. '
  534. '
  535. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  536. '
  537. SUB Create
  538.     IF (v0 <= 0) THEN v0 = 0
  539.     IF (v1 <= 0) THEN v1 = 0
  540.     IF (v2 <= 0) THEN v2 = designWidth
  541.     IF (v3 <= 0) THEN v3 = designHeight
  542.   XuiCreateGrid  (@grid, XuiDialog3B, @v0, @v1, @v2, @v3, r0, r1, &XuiDialog3B())
  543.   XuiLabel       (@g, #Create, 4, 4, 312, 20, r0, grid)
  544.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  545.   XuiTextLine    (@g, #Create, 4, 24, 312, 24, r0, grid)
  546.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog3B(), -1, -1, $TextLine, grid)
  547.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  548.   XuiPushButton  (@g, #Create, 4, 48, 104, 20, r0, grid)
  549.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog3B(), -1, -1, $Button0, grid)
  550.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  551.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  552.   XuiPushButton  (@g, #Create, 108, 48, 104, 20, r0, grid)
  553.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog3B(), -1, -1, $Button1, grid)
  554.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  555.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Retry")
  556.   XuiPushButton  (@g, #Create, 212, 48, 104, 20, r0, grid)
  557.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog3B(), -1, -1, $Button2, grid)
  558.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button2")
  559.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  560.   GOSUB Resize
  561. END SUB
  562. '
  563. '
  564. ' *****  CreateWindow  *****  v0123 = xywh : r0 = windowType : r1$ = display$
  565. '
  566. SUB CreateWindow
  567.     IF (v0  = 0) THEN v0 = designX
  568.     IF (v1  = 0) THEN v1 = designY
  569.     IF (v2 <= 0) THEN v2 = designWidth
  570.     IF (v3 <= 0) THEN v3 = designHeight
  571.   XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  572.   v0 = 0 : v1 = 0 : r0 = window : display$ = r1$ : r1 = 0
  573.   GOSUB Create
  574.     r1 = 0 : r1$ = display$
  575.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiDialog3B")
  576. END SUB
  577. '
  578. '
  579. ' *****  GetSmallestSize  *****
  580. '
  581. SUB GetSmallestSize
  582.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  583.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @labelWidth, @labelHeight, $Label, 8)
  584.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @textWidth, @textHeight, $TextLine, 8)
  585. '
  586.     buttonWidth = 8
  587.     buttonHeight = 8
  588.     FOR i = $Button0 TO $Button2
  589.         XuiSendToKid (grid, #GetSmallestSize, 0, 0, @width, @height, i, 8)
  590.         IF (width > buttonWidth) THEN buttonWidth = width
  591.         IF (height > buttonHeight) THEN buttonHeight = height
  592.     NEXT i
  593.     width = buttonWidth + buttonWidth + buttonWidth
  594.     IF (width < labelWidth) THEN width = labelWidth
  595.     v2 = width + bw + bw
  596.     v3 = labelHeight + buttonHeight + textHeight + bw + bw
  597. END SUB
  598. '
  599. '
  600. ' *****  Resize  *****
  601. '
  602. SUB Resize
  603.     vv2 = v2
  604.     vv3 = v3
  605.     GOSUB GetSmallestSize                ' returns bw and heights
  606.     v2 = MAX (vv2, v2)
  607.     v3 = MAX (vv3, v3)
  608. '
  609.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  610. '
  611.     h = labelHeight + buttonHeight + textHeight + bw + bw
  612.     IF (v3 >= (h + 4)) THEN h = h + 4 : buttonHeight = buttonHeight + 4
  613.     IF (v3 >= (h + 4)) THEN h = h + 4 : textHeight = textHeight + 4
  614.     IF (v3 >= (h + 4)) THEN h = h + 4 : labelHeight = labelHeight + 4
  615. '
  616.     labelWidth    = v2 - bw - bw
  617.     labelHeight    = v3 - buttonHeight - textHeight - bw - bw
  618.     buttonWidth    = labelWidth \ 3
  619.     w0 = buttonWidth
  620.     w1 = labelWidth - w0 - w0
  621.     w2 = buttonWidth
  622. '
  623.     x = bw
  624.     y = bw
  625.     w = labelWidth
  626.     XuiSendToKid (grid, #Resize, x, y, w, labelHeight, $Label, 0)
  627. '
  628.     y = y + labelHeight
  629.     XuiSendToKid (grid, #Resize, x, y, w, textHeight, $TextLine, 0)
  630. '
  631.     h = buttonHeight
  632.     y = y + textHeight
  633.     XuiSendToKid (grid, #Resize, x, y, w0, h, $Button0, 0) : x = x + w0
  634.     XuiSendToKid (grid, #Resize, x, y, w1, h, $Button1, 0) : x = x + w1
  635.     XuiSendToKid (grid, #Resize, x, y, w2, h, $Button2, 0) : x = x + w2
  636.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  637. END SUB
  638. '
  639. '
  640. ' *****  Selection  *****
  641. '
  642. SUB Selection
  643. END SUB
  644. '
  645. '
  646. ' *****  Initialize  *****
  647. '
  648. SUB Initialize
  649.     XuiGetDefaultMessageFuncArray (@func[])
  650.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  651. '
  652.     func[#Callback]                        = &XuiCallback()
  653.     func[#GetSmallestSize]        = 0
  654.     func[#Resize]                            = 0
  655. '
  656.     DIM sub[upperMessage]
  657.     sub[#Create]                            = SUBADDRESS (Create)
  658.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  659.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  660.     sub[#Resize]                            = SUBADDRESS (Resize)
  661. '
  662.     IF func[0] THEN PRINT "XuiDialog3B() : Initialize : error ::: (undefined message)"
  663.     IF sub[0] THEN PRINT "XuiDialog3B() : Initialize : error ::: (undefined message)"
  664.   XuiRegisterGridType (@XuiDialog3B, "XuiDialog3B", &XuiDialog3B(), @func[], @sub[])
  665. '
  666.   designX = 0
  667.   designY = 0
  668.   designWidth = 240
  669.   designHeight = 68
  670. '
  671.     gridType = XuiDialog3B
  672.     XuiSetGridTypeValue (gridType, @"x",               designX)
  673.     XuiSetGridTypeValue (gridType, @"y",               designY)
  674.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  675.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  676.     XuiSetGridTypeValue (gridType, @"minWidth",        64)
  677.     XuiSetGridTypeValue (gridType, @"minHeight",       24)
  678.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  679.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  680.     XuiSetGridTypeValue (gridType, @"focusKid",         $TextLine)
  681.     XuiSetGridTypeValue (gridType, @"inputTextString",  $TextLine)
  682.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  683.   IFZ message THEN RETURN
  684. END SUB
  685. END FUNCTION
  686. '
  687. '
  688. ' ############################
  689. ' #####  XuiDialog4B ()  #####  Label, TextLine, 4 PushButtons
  690. ' ############################
  691. '
  692. FUNCTION  XuiDialog4B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  693.   STATIC    designX,  designY,  designWidth,  designHeight
  694.   STATIC    SUBADDR  sub[]
  695.     STATIC    upperMessage
  696.   STATIC    XuiDialog4B
  697. '
  698.   $XuiDialog4B   =  0  ' kid  0 grid type = XuiDialog4B
  699.   $Label         =  1  ' kid  1 grid type = XuiLabel
  700.   $TextLine      =  2  ' kid  2 grid type = XuiTextLine
  701.   $Button0       =  3  ' kid  3 grid type = XuiPushButton
  702.   $Button1       =  4  ' kid  4 grid type = XuiPushButton
  703.   $Button2       =  5  ' kid  5 grid type = XuiPushButton
  704.   $Button3       =  6  ' kid  6 grid type = XuiPushButton
  705. '
  706.   IFZ sub[] THEN GOSUB Initialize
  707.   IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiDialog4B) THEN RETURN
  708.   GOSUB @sub[message]
  709.   RETURN
  710. '
  711. '
  712. ' *****  Callback  *****  message = Callback : r1 = original message
  713. '
  714. SUB Callback
  715.   message = r1
  716.     callback = message
  717.   IF (message <= upperMessage) THEN GOSUB @sub[message]
  718. END SUB
  719. '
  720. '
  721. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  722. '
  723. SUB Create
  724.     IF (v0 <= 0) THEN v0 = 0
  725.     IF (v1 <= 0) THEN v1 = 0
  726.     IF (v2 <= 0) THEN v2 = designWidth
  727.     IF (v3 <= 0) THEN v3 = designHeight
  728.   XuiCreateGrid  (@grid, XuiDialog4B, @v0, @v1, @v2, @v3, r0, r1, &XuiDialog4B())
  729.   XuiLabel       (@g, #Create, 4, 4, 312, 20, r0, grid)
  730.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  731.   XuiTextLine    (@g, #Create, 4, 24, 312, 24, r0, grid)
  732.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog4B(), -1, -1, $TextLine, grid)
  733.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  734.   XuiPushButton  (@g, #Create, 4, 48, 104, 20, r0, grid)
  735.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog4B(), -1, -1, $Button0, grid)
  736.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  737.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  738.   XuiPushButton  (@g, #Create, 108, 48, 104, 20, r0, grid)
  739.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog4B(), -1, -1, $Button1, grid)
  740.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  741.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Update")
  742.   XuiPushButton  (@g, #Create, 212, 48, 104, 20, r0, grid)
  743.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog4B(), -1, -1, $Button2, grid)
  744.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button2")
  745.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Retry")
  746.   XuiPushButton  (@g, #Create, 212, 48, 104, 20, r0, grid)
  747.   XuiSendMessage ( g, #SetCallback, grid, &XuiDialog4B(), -1, -1, $Button3, grid)
  748.   XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button3")
  749.   XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  750.   GOSUB Resize
  751. END SUB
  752. '
  753. '
  754. ' *****  CreateWindow  *****  v0123 = xywh : r0 = windowType : r1$ = display$
  755. '
  756. SUB CreateWindow
  757.     IF (v0  = 0) THEN v0 = designX
  758.     IF (v1  = 0) THEN v1 = designY
  759.     IF (v2 <= 0) THEN v2 = designWidth
  760.     IF (v3 <= 0) THEN v3 = designHeight
  761.   XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  762.   v0 = 0 : v1 = 0 : r0 = window : display$ = r1$ : r1 = 0
  763.   GOSUB Create
  764.     r1 = 0 : r1$ = display$
  765.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiDialog4B")
  766. END SUB
  767. '
  768. '
  769. ' *****  GetSmallestSize  *****
  770. '
  771. SUB GetSmallestSize
  772.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  773.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @labelWidth, @labelHeight, $Label, 8)
  774.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @textWidth, @textHeight, $TextLine, 8)
  775. '
  776.     buttonWidth = 8
  777.     buttonHeight = 8
  778.     FOR i = $Button0 TO $Button3
  779.         XuiSendToKid (grid, #GetSmallestSize, 0, 0, @width, @height, i, 8)
  780.         IF (width > buttonWidth) THEN buttonWidth = width
  781.         IF (height > buttonHeight) THEN buttonHeight = height
  782.     NEXT i
  783.     width = buttonWidth << 2
  784.     IF (width < labelWidth) THEN width = labelWidth
  785.     v2 = width + bw + bw
  786.     v3 = labelHeight + buttonHeight + textHeight + bw + bw
  787. END SUB
  788. '
  789. '
  790. ' *****  Resize  *****
  791. '
  792. SUB Resize
  793.     vv2 = v2
  794.     vv3 = v3
  795.     GOSUB GetSmallestSize                ' returns bw and heights
  796.     v2 = MAX (vv2, v2)
  797.     v3 = MAX (vv3, v3)
  798. '
  799.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  800. '
  801.     h = labelHeight + buttonHeight + textHeight + bw + bw
  802.     IF (v3 >= (h + 4)) THEN h = h + 4 : buttonHeight = buttonHeight + 4
  803.     IF (v3 >= (h + 4)) THEN h = h + 4 : textHeight = textHeight + 4
  804.     IF (v3 >= (h + 4)) THEN h = h + 4 : labelHeight = labelHeight + 4
  805. '
  806.     labelWidth    = v2 - bw - bw
  807.     labelHeight    = v3 - buttonHeight - textHeight - bw - bw
  808.     buttonWidth    = labelWidth >> 2
  809.     w0 = buttonWidth
  810.     w1 = w0
  811.     w2 = w1
  812.     w3 = labelWidth - w0 - w1 - w2
  813. '
  814.     x = bw
  815.     y = bw
  816.     w = labelWidth
  817.     XuiSendToKid (grid, #Resize, x, y, w, labelHeight, $Label, 0)
  818. '
  819.     y = y + labelHeight
  820.     XuiSendToKid (grid, #Resize, x, y, w, textHeight, $TextLine, 0)
  821. '
  822.     h = buttonHeight
  823.     y = y + textHeight
  824.     XuiSendToKid (grid, #Resize, x, y, w0, h, $Button0, 0) : x = x + w0
  825.     XuiSendToKid (grid, #Resize, x, y, w1, h, $Button1, 0) : x = x + w1
  826.     XuiSendToKid (grid, #Resize, x, y, w2, h, $Button2, 0) : x = x + w2
  827.     XuiSendToKid (grid, #Resize, x, y, w3, h, $Button3, 0) : x = x + w3
  828.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  829. END SUB
  830. '
  831. '
  832. ' *****  Initialize  *****
  833. '
  834. SUB Initialize
  835.     XuiGetDefaultMessageFuncArray (@func[])
  836.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  837. '
  838.     func[#Callback]                        = &XuiCallback()
  839.     func[#GetSmallestSize]        = 0
  840.     func[#Resize]                            = 0
  841. '
  842.     DIM sub[upperMessage]
  843.     sub[#Create]                            = SUBADDRESS (Create)
  844.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  845.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  846.     sub[#Resize]                            = SUBADDRESS (Resize)
  847. '
  848.     IF func[0] THEN PRINT "XuiDialog4B() : Initialize : error ::: (undefined message)"
  849.     IF sub[0] THEN PRINT "XuiDialog4B() : Initialize : error ::: (undefined message)"
  850.   XuiRegisterGridType (@XuiDialog4B, "XuiDialog4B", &XuiDialog4B(), @func[], @sub[])
  851. '
  852.   designX = 0
  853.   designY = 0
  854.   designWidth = 320
  855.   designHeight = 68
  856. '
  857.     gridType = XuiDialog4B
  858.     XuiSetGridTypeValue (gridType, @"x",               designX)
  859.     XuiSetGridTypeValue (gridType, @"y",               designY)
  860.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  861.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  862.     XuiSetGridTypeValue (gridType, @"minWidth",        64)
  863.     XuiSetGridTypeValue (gridType, @"minHeight",       24)
  864.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  865.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  866.     XuiSetGridTypeValue (gridType, @"focusKid",         $TextLine)
  867.     XuiSetGridTypeValue (gridType, @"inputTextString",  $TextLine)
  868.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  869.   IFZ message THEN RETURN
  870. END SUB
  871. END FUNCTION
  872. '
  873. '
  874. ' ###########################
  875. ' #####  XuiDropBox ()  #####
  876. ' ###########################
  877. '
  878. FUNCTION  XuiDropBox (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  879.   STATIC    designX,  designY,  designWidth,  designHeight
  880.     STATIC    SUBADDR        sub[]
  881.     STATIC    upperMessage
  882.     STATIC    XuiDropBox
  883.     STATIC    monitor
  884. '
  885.     $DropBox    = 0
  886.     $Text            = 1
  887.     $Button        = 2
  888.     $PullDown    = 3
  889. '
  890.     $Style0        = 0            ' list goes up/down, text line editable
  891.     $Style1        = 1            ' list always down, text line editable
  892.     $Style2        = 2            ' list goes up/down, text line not editable
  893.     $Style3        = 3            ' list always down, text line not editable
  894. '
  895.     IFZ sub[] THEN GOSUB Initialize
  896.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiDropBox) THEN RETURN
  897.     GOSUB @sub[message]
  898.     RETURN
  899. '
  900. '
  901. ' *****  Callback  *****
  902. '
  903. SUB Callback
  904.     message = r1
  905.     callback = message
  906.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  907. END SUB
  908. '
  909. '
  910. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  911. '
  912. SUB Create
  913.     IF (v0 <= 0) THEN v0 = 0
  914.     IF (v1 <= 0) THEN v1 = 0
  915.     IF (v2 <= 0) THEN v2 = designWidth
  916.     IF (v3 <= 0) THEN v3 = designHeight
  917.     XuiCreateGrid  (@grid, XuiDropBox, @v0, @v1, 128, 20, r0, r1, &XuiDropBox())
  918.     XuiTextLine    (@g, #Create, 0, 0, 108, 20, r0, grid)
  919.     XuiSendMessage ( g, #SetCallback, grid, &XuiDropBox(), -1, -1, $Text, grid)
  920.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  921.     XuiPressButton (@g, #Create, 108, 0, 20, 20, r0, grid)
  922.     XuiSendMessage ( g, #SetCallback, grid, &XuiDropBox(), -1, -1, $Button, grid)
  923.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"PressButton")
  924.     XuiSendMessage ( g, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, 0, 0)
  925.     XuiSendMessage ( g, #SetTexture, $$TextureFlat, 0, 0, 0, 0, 0)
  926.     XuiSendMessage ( g, #SetStyle, $$TriangleDown, 0, 0, 0, 0, 0)
  927.     GOSUB CreatePullDown
  928.     GOSUB Resize
  929. END SUB
  930. '
  931. '
  932. ' *****  CreatePullDown  *****
  933. '
  934. SUB CreatePullDown
  935.     XgrGetGridWindow (grid, @window)
  936.     XgrConvertWindowToDisplay (grid, v0, v1+20, @xDisp, @yDisp)
  937.     windowType = $$WindowTypeTopMost OR $$WindowTypeNoSelect OR $$WindowTypeNoFrame OR window
  938.     XuiPullDown    (@g, #CreateWindow, xDisp, yDisp, v2, v3, windowType, 0)
  939.     XuiSendMessage ( g, #SetCallback, grid, &XuiDropBox(), -1, -1, $PullDown, grid)
  940.     XuiSetValues (grid, #SetValues, g, 0, 0, 0, 0, 0)
  941. END SUB
  942. '
  943. '
  944. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  945. '
  946. SUB CreateWindow
  947.     IF (v0  = 0) THEN v0 = designX
  948.     IF (v1  = 0) THEN v1 = designY
  949.     IF (v2 <= 0) THEN v2 = designWidth
  950.     IF (v3 <= 0) THEN v3 = designHeight
  951.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  952.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  953.     GOSUB Create
  954.     r1 = 0 : ATTACH display$ TO r1$
  955.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiDropBox")
  956. END SUB
  957. '
  958. '
  959. ' *****  Destroy  *****
  960. '
  961. SUB Destroy
  962.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  963.     XuiSendMessage (pulldown, #Destroy, 0, 0, 0, 0, 0, 0)
  964.     XuiDestroy (grid, #Destroy, 0, 0, 0, 0, 0, 0)
  965. END SUB
  966. '
  967. '
  968. ' *****  GetTextArray  *****
  969. '
  970. SUB GetTextArray
  971.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  972.     XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @r1$[])
  973. END SUB
  974. '
  975. '
  976. ' *****  GetTextCursor  *****
  977. '
  978. SUB GetTextCursor
  979.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  980.     XuiSendMessage (pulldown, #GetTextCursor, 0, @v1, 0, 0, 0, 0)
  981.     XuiSendMessage (grid, #GetTextCursor, @v0, 0, 0, 0, 0, 0)
  982. END SUB
  983. '
  984. '
  985. ' *****  GetTextString  *****
  986. '
  987. SUB GetTextString
  988.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @r1$)
  989. END SUB
  990. '
  991. '
  992. ' *****  Monitor  *****
  993. '
  994. SUB Monitor
  995.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiDropBox(), 0, 0, 0, monitor)
  996.     XuiMonitorContext (grid, #MonitorContext, grid, &XuiDropBox(), 0, 0, 0, monitor)
  997. END SUB
  998. '
  999. '
  1000. ' *****  MouseDown  *****  caused by #MonitorMouse
  1001. '
  1002. SUB MouseDown
  1003.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1004.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1005.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1006.     IFZ (state AND mouse) THEN EXIT SUB
  1007.     IFZ pullstate THEN EXIT SUB
  1008.     IFZ pulldown THEN EXIT SUB
  1009.     IFZ monitor THEN EXIT SUB
  1010.     IFZ r1 THEN EXIT SUB
  1011.     gg = r1
  1012. '
  1013.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1014.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1015.         r0 = -1
  1016.     ELSE
  1017.         IFZ (style AND 1) THEN GOSUB PullUp
  1018.         XuiSendToKid (grid, #GetGridNumber, @gb, 0, 0, 0, $Button, 0)
  1019.         IF XuiGridContainsGridCoord (gb, gg, v0, v1, 0, 0) THEN r0 = -1
  1020.     END IF
  1021. END SUB
  1022. '
  1023. '
  1024. ' *****  MouseDrag  *****  caused by #MonitorMouse
  1025. '
  1026. SUB MouseDrag
  1027.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1028.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1029.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1030.     IFZ (state AND mouse) THEN EXIT SUB
  1031.     IFZ pullstate THEN EXIT SUB
  1032.     IFZ pulldown THEN EXIT SUB
  1033.     IFZ monitor THEN EXIT SUB
  1034.     IFZ r1 THEN EXIT SUB
  1035.     gg = r1
  1036. '
  1037.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1038.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1039.     END IF
  1040.     r0 = -1
  1041. END SUB
  1042. '
  1043. '
  1044. ' *****  MouseUp  *****  caused by #MonitorMouse
  1045. '
  1046. SUB MouseUp
  1047.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1048.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1049.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1050.     IFZ (state AND mouse) THEN EXIT SUB
  1051.     IFZ pullstate THEN EXIT SUB
  1052.     IFZ pulldown THEN EXIT SUB
  1053.     IFZ monitor THEN EXIT SUB
  1054.     IFZ r1 THEN EXIT SUB
  1055.     gg = r1
  1056. '
  1057.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1058.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1059.     ELSE
  1060.         IFZ (style AND 1) THEN
  1061.             XuiSendToKid (grid, #GetGridNumber, @gb, 0, 0, 0, $Button, 0)
  1062.             IFZ XuiGridContainsGridCoord (gb, gg, v0, v1, 0, 0) THEN GOSUB PullUp
  1063.         END IF
  1064.     END IF
  1065.     r0 = -1
  1066. END SUB
  1067. '
  1068. '
  1069. ' *****  Resize  *****
  1070. '
  1071. SUB Resize
  1072.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1073.     IF (v2 < (v3 + 32)) THEN v2 = v3 + 32
  1074.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  1075.     x1 = 0 : y1 = 0 : w1 = v2 - v3
  1076.     x2 = v2 - v3 : y2 = 0 : w2 = v3
  1077.     XuiSendToKid (grid, #Resize, x1, y1, w1, v3, $Text, 0)
  1078.     XuiSendToKid (grid, #Resize, x2, y2, w2, v3, $Button, 0)
  1079.     XuiSendMessage (pulldown, #Resize, 0, 0, 0, 0, 0, 0)
  1080.     XgrGetGridWindow (pulldown, @pullWindow)
  1081.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1082.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  1083.     XgrSetWindowPositionAndSize (pullWindow, xDrop, yDrop, -1, -1)
  1084.     XuiSendMessage (pulldown, #Resize, 0, 0, x2-x1+1, 0, 0, 0)
  1085.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  1086. END SUB
  1087. '
  1088. '
  1089. ' *****  Selection  *****
  1090. '
  1091. SUB Selection
  1092.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1093.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1094. '
  1095.     SELECT CASE r0
  1096.         CASE $Text            : item = -1
  1097.                                             IFZ (style AND 1) THEN GOSUB PullUp
  1098.                                             XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @text$)
  1099.                                             XuiSetTextString (grid, #SetTextString, 0, 0, 0, 0, 0, @text$)
  1100.                                             XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @text$[])
  1101.                                             IF text$[] THEN
  1102.                                                 upper = UBOUND (text$[])
  1103.                                                 FOR i = 0 TO upper
  1104.                                                     IF (text$ = text$[i]) THEN item = i : EXIT FOR
  1105.                                                 NEXT i
  1106.                                             END IF
  1107.                                             XuiSendMessage (pulldown, #SetTextCursor, 0, @item, 0, 0, 0, 0)
  1108.                                             XuiCallback (grid, #Selection, item, 0, 0, 0, 0, 0)
  1109.         CASE $Button        :    IF (style AND 1) THEN GOSUB PullDown ELSE GOSUB PullToggle
  1110.         CASE $PullDown    : XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @text$[])
  1111.                                             XuiSendMessage (pulldown, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  1112.                                             IF ((v0 >= 0) AND (v0 <= UBOUND(text$[]))) THEN
  1113.                                                 text$ = text$[v0]
  1114.                                                 under = INSTR(text$, "_")
  1115.                                                 IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  1116.                                                 XuiSetTextString (grid, #SetTextString, 0, 0, 0, 0, 0, @text$)
  1117.                                                 XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @text$)
  1118.                                                 XuiSendToKid (grid, #Redraw, 0, 0, 0, 0, $Text, 0)
  1119.                                                 XuiSendToKid (grid, #SetKeyboardFocus, 0, 0, 0, 0, $Text, 0)
  1120.                                             END IF
  1121.                                             IFZ (style AND 1) THEN GOSUB PullUp
  1122.                                             XuiCallback (grid, #Selection, v0, 0, 0, 0, 0, 0)
  1123.     END SELECT
  1124. END SUB
  1125. '
  1126. '
  1127. ' *****  PullDown  *****
  1128. '
  1129. SUB PullDown
  1130.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1131.     IF pullstate THEN EXIT SUB
  1132.     XgrGetGridWindow (grid, @window)
  1133.     XgrGetGridWindow (pulldown, @pullWindow)
  1134.     XuiSetValue (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 1)
  1135.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1136.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  1137.     XgrSetWindowPositionAndSize (pullWindow, xDrop, yDrop, -1, -1)
  1138.     XuiSendMessage (pulldown, #ShowWindow, 0, 0, 0, 0, 0, 0)
  1139.     monitor = $$TRUE
  1140.     GOSUB Monitor
  1141. END SUB
  1142. '
  1143. '
  1144. ' *****  PullUp  *****
  1145. '
  1146. SUB PullUp
  1147.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1148.     IFZ pullstate THEN EXIT SUB
  1149.     XgrGetGridWindow (grid, @window)
  1150.     XgrGetGridWindow (pulldown, @pullWindow)
  1151.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 1)
  1152.     XuiSendMessage (pulldown, #HideWindow, 0, 0, 0, 0, 0, 0)
  1153.     monitor = $$FALSE
  1154.     GOSUB Monitor
  1155. END SUB
  1156. '
  1157. '
  1158. ' *****  PullToggle  *****
  1159. '
  1160. SUB PullToggle
  1161.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1162.     IF pullstate THEN GOSUB PullUp ELSE GOSUB PullDown
  1163. END SUB
  1164. '
  1165. '
  1166. ' *****  SetStyle  *****
  1167. '
  1168. '    $Style0        = 0            ' list goes up/down, text line editable
  1169. '    $Style1        = 1            ' list always down, text line editable
  1170. '    $Style2        = 2            ' list goes up/down, text line not editable
  1171. '    $Style3        = 3            ' list always down, text line not editable
  1172. '
  1173. SUB SetStyle
  1174.     style = v0
  1175.     IF (style < 0) THEN EXIT SUB
  1176.     IF (style > 3) THEN EXIT SUB
  1177.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1178.     XuiGetStyle (grid, #GetStyle, @oldStyle, 0, 0, 0, 0, 0)
  1179.     XuiSetStyle (grid, #SetStyle, style, 0, 0, 0, 0, 0)
  1180.     IF (style = oldStyle) THEN EXIT SUB
  1181.     SELECT CASE style
  1182.         CASE 0:        XuiSendToKid (grid, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, $Text, 0)
  1183.                             XuiSendToKid (grid, #ShowTextCursor, 0, 0, 0, 0, $Text, 0)
  1184.         CASE 1:        XuiSendToKid (grid, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, $Text, 0)
  1185.                             XuiSendToKid (grid, #ShowTextCursor, 0, 0, 0, 0, $Text, 0)
  1186.                             XuiSendMessage (pulldown, #ShowWindow, 0, 0, 0, 0, 0, 0)
  1187.         CASE 2:        XuiSendToKid (grid, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, $Text, 0)
  1188.                             XuiSendToKid (grid, #HideTextCursor, 0, 0, 0, 0, $Text, 0)
  1189.         CASE 3:        XuiSendToKid (grid, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, $Text, 0)
  1190.                             XuiSendToKid (grid, #HideTextCursor, 0, 0, 0, 0, $Text, 0)
  1191.                             XuiSendMessage (pulldown, #ShowWindow, 0, 0, 0, 0, 0, 0)
  1192.     END SELECT
  1193. END SUB
  1194. '
  1195. '
  1196. ' *****  SetColor  *****
  1197. '
  1198. SUB SetColor
  1199.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1200.     XuiSendToKid (grid, message, v0, v1, v2, v3, $Text, 0)
  1201.     XuiSendToKid (grid, message, v0, v1, v2, v3, $Button, 0)
  1202.     XuiSendMessage (pulldown, message, v0, v1, v2, v3, 0, r1)
  1203. END SUB
  1204. '
  1205. '
  1206. ' *****  SetTextArray  *****
  1207. '
  1208. SUB SetTextArray
  1209.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1210.     IF r1$[] THEN text$ = r1$[0]
  1211.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1212.     under = INSTR (text$, "_")
  1213.     IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  1214.     cp = LEN (text$)
  1215.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @text$)
  1216.     XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  1217.     XuiSendMessage (pulldown, #SetTextArray, 0, 0, 0, 0, 0, @r1$[])
  1218.     XuiSendMessage (pulldown, #Resize, 0, 0, x2-x1+1, 0, 0, 0)
  1219.     XuiSendMessage (pulldown, #Redraw, 0, 0, 0, 0, 0, 0)
  1220. END SUB
  1221. '
  1222. '
  1223. ' *****  SetTextCursor  *****
  1224. '
  1225. SUB SetTextCursor
  1226.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1227.     IF (v0 >= 0) THEN XuiSendToKid (grid, #SetTextCursor, v0, 0, 0, 0, $Text, 0)
  1228.     IF (v1 >= 0) THEN XuiSendMessage (pulldown, #SetTextCursor, 0, v1, 0, 0, 0, 0)
  1229. END SUB
  1230. '
  1231. '
  1232. ' *****  SetTextString  *****
  1233. '
  1234. SUB SetTextString
  1235.     cp = LEN (r1$)
  1236.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @r1$)
  1237.     XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  1238. END SUB
  1239. '
  1240. '
  1241. ' *****  TextEvent  *****
  1242. '
  1243. SUB TextEvent
  1244.     abort = r0
  1245.     XuiCallback (grid, #TextEvent, v0, v1, v2, v3, @abort, grid)
  1246.     IF (abort = -1) THEN EXIT SUB
  1247.     IF (v2 AND $$TextModifyBit) THEN XgrJamMessage (grid, #TextModified, 0, 0, 0, 0, 0, 0)
  1248. '
  1249.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1250.     IFZ pulldown THEN EXIT SUB
  1251.     key = v2{$$VirtualKey}
  1252. '
  1253.     IF (v2 AND $$AltBit) THEN
  1254.         SELECT CASE key
  1255.             CASE $$KeyUpArrow        : GOSUB PullUp        : r0 = -1            ' cancel
  1256.             CASE $$KeyDownArrow    : GOSUB PullDown    : r0 = -1            ' cancel
  1257.         END SELECT
  1258.     ELSE
  1259.         IF (r0 != $PullDown) THEN        ' avoid infinite loop stack overflow
  1260.             SELECT CASE key
  1261.                 CASE $$KeyUpArrow, $$KeyDownArrow
  1262.                             XuiSendMessage (pulldown, #KeyDown, v0, v1, v2, v3, 0, pulldown)
  1263.                             XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @item$[])
  1264.                             XuiSendMessage (pulldown, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  1265.                             upper = UBOUND (item$[])
  1266.                             IF (cl > upper) THEN cl = upper
  1267.                             IF (cl < 0) THEN cl = 0
  1268.                             item$ = item$[cl]
  1269.                             cp = LEN(item$)
  1270.                             XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @item$)
  1271.                             XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  1272.                             XuiSendToKid (grid, #Redraw, 0, 0, 0, 0, $Text, 0)
  1273.                             r0 = -1
  1274.             END SELECT
  1275.         END IF
  1276.     END IF
  1277. END SUB
  1278. '
  1279. '
  1280. ' *****  TextModified  *****
  1281. '
  1282. SUB TextModified
  1283.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1284.     IFZ pulldown THEN EXIT SUB
  1285.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @text$)
  1286.     IFZ text$ THEN EXIT SUB
  1287.     XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @list$[])
  1288.     IFZ list$[] THEN EXIT SUB
  1289.     uList = UBOUND (list$[])
  1290.     lenText = LEN (text$)
  1291.     FOR line = 0 TO uList
  1292.         list$ = list$[line]
  1293.         under = INSTR (list$, "_")
  1294.         IF under THEN list$ = LEFT$ (list$, under-1) + MID$ (list$, under+1)
  1295.         lenLine = LEN (list$)
  1296.         IF (lenLine < lenText) THEN DO NEXT
  1297.         IF (text$ = LEFT$ (list$, lenText)) THEN EXIT FOR
  1298.     NEXT line
  1299.     IF (line <= uList) THEN XuiSendMessage (pulldown, #SetTextCursor, 0, line, -1, -1, 0, 0)
  1300. END SUB
  1301. '
  1302. '
  1303. ' *****  SendToKids  *****
  1304. '
  1305. SUB SendToKids
  1306.     XuiSendToKids (grid, message, v0, v1, v2, v3, 0, r1)
  1307. END SUB
  1308. '
  1309. '
  1310. ' *****  Initialize  *****
  1311. '
  1312. SUB Initialize
  1313.     XuiGetDefaultMessageFuncArray (@func[])
  1314.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  1315. '
  1316.     func[#Callback]                        = 0
  1317.     func[#Destroy]                        = 0
  1318.     func[#GetSmallestSize]        = &XuiGetMaxMinSize()
  1319.     func[#GetTextArray]                = 0
  1320.     func[#GetTextString]            = 0
  1321.     func[#Resize]                            = 0
  1322.     func[#SetStyle]                        = 0
  1323.     func[#SetTextArray]                = 0
  1324.     func[#SetTextString]            = 0
  1325. '
  1326.     DIM sub[upperMessage]
  1327.     sub[#Callback]                        = SUBADDRESS (Callback)
  1328.     sub[#ContextChange]                = SUBADDRESS (PullUp)
  1329.     sub[#Create]                            = SUBADDRESS (Create)
  1330.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  1331.     sub[#Destroy]                            = SUBADDRESS (Destroy)
  1332.     sub[#GetTextArray]                = SUBADDRESS (GetTextArray)
  1333.     sub[#GetTextCursor]                = SUBADDRESS (GetTextCursor)
  1334.     sub[#GetTextString]                = SUBADDRESS (GetTextString)
  1335.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  1336.     sub[#MouseDrag]                        = SUBADDRESS (MouseDrag)
  1337.     sub[#MouseUp]                            = SUBADDRESS (MouseUp)
  1338.     sub[#Resize]                            = SUBADDRESS (Resize)
  1339.     sub[#Selection]                        = SUBADDRESS (Selection)
  1340.     sub[#SetColor]                        = SUBADDRESS (SetColor)
  1341.     sub[#SetColorExtra]                = SUBADDRESS (SetColor)
  1342.     sub[#SetFont]                            = SUBADDRESS (SendToKids)
  1343.     sub[#SetFontNumber]                = SUBADDRESS (SendToKids)
  1344.     sub[#SetStyle]                        = SUBADDRESS (SetStyle)
  1345.     sub[#SetTextArray]                = SUBADDRESS (SetTextArray)
  1346.     sub[#SetTextCursor]                = SUBADDRESS (SetTextCursor)
  1347.     sub[#SetTextString]                = SUBADDRESS (SetTextString)
  1348.     sub[#TextEvent]                        = SUBADDRESS (TextEvent)
  1349.     sub[#TextModified]                = SUBADDRESS (TextModified)
  1350. '
  1351.     IF func[0] THEN PRINT "XuiDropBox() : Initialize : error ::: (undefined message)"
  1352.     IF sub[0] THEN PRINT "XuiDropBox() : Initialize : error ::: (undefined message)"
  1353.     XuiRegisterGridType (@XuiDropBox, @"XuiDropBox", &XuiDropBox(), @func[], @sub[])
  1354. '
  1355.     designX = 0
  1356.     designY = 0
  1357.     designWidth = 80
  1358.     designHeight = 24
  1359. '
  1360.     gridType = XuiDropBox
  1361.     XuiSetGridTypeValue (gridType, @"x",               designX)
  1362.     XuiSetGridTypeValue (gridType, @"y",               designY)
  1363.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  1364.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  1365.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  1366.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  1367.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  1368.     XuiSetGridTypeValue (gridType, @"focusKid",         $Text)
  1369.     XuiSetGridTypeValue (gridType, @"inputTextString",  $Text)
  1370.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  1371.     IFZ message THEN RETURN
  1372. END SUB
  1373. END FUNCTION
  1374. '
  1375. '
  1376. ' ##############################
  1377. ' #####  XuiDropButton ()  #####
  1378. ' ##############################
  1379. '
  1380. FUNCTION  XuiDropButton (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  1381.   STATIC    designX,  designY,  designWidth,  designHeight
  1382.     STATIC    SUBADDR        sub[]
  1383.     STATIC    upperMessage
  1384.     STATIC    XuiDropButton
  1385.     STATIC    monitor
  1386. '
  1387.     $DropButton    = 0
  1388.     $Button            = 1
  1389.     $PullDown        = 2
  1390. '
  1391.     $Style0            = 0            ' list goes up/down
  1392.     $Style1            = 1            ' list always down
  1393. '
  1394.     IFZ sub[] THEN GOSUB Initialize
  1395.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiDropButton) THEN RETURN
  1396.     GOSUB @sub[message]
  1397.     RETURN
  1398. '
  1399. '
  1400. ' *****  Callback  *****
  1401. '
  1402. SUB Callback
  1403.     message = r1
  1404.     callback = message
  1405.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  1406. END SUB
  1407. '
  1408. '
  1409. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  1410. '
  1411. SUB Create
  1412.     IF (v0 <= 0) THEN v0 = 0
  1413.     IF (v1 <= 0) THEN v1 = 0
  1414.     IF (v2 <= 0) THEN v2 = designWidth
  1415.     IF (v3 <= 0) THEN v3 = designHeight
  1416.     XuiCreateGrid  (@grid, XuiDropButton, @v0, @v1, 128, 20, r0, r1, &XuiDropButton())
  1417.     XuiPressButton (@g, #Create, 108, 0, 20, 20, r0, grid)
  1418.     XuiSendMessage ( g, #SetCallback, grid, &XuiDropButton(), -1, -1, $Button, grid)
  1419.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"PressButton")
  1420.     GOSUB CreatePullDown
  1421.     GOSUB Resize
  1422. END SUB
  1423. '
  1424. '
  1425. ' *****  CreatePullDown  *****
  1426. '
  1427. SUB CreatePullDown
  1428.     XgrGetGridWindow (grid, @window)
  1429.     XgrConvertWindowToDisplay (grid, v0, v1+20, @xDisp, @yDisp)
  1430.     windowType = $$WindowTypeTopMost OR $$WindowTypeNoSelect OR $$WindowTypeNoFrame OR window
  1431.     XuiPullDown    (@g, #CreateWindow, xDisp, yDisp, v2, v3, windowType, 0)
  1432.     XuiSendMessage ( g, #SetCallback, grid, &XuiDropButton(), -1, -1, $PullDown, grid)
  1433.     XuiSetValues   (grid, #SetValues, g, 0, 0, 0, 0, 0)
  1434. END SUB
  1435. '
  1436. '
  1437. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  1438. '
  1439. SUB CreateWindow
  1440.     IF (v0  = 0) THEN v0 = designX
  1441.     IF (v1  = 0) THEN v1 = designY
  1442.     IF (v2 <= 0) THEN v2 = designWidth
  1443.     IF (v3 <= 0) THEN v3 = designHeight
  1444.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  1445.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  1446.     GOSUB Create
  1447.     r1 = 0 : ATTACH display$ TO r1$
  1448.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiDropButton")
  1449. END SUB
  1450. '
  1451. '
  1452. ' *****  Destroy  *****
  1453. '
  1454. SUB Destroy
  1455.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1456.     XuiSendMessage (pulldown, #Destroy, 0, 0, 0, 0, 0, 0)
  1457.     XuiDestroy (grid, #Destroy, 0, 0, 0, 0, 0, 0)
  1458. END SUB
  1459. '
  1460. '
  1461. ' *****  GetTextArray  *****
  1462. '
  1463. SUB GetTextArray
  1464.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1465.     XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @r1$[])
  1466. END SUB
  1467. '
  1468. '
  1469. ' *****  GetTextCursor  *****
  1470. '
  1471. SUB GetTextCursor
  1472.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1473.     XuiSendMessage (pulldown, #GetTextCursor, 0, @v1, 0, 0, 0, 0)
  1474.     v0 = 0
  1475. END SUB
  1476. '
  1477. '
  1478. ' *****  GetTextString  *****
  1479. '
  1480. SUB GetTextString
  1481.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Button, @r1$)
  1482. END SUB
  1483. '
  1484. '
  1485. ' *****  Monitor  *****
  1486. '
  1487. SUB Monitor
  1488.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiDropButton(), 0, 0, 0, monitor)
  1489.     XuiMonitorContext (grid, #MonitorContext, grid, &XuiDropButton(), 0, 0, 0, monitor)
  1490. END SUB
  1491. '
  1492. '
  1493. ' *****  MouseDown  *****  caused by #MonitorMouse
  1494. '
  1495. SUB MouseDown
  1496.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1497.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1498.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1499.     IFZ (state AND mouse) THEN EXIT SUB
  1500.     IFZ pullstate THEN EXIT SUB
  1501.     IFZ pulldown THEN EXIT SUB
  1502.     IFZ monitor THEN EXIT SUB
  1503.     IFZ r1 THEN EXIT SUB
  1504.     gg = r1
  1505. '
  1506.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1507.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1508.         r0 = -1
  1509.     ELSE
  1510.         IFZ (style AND 1) THEN GOSUB PullUp
  1511.         XuiSendToKid (grid, #GetGridNumber, @gb, 0, 0, 0, $Button, 0)
  1512.         IF XuiGridContainsGridCoord (gb, gg, v0, v1, 0, 0) THEN r0 = -1
  1513.     END IF
  1514. END SUB
  1515. '
  1516. '
  1517. ' *****  MouseDrag  *****  caused by #MonitorMouse
  1518. '
  1519. SUB MouseDrag
  1520.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1521.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1522.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1523.     IFZ (state AND mouse) THEN EXIT SUB
  1524.     IFZ pullstate THEN EXIT SUB
  1525.     IFZ pulldown THEN EXIT SUB
  1526.     IFZ monitor THEN EXIT SUB
  1527.     IFZ r1 THEN EXIT SUB
  1528.     gg = r1
  1529. '
  1530.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1531.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1532.     END IF
  1533.     r0 = -1
  1534. END SUB
  1535. '
  1536. '
  1537. ' *****  MouseUp  *****  caused by #MonitorMouse
  1538. '
  1539. SUB MouseUp
  1540.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  1541.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1542.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1543.     IFZ (state AND mouse) THEN EXIT SUB
  1544.     IFZ pullstate THEN EXIT SUB
  1545.     IFZ pulldown THEN EXIT SUB
  1546.     IFZ monitor THEN EXIT SUB
  1547.     IFZ r1 THEN EXIT SUB
  1548.     gg = r1
  1549. '
  1550.     IF XuiGridContainsGridCoord (pulldown, gg, v0, v1, @xx, @yy) THEN
  1551.         XuiSendMessage (pulldown, message, xx, yy, v2, v3, 0, pulldown)
  1552.     ELSE
  1553.         IFZ (style AND 1) THEN
  1554.             XuiSendToKid (grid, #GetGridNumber, @gb, 0, 0, 0, $Button, 0)
  1555.             IFZ XuiGridContainsGridCoord (gb, gg, v0, v1, 0, 0) THEN GOSUB PullUp
  1556.         END IF
  1557.     END IF
  1558.     r0 = -1
  1559. END SUB
  1560. '
  1561. '
  1562. ' *****  Resize  *****
  1563. '
  1564. SUB Resize
  1565.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1566.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  1567.     XuiSendToKid (grid, #Resize, 0, 0, v2, v3, $Button, 0)
  1568.     XuiSendMessage (pulldown, #Resize, 0, 0, 0, 0, 0, 0)
  1569.     XgrGetGridWindow (pulldown, @pullWindow)
  1570.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1571.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  1572.     XgrSetWindowPositionAndSize (pullWindow, xDrop, yDrop, -1, -1)
  1573.     XuiSendMessage (pulldown, #Resize, 0, 0, x2-x1+1, 0, 0, 0)
  1574.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  1575. END SUB
  1576. '
  1577. '
  1578. ' *****  Selection  *****
  1579. '
  1580. SUB Selection
  1581.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1582.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  1583. '
  1584.     SELECT CASE r0
  1585.         CASE $Button        :    IF (style AND 1) THEN GOSUB PullDown ELSE GOSUB PullToggle
  1586.         CASE $PullDown    : XuiSendMessage (pulldown, #GetTextArray, 0, 0, 0, 0, 0, @text$[])
  1587.                                             XuiSendMessage (pulldown, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  1588.                                             IF ((v0 >= 0) AND (v0 <= UBOUND(text$[]))) THEN
  1589.                                                 text$ = text$[v0]
  1590.                                                 under = INSTR(text$, "_")
  1591.                                                 IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  1592.                                                 XuiSetTextString (grid, #SetTextString, 0, 0, 0, 0, 0, @text$)
  1593.                                             END IF
  1594.                                             IFZ (style AND 1) THEN GOSUB PullUp
  1595.                                             XuiCallback (grid, #Selection, v0, 0, 0, 0, 0, 0)
  1596.     END SELECT
  1597. END SUB
  1598. '
  1599. '
  1600. ' *****  PullDown  *****
  1601. '
  1602. SUB PullDown
  1603.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1604.     IF pullstate THEN EXIT SUB
  1605.     XgrGetGridWindow (grid, @window)
  1606.     XgrGetGridWindow (pulldown, @pullWindow)
  1607.     XuiSetValue (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 1)
  1608.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1609.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  1610.     XgrSetWindowPositionAndSize (pullWindow, xDrop, yDrop, -1, -1)
  1611.     XuiSendMessage (pulldown, #ShowWindow, 0, 0, 0, 0, 0, 0)
  1612.     monitor = $$TRUE
  1613.     GOSUB Monitor
  1614. END SUB
  1615. '
  1616. '
  1617. ' *****  PullUp  *****
  1618. '
  1619. SUB PullUp
  1620.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1621.     IFZ pullstate THEN EXIT SUB
  1622.     XgrGetGridWindow (grid, @window)
  1623.     XgrGetGridWindow (pulldown, @pullWindow)
  1624.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 1)
  1625.     XuiSendMessage (pulldown, #HideWindow, 0, 0, 0, 0, 0, 0)
  1626.     monitor = $$FALSE
  1627.     GOSUB Monitor
  1628. END SUB
  1629. '
  1630. '
  1631. ' *****  PullToggle  *****
  1632. '
  1633. SUB PullToggle
  1634.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1635.     IF pullstate THEN GOSUB PullUp ELSE GOSUB PullDown
  1636. END SUB
  1637. '
  1638. '
  1639. ' *****  SetStyle  *****
  1640. '
  1641. '    $Style0        = 0            ' list goes up/down
  1642. '    $Style1        = 1            ' list always down
  1643. '
  1644. SUB SetStyle
  1645.     style = v0
  1646.     IF (style < 0) THEN EXIT SUB
  1647.     IF (style > 1) THEN EXIT SUB
  1648.     XuiSetStyle (grid, #SetStyle, style, 0, 0, 0, 0, 0)
  1649.     IF (style AND 1) THEN GOSUB PullDown
  1650. END SUB
  1651. '
  1652. '
  1653. ' *****  SetColor  *****
  1654. '
  1655. SUB SetColor
  1656.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1657.     XuiSendToKid (grid, message, v0, v1, v2, v3, $Button, 0)
  1658.     XuiSendMessage (pulldown, message, v0, v1, v2, v3, 0, r1)
  1659. END SUB
  1660. '
  1661. '
  1662. ' *****  SetTextArray  *****
  1663. '
  1664. SUB SetTextArray
  1665.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1666.     XuiSendMessage (pulldown, #SetTextArray, 0, 0, 0, 0, 0, @r1$[])
  1667.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1668.     XuiSendMessage (pulldown, #Resize, 0, 0, x2-x1+1, 0, 0, 0)
  1669.     XuiSendMessage (pulldown, #Redraw, 0, 0, 0, 0, 0, 0)
  1670. END SUB
  1671. '
  1672. '
  1673. ' *****  SetTextCursor  *****
  1674. '
  1675. SUB SetTextCursor
  1676.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1677.     IF (v1 >= 0) THEN XuiSendMessage (pulldown, #SetTextCursor, 0, v1, 0, 0, 0, 0)
  1678. END SUB
  1679. '
  1680. '
  1681. ' *****  SetTextString  *****
  1682. '
  1683. SUB SetTextString
  1684.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Button, @r1$)
  1685. END SUB
  1686. '
  1687. '
  1688. ' *****  TextEvent  *****
  1689. '
  1690. SUB TextEvent
  1691.     XuiGetValues (grid, #GetValues, @pulldown, @pullstate, 0, 0, 0, 0)
  1692.     IFZ pulldown THEN EXIT SUB
  1693.     key = v2{$$VirtualKey}
  1694. '
  1695.     IF (v2 AND $$AltBit) THEN
  1696.         SELECT CASE key
  1697.             CASE $$KeyUpArrow        : GOSUB PullUp        : r0 = -1            ' cancel
  1698.             CASE $$KeyDownArrow    : GOSUB PullDown    : r0 = -1            ' cancel
  1699.         END SELECT
  1700.     ELSE
  1701.         IF (r0 != $PullDown) THEN        ' avoid infinite loop stack overflow
  1702.             SELECT CASE key
  1703.                 CASE $$KeyUpArrow, $$KeyDownArrow
  1704.                             XuiSendMessage (pulldown, #KeyDown, v0, v1, v2, v3, 0, pulldown)
  1705.                             r0 = -1
  1706.             END SELECT
  1707.         END IF
  1708.     END IF
  1709. END SUB
  1710. '
  1711. '
  1712. ' *****  SendToKids  *****
  1713. '
  1714. SUB SendToKids
  1715.     XuiSendToKids (grid, message, v0, v1, v2, v3, 0, r1)
  1716. END SUB
  1717. '
  1718. '
  1719. ' *****  Initialize  *****
  1720. '
  1721. SUB Initialize
  1722.     XuiGetDefaultMessageFuncArray (@func[])
  1723.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  1724. '
  1725.     func[#Callback]                        = 0
  1726.     func[#Destroy]                        = 0
  1727.     func[#GetSmallestSize]        = &XuiGetMaxMinSize()
  1728.     func[#GetTextArray]                = 0
  1729.     func[#Resize]                            = 0
  1730.     func[#SetStyle]                        = 0
  1731.     func[#SetTextArray]                = 0
  1732.     func[#SetTextString]            = 0
  1733. '
  1734.     DIM sub[upperMessage]
  1735.     sub[#Callback]                        = SUBADDRESS (Callback)
  1736.     sub[#ContextChange]                = SUBADDRESS (PullUp)
  1737.     sub[#Create]                            = SUBADDRESS (Create)
  1738.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  1739.     sub[#Destroy]                            = SUBADDRESS (Destroy)
  1740.     sub[#GetTextArray]                = SUBADDRESS (GetTextArray)
  1741.     sub[#GetTextCursor]                = SUBADDRESS (GetTextCursor)
  1742.     sub[#GetTextString]                = SUBADDRESS (GetTextString)
  1743.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  1744.     sub[#MouseDrag]                        = SUBADDRESS (MouseDrag)
  1745.     sub[#MouseUp]                            = SUBADDRESS (MouseUp)
  1746.     sub[#Resize]                            = SUBADDRESS (Resize)
  1747.     sub[#Selection]                        = SUBADDRESS (Selection)
  1748.     sub[#SetColor]                        = SUBADDRESS (SetColor)
  1749.     sub[#SetColorExtra]                = SUBADDRESS (SetColor)
  1750.     sub[#SetFont]                            = SUBADDRESS (SendToKids)
  1751.     sub[#SetFontNumber]                = SUBADDRESS (SendToKids)
  1752.     sub[#SetStyle]                        = SUBADDRESS (SetStyle)
  1753.     sub[#SetTextArray]                = SUBADDRESS (SetTextArray)
  1754.     sub[#SetTextCursor]                = SUBADDRESS (SetTextCursor)
  1755.     sub[#SetTextString]                = SUBADDRESS (SetTextString)
  1756.     sub[#TextEvent]                        = SUBADDRESS (TextEvent)
  1757. '
  1758.     IF func[0] THEN PRINT "XuiDropButton() : Initialize : error ::: (undefined message)"
  1759.     IF sub[0] THEN PRINT "XuiDropButton() : Initialize : error ::: (undefined message)"
  1760.     XuiRegisterGridType (@XuiDropButton, @"XuiDropButton", &XuiDropButton(), @func[], @sub[])
  1761. '
  1762.     designX = 0
  1763.     designY = 0
  1764.     designWidth = 80
  1765.     designHeight = 24
  1766. '
  1767.     gridType = XuiDropButton
  1768.     XuiSetGridTypeValue (gridType, @"x",               designX)
  1769.     XuiSetGridTypeValue (gridType, @"y",               designY)
  1770.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  1771.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  1772.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  1773.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  1774.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  1775.     XuiSetGridTypeValue (gridType, @"focusKid",         $Button)
  1776.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  1777.     IFZ message THEN RETURN
  1778. END SUB
  1779. END FUNCTION
  1780. '
  1781. '
  1782. ' #########################
  1783. ' #####  XuiLabel ()  #####
  1784. ' #########################
  1785. '
  1786. FUNCTION  XuiLabel (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  1787.   STATIC    designX,  designY,  designWidth,  designHeight
  1788.     STATIC    SUBADDR  sub[]
  1789.     STATIC    upperMessage
  1790.     STATIC    XuiLabel
  1791. '
  1792.     IFZ sub[] THEN GOSUB Initialize
  1793.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, @XuiLabel) THEN RETURN
  1794.     GOSUB @sub[message]
  1795.     RETURN
  1796. '
  1797. '
  1798. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  1799. '
  1800. SUB Create
  1801.     IF (v0 <= 0) THEN v0 = 0
  1802.     IF (v1 <= 0) THEN v1 = 0
  1803.     IF (v2 <= 0) THEN v2 = designWidth
  1804.     IF (v3 <= 0) THEN v3 = designHeight
  1805.     XuiCreateGrid (@grid, XuiLabel, @v0, @v1, @v2, @v3, r0, r1, &XuiLabel())
  1806. END SUB
  1807. '
  1808. '
  1809. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  1810. '
  1811. SUB CreateWindow
  1812.     IF (v0  = 0) THEN v0 = designX
  1813.     IF (v1  = 0) THEN v1 = designY
  1814.     IF (v2 <= 0) THEN v2 = designWidth
  1815.     IF (v3 <= 0) THEN v3 = designHeight
  1816.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  1817.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  1818.     GOSUB Create
  1819.     r1 = 0 : ATTACH display$ TO r1$
  1820.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiLabel")
  1821. END SUB
  1822. '
  1823. '
  1824. ' *****  Initialize  *****
  1825. '
  1826. SUB Initialize
  1827.     XuiGetDefaultMessageFuncArray (@func[])
  1828.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  1829. '
  1830.     DIM sub[upperMessage]
  1831.     sub[#Create]                            = SUBADDRESS (Create)
  1832.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  1833. '
  1834.     IF func[0] THEN PRINT "XuiLabel() : Initialize : error ::: (undefined message)"
  1835.     IF sub[0] THEN PRINT "XuiLabel() : Initialize : error ::: (undefined message)"
  1836.     XuiRegisterGridType (@XuiLabel, @"XuiLabel", &XuiLabel(), @func[], @sub[])
  1837. '
  1838.     designX = 0
  1839.     designY = 0
  1840.     designWidth = 80
  1841.     designHeight = 16
  1842. '
  1843.     gridType = XuiLabel
  1844.     XuiSetGridTypeValue (gridType, @"x",           designX)
  1845.     XuiSetGridTypeValue (gridType, @"y",           designY)
  1846.     XuiSetGridTypeValue (gridType, @"width",       designWidth)
  1847.     XuiSetGridTypeValue (gridType, @"height",      designHeight)
  1848.     XuiSetGridTypeValue (gridType, @"minWidth",    4)
  1849.     XuiSetGridTypeValue (gridType, @"minHeight",   4)
  1850.     XuiSetGridTypeValue (gridType, @"align",       $$AlignMiddleCenter)
  1851.     XuiSetGridTypeValue (gridType, @"justify",     $$JustifyCenter)
  1852.     XuiSetGridTypeValue (gridType, @"border",      $$BorderRaise)
  1853.     XuiSetGridTypeValue (gridType, @"texture",     $$TextureRaise1)
  1854.     XuiSetGridTypeValue (gridType, @"redrawFlags", $$RedrawDefaultNoFocus)
  1855.     IFZ message THEN RETURN
  1856. END SUB
  1857. END FUNCTION
  1858. '
  1859. '
  1860. ' ###########################
  1861. ' #####  XuiListBox ()  #####
  1862. ' ###########################
  1863. '
  1864. FUNCTION  XuiListBox (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  1865.   STATIC    designX,  designY,  designWidth,  designHeight
  1866.     STATIC    SUBADDR  sub[]
  1867.     STATIC    upperMessage
  1868.     STATIC    XuiListBox
  1869. '
  1870.     $ListBox    = 0
  1871.     $Text            = 1
  1872.     $Button        = 2
  1873.     $List            = 3
  1874. '
  1875.     $Style0        = 0            ' list goes up/down, text line editable
  1876.     $Style1        = 1            ' list always down, text line editable
  1877.     $Style2        = 2            ' list goes up/down, text line not editable
  1878.     $Style3        = 3            ' list always down, text line not editable
  1879. '
  1880.     IFZ sub[] THEN GOSUB Initialize
  1881.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiListBox) THEN RETURN
  1882.     GOSUB @sub[message]
  1883.     RETURN
  1884. '
  1885. '
  1886. ' *****  Callback  *****
  1887. '
  1888. SUB Callback
  1889.     message = r1
  1890.     callback = message
  1891.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  1892. END SUB
  1893. '
  1894. '
  1895. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  1896. '
  1897. SUB Create
  1898.     IF (v0 <= 0) THEN v0 = 0
  1899.     IF (v1 <= 0) THEN v1 = 0
  1900.     IF (v2 <= 0) THEN v2 = designWidth
  1901.     IF (v3 <= 0) THEN v3 = designHeight
  1902.     XuiCreateGrid  (@grid, XuiListBox, @v0, @v1, 128, 20, r0, r1, &XuiListBox())
  1903.     XuiTextLine    (@g, #Create, 0, 0, 108, 20, r0, grid)
  1904.     XuiSendMessage ( g, #SetCallback, grid, &XuiListBox(), -1, -1, $Text, grid)
  1905.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  1906.     XuiPressButton (@g, #Create, 108, 0, 20, 20, r0, grid)
  1907.     XuiSendMessage ( g, #SetCallback, grid, &XuiListBox(), -1, -1, $Button, grid)
  1908.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"PressButton")
  1909.     XuiSendMessage ( g, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, 0, 0)
  1910.     XuiSendMessage ( g, #SetTexture, $$TextureFlat, 0, 0, 0, 0, 0)
  1911.     XuiSendMessage ( g, #SetStyle, $$TriangleDown, 0, 0, 0, 0, 0)
  1912.     GOSUB CreateList
  1913.     GOSUB Resize
  1914. END SUB
  1915. '
  1916. '
  1917. ' *****  CreateList  *****
  1918. '
  1919. SUB CreateList
  1920.     XgrConvertWindowToDisplay (grid, v0, v1+20, @xDisp, @yDisp)
  1921.     XgrGetGridWindow (grid, @window)
  1922.     windowType = $$WindowTypeTopMost OR $$WindowTypeNoFrame OR window
  1923.     XuiList        (@g, #CreateWindow, xDisp, yDisp, v2, v3, windowType, 0)
  1924.     XuiSendMessage ( g, #SetCallback, grid, &XuiListBox(), -1, -1, $List, grid)
  1925.     XuiSendMessage ( g, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, 0, 0)
  1926.     XuiSendMessage ( g, #SetColorExtra, $$Yellow, $$Yellow, -1, -1, 2, 0)
  1927.     XuiSetValues   (grid, #SetValues, g, 0, 0, 0, 0, 0)
  1928. END SUB
  1929. '
  1930. '
  1931. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  1932. '
  1933. SUB CreateWindow
  1934.     IF (v0  = 0) THEN v0 = designX
  1935.     IF (v1  = 0) THEN v1 = designY
  1936.     IF (v2 <= 0) THEN v2 = designWidth
  1937.     IF (v3 <= 0) THEN v3 = designHeight
  1938.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  1939.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  1940.     GOSUB Create
  1941.     r1 = 0 : ATTACH display$ TO r1$
  1942.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiListBox")
  1943. END SUB
  1944. '
  1945. '
  1946. ' *****  Destroy  *****
  1947. '
  1948. SUB Destroy
  1949.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  1950.     XuiSendMessage (list, #Destroy, 0, 0, 0, 0, 0, 0)
  1951.     XuiDestroy (grid, #Destroy, 0, 0, 0, 0, 0, 0)
  1952. END SUB
  1953. '
  1954. '
  1955. ' *****  GetTextArray  *****
  1956. '
  1957. SUB GetTextArray
  1958.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  1959.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1960.     XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @r1$[])
  1961. END SUB
  1962. '
  1963. '
  1964. ' *****  GetTextCursor  *****
  1965. '
  1966. SUB GetTextCursor
  1967.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  1968.     XuiSendToKid (grid, #GetTextCursor, @v0, 0, 0, 0, $Text, 0)
  1969.     XuiSendMessage (list, #GetTextCursor, 0, @v1, 0, 0, 0, 0)
  1970. END SUB
  1971. '
  1972. '
  1973. ' *****  GetTextString  *****
  1974. '
  1975. SUB GetTextString
  1976.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @r1$)
  1977. END SUB
  1978. '
  1979. '
  1980. ' *****  Resize  *****
  1981. '
  1982. SUB Resize
  1983.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  1984.     IF (v2 < (v3 + 32)) THEN v2 = v3 + 32
  1985.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  1986.     x1 = 0 : y1 = 0 : w1 = v2 - v3
  1987.     x2 = v2 - v3 : y2 = 0 : w2 = v3
  1988.     XuiSendToKid (grid, #Resize, x1, y1, w1, v3, $Text, 0)
  1989.     XuiSendToKid (grid, #Resize, x2, y2, w2, v3, $Button, 0)
  1990.     XuiSendMessage (list, #Resize, 0, 0, 0, 0, 0, 0)
  1991.     XgrGetGridWindow (list, @listWindow)
  1992.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  1993.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  1994.     XgrSetWindowPositionAndSize (listWindow, xDrop, yDrop, -1, -1)
  1995.     GOSUB SizeList
  1996.     XuiSendMessage (list, #Resize, 0, 0, x2-x1+1, height, 0, 0)
  1997.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  1998. END SUB
  1999. '
  2000. '
  2001. ' *****  Selection  *****
  2002. '
  2003. SUB Selection
  2004.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2005.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  2006.     SELECT CASE r0
  2007.         CASE $Text            : IFZ (style AND 1) THEN GOSUB PullUp
  2008.                                             XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @text$)
  2009.                                             XuiSetTextString (grid, #SetTextString, 0, 0, 0, 0, 0, @text$)
  2010.                                             XuiSendMessage (list, #GetTextCursor, 0, @cl, 0, 0, 0, 0)
  2011.                                             XuiCallback (grid, #Selection, cl, 0, 0, 0, 0, 0)
  2012.         CASE $Button        :    XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2013.                                             XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  2014.                                             IF (style AND 1) THEN GOSUB PullDown ELSE GOSUB PullToggle
  2015.         CASE $List            : XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @text$[])
  2016.                                             XuiSendMessage (list, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  2017.                                             IF ((v0 >= 0) AND (v0 <= UBOUND(text$[]))) THEN
  2018.                                                 text$ = text$[v0]
  2019.                                                 under = INSTR(text$, "_")
  2020.                                                 IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  2021.                                                 XuiSetTextString (grid, #SetTextString, 0, 0, 0, 0, 0, @text$)
  2022.                                                 XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @text$)
  2023.                                                 XuiSendToKid (grid, #Redraw, 0, 0, 0, 0, $Text, 0)
  2024.                                                 XuiSendToKid (grid, #SetKeyboardFocus, 0, 0, 0, 0, $Text, 0)
  2025.                                             END IF
  2026.                                             IFZ (style AND 1) THEN GOSUB PullUp
  2027.                                             XuiCallback (grid, #Selection, v0, 0, 0, 0, 0, 0)
  2028.     END SELECT
  2029. END SUB
  2030. '
  2031. '
  2032. ' *****  PullDown  *****
  2033. '
  2034. SUB PullDown
  2035.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2036.     IF listState THEN EXIT SUB
  2037.     XgrGetGridWindow (grid, @window)
  2038.     XgrGetGridWindow (list, @listWindow)
  2039.     XuiSetValue (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 1)
  2040.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2041.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  2042.     XgrSetWindowPositionAndSize (listWindow, xDrop, yDrop, -1, -1)
  2043.     XuiSendMessage (list, #ShowWindow, 0, 0, 0, 0, 0, 0)
  2044. END SUB
  2045. '
  2046. '
  2047. ' *****  PullUp  *****
  2048. '
  2049. SUB PullUp
  2050.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2051.     IFZ listState THEN EXIT SUB
  2052.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 1)
  2053.     XuiSendMessage (list, #HideWindow, 0, 0, 0, 0, 0, 0)
  2054. END SUB
  2055. '
  2056. '
  2057. ' *****  PullToggle  *****
  2058. '
  2059. SUB PullToggle
  2060.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2061.     IF listState THEN GOSUB PullUp ELSE GOSUB PullDown
  2062. END SUB
  2063. '
  2064. '
  2065. ' *****  SetStyle  *****
  2066. '
  2067. '    $Style0        = 0            ' list goes up/down, text line editable
  2068. '    $Style1        = 1            ' list always down, text line editable
  2069. '    $Style2        = 2            ' list goes up/down, text line not editable
  2070. '    $Style3        = 3            ' list always down, text line not editable
  2071. '
  2072. SUB SetStyle
  2073.     style = v0
  2074.     IF (style < 0) THEN EXIT SUB
  2075.     IF (style > 3) THEN EXIT SUB
  2076.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2077.     XuiGetStyle (grid, #GetStyle, @oldStyle, 0, 0, 0, 0, 0)
  2078.     XuiSetStyle (grid, #SetStyle, style, 0, 0, 0, 0, 0)
  2079.     IF (style = oldStyle) THEN EXIT SUB
  2080.     SELECT CASE style
  2081.         CASE 0:        XuiSendToKid (grid, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, $Text, 0)
  2082.                             XuiSendToKid (grid, #ShowTextCursor, 0, 0, 0, 0, $Text, 0)
  2083.         CASE 1:        XuiSendToKid (grid, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, $Text, 0)
  2084.                             XuiSendToKid (grid, #ShowTextCursor, 0, 0, 0, 0, $Text, 0)
  2085.                             XuiSendMessage (list, #ShowWindow, 0, 0, 0, 0, 0, 0)
  2086.         CASE 2:        XuiSendToKid (grid, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, $Text, 0)
  2087.                             XuiSendToKid (grid, #HideTextCursor, 0, 0, 0, 0, $Text, 0)
  2088.         CASE 3:        XuiSendToKid (grid, #SetBorder, $$BorderRaise1, $$BorderRaise1, $$BorderRaise1, 0, $Text, 0)
  2089.                             XuiSendToKid (grid, #HideTextCursor, 0, 0, 0, 0, $Text, 0)
  2090.                             XuiSendMessage (list, #ShowWindow, 0, 0, 0, 0, 0, 0)
  2091.     END SELECT
  2092. END SUB
  2093. '
  2094. '
  2095. ' *****  SetColors  *****
  2096. '
  2097. SUB SetColors
  2098.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2099.     XuiSendToKid (grid, message, v0, v1, v2, v3, $Text, 0)
  2100.     XuiSendToKid (grid, message, v0, v1, v2, v3, $Button, 0)
  2101.     XuiSendMessage (list, message, v0, v1, v2, v3, 0, r1)
  2102. END SUB
  2103. '
  2104. '
  2105. ' *****  SetTextArray  *****
  2106. '
  2107. SUB SetTextArray
  2108.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2109.     IF r1$[] THEN text$ = r1$[0]
  2110.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2111.     under = INSTR (text$, "_")
  2112.     IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  2113.     cp = LEN (text$)
  2114.     IF r1$[] THEN
  2115.         XuiSendMessage (list, #GetFontNumber, @font, 0, 0, 0, 0, 0)
  2116.         XuiGetTextArraySize (@r1$[], font, @w, @h, @width, @height, extra, extra)
  2117.     END IF
  2118.     height = height + 24
  2119.     IF (height > 256) THEN height = 256
  2120.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @text$)
  2121.     XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  2122.     XuiSendMessage (list, #SetTextArray, 0, 0, 0, 0, 0, @r1$[])
  2123.     GOSUB SizeList
  2124.     XuiSendMessage (list, #Resize, 0, 0, x2-x1+1, height, 0, 0)
  2125.     XuiSendMessage (list, #Redraw, 0, 0, 0, 0, 0, 0)
  2126. END SUB
  2127. '
  2128. '
  2129. ' *****  SizeList  *****
  2130. '
  2131. SUB SizeList
  2132.     XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @list$[])
  2133.     height = 0
  2134.     IF list$[] THEN
  2135.         XuiSendMessage (list, #GetFontNumber, @font, 0, 0, 0, 0, 0)
  2136.         XuiGetTextArraySize (@list$[], font, 0, 0, 0, @height, 0, 0)
  2137.     END IF
  2138.     DIM list$[]
  2139.     height = height + 24
  2140.     IF (height > 256) THEN height = 256
  2141. END SUB
  2142. '
  2143. '
  2144. ' *****  SetTextCursor  *****
  2145. '
  2146. SUB SetTextCursor
  2147.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2148.     IF (v0 >= 0) THEN XuiSendToKid (grid, #SetTextCursor, v0, 0, 0, 0, $Text, 0)
  2149.     IF (v1 >= 0) THEN XuiSendMessage (list, #SetTextCursor, 0, v1, -1, -1, 0, 0)
  2150. END SUB
  2151. '
  2152. '
  2153. ' *****  SetTextString  *****
  2154. '
  2155. SUB SetTextString
  2156.     cp = LEN (r1$)
  2157.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @r1$)
  2158.     XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  2159. END SUB
  2160. '
  2161. '
  2162. ' *****  TextEvent  *****
  2163. '
  2164. SUB TextEvent
  2165.     abort = r0
  2166.     XuiCallback (grid, #TextEvent, v0, v1, v2, v3, @abort, grid)
  2167.     IF (abort = -1) THEN EXIT SUB
  2168. '
  2169.     IF (v2 AND $$TextModifyBit) THEN XgrJamMessage (grid, #TextModified, 0, 0, 0, 0, 0, 0)
  2170.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2171.     IFZ list THEN EXIT SUB
  2172.     key = v2{$$VirtualKey}
  2173. '
  2174.     IF (v2 AND $$AltBit) THEN
  2175.         SELECT CASE key
  2176.             CASE $$KeyUpArrow        : GOSUB PullUp        : r0 = -1            ' cancel
  2177.             CASE $$KeyDownArrow    : GOSUB PullDown    : r0 = -1            ' cancel
  2178.         END SELECT
  2179.     ELSE
  2180.         IF (r0 != $List) THEN
  2181.             SELECT CASE key
  2182.                 CASE $$KeyUpArrow, $$KeyDownArrow
  2183.                             XuiSendMessage (list, #KeyDown, v0, v1, v2, v3, 0, list)
  2184.                             XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @item$[])
  2185.                             XuiSendMessage (list, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  2186.                             upper = UBOUND (item$[])
  2187.                             IF (cl > upper) THEN cl = upper
  2188.                             IF (cl < 0) THEN cl = 0
  2189.                             item$ = item$[cl]
  2190.                             cp = LEN(item$)
  2191.                             XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Text, @item$)
  2192.                             XuiSendToKid (grid, #SetTextCursor, cp, 0, 0, 0, $Text, 0)
  2193.                             XuiSendToKid (grid, #Redraw, 0, 0, 0, 0, $Text, 0)
  2194.                             r0 = -1
  2195.             END SELECT
  2196.         END IF
  2197.     END IF
  2198. END SUB
  2199. '
  2200. '
  2201. ' *****  TextModified  *****
  2202. '
  2203. SUB TextModified
  2204.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2205.     IFZ list THEN EXIT SUB
  2206.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @text$)
  2207.     IFZ text$ THEN EXIT SUB
  2208.     XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @list$[])
  2209.     IFZ list$[] THEN EXIT SUB
  2210.     uList = UBOUND (list$[])
  2211.     lenText = LEN (text$)
  2212.     FOR line = 0 TO uList
  2213.         list$ = list$[line]
  2214.         under = INSTR (list$, "_")
  2215.         IF under THEN list$ = LEFT$ (list$, under-1) + MID$ (list$, under+1)
  2216.         lenLine = LEN (list$)
  2217.         IF (lenLine < lenText) THEN DO NEXT
  2218.         IF (text$ = LEFT$ (list$, lenText)) THEN EXIT FOR
  2219.     NEXT line
  2220.     IF (line <= uList) THEN XuiSendMessage (list, #SetTextCursor, 0, line, -1, -1, 0, 0)
  2221. END SUB
  2222. '
  2223. '
  2224. ' *****  SendToKids  *****
  2225. '
  2226. SUB SendToKids
  2227.     XuiSendToKids (grid, message, v0, v1, v2, v3, 0, r1)
  2228. END SUB
  2229. '
  2230. '
  2231. ' *****  Initialize  *****
  2232. '
  2233. SUB Initialize
  2234.     XuiGetDefaultMessageFuncArray (@func[])
  2235.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  2236. '
  2237.     func[#Callback]                        = 0
  2238.     func[#Destroy]                        = 0
  2239.     func[#GetSmallestSize]        = &XuiGetMaxMinSize()
  2240.     func[#GetTextArray]                = 0
  2241.     func[#GetTextString]            = 0
  2242.     func[#Resize]                            = 0
  2243.     func[#SetStyle]                        = 0
  2244.     func[#SetTextArray]                = 0
  2245.     func[#SetTextString]            = 0
  2246. '
  2247.     DIM sub[upperMessage]
  2248.     sub[#Callback]                        = SUBADDRESS (Callback)
  2249.     sub[#Create]                            = SUBADDRESS (Create)
  2250.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  2251.     sub[#Destroy]                            = SUBADDRESS (Destroy)
  2252.     sub[#GetTextArray]                = SUBADDRESS (GetTextArray)
  2253.     sub[#GetTextCursor]                = SUBADDRESS (GetTextCursor)
  2254.     sub[#GetTextString]                = SUBADDRESS (GetTextString)
  2255.     sub[#Resize]                            = SUBADDRESS (Resize)
  2256.     sub[#Selection]                        = SUBADDRESS (Selection)
  2257.     sub[#SetColor]                        = SUBADDRESS (SetColors)
  2258.     sub[#SetColorExtra]                = SUBADDRESS (SetColors)
  2259.     sub[#SetFont]                            = SUBADDRESS (SendToKids)
  2260.     sub[#SetFontNumber]                = SUBADDRESS (SendToKids)
  2261.     sub[#SetStyle]                        = SUBADDRESS (SetStyle)
  2262.     sub[#SetTextArray]                = SUBADDRESS (SetTextArray)
  2263.     sub[#SetTextCursor]                = SUBADDRESS (SetTextCursor)
  2264.     sub[#SetTextString]                = SUBADDRESS (SetTextString)
  2265.     sub[#TextEvent]                        = SUBADDRESS (TextEvent)
  2266.     sub[#TextModified]                = SUBADDRESS (TextModified)
  2267. '
  2268.     IF func[0] THEN PRINT "XuiListBox() : Initialize : error ::: (undefined message)"
  2269.     IF sub[0] THEN PRINT "XuiListBox() : Initialize : error ::: (undefined message)"
  2270.     XuiRegisterGridType (@XuiListBox, @"XuiListBox", &XuiListBox(), @func[], @sub[])
  2271. '
  2272.     designX = 0
  2273.     designY = 0
  2274.     designWidth = 80
  2275.     designHeight = 24
  2276. '
  2277.     gridType = XuiListBox
  2278.     XuiSetGridTypeValue (gridType, @"x",               designX)
  2279.     XuiSetGridTypeValue (gridType, @"y",               designY)
  2280.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  2281.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  2282.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  2283.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  2284.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  2285.     XuiSetGridTypeValue (gridType, @"focusKid",         $Text)
  2286.     XuiSetGridTypeValue (gridType, @"inputTextString",  $Text)
  2287.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawNone)
  2288.     IFZ message THEN RETURN
  2289. END SUB
  2290. END FUNCTION
  2291. '
  2292. '
  2293. ' ##############################
  2294. ' #####  XuiListButton ()  #####
  2295. ' ##############################
  2296. '
  2297. FUNCTION  XuiListButton (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  2298.   STATIC  designX,  designY,  designWidth,  designHeight
  2299.     STATIC  SUBADDR  sub[]
  2300.     STATIC  upperMessage
  2301.     STATIC  XuiListButton
  2302.     STATIC  downGrid
  2303.     STATIC  outside
  2304. '
  2305.     $ListButton    = 0
  2306.     $List                = 1
  2307. '
  2308.     $Style0            = 0            ' list goes up/down, text line editable
  2309.     $Style1            = 1            ' list always down, text line editable
  2310.     $Style2            = 2            ' list goes up/down, text line not editable
  2311.     $Style3            = 3            ' list always down, text line not editable
  2312. '
  2313.     IFZ sub[] THEN GOSUB Initialize
  2314.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiListButton) THEN RETURN
  2315.     GOSUB @sub[message]
  2316.     RETURN
  2317. '
  2318. '
  2319. ' *****  Callback  *****
  2320. '
  2321. SUB Callback
  2322.     message = r1
  2323.     callback = message
  2324.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  2325. END SUB
  2326. '
  2327. '
  2328. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  2329. '
  2330. SUB Create
  2331.     IF (v0 <= 0) THEN v0 = 0
  2332.     IF (v1 <= 0) THEN v1 = 0
  2333.     IF (v2 <= 0) THEN v2 = designWidth
  2334.     IF (v3 <= 0) THEN v3 = designHeight
  2335.     XuiCreateGrid (@grid, XuiListButton, @v0, @v1, @v2, @v3, r0, r1, &XuiListButton())
  2336.     GOSUB CreateList
  2337.     GOSUB Resize
  2338. END SUB
  2339. '
  2340. '
  2341. ' *****  CreateList  *****
  2342. '
  2343. SUB CreateList
  2344.     XgrGetGridWindow (grid, @window)
  2345.     XgrConvertWindowToDisplay (grid, v0, v1+20, @xDisp, @yDisp)
  2346.     windowType = $$WindowTypeTopMost OR $$WindowTypeNoFrame OR window
  2347.     XuiList (@g, #CreateWindow, xDisp, yDisp, v2, v3, windowType, 0)
  2348.     XuiSendMessage ( g, #SetCallback, grid, &XuiListButton(), -1, -1, $List, grid)
  2349.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"List")
  2350.     XuiSendMessage ( g, #SetBorder, $$BorderRidge, $$BorderRidge, $$BorderRidge, 0, 0, 0)
  2351.     XuiSetValues (grid, #SetValues, g, 0, 0, 0, 0, 0)
  2352. END SUB
  2353. '
  2354. '
  2355. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  2356. '
  2357. SUB CreateWindow
  2358.     IF (v0  = 0) THEN v0 = designX
  2359.     IF (v1  = 0) THEN v1 = designY
  2360.     IF (v2 <= 0) THEN v2 = designWidth
  2361.     IF (v3 <= 0) THEN v3 = designHeight
  2362.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  2363.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  2364.     GOSUB Create
  2365.     r1 = 0 : ATTACH display$ TO r1$
  2366.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiListButton")
  2367. END SUB
  2368. '
  2369. '
  2370. ' *****  Destroy  *****
  2371. '
  2372. SUB Destroy
  2373.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2374.     XuiSendMessage (list, #Destroy, 0, 0, 0, 0, 0, 0)
  2375.     XuiDestroy (grid, #Destroy, 0, 0, 0, 0, 0, 0)
  2376. END SUB
  2377. '
  2378. '
  2379. ' *****  GetTextArray  *****
  2380. '
  2381. SUB GetTextArray
  2382.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2383.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2384.     XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @r1$[])
  2385. END SUB
  2386. '
  2387. '
  2388. ' *****  GetTextCursor  *****
  2389. '
  2390. SUB GetTextCursor
  2391.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2392.     XuiSendMessage (list, #GetTextCursor, @v0, @v1, @v2, @v3, 0, 0)
  2393. END SUB
  2394. '
  2395. '
  2396. ' *****  GrabTextArray  *****
  2397. '
  2398. SUB GrabTextArray
  2399.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2400.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2401.     XuiSendMessage (list, #GrabTextArray, 0, 0, 0, 0, 0, @r1$[])
  2402. END SUB
  2403. '
  2404. '
  2405. ' *****  KeyDown  *****
  2406. '
  2407. SUB KeyDown
  2408.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  2409.     IFZ (state AND keyboard) THEN EXIT SUB
  2410.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2411.     IFZ list THEN EXIT SUB
  2412.     key = v2{$$VirtualKey}
  2413. '
  2414.     IF (v2 AND $$AltBit) THEN
  2415.         SELECT CASE key
  2416.             CASE $$KeyUpArrow        : GOSUB PullUp
  2417.             CASE $$KeyDownArrow    : GOSUB PullDown
  2418.         END SELECT
  2419.     ELSE
  2420.         IFZ callback THEN            ' avoid stack overflow
  2421.             SELECT CASE key
  2422.                 CASE $$KeyUpArrow, $$KeyDownArrow, $$KeyEnter
  2423.                             XuiSendMessage (list, #KeyDown, v0, v1, v2, v3, 0, list)
  2424.             END SELECT
  2425.         END IF
  2426.     END IF
  2427. END SUB
  2428. '
  2429. '
  2430. ' *****  MouseDown  *****
  2431. '
  2432. SUB MouseDown
  2433.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  2434.     IFZ (state AND mouse) THEN EXIT SUB
  2435.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2436.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  2437.     IF (style AND 1) THEN GOSUB PullDown ELSE GOSUB PullToggle
  2438.     downGrid = grid
  2439. END SUB
  2440. '
  2441. '
  2442. ' *****  MouseDrag  *****
  2443. '
  2444. SUB MouseDrag
  2445.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  2446.     IFZ (state AND mouse) THEN EXIT SUB
  2447.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2448.     IFZ listState THEN EXIT SUB
  2449.     IF outside THEN
  2450.         XgrConvertLocalToDisplay (r1, v0, v1, @xDisp, @yDisp)
  2451.         XgrConvertDisplayToLocal (list, xDisp, yDisp, @x, @y)
  2452.         XgrGetGridBoxLocal (list, @x1, @y1, @x2, @y2)
  2453.         IF (x >= x1) THEN
  2454.             IF (x <= x2) THEN
  2455.                 IF (y >= y1) THEN
  2456.                     IF (y <= y2) THEN
  2457.                         XuiSendMessage (list, message, x, y, v2, v3, 0, list)
  2458.                     END IF
  2459.                 END IF
  2460.             END IF
  2461.         END IF
  2462.     END IF
  2463. END SUB
  2464. '
  2465. '
  2466. ' *****  MouseEnter  *****
  2467. '
  2468. SUB MouseEnter
  2469.     IF downGrid THEN outside = $$FALSE
  2470. END SUB
  2471. '
  2472. '
  2473. ' *****  MouseExit  *****
  2474. '
  2475. SUB MouseExit
  2476.     IF downGrid THEN outside = $$TRUE
  2477. END SUB
  2478. '
  2479. '
  2480. ' *****  MouseUp  *****
  2481. '
  2482. SUB MouseUp
  2483.     downGrid = $$FALSE
  2484.     outside = $$FALSE
  2485. END SUB
  2486. '
  2487. '
  2488. ' *****  Resize  *****
  2489. '
  2490. SUB Resize
  2491.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2492.     IF (v2 < (v3 + 32)) THEN v2 = v3 + 32
  2493.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  2494.     XuiSendMessage (list, #Resize, 0, 0, 0, 0, 0, 0)
  2495.     XgrGetGridWindow (list, @listWindow)
  2496.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2497.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  2498.     XgrSetWindowPositionAndSize (listWindow, xDrop, yDrop, -1, -1)
  2499.     GOSUB SizeList
  2500.     XuiSendMessage (list, #Resize, 0, 0, x2-x1+1, height, 0, 0)
  2501.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  2502. END SUB
  2503. '
  2504. '
  2505. ' *****  Selection  *****
  2506. '
  2507. SUB Selection
  2508.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2509.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  2510.     SELECT CASE r0
  2511.         CASE $List            : XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @text$[])
  2512.                                             XuiSendMessage (list, #GetTextCursor, @cp, @cl, 0, 0, 0, 0)
  2513.                                             IF ((v0 >= 0) AND (v0 <= UBOUND(text$[]))) THEN
  2514.                                                 text$ = text$[v0]
  2515.                                                 under = INSTR(text$, "_")
  2516.                                                 IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  2517.                                                 XuiSetKeyboardFocus (grid, #SetKeyboardFocus, 0, 0, 0, 0, 0, 0)
  2518.                                             END IF
  2519.                                             IFZ (style AND 1) THEN GOSUB PullUp
  2520.                                             XuiCallback (grid, #Selection, v0, 0, 0, 0, 0, 0)
  2521.     END SELECT
  2522. END SUB
  2523. '
  2524. '
  2525. ' *****  PullDown  *****
  2526. '
  2527. SUB PullDown
  2528.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2529.     IF listState THEN EXIT SUB
  2530.     XgrGetGridWindow (grid, @window)
  2531.     XgrGetGridWindow (list, @listWindow)
  2532.     XuiSetValue (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 1)
  2533.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2534.     XgrConvertWindowToDisplay (grid, x1, y2+1, @xDrop, @yDrop)
  2535.     XgrSetWindowPositionAndSize (listWindow, xDrop, yDrop, -1, -1)
  2536.     XuiSendMessage (list, #ShowWindow, 0, 0, 0, 0, 0, 0)
  2537. END SUB
  2538. '
  2539. '
  2540. ' *****  PullUp  *****
  2541. '
  2542. SUB PullUp
  2543.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2544.     IFZ listState THEN EXIT SUB
  2545.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 1)
  2546.     XuiSendMessage (list, #HideWindow, 0, 0, 0, 0, 0, 0)
  2547. END SUB
  2548. '
  2549. '
  2550. ' *****  PullToggle  *****
  2551. '
  2552. SUB PullToggle
  2553.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2554.     IF listState THEN GOSUB PullUp ELSE GOSUB PullDown
  2555. END SUB
  2556. '
  2557. '
  2558. ' *****  PokeTextArray  *****
  2559. '
  2560. SUB PokeTextArray
  2561.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2562.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2563.     XuiSendMessage (list, #PokeTextArray, 0, 0, 0, 0, 0, @r1$[])
  2564. END SUB
  2565. '
  2566. '
  2567. ' *****  SetStyle  *****
  2568. '
  2569. '    $Style0        = 0            ' list goes up/down
  2570. '    $Style1        = 1            ' list always down
  2571. '    $Style2        = 2            ' list goes up/down
  2572. '    $Style3        = 3            ' list always down
  2573. '
  2574. SUB SetStyle
  2575.     style = v0
  2576.     IF (style < 0) THEN EXIT SUB
  2577.     IF (style > 3) THEN EXIT SUB
  2578.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2579.     XuiGetStyle (grid, #GetStyle, @oldStyle, 0, 0, 0, 0, 0)
  2580.     XuiSetStyle (grid, #SetStyle, style, 0, 0, 0, 0, 0)
  2581.     IF (style = oldStyle) THEN EXIT SUB
  2582.     SELECT CASE style
  2583.         CASE 0,2:    XuiSendMessage (list, #HideWindow, 0, 0, 0, 0, 0, 0)
  2584.         CASE 1,3:    XuiSendMessage (list, #ShowWindow, 0, 0, 0, 0, 0, 0)
  2585.     END SELECT
  2586. END SUB
  2587. '
  2588. '
  2589. ' *****  SetColors  *****
  2590. '
  2591. SUB SetColors
  2592.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2593.     XuiSendMessage (list, message, v0, v1, v2, v3, 0, r1)
  2594. END SUB
  2595. '
  2596. '
  2597. ' *****  SetTextArray  *****
  2598. '
  2599. SUB SetTextArray
  2600.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2601.     IF r1$[] THEN text$ = r1$[0]
  2602.     XgrGetGridBoxWindow (grid, @x1, @y1, @x2, @y2)
  2603.     under = INSTR (text$, "_")
  2604.     IF under THEN text$ = LEFT$(text$,under-1) + MID$(text$, under+1)
  2605.     cp = LEN (text$)
  2606.     IF r1$[] THEN
  2607.         XuiSendMessage (list, #GetFontNumber, @font, 0, 0, 0, 0, 0)
  2608.         XuiGetTextArraySize (@r1$[], font, @w, @h, @width, @height, extra, extra)
  2609.     END IF
  2610.     height = height + 24
  2611.     IF (height > 256) THEN height = 256
  2612.     XuiSendMessage (list, #SetTextArray, 0, 0, 0, 0, 0, @r1$[])
  2613.     GOSUB SizeList
  2614.     XuiSendMessage (list, #Resize, 0, 0, x2-x1+1, height, 0, 0)
  2615.     XuiSendMessage (list, #Redraw, 0, 0, 0, 0, 0, 0)
  2616. END SUB
  2617. '
  2618. '
  2619. ' *****  SetTextCursor  *****
  2620. '
  2621. SUB SetTextCursor
  2622.     XuiGetValues (grid, #GetValues, @list, @listState, 0, 0, 0, 0)
  2623.     XuiSendMessage (list, #SetTextCursor, v0, v1, v2, v3, 0, 0)
  2624. END SUB
  2625. '
  2626. '
  2627. ' *****  SizeList  *****
  2628. '
  2629. SUB SizeList
  2630.     XuiSendMessage (list, #GetTextArray, 0, 0, 0, 0, 0, @list$[])
  2631.     height = 0
  2632.     IF list$[] THEN
  2633.         XuiSendMessage (list, #GetFontNumber, @font, 0, 0, 0, 0, 0)
  2634.         XuiGetTextArraySize (@list$[], font, 0, 0, 0, @height, 0, 0)
  2635.     END IF
  2636.     DIM list$[]
  2637.     height = height + 24
  2638.     IF (height > 256) THEN height = 256
  2639. END SUB
  2640. '
  2641. '
  2642. ' *****  TextEvent  *****
  2643. '
  2644. SUB TextEvent
  2645.     GOSUB KeyDown
  2646. END SUB
  2647. '
  2648. '
  2649. ' *****  SendToKids  *****
  2650. '
  2651. SUB SendToKids
  2652.     XuiSendToKids (grid, message, v0, v1, v2, v3, 0, r1)
  2653. END SUB
  2654. '
  2655. '
  2656. ' *****  Initialize  *****
  2657. '
  2658. SUB Initialize
  2659.     XuiGetDefaultMessageFuncArray (@func[])
  2660.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  2661. '
  2662.     func[#Callback]                        = 0
  2663.     func[#Destroy]                        = 0
  2664.     func[#GetSmallestSize]        = &XuiGetMaxMinSize()
  2665.     func[#GetTextArray]                = 0
  2666.     func[#GrabTextArray]            = 0
  2667.     func[#PokeTextArray]            = 0
  2668.     func[#Resize]                            = 0
  2669.     func[#SetStyle]                        = 0
  2670.     func[#SetTextArray]                = 0
  2671. '
  2672.     DIM sub[upperMessage]
  2673.     sub[#Callback]                        = SUBADDRESS (Callback)
  2674.     sub[#Create]                            = SUBADDRESS (Create)
  2675.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  2676.     sub[#Destroy]                            = SUBADDRESS (Destroy)
  2677.     sub[#GetTextArray]                = SUBADDRESS (GetTextArray)
  2678.     sub[#GrabTextArray]                = SUBADDRESS (GrabTextArray)
  2679.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  2680.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  2681.     sub[#MouseDrag]                        = SUBADDRESS (MouseDrag)
  2682.     sub[#MouseEnter]                    = SUBADDRESS (MouseEnter)
  2683.     sub[#MouseExit]                        = SUBADDRESS (MouseExit)
  2684.     sub[#MouseUp]                            = SUBADDRESS (MouseUp)
  2685.     sub[#PokeTextArray]                = SUBADDRESS (PokeTextArray)
  2686.     sub[#Resize]                            = SUBADDRESS (Resize)
  2687.     sub[#Selection]                        = SUBADDRESS (Selection)
  2688.     sub[#SetColor]                        = SUBADDRESS (SetColors)
  2689.     sub[#SetColorExtra]                = SUBADDRESS (SetColors)
  2690.     sub[#SetFont]                            = SUBADDRESS (SendToKids)
  2691.     sub[#SetFontNumber]                = SUBADDRESS (SendToKids)
  2692.     sub[#SetStyle]                        = SUBADDRESS (SetStyle)
  2693.     sub[#SetTextArray]                = SUBADDRESS (SetTextArray)
  2694.     sub[#TextEvent]                        = SUBADDRESS (TextEvent)
  2695. '
  2696.     IF func[0] THEN PRINT "XuiListButton() : Initialize : error ::: (undefined message)"
  2697.     IF sub[0] THEN PRINT "XuiListButton() : Initialize : error ::: (undefined message)"
  2698.     XuiRegisterGridType (@XuiListButton, @"XuiListButton", &XuiListButton(), @func[], @sub[])
  2699. '
  2700.     designX = 0
  2701.     designY = 0
  2702.     designWidth = 80
  2703.     designHeight = 24
  2704. '
  2705.     gridType = XuiListButton
  2706.     XuiSetGridTypeValue (gridType, @"x",               designX)
  2707.     XuiSetGridTypeValue (gridType, @"y",               designY)
  2708.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  2709.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  2710.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  2711.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  2712.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise1)
  2713.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  2714.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  2715.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  2716.     IFZ message THEN RETURN
  2717. END SUB
  2718. END FUNCTION
  2719. '
  2720. '
  2721. ' ################################
  2722. ' #####  XuiListDialog2B ()  #####  Label, List, TextLine, and 2 PushButtons
  2723. ' ################################
  2724. '
  2725. FUNCTION  XuiListDialog2B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  2726.   STATIC    designX,  designY,  designWidth,  designHeight
  2727.     STATIC    SUBADDR  sub[]
  2728.     STATIC    upperMessage
  2729.     STATIC    XuiListDialog2B
  2730. '
  2731.     $Dialog        = 0
  2732.     $Label        = 1
  2733.     $List            = 2
  2734.     $Text            = 3
  2735.     $Button0    = 4
  2736.     $Button1    = 5
  2737. '
  2738.     IFZ sub[] THEN GOSUB Initialize
  2739.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiListDialog2B) THEN RETURN
  2740.     GOSUB @sub[message]
  2741.     RETURN
  2742. '
  2743. '
  2744. ' *****  Callback  *****
  2745. '
  2746. SUB Callback
  2747.     IF (r1 = #Selection) THEN
  2748.         XuiCallback (grid, message, v0, v1, v2, v3, r0, r1)
  2749.     ELSE
  2750.         message = r1
  2751.         callback = message
  2752.         IF (message <= upperMessage) THEN GOSUB @sub[message]
  2753.     END IF
  2754. END SUB
  2755. '
  2756. '
  2757. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  2758. '
  2759. SUB Create
  2760.     IF (v0 <= 0) THEN v0 = 0
  2761.     IF (v1 <= 0) THEN v1 = 0
  2762.     IF (v2 <= 0) THEN v2 = designWidth
  2763.     IF (v3 <= 0) THEN v3 = designHeight
  2764.     XuiCreateGrid  (@grid, XuiListDialog2B, @v0, @v1, @v2, @v3, r0, r1, &XuiListDialog2B())
  2765.     XuiLabel       (@g, #Create, 0, 0, 0, 0, r0, grid)
  2766.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  2767.     XuiList        (@g, #Create, 0, 0, 0, 0, r0, grid)
  2768.     XuiSendMessage ( g, #SetCallback, grid, &XuiListDialog2B(), -1, -1, $List, grid)
  2769.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"List")
  2770.     XuiTextLine    (@g, #Create, 0, 0, 0, 0, r0, grid)
  2771.     XuiSendMessage ( g, #SetCallback, grid, &XuiListDialog2B(), -1, -1, $Text, grid)
  2772.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"TextLine")
  2773.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  2774.     XuiSendMessage ( g, #SetCallback, grid, &XuiListDialog2B(), -1, -1, $Button0, grid)
  2775.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  2776.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @" Enter ")
  2777.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  2778.     XuiSendMessage ( g, #SetCallback, grid, &XuiListDialog2B(), -1, -1, $Button1, grid)
  2779.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  2780.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @" Cancel ")
  2781.     GOSUB Resize
  2782. END SUB
  2783. '
  2784. '
  2785. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  2786. '
  2787. SUB CreateWindow
  2788.     IF (v0  = 0) THEN v0 = designX
  2789.     IF (v1  = 0) THEN v1 = designY
  2790.     IF (v2 <= 0) THEN v2 = designWidth
  2791.     IF (v3 <= 0) THEN v3 = designHeight
  2792.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  2793.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  2794.     GOSUB Create
  2795.     r1 = 0 : ATTACH display$ TO r1$
  2796.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiListDialog2B")
  2797. END SUB
  2798. '
  2799. '
  2800. ' *****  GetSmallestSize  *****
  2801. '
  2802. SUB GetSmallestSize
  2803.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  2804.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @labelWidth, @labelHeight, $Label, 8)
  2805.     XuiSendToKid (grid, #GetSmallestSize, 10, 8, @listWidth, @listHeight, $List, 64)
  2806.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, 0, @textHeight, $Text, 8)
  2807. '
  2808.     buttonWidth = 8
  2809.     buttonHeight = 8
  2810.     FOR i = $Button0 TO $Button1
  2811.         XuiSendToKid (grid, #GetSmallestSize, 0, 0, @width, @height, i, 8)
  2812.         IF (width > buttonWidth) THEN buttonWidth = width
  2813.         IF (height > buttonHeight) THEN buttonHeight = height
  2814.     NEXT i
  2815.     width = buttonWidth + buttonWidth
  2816.     IF (width < labelWidth) THEN width = labelWidth
  2817.     IF (width < listWidth) THEN width = listWidth
  2818.     v2 = width + bw + bw
  2819.     v3 = labelHeight + listHeight + buttonHeight + textHeight + bw + bw
  2820. END SUB
  2821. '
  2822. '
  2823. ' *****  Resize  *****
  2824. '
  2825. SUB Resize
  2826.     vv2 = v2
  2827.     vv3 = v3
  2828.     GOSUB GetSmallestSize                ' returns bw and heights
  2829.     v2 = MAX (vv2, v2)
  2830.     v3 = MAX (vv3, v3)
  2831. '
  2832. '    Resize grid
  2833. '
  2834.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  2835.     h = labelHeight + listHeight + buttonHeight + textHeight + bw + bw
  2836.     IF (v3 >= h + 4) THEN
  2837.         buttonHeight = buttonHeight + 4 : h = h + 4
  2838.         IF (v3 >= h + 4) THEN
  2839.             textHeight = textHeight + 4 : h = h + 4
  2840.             IF (v3 >= h + 4) THEN
  2841.                 labelHeight = labelHeight + 4
  2842.             END IF
  2843.         END IF
  2844.     END IF
  2845. '
  2846. '    Resize kids
  2847. '
  2848.     x = bw
  2849.     y = bw
  2850.     w = v2 - bw - bw
  2851.     XuiSendToKid (grid, #Resize, x, y, w, labelHeight, $Label, 0)
  2852. '
  2853.     y = y + labelHeight
  2854.     h = v3 - labelHeight - textHeight - buttonHeight - bw - bw
  2855.     XuiSendToKid (grid, #Resize, x, y, w, h, $List, 0)
  2856. '
  2857.     y = y + h
  2858.     XuiSendToKid (grid, #Resize, x, y, w, textHeight, $Text, 0)
  2859. '
  2860.     y = y + textHeight
  2861.     h = buttonHeight
  2862.     w1 = w >> 1
  2863.     w2 = v2 - w1 - bw - bw
  2864.     XuiSendToKid (grid, #Resize, x, y, w2, h, $Button0, 0) : x = x + w2
  2865.     XuiSendToKid (grid, #Resize, x, y, w1, h, $Button1, 0)
  2866.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  2867. END SUB
  2868. '
  2869. '
  2870. ' *****  GotKeyboardFocus  *****
  2871. '
  2872. SUB GotKeyboardFocus
  2873.     XuiSendToKid (grid, #ShowTextCursor, -1, -1, -1, -1, $Text, 0)
  2874. END SUB
  2875. '
  2876. '
  2877. ' *****  LostKeyboardFocus  *****
  2878. '
  2879. SUB LostKeyboardFocus
  2880.     XuiSendToKid (grid, #HideTextCursor, -1, -1, -1, -1, $Text, 0)
  2881. END SUB
  2882. '
  2883. '
  2884. ' *****  KeyDown  *****  Send upArrow, downArrow, pageUp, pageDown to XuiList
  2885. '
  2886. SUB KeyDown
  2887.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  2888.     IFZ (state AND keyboard) THEN EXIT SUB
  2889.     IF (v2{$$KeyKind} = $$KeyKindVirtual) THEN
  2890.         key = v2{8,0}
  2891.         SELECT CASE key
  2892.             CASE $$KeyUpArrow, $$KeyDownArrow, $$KeyPageUp, $$KeyPageDown
  2893.                         XuiSendToKid (grid, #KeyDown, v0, v1, v2, v3, $List, r1)
  2894.             CASE ELSE
  2895.                         XuiSendToKid (grid, #KeyDown, v0, v1, v2, v3, $Text, r1)
  2896.         END SELECT
  2897.     ELSE
  2898.         XuiSendToKid (grid, #KeyDown, v0, v1, v2, v3, $Text, r1)
  2899.     END IF
  2900. END SUB
  2901. '
  2902. '
  2903. ' *****  TextEvent  *****
  2904. '
  2905. SUB TextEvent
  2906.     abort = r0
  2907.     XuiCallback (grid, #TextEvent, v0, v1, v2, v3, @abort, grid)
  2908.     IF (abort = -1) THEN EXIT SUB
  2909.     IF (v2 AND $$TextModifyBit) THEN XgrJamMessage (grid, #TextModified, 0, 0, 0, 0, 0, 0)
  2910. END SUB
  2911. '
  2912. '
  2913. ' *****  TextModified  *****
  2914. '
  2915. SUB TextModified
  2916.     XuiSendToKid (grid, #GetTextString, 0, 0, 0, 0, $Text, @text$)
  2917.     IFZ text$ THEN EXIT SUB
  2918.     XuiSendToKid (grid, #GrabTextArray, 0, 0, 0, 0, $List, @list$[])
  2919.     IFZ list$[] THEN EXIT SUB
  2920.     uList = UBOUND(list$[])
  2921.     IF (uList = 0) THEN
  2922.         XuiSendToKid (grid, #PokeTextArray, 0, 0, 0, 0, $List, @list$[])
  2923.         EXIT SUB
  2924.     END IF
  2925.     lenText = LEN(text$)
  2926.     FOR line = 0 TO uList
  2927.         lenLine = LEN(list$[line])
  2928.         IF (lenLine < lenText) THEN DO NEXT
  2929.         IF (text$ = LEFT$(list$[line],lenText)) THEN EXIT FOR
  2930.     NEXT line
  2931.     XuiSendToKid (grid, #PokeTextArray, 0, 0, 0, 0, $List, @list$[])
  2932.     IF (line <= uList) THEN
  2933.         XuiSendToKid (grid, #SetTextCursor, 0, line, -1, -1, $List, 0)
  2934.     END IF
  2935. END SUB
  2936. '
  2937. '
  2938. ' *****  Initialize  ****
  2939. '
  2940. SUB Initialize
  2941.     XuiGetDefaultMessageFuncArray (@func[])
  2942.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  2943. '
  2944.     func[#GetSmallestSize]        = 0
  2945.     func[#MouseDown]                    = &XuiMouseDownSetKeyboardFocus()
  2946.     func[#Resize]                            = 0
  2947.     func[#Selection]                    = &XuiCallback()
  2948. '
  2949.     DIM sub[upperMessage]
  2950.     sub[#Callback]                        = SUBADDRESS (Callback)
  2951.     sub[#Create]                            = SUBADDRESS (Create)
  2952.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  2953.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  2954.     sub[#GotKeyboardFocus]        = SUBADDRESS (GotKeyboardFocus)
  2955.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  2956.     sub[#LostKeyboardFocus]        = SUBADDRESS (LostKeyboardFocus)
  2957.     sub[#Resize]                            = SUBADDRESS (Resize)
  2958.     sub[#TextEvent]                        = SUBADDRESS (TextEvent)
  2959.     sub[#TextModified]                = SUBADDRESS (TextModified)
  2960. '
  2961.     IF func[0] THEN PRINT "XuiListDialog2B() : Initialize : error ::: (undefined message)"
  2962.     IF sub[0] THEN PRINT "XuiListDialog2B() : Initialize : error ::: (undefined message)"
  2963.     XuiRegisterGridType (@XuiListDialog2B, @"XuiListDialog2B", &XuiListDialog2B(), @func[], @sub[])
  2964. '
  2965.     designX = 0
  2966.     designY = 0
  2967.     designWidth = 96
  2968.     designHeight = 96
  2969. '
  2970.     gridType = XuiListDialog2B
  2971.     XuiSetGridTypeValue (gridType, @"x",               designX)
  2972.     XuiSetGridTypeValue (gridType, @"y",               designY)
  2973.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  2974.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  2975.     XuiSetGridTypeValue (gridType, @"minWidth",        designWidth)
  2976.     XuiSetGridTypeValue (gridType, @"minHeight",       designHeight)
  2977.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  2978.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback OR $$InputTextString)
  2979.     XuiSetGridTypeValue (gridType, @"focusKid",         $Text)
  2980.     XuiSetGridTypeValue (gridType, @"inputTextString",  $Text)
  2981.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  2982.     IFZ message THEN RETURN
  2983. END SUB
  2984. END FUNCTION
  2985. '
  2986. '
  2987. ' #############################
  2988. ' #####  XuiMessage1B ()  #####  Label and PushButton
  2989. ' #############################
  2990. '
  2991. FUNCTION  XuiMessage1B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  2992.     STATIC    designX,  designY,  designWidth,  designHeight
  2993.     STATIC    SUBADDR  sub[]
  2994.     STATIC    upperMessage
  2995.     STATIC    XuiMessage1B
  2996. '
  2997.     $Message1B        = 0
  2998.     $Label                = 1
  2999.     $Button0            = 2
  3000. '
  3001.     IFZ sub[] THEN GOSUB Initialize
  3002.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiMessage1B) THEN RETURN
  3003.     GOSUB @sub[message]
  3004.     RETURN
  3005. '
  3006. '
  3007. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3008. '
  3009. SUB Create
  3010.     IF (v0 <= 0) THEN v0 = 0
  3011.     IF (v1 <= 0) THEN v1 = 0
  3012.     IF (v2 <= 0) THEN v2 = designWidth
  3013.     IF (v3 <= 0) THEN v3 = designHeight
  3014.     XuiCreateGrid  (@grid, XuiMessage1B, @v0, @v1, @v2, @v3, r0, r1, &XuiMessage1B())
  3015.     XuiLabel       (@g, #Create, 0, 0, 0, 0, r0, grid)
  3016.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  3017.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3018.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage1B(), -1, -1, $Button0, grid)
  3019.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"PushButton")
  3020.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  3021.     GOSUB Resize
  3022. END SUB
  3023. '
  3024. '
  3025. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3026. '
  3027. SUB CreateWindow
  3028.     IF (v0  = 0) THEN v0 = designX
  3029.     IF (v1  = 0) THEN v1 = designY
  3030.     IF (v2 <= 0) THEN v2 = designWidth
  3031.     IF (v3 <= 0) THEN v3 = designHeight
  3032.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3033.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3034.     GOSUB Create
  3035.     r1 = 0 : ATTACH display$ TO r1$
  3036.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiMessage1B")
  3037. END SUB
  3038. '
  3039. '
  3040. ' *****  GetSmallestSize  *****
  3041. '
  3042. SUB GetSmallestSize
  3043.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3044. '
  3045.     XuiSendToKid (grid, #GetSmallestSize, @labelWidth, @labelHeight, 0, 0, $Label, 8)
  3046.     XuiSendToKid (grid, #GetSmallestSize, @width, @height, 0, 0, $Button0, 8)
  3047.     IF (width > buttonWidth) THEN buttonWidth = width
  3048.     IF (height > buttonHeight) THEN buttonHeight = height
  3049. '
  3050.     width = buttonWidth
  3051.     height = labelHeight + buttonHeight
  3052.     IF (width < labelWidth) THEN width = labelWidth
  3053.     v2 = width + bw + bw
  3054.     v3 = height + bw + bw
  3055. END SUB
  3056. '
  3057. '
  3058. ' *****  Resize  *****        This reconfigures window to current text sizes
  3059. '
  3060. SUB Resize
  3061.     vv2 = v2
  3062.     vv3 = v3
  3063.     GOSUB GetSmallestSize
  3064.     v2 = MAX (vv2, v2)
  3065.     v3 = MAX (vv3, v3)
  3066. '
  3067.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  3068.     IF (v3 >= (labelHeight + buttonHeight + bw + bw + 4)) THEN buttonHeight = buttonHeight + 4
  3069. '
  3070.     labelWidth    = v2 - bw - bw
  3071.     labelHeight    = v3 - buttonHeight - bw - bw
  3072.     buttonWidth    = labelWidth
  3073. '
  3074.     x = bw
  3075.     y = bw
  3076.     XuiSendToKid (grid, #Resize, x, y, labelWidth, labelHeight, $Label, 0)
  3077. '
  3078.     y = y + labelHeight
  3079.     XuiSendToKid (grid, #Resize, x, y, buttonWidth, buttonHeight, $Button0, 0)
  3080.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  3081. END SUB
  3082. '
  3083. '
  3084. ' *****  Initialize  ****
  3085. '
  3086. SUB Initialize
  3087.     XuiGetDefaultMessageFuncArray (@func[])
  3088.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3089. '
  3090.     func[#Callback]                        = &XuiCallback()
  3091.     func[#GetSmallestSize]        = 0
  3092.     func[#Resize]                            = 0
  3093. '
  3094.     DIM sub[upperMessage]
  3095.     sub[#Create]                            = SUBADDRESS (Create)
  3096.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3097.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  3098.     sub[#Resize]                            = SUBADDRESS (Resize)
  3099. '
  3100.     IF func[0] THEN PRINT "XuiMessage1B() : Initialize : error ::: (undefined message)"
  3101.     IF sub[0] THEN PRINT "XuiMessage1B() : Initialize : error ::: (undefined message)"
  3102.     XuiRegisterGridType (@XuiMessage1B, @"XuiMessage1B", &XuiMessage1B(), @func[], @sub[])
  3103. '
  3104.     designX = 0
  3105.     designY = 0
  3106.     designWidth = 80
  3107.     designHeight = 48
  3108. '
  3109.     gridType = XuiMessage1B
  3110.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3111.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3112.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3113.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3114.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  3115.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  3116.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  3117.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  3118.     XuiSetGridTypeValue (gridType, @"focusKid",         $Button0)
  3119.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  3120.     IFZ message THEN RETURN
  3121. END SUB
  3122. END FUNCTION
  3123. '
  3124. '
  3125. ' #############################
  3126. ' #####  XuiMessage2B ()  #####  Label and 2 PushButtons
  3127. ' #############################
  3128. '
  3129. FUNCTION  XuiMessage2B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3130.     STATIC    designX,  designY,  designWidth,  designHeight
  3131.     STATIC    SUBADDR  sub[]
  3132.     STATIC    upperMessage
  3133.     STATIC    XuiMessage2B
  3134. '
  3135.     $Message2B        = 0
  3136.     $Label                = 1
  3137.     $Button0            = 2
  3138.     $Button1            = 3
  3139. '
  3140.     IFZ sub[] THEN GOSUB Initialize
  3141.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiMessage2B) THEN RETURN
  3142.     GOSUB @sub[message]
  3143.     RETURN
  3144. '
  3145. '
  3146. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3147. '
  3148. SUB Create
  3149.     IF (v0 <= 0) THEN v0 = 0
  3150.     IF (v1 <= 0) THEN v1 = 0
  3151.     IF (v2 <= 0) THEN v2 = designWidth
  3152.     IF (v3 <= 0) THEN v3 = designHeight
  3153.     XuiCreateGrid  (@grid, XuiMessage2B, @v0, @v1, @v2, @v3, r0, r1, &XuiMessage2B())
  3154.     XuiLabel       (@g, #Create, 0, 0, 0, 0, r0, grid)
  3155.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  3156.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3157.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage2B(), -1, -1, $Button0, grid)
  3158.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  3159.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  3160.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3161.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage2B(), -1, -1, $Button1, grid)
  3162.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  3163.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  3164.     GOSUB Resize
  3165. END SUB
  3166. '
  3167. '
  3168. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3169. '
  3170. SUB CreateWindow
  3171.     IF (v0  = 0) THEN v0 = designX
  3172.     IF (v1  = 0) THEN v1 = designY
  3173.     IF (v2 <= 0) THEN v2 = designWidth
  3174.     IF (v3 <= 0) THEN v3 = designHeight
  3175.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3176.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3177.     GOSUB Create
  3178.     r1 = 0 : ATTACH display$ TO r1$
  3179.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiMessage2B")
  3180. END SUB
  3181. '
  3182. '
  3183. ' *****  GetSmallestSize  *****
  3184. '
  3185. SUB GetSmallestSize
  3186.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3187.     XuiSendToKid (grid, #GetSmallestSize, @labelWidth, @labelHeight, 0, 0, $Label, 8)
  3188.     FOR i = $Button0 TO $Button1
  3189.         XuiSendToKid (grid, #GetSmallestSize, @width, @height, 0, 0, i, 8)
  3190.         IF (width > buttonWidth) THEN buttonWidth = width
  3191.         IF (height > buttonHeight) THEN buttonHeight = height
  3192.     NEXT i
  3193.     width = buttonWidth + buttonWidth
  3194.     height = labelHeight + buttonHeight
  3195.     IF (width < labelWidth) THEN width = labelWidth
  3196.     v2 = width + bw + bw
  3197.     v3 = height + bw + bw
  3198. END SUB
  3199. '
  3200. '
  3201. ' *****  Resize  *****
  3202. '
  3203. SUB Resize
  3204.     vv2 = v2
  3205.     vv3 = v3
  3206.     GOSUB GetSmallestSize
  3207.     v2 = MAX (vv2, v2)
  3208.     v3 = MAX (vv3, v3)
  3209. '
  3210.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  3211.     IF (v3 >= (labelHeight + buttonHeight + bw + bw + 4)) THEN buttonHeight = buttonHeight + 4
  3212. '
  3213.     labelWidth    = v2 - bw - bw
  3214.     labelHeight    = v3 - buttonHeight - bw - bw
  3215.     buttonWidth    = labelWidth >> 1
  3216.     width0            = buttonWidth
  3217.     width1            = labelWidth - width0
  3218. '
  3219.     x = bw : y = bw
  3220.     XuiSendToKid (grid, #Resize, x, y, labelWidth, labelHeight, $Label, 0)
  3221. '
  3222.     h = buttonHeight
  3223.     y = y + labelHeight
  3224.     XuiSendToKid (grid, #Resize, x, y, width0, h, $Button0, 0) : x = x + width0
  3225.     XuiSendToKid (grid, #Resize, x, y, width1, h, $Button1, 0)
  3226.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  3227. END SUB
  3228. '
  3229. '
  3230. ' *****  Initialize  ****
  3231. '
  3232. SUB Initialize
  3233.     XuiGetDefaultMessageFuncArray (@func[])
  3234.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3235. '
  3236.     func[#Callback]                        = &XuiCallback()
  3237.     func[#GetSmallestSize]        = 0
  3238.     func[#Resize]                            = 0
  3239. '
  3240.     DIM sub[upperMessage]
  3241.     sub[#Create]                            = SUBADDRESS (Create)
  3242.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3243.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  3244.     sub[#Resize]                            = SUBADDRESS (Resize)
  3245. '
  3246.     IF func[0] THEN PRINT "XuiMessage2B() : Initialize : error ::: (undefined message)"
  3247.     IF sub[0] THEN PRINT "XuiMessage2B() : Initialize : error ::: (undefined message)"
  3248.     XuiRegisterGridType (@XuiMessage2B, @"XuiMessage2B", &XuiMessage2B(), @func[], @sub[])
  3249. '
  3250.     designX = 0
  3251.     designY = 0
  3252.     designWidth = 160
  3253.     designHeight = 48
  3254. '
  3255.     gridType = XuiMessage2B
  3256.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3257.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3258.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3259.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3260.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  3261.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  3262.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  3263.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  3264.     XuiSetGridTypeValue (gridType, @"focusKid",         $Button0)
  3265.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  3266.     IFZ message THEN RETURN
  3267. END SUB
  3268. END FUNCTION
  3269. '
  3270. '
  3271. ' #############################
  3272. ' #####  XuiMessage3B ()  #####  Label and 3 PushButtons
  3273. ' #############################
  3274. '
  3275. FUNCTION  XuiMessage3B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3276.     STATIC    designX,  designY,  designWidth,  designHeight
  3277.     STATIC    SUBADDR  sub[]
  3278.     STATIC    upperMessage
  3279.     STATIC    XuiMessage3B
  3280. '
  3281.     $Message3B        = 0
  3282.     $Label                = 1
  3283.     $Button0            = 2
  3284.     $Button1            = 3
  3285.     $Button2            = 4
  3286. '
  3287.     IFZ sub[] THEN GOSUB Initialize
  3288.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiMessage3B) THEN RETURN
  3289.     GOSUB @sub[message]
  3290.     RETURN
  3291. '
  3292. '
  3293. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3294. '
  3295. SUB Create
  3296.     IF (v0 <= 0) THEN v0 = 0
  3297.     IF (v1 <= 0) THEN v1 = 0
  3298.     IF (v2 <= 0) THEN v2 = designWidth
  3299.     IF (v3 <= 0) THEN v3 = designHeight
  3300.     XuiCreateGrid  (@grid, XuiMessage3B, @v0, @v1, @v2, @v3, r0, r1, &XuiMessage3B())
  3301.     XuiLabel       (@g, #Create, 0, 0, 0, 0, r0, grid)
  3302.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  3303.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3304.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage3B(), -1, -1, $Button0, grid)
  3305.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  3306.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  3307.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3308.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage3B(), -1, -1, $Button1, grid)
  3309.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  3310.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Option")
  3311.     XuiPushButton  (@g, #Create, 0, 0, 0, 0, r0, grid)
  3312.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage3B(), -1, -1, $Button2, grid)
  3313.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button2")
  3314.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  3315.     GOSUB Resize
  3316. END SUB
  3317. '
  3318. '
  3319. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3320. '
  3321. SUB CreateWindow
  3322.     IF (v0  = 0) THEN v0 = designX
  3323.     IF (v1  = 0) THEN v1 = designY
  3324.     IF (v2 <= 0) THEN v2 = designWidth
  3325.     IF (v3 <= 0) THEN v3 = designHeight
  3326.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3327.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3328.     GOSUB Create
  3329.     r1 = 0 : ATTACH display$ TO r1$
  3330.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiMessage3B")
  3331. END SUB
  3332. '
  3333. '
  3334. ' *****  GetSmallestSize  *****
  3335. '
  3336. SUB GetSmallestSize
  3337.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3338.     XuiSendToKid (grid, #GetSmallestSize, @labelWidth, @labelHeight, 0, 0, $Label, 8)
  3339.     FOR i = $Button0 TO $Button2
  3340.         XuiSendToKid (grid, #GetSmallestSize, @width, @height, 0, 0, i, 8)
  3341.         IF (width > buttonWidth) THEN buttonWidth = width
  3342.         IF (height > buttonHeight) THEN buttonHeight = height
  3343.     NEXT i
  3344.     width = buttonWidth + buttonWidth + buttonWidth
  3345.     height = labelHeight + buttonHeight
  3346.     IF (width < labelWidth) THEN width = labelWidth
  3347.     v2 = width + bw + bw
  3348.     v3 = height + bw + bw
  3349. END SUB
  3350. '
  3351. '
  3352. ' *****  Resize  *****
  3353. '
  3354. SUB Resize
  3355.     vv2 = v2
  3356.     vv3 = v3
  3357.     GOSUB GetSmallestSize
  3358.     v2 = MAX(vv2, v2)
  3359.     v3 = MAX(vv3, v3)
  3360. '
  3361.     width                = buttonWidth + buttonWidth + buttonWidth
  3362.     height            = labelHeight + buttonHeight + bw + bw
  3363.     IF (width < labelWidth) THEN width = labelWidth
  3364.     width                = width + bw + bw
  3365. '
  3366.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  3367.     IF (v3 >= (labelHeight + buttonHeight + bw + bw + 4)) THEN buttonHeight = buttonHeight + 4
  3368. '
  3369.     labelWidth    = v2 - bw - bw
  3370.     labelHeight    = v3 - buttonHeight - bw - bw
  3371.     buttonWidth    = labelWidth / 3
  3372.     width0            = buttonWidth
  3373.     width1            = buttonWidth
  3374.     width2            = labelWidth - width0 - width1
  3375. '
  3376.     x = bw
  3377.     y = bw
  3378.     XuiSendToKid (grid, #Resize, x, y, labelWidth, labelHeight, $Label, 0)
  3379. '
  3380.     h = buttonHeight
  3381.     y = y + labelHeight
  3382.     XuiSendToKid (grid, #Resize, x, y, width0, h, $Button0, 0) : x = x + width0
  3383.     XuiSendToKid (grid, #Resize, x, y, width1, h, $Button1, 0) : x = x + width1
  3384.     XuiSendToKid (grid, #Resize, x, y, width2, h, $Button2, 0) : x = x + width2
  3385.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  3386. END SUB
  3387. '
  3388. '
  3389. ' *****  Initialize  ****
  3390. '
  3391. SUB Initialize
  3392.     XuiGetDefaultMessageFuncArray (@func[])
  3393.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3394. '
  3395.     func[#Callback]                        = &XuiCallback()
  3396.     func[#GetSmallestSize]        = 0
  3397.     func[#Resize]                            = 0
  3398. '
  3399.     DIM sub[upperMessage]
  3400.     sub[#Create]                            = SUBADDRESS (Create)
  3401.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3402.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  3403.     sub[#Resize]                            = SUBADDRESS (Resize)
  3404. '
  3405.     IF func[0] THEN PRINT "XuiMessage3B() : Initialize : error ::: (undefined message)"
  3406.     IF sub[0] THEN PRINT "XuiMessage3B() : Initialize : error ::: (undefined message)"
  3407.     XuiRegisterGridType (@XuiMessage3B, @"XuiMessage3B", &XuiMessage3B(), @func[], @sub[])
  3408. '
  3409.     designX = 0
  3410.     designY = 0
  3411.     designWidth = 240
  3412.     designHeight = 48
  3413. '
  3414.     gridType = XuiMessage3B
  3415.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3416.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3417.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3418.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3419.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  3420.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  3421.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  3422.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  3423.     XuiSetGridTypeValue (gridType, @"focusKid",         $Button0)
  3424.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  3425.     IFZ message THEN RETURN
  3426. END SUB
  3427. END FUNCTION
  3428. '
  3429. '
  3430. ' #############################
  3431. ' #####  XuiMessage4B ()  #####  Label and 4 PushButtons
  3432. ' #############################
  3433. '
  3434. FUNCTION  XuiMessage4B (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3435.     STATIC    designX,  designY,  designWidth,  designHeight
  3436.     STATIC    SUBADDR  sub[]
  3437.     STATIC    upperMessage
  3438.     STATIC    XuiMessage4B
  3439. '
  3440.     $Message4B    = 0  ' kid 0
  3441.     $Label            = 1  ' kid 1
  3442.     $Button0        = 2  ' kid 2
  3443.     $Button1        = 3  ' kid 3
  3444.     $Button2        = 4  ' kid 4
  3445.     $Button3        = 5  ' kid 5
  3446. '
  3447.     IFZ sub[] THEN GOSUB Initialize
  3448.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiMessage4B) THEN RETURN
  3449.     GOSUB @sub[message]
  3450.     RETURN
  3451. '
  3452. '
  3453. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3454. '
  3455. SUB Create
  3456.     IF (v0 <= 0) THEN v0 = 0
  3457.     IF (v1 <= 0) THEN v1 = 0
  3458.     IF (v2 <= 0) THEN v2 = designWidth
  3459.     IF (v3 <= 0) THEN v3 = designHeight
  3460.     XuiCreateGrid  (@grid, XuiMessage4B, @v0, @v1, @v2, @v3, r0, r1, &XuiMessage4B())
  3461.     XuiLabel       (@g, #Create, 4, 4, 400, 28, r0, grid)
  3462.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  3463.     XuiPushButton  (@g, #Create, 4, 32, 100, 28, r0, grid)
  3464.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage4B(), -1, -1, $Button0, grid)
  3465.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  3466.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Enter")
  3467.     XuiPushButton  (@g, #Create, 104, 32, 100, 28, r0, grid)
  3468.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage4B(), -1, -1, $Button1, grid)
  3469.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  3470.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Update")
  3471.     XuiPushButton  (@g, #Create, 204, 32, 100, 28, r0, grid)
  3472.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage4B(), -1, -1, $Button2, grid)
  3473.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button2")
  3474.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Retry")
  3475.     XuiPushButton  (@g, #Create, 304, 32, 100, 28, r0, grid)
  3476.     XuiSendMessage ( g, #SetCallback, grid, &XuiMessage4B(), -1, -1, $Button3, grid)
  3477.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button3")
  3478.     XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Cancel")
  3479.     GOSUB Resize
  3480. END SUB
  3481. '
  3482. '
  3483. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3484. '
  3485. SUB CreateWindow
  3486.     IF (v0  = 0) THEN v0 = designX
  3487.     IF (v1  = 0) THEN v1 = designY
  3488.     IF (v2 <= 0) THEN v2 = designWidth
  3489.     IF (v3 <= 0) THEN v3 = designHeight
  3490.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3491.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3492.     GOSUB Create
  3493.     r1 = 0 : ATTACH display$ TO r1$
  3494.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiMessage4B")
  3495. END SUB
  3496. '
  3497. '
  3498. ' *****  GetSmallestSize  *****
  3499. '
  3500. SUB GetSmallestSize
  3501.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3502.     XuiSendToKid (grid, #GetSmallestSize, @labelWidth, @labelHeight, 0, 0, $Label, 8)
  3503.     FOR i = $Button0 TO $Button3
  3504.         XuiSendToKid (grid, #GetSmallestSize, @width, @height, 0, 0, i, 8)
  3505.         IF (width > buttonWidth) THEN buttonWidth = width
  3506.         IF (height > buttonHeight) THEN buttonHeight = height
  3507.     NEXT i
  3508.     width = buttonWidth << 2
  3509.     height = labelHeight + buttonHeight
  3510.     IF (width < labelWidth) THEN width = labelWidth
  3511.     v2 = width + bw + bw
  3512.     v3 = height + bw + bw
  3513. END SUB
  3514. '
  3515. '
  3516. ' *****  Resize  *****
  3517. '
  3518. SUB Resize
  3519.     vv2 = v2
  3520.     vv3 = v3
  3521.     GOSUB GetSmallestSize
  3522.     v2 = MAX (vv2, v2)
  3523.     v3 = MAX (vv3, v3)
  3524. '
  3525.     width                = buttonWidth + buttonWidth + buttonWidth
  3526.     height            = labelHeight + buttonHeight + bw + bw
  3527.     IF (width < labelWidth) THEN width = labelWidth
  3528.     width                = width + bw + bw
  3529. '
  3530.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  3531.     IF (v3 >= (labelHeight + buttonHeight + bw + bw + 4)) THEN buttonHeight = buttonHeight + 4
  3532. '
  3533.     labelWidth    = v2 - bw - bw
  3534.     labelHeight    = v3 - buttonHeight - bw - bw
  3535.     buttonWidth    = labelWidth >> 2
  3536.     width0            = buttonWidth
  3537.     width1            = buttonWidth
  3538.     width2            = buttonWidth
  3539.     width3            = labelWidth - width0 - width1 - width2
  3540. '
  3541.     x = bw
  3542.     y = bw
  3543.     XuiSendToKid (grid, #Resize, x, y, labelWidth, labelHeight, $Label, 0)
  3544. '
  3545.     h = buttonHeight
  3546.     y = y + labelHeight
  3547.     XuiSendToKid (grid, #Resize, x, y, width0, h, $Button0, 0) : x = x + width0
  3548.     XuiSendToKid (grid, #Resize, x, y, width1, h, $Button1, 0) : x = x + width1
  3549.     XuiSendToKid (grid, #Resize, x, y, width2, h, $Button2, 0) : x = x + width2
  3550.     XuiSendToKid (grid, #Resize, x, y, width3, h, $Button3, 0) : x = x + width3
  3551.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  3552. END SUB
  3553. '
  3554. '
  3555. ' *****  Initialize  ****
  3556. '
  3557. SUB Initialize
  3558.     XuiGetDefaultMessageFuncArray (@func[])
  3559.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3560. '
  3561.     func[#Callback]                        = &XuiCallback()
  3562.     func[#GetSmallestSize]        = 0
  3563.     func[#Resize]                            = 0
  3564. '
  3565.     DIM sub[upperMessage]
  3566.     sub[#Create]                            = SUBADDRESS (Create)
  3567.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3568.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  3569.     sub[#Resize]                            = SUBADDRESS (Resize)
  3570. '
  3571.     IF func[0] THEN PRINT "XuiMessage4B() : Initialize : error ::: (undefined message)"
  3572.     IF sub[0] THEN PRINT "XuiMessage4B() : Initialize : error ::: (undefined message)"
  3573.     XuiRegisterGridType (@XuiMessage4B, @"XuiMessage4B", &XuiMessage4B(), @func[], @sub[])
  3574. '
  3575.     designX = 0
  3576.     designY = 0
  3577.     designWidth = 320
  3578.     designHeight = 48
  3579. '
  3580.     gridType = XuiMessage4B
  3581.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3582.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3583.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3584.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3585.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  3586.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  3587.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  3588.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  3589.     XuiSetGridTypeValue (gridType, @"focusKid",         $Button0)
  3590.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  3591.     IFZ message THEN RETURN
  3592. END SUB
  3593. END FUNCTION
  3594. '
  3595. '
  3596. ' ###############################
  3597. ' #####  XuiPressButton ()  #####
  3598. ' ###############################
  3599. '
  3600. FUNCTION  XuiPressButton (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3601.     STATIC    designX,  designY,  designWidth,  designHeight
  3602.     STATIC    SUBADDR  sub[]
  3603.     STATIC    upperMessage
  3604.     STATIC    XuiPressButton
  3605.     STATIC    downGrid
  3606. '
  3607.     IFZ sub[] THEN GOSUB Initialize
  3608.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiPressButton) THEN RETURN
  3609.     GOSUB @sub[message]
  3610.     RETURN
  3611. '
  3612. '
  3613. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3614. '
  3615. SUB Create
  3616.     IF (v0 <= 0) THEN v0 = 0
  3617.     IF (v1 <= 0) THEN v1 = 0
  3618.     IF (v2 <= 0) THEN v2 = designWidth
  3619.     IF (v3 <= 0) THEN v3 = designHeight
  3620.     XuiCreateGrid (@grid, XuiPressButton, @v0, @v1, @v2, @v3, r0, r1, &XuiPressButton())
  3621. END SUB
  3622. '
  3623. '
  3624. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3625. '
  3626. SUB CreateWindow
  3627.     IF (v0  = 0) THEN v0 = designX
  3628.     IF (v1  = 0) THEN v1 = designY
  3629.     IF (v2 <= 0) THEN v2 = designWidth
  3630.     IF (v3 <= 0) THEN v3 = designHeight
  3631.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3632.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3633.     GOSUB Create
  3634.     r1 = 0 : ATTACH display$ TO r1$
  3635.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiPressButton")
  3636. END SUB
  3637. '
  3638. '
  3639. ' *****  KeyDown  *****  #Selection on $$KeyEnter
  3640. '
  3641. SUB KeyDown
  3642.     XuiGetState (grid, #GetState, @state, @keyboard, 0, 0, 0, 0)
  3643.     IFZ (state AND keyboard) THEN EXIT SUB
  3644.     state = v2                                                            ' v2 = state
  3645.     key = state{8,24}                                                ' virtual key
  3646.     XuiCallback (grid, #TextEvent, v0, v1, v2, v3, 0, grid)
  3647.     IF (key = $$KeyEnter) THEN XuiCallback (grid, #Selection, 0, 0, v2, v3, 0, grid)
  3648. END SUB
  3649. '
  3650. '
  3651. ' *****  MouseDown  *****
  3652. '
  3653. SUB MouseDown
  3654.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  3655.     IFZ (state AND mouse) THEN EXIT SUB
  3656.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  3657.     IF downGrid THEN downGrid = 0 : EXIT SUB
  3658.     XuiGetValue (grid, #GetValue, @on, 0, 0, 0, 0, 0)
  3659.     IF on THEN EXIT SUB
  3660.     XuiCallback (grid, #Selection, 0, 0, v2, v3, 0, grid)
  3661.     XuiGetTimer (grid, #GetTimer, @timer, 0, 0, 0, 0, 0)
  3662.     IFZ timer THEN EXIT SUB
  3663.     XuiStartTimer (grid, #StartTimer, 0, 0, 0, 0, 0, 0)
  3664.     XuiSetValue (grid, #SetValue, 1, 0, 0, 0, 0, 0)
  3665.     downGrid = grid
  3666. END SUB
  3667. '
  3668. '
  3669. ' *****  RedrawGrid  *****  executes after func[#RedrawGrid]
  3670. '
  3671. SUB RedrawGrid
  3672.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  3673.     XuiGetValues (grid, #GetValues, @x1, @y1, @x2, @y2, 0, 0)
  3674.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  3675.     XuiGetSize (grid, #GetSize, 0, 0, @w, @h, 0, 0)
  3676.     IFZ (state AND redraw) THEN EXIT SUB
  3677.     IFZ (style AND 0x1E) THEN EXIT SUB
  3678.     direction = style AND 0x001E
  3679.     XgrFillTriangle (grid, -1, 0, direction, x1, y1, x2, y2)
  3680. END SUB
  3681. '
  3682. '
  3683. ' *****  TimeOff  *****
  3684. '
  3685. SUB TimeOff
  3686.     downGrid = 0
  3687.     XuiSetValue (grid, #SetValue, 0, 0, 0, 0, 0, 0)
  3688. END SUB
  3689. '
  3690. '
  3691. ' *****  TimeOut  *****
  3692. '
  3693. SUB TimeOut
  3694.     XuiGetValue (grid, #GetValue, @on, 0, 0, 0, 0, 0)
  3695.     XuiGetTimer (grid, #GetTimer, @timer, 0, 0, 0, 0, 0)
  3696.     callback = $$TRUE
  3697.     SELECT CASE on
  3698.         CASE 0        : callback = $$FALSE
  3699.         CASE 2        : callback = $$FALSE
  3700.     END SELECT
  3701.     IF callback THEN XuiCallback (grid, #Selection, 0, 0, v2, v3, 0, grid)
  3702.     restart = on && timer && downGrid
  3703.     on = on + 1
  3704. '
  3705.     IF restart THEN
  3706.         XuiStartTimer (grid, #StartTimer, 0, 0, 0, 0, 0, 0)
  3707.         XuiSetValue (grid, #SetValue, on, 0, 0, 0, 0, 0)
  3708.     ELSE
  3709.         XuiSetValue (grid, #SetValue, 0, 0, 0, 0, 0, 0)
  3710.         downGrid = 0
  3711.     END IF
  3712. END SUB
  3713. '
  3714. '
  3715. ' *****  Initialize  ****
  3716. '
  3717. SUB Initialize
  3718.     XuiGetDefaultMessageFuncArray (@func[])
  3719.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3720. '
  3721.     DIM sub[upperMessage]
  3722.     sub[#Create]                            = SUBADDRESS (Create)
  3723.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3724.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  3725.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  3726.     sub[#MouseExit]                        = SUBADDRESS (TimeOff)
  3727.     sub[#MouseUp]                            = SUBADDRESS (TimeOff)
  3728.     sub[#Redraw]                            = SUBADDRESS (RedrawGrid)
  3729.     sub[#RedrawGrid]                    = SUBADDRESS (RedrawGrid)
  3730.     sub[#TimeOut]                            = SUBADDRESS (TimeOut)
  3731. '
  3732.     IF func[0] THEN PRINT "XuiPressButton() : Initialize : error ::: (undefined message)"
  3733.     IF sub[0] THEN PRINT "XuiPressButton() : Initialize : error ::: (undefined message)"
  3734.     XuiRegisterGridType (@XuiPressButton, @"XuiPressButton", &XuiPressButton(), @func[], @sub[])
  3735. '
  3736.     designX = 0
  3737.     designY = 0
  3738.     designWidth = 80
  3739.     designHeight = 20
  3740. '
  3741.     gridType = XuiPressButton
  3742.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3743.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3744.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3745.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3746.     XuiSetGridTypeValue (gridType, @"minWidth",          4)
  3747.     XuiSetGridTypeValue (gridType, @"minHeight",         4)
  3748.     XuiSetGridTypeValue (gridType, @"align",           $$AlignMiddleCenter)
  3749.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise1)
  3750.     XuiSetGridTypeValue (gridType, @"borderUp",        $$BorderRaise1)
  3751.     XuiSetGridTypeValue (gridType, @"borderDown",      $$BorderLower1)
  3752.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  3753.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  3754.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  3755.     IFZ message THEN RETURN
  3756. END SUB
  3757. END FUNCTION
  3758. '
  3759. '
  3760. ' ############################
  3761. ' #####  XuiProgress ()  #####
  3762. ' ############################
  3763. '
  3764. FUNCTION  XuiProgress (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3765.     STATIC    designX,  designY,  designWidth,  designHeight
  3766.     STATIC    SUBADDR  sub[]
  3767.     STATIC    upperMessage
  3768.     STATIC    XuiProgress
  3769. '
  3770.     $Progress        = 0
  3771. '
  3772.     $position        = 0
  3773.     $fullScale    = 1
  3774. '
  3775.     IFZ sub[] THEN GOSUB Initialize
  3776.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiProgress) THEN RETURN
  3777.     GOSUB @sub[message]
  3778.     RETURN
  3779. '
  3780. '
  3781. ' *****  Create  *****  v0 = xywh : r0 = window : r1 = parent
  3782. '
  3783. SUB Create
  3784.     IF (v0 <= 0) THEN v0 = 0
  3785.     IF (v1 <= 0) THEN v1 = 0
  3786.     IF (v2 <= 0) THEN v2 = designWidth
  3787.     IF (v3 <= 0) THEN v3 = designHeight
  3788.     XuiCreateGrid  (@grid, XuiProgress, @v0, @v1, 120, 40, r0, r1, &XuiProgress())
  3789.     XuiSetColorExtra (grid, #SetColorExtra, -1, $$LightGreen, -1, -1, 0, 0)
  3790.     XuiSetValues   ( grid, #SetValues, 0, 100, 0, 0, 0, $position)
  3791.     GOSUB Resize
  3792. END SUB
  3793. '
  3794. '
  3795. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3796. '
  3797. SUB CreateWindow
  3798.     IF (v0  = 0) THEN v0 = designX
  3799.     IF (v1  = 0) THEN v1 = designY
  3800.     IF (v2 <= 0) THEN v2 = designWidth
  3801.     IF (v3 <= 0) THEN v3 = designHeight
  3802.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3803.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3804.     GOSUB Create
  3805.     r1 = 0 : ATTACH display$ TO r1$
  3806.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiProgress")
  3807. END SUB
  3808. '
  3809. '
  3810. ' ****  Resize  *****
  3811. '
  3812. SUB Resize
  3813.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  3814.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  3815. END SUB
  3816. '
  3817. '
  3818. ' *****  SetValue  *****
  3819. '
  3820. SUB SetValue
  3821.     XuiGetValues (grid, #GetValues, @position, @fullScale, 0, 0, 0, 0)
  3822.     XuiSetValue (grid, #SetValue, v0, v1, v2, v3, 0, r1)
  3823.     GOSUB UpdatePosition
  3824. END SUB
  3825. '
  3826. '
  3827. ' *****  SetValues  *****
  3828. '
  3829. SUB SetValues
  3830.     XuiGetValues (grid, #GetValues, @position, @fullScale, 0, 0, 0, 0)
  3831.     XuiSetValues (grid, #SetValues, v0, v1, v2, v3, 0, r1)
  3832.     GOSUB UpdatePosition
  3833. END SUB
  3834. '
  3835. '
  3836. ' *****  UpdatePosition  *****
  3837. '
  3838. SUB UpdatePosition
  3839.     XuiGetValues (grid, #GetValues, @v0, @v1, 0, 0, 0, 0)
  3840.     IF (v0 < 0) THEN v0 = 0
  3841.     IF (v1 <= 0) THEN v1 = fullScale
  3842.     IF (v0 > v1) THEN v0 = v1
  3843.     XuiSetValues (grid, #SetValues, v0, v1, 0, 0, 0, 0)
  3844.     IF ((v0 = position) AND (v1 = fullScale)) THEN EXIT SUB
  3845.     IF (v0 > position) THEN
  3846.         XgrGetGridPositionAndSize (grid, 0, 0, @w, @h)
  3847.         XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3848.         XuiGetColorExtra (grid, #GetColorExtra, @d, @accent, 0, 0, 0, 0)
  3849.         m# = DOUBLE (v0) / DOUBLE (v1)
  3850.         w = m# * (w-bw-bw)
  3851.         IF (w < 1) THEN w = 1
  3852.         XgrFillBox (grid, accent, bw, bw, bw+w-1, h-bw-1)
  3853.     ELSE
  3854.         GOSUB Redraw
  3855.     END IF
  3856. END SUB
  3857. '
  3858. '
  3859. ' *****  Redraw  *****
  3860. '
  3861. SUB Redraw
  3862.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  3863.     IFZ (state AND redraw) THEN EXIT SUB
  3864.     XuiRedraw (grid, #Redraw, 0, 0, 0, 0, 0, 0)
  3865.     XgrGetGridPositionAndSize (grid, @vv0, @vv1, @vv2, @vv3)
  3866.     XuiGetBorder (grid, #GetBorder, 0, 0, 0, 0, 0, @bw)
  3867.     XuiGetColorExtra (grid, #GetColorExtra, @d, @accent, 0, 0, 0, 0)
  3868.     XuiGetValues (grid, #GetValues, @position, @fullScale, 0, 0, 0, $position)
  3869.     m# = DOUBLE (position) / DOUBLE (fullScale)
  3870.     w = m# * (vv2-bw-bw)
  3871.     IF (w < 1) THEN w = 1
  3872.     XgrFillBox (grid, $$Grey, bw, bw, vv2-bw-1, vv3-bw-1)
  3873.     XgrFillBox (grid, accent, bw, bw, bw+w-1, vv3-bw-1)
  3874. END SUB
  3875. '
  3876. '
  3877. ' *****  Initialize  *****
  3878. '
  3879. SUB Initialize
  3880.     XuiGetDefaultMessageFuncArray (@func[])
  3881.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  3882. '
  3883.     func[#GetSmallestSize]        = &XuiGetMaxMinSize()
  3884.     func[#Redraw]                            = 0
  3885.     func[#Resize]                            = 0
  3886.     func[#SetPosition]                = 0
  3887.     func[#SetValue]                        = 0
  3888.     func[#SetValues]                    = 0
  3889. '
  3890.     DIM sub[upperMessage]
  3891.     sub[#Create]                            = SUBADDRESS (Create)
  3892.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  3893.     sub[#SetPosition]                  = SUBADDRESS (SetValues)
  3894.     sub[#SetValue]                        = SUBADDRESS (SetValue)
  3895.     sub[#SetValues]                        = SUBADDRESS (SetValues)
  3896.     sub[#Redraw]                            = SUBADDRESS (Redraw)
  3897.     sub[#Resize]                            = SUBADDRESS (Resize)
  3898. '
  3899.     IF func[0] THEN PRINT "XuiProgress() : Initialize : error ::: (undefined message)"
  3900.     IF sub[0] THEN PRINT "XuiProgress() : Initialize : error ::: (undefined message)"
  3901.     XuiRegisterGridType (@XuiProgress, @"XuiProgress", &XuiProgress(), @func[], @sub[])
  3902. '
  3903.     designX = 0
  3904.     designY = 0
  3905.     designWidth = 80
  3906.     designHeight = 40
  3907. '
  3908.     gridType = XuiProgress
  3909.     XuiSetGridTypeValue (gridType, @"x",               designX)
  3910.     XuiSetGridTypeValue (gridType, @"y",               designY)
  3911.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  3912.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  3913.     XuiSetGridTypeValue (gridType, @"minWidth",        24)
  3914.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  3915.     XuiSetGridTypeValue (gridType, @"border",          $$BorderFrame)
  3916.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawClearBorder)
  3917.     IFZ message THEN RETURN
  3918. END SUB
  3919. END FUNCTION
  3920. '
  3921. '
  3922. ' ##############################
  3923. ' #####  XuiPushButton ()  #####
  3924. ' ##############################
  3925. '
  3926. FUNCTION  XuiPushButton (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  3927.     STATIC    designX,  designY,  designWidth,  designHeight
  3928.     STATIC    SUBADDR  sub[]
  3929.     STATIC    upperMessage
  3930.     STATIC    XuiPushButton
  3931.     STATIC    downGrid
  3932. '
  3933.     IFZ sub[] THEN GOSUB Initialize
  3934.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiPushButton) THEN RETURN
  3935.     GOSUB @sub[message]
  3936.     RETURN
  3937. '
  3938. '
  3939. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  3940. '
  3941. SUB Create
  3942.     IF (v0 <= 0) THEN v0 = 0
  3943.     IF (v1 <= 0) THEN v1 = 0
  3944.     IF (v2 <= 0) THEN v2 = designWidth
  3945.     IF (v3 <= 0) THEN v3 = designHeight
  3946.     XuiCreateGrid (@grid, XuiPushButton, @v0, @v1, @v2, @v3, r0, r1, &XuiPushButton())
  3947. END SUB
  3948. '
  3949. '
  3950. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  3951. '
  3952. SUB CreateWindow
  3953.     IF (v0  = 0) THEN v0 = designX
  3954.     IF (v1  = 0) THEN v1 = designY
  3955.     IF (v2 <= 0) THEN v2 = designWidth
  3956.     IF (v3 <= 0) THEN v3 = designHeight
  3957.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  3958.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  3959.     GOSUB Create
  3960.     r1 = 0 : ATTACH display$ TO r1$
  3961.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiPushButton")
  3962. END SUB
  3963. '
  3964. '
  3965. ' *****  KeyDown  *****  #Selection callback on $$KeyEnter
  3966. '
  3967. SUB KeyDown
  3968.     XuiGetState (grid, #GetState, @state, @keyboard, 0, 0, 0, 0)
  3969.     IFZ (state AND keyboard) THEN EXIT SUB
  3970.     state = v2                                                            ' v2 = state
  3971.     key = state{8,24}                                                ' virtual key
  3972.     IF (key = $$KeyEnter) THEN XuiCallback (grid, #Selection, v0, v1, v2, v3, 0, grid)
  3973. END SUB
  3974. '
  3975. '
  3976. ' *****  MouseDown  *****
  3977. '
  3978. SUB MouseDown
  3979.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  3980.     XuiGetState (grid, #GetState, @state, 0, @mouse, 0, 0, 0)
  3981.     IFZ (state AND mouse) THEN EXIT SUB
  3982.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  3983.     IF (style AND 1) THEN
  3984.         XuiCallback (grid, #Selection, 0, 0, v2, v3, 0, grid)
  3985.         EXIT SUB
  3986.     END IF
  3987.     XuiGetBorder (grid, #GetBorder, 0, 0, @border, 0, 0, 0)
  3988.     XuiSetBorder (grid, #SetBorder, border, -1, -1, 0, 0, 0)
  3989.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  3990.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiPushButton(), 0, 0, 0, $$TRUE)
  3991.     downGrid = grid
  3992. END SUB
  3993. '
  3994. '
  3995. ' *****  MouseEnter  *****
  3996. '
  3997. SUB MouseEnter
  3998.     IF (grid != r1) THEN EXIT SUB
  3999.     IF (grid != downGrid) THEN EXIT SUB
  4000.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4001.     XuiGetState (grid, #GetState, @state, 0, @mouse, 0, 0, 0)
  4002.     IFZ (state AND mouse) THEN EXIT SUB
  4003.     XuiGetBorder (grid, #GetBorder, 0, 0, @border, 0, 0, 0)
  4004.     XuiSetBorder (grid, #SetBorder, border, -1, -1, 0, 0, 0)
  4005.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4006. END SUB
  4007. '
  4008. '
  4009. ' *****  MouseExit  *****
  4010. '
  4011. SUB MouseExit
  4012.     IF (grid != r1) THEN EXIT SUB
  4013.     IF (grid != downGrid) THEN EXIT SUB
  4014.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4015.     XuiGetState (grid, #GetState, @state, 0, @mouse, 0, 0, 0)
  4016.     IFZ (state AND mouse) THEN EXIT SUB
  4017.     XuiGetBorder (grid, #GetBorder, 0, @border, 0, 0, 0, 0)
  4018.     XuiSetBorder (grid, #SetBorder, border, -1, -1, 0, 0, 0)
  4019.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4020. END SUB
  4021. '
  4022. '
  4023. ' *****  MouseUp  *****
  4024. '
  4025. SUB MouseUp
  4026.     IFZ downGrid THEN EXIT SUB
  4027.     IF (v2{$$ButtonNumber} = $$HelpButtonNumber) THEN EXIT SUB
  4028.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiPushButton(), 0, 0, 0, $$FALSE)
  4029.     XuiGetState (grid, #GetState, @state, 0, @mouse, 0, 0, 0)
  4030.     IFZ (state AND mouse) THEN EXIT SUB
  4031.     XgrGetGridBoxLocal (downGrid, @x1, @y1, @x2, @y2)
  4032.     inside = $$TRUE
  4033.     SELECT CASE TRUE
  4034.         CASE (v0 < x1)    : inside = $$FALSE
  4035.         CASE (v0 > x2)    : inside = $$FALSE
  4036.         CASE (v1 < y1)    : inside = $$FALSE
  4037.         CASE (v1 > y2)    : inside = $$FALSE
  4038.     END SELECT
  4039.     downGrid = 0
  4040.     IFZ inside THEN EXIT SUB
  4041.     XuiGetBorder (grid, #GetBorder, 0, @border, 0, 0, 0, 0)
  4042.     XuiSetBorder (grid, #SetBorder, border, -1, -1, 0, 0, 0)
  4043.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4044.     XuiCallback (grid, #Selection, 0, 0, v2, v3, 0, grid)
  4045. END SUB
  4046. '
  4047. '
  4048. ' *****  Initialize  ****
  4049. '
  4050. SUB Initialize
  4051.     XuiGetDefaultMessageFuncArray (@func[])
  4052.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  4053. '
  4054.     DIM sub[upperMessage]
  4055.     sub[#Create]                        = SUBADDRESS (Create)
  4056.     sub[#CreateWindow]            = SUBADDRESS (CreateWindow)
  4057.     sub[#KeyDown]                        = SUBADDRESS (KeyDown)
  4058.     sub[#MouseDown]                    = SUBADDRESS (MouseDown)
  4059.     sub[#MouseEnter]                = SUBADDRESS (MouseEnter)
  4060.     sub[#MouseExit]                    = SUBADDRESS (MouseExit)
  4061.     sub[#MouseUp]                        = SUBADDRESS (MouseUp)
  4062. '
  4063.     IF func[0] THEN PRINT "XuiPushButton() : Initialize : error ::: (undefined message)"
  4064.     IF sub[0] THEN PRINT "XuiPushButton() : Initialize : error ::: (undefined message)"
  4065.     XuiRegisterGridType (@XuiPushButton, @"XuiPushButton", &XuiPushButton(), @func[], @sub[])
  4066. '
  4067.     designX = 0
  4068.     designY = 0
  4069.     designWidth = 80
  4070.     designHeight = 20
  4071. '
  4072.     gridType = XuiPushButton
  4073.     XuiSetGridTypeValue (gridType, @"x",               designX)
  4074.     XuiSetGridTypeValue (gridType, @"y",               designY)
  4075.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  4076.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  4077.     XuiSetGridTypeValue (gridType, @"minWidth",         4)
  4078.     XuiSetGridTypeValue (gridType, @"minHeight",        4)
  4079.     XuiSetGridTypeValue (gridType, @"align",           $$AlignMiddleCenter)
  4080.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise2)
  4081.     XuiSetGridTypeValue (gridType, @"borderUp",        $$BorderRaise2)
  4082.     XuiSetGridTypeValue (gridType, @"borderDown",      $$BorderLower2)
  4083.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  4084.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  4085.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  4086.     IFZ message THEN RETURN
  4087. END SUB
  4088. END FUNCTION
  4089. '
  4090. '
  4091. ' ############################
  4092. ' #####  XuiRadioBox ()  #####
  4093. ' ############################
  4094. '
  4095. FUNCTION  XuiRadioBox (grid, message, v0, v1, v2, v3, r0, r1)
  4096.     STATIC    designX,  designY,  designWidth,  designHeight
  4097.     STATIC    SUBADDR  sub[]
  4098.     STATIC    upperMessage
  4099.     STATIC    XuiRadioBox
  4100. '
  4101.     IFZ sub[] THEN GOSUB Initialize
  4102.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiRadioBox) THEN RETURN
  4103.     GOSUB @sub[message]
  4104.     RETURN
  4105. '
  4106. '
  4107. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  4108. '
  4109. SUB Create
  4110.     IF (v0 <= 0) THEN v0 = 0
  4111.     IF (v1 <= 0) THEN v1 = 0
  4112.     IF (v2 <= 0) THEN v2 = designWidth
  4113.     IF (v3 <= 0) THEN v3 = designHeight
  4114.     XuiCreateGrid (@grid, XuiRadioBox, @v0, @v1, @v2, @v3, r0, r1, &XuiRadioBox())
  4115. END SUB
  4116. '
  4117. '
  4118. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  4119. '
  4120. SUB CreateWindow
  4121.     IF (v0  = 0) THEN v0 = designX
  4122.     IF (v1  = 0) THEN v1 = designY
  4123.     IF (v2 <= 0) THEN v2 = designWidth
  4124.     IF (v3 <= 0) THEN v3 = designHeight
  4125.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  4126.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  4127.     GOSUB Create
  4128.     r1 = 0 : ATTACH display$ TO r1$
  4129.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiRadioBox")
  4130. END SUB
  4131. '
  4132. '
  4133. ' *****  KeyDown  *****
  4134. '
  4135. SUB KeyDown
  4136.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4137.     IFZ (state AND keyboard) THEN EXIT SUB
  4138.     state = v2                                                                            ' v2 = state
  4139.     key = state{8,24}                                                                ' virtual key
  4140.     IF (state AND $$AltBit) THEN EXIT SUB                        ' disallow Alt+Enter
  4141.     IF (key = $$KeyEnter) THEN GOSUB ButtonOn                ' got Enter
  4142. END SUB
  4143. '
  4144. '
  4145. ' *****  MouseDown  *****
  4146. '
  4147. SUB MouseDown
  4148.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4149.     IFZ (state AND mouse) THEN EXIT SUB
  4150.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4151.     GOSUB ButtonOn
  4152. END SUB
  4153. '
  4154. '
  4155. ' *****  SetValue  *****
  4156. '
  4157. SUB SetValue
  4158.     IF r1 THEN EXIT SUB
  4159.     GOSUB SetValues
  4160. END SUB
  4161. '
  4162. '
  4163. ' *****  SetValues  *****
  4164. '
  4165. SUB SetValues
  4166.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4167.     IF v0 THEN GOSUB ButtonOn ELSE GOSUB ButtonOff
  4168. END SUB
  4169. '
  4170. '
  4171. ' *****  ButtonOff  *****
  4172. '
  4173. SUB ButtonOff
  4174.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4175.     IFZ value0 THEN EXIT SUB
  4176.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 0)
  4177.     GOSUB RedrawGrid
  4178.     XuiCallback (grid, #Selection, 0, 0, 0, 0, 0, grid)
  4179. END SUB
  4180. '
  4181. '
  4182. ' *****  ButtonOn  *****
  4183. '
  4184. SUB ButtonOn
  4185.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4186.     IF value0 THEN EXIT SUB
  4187.     XuiSetValue  (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 0)
  4188.     GOSUB ResetOtherRadioBoxes
  4189.     GOSUB RedrawGrid
  4190.     XuiCallback (grid, #Selection, -1, 0, 0, 0, 0, grid)
  4191. END SUB
  4192. '
  4193. '
  4194. ' *****  ResetOtherRadioBoxes  *****  reset grids in same .group
  4195. '
  4196. SUB ResetOtherRadioBoxes
  4197.     XuiGetEnclosingGrid (grid, #GetEnclosingGrid, @gg, 0, 0, 0, 0, 0)
  4198.     XuiGetEnclosedGrids (gg, #GetEnclosedGrids, 0, 0, 0, 0, 0, @kk[])
  4199.     XuiGetGroup (grid, #GetGroup, @group, 0, 0, 0, 0, 0)
  4200.     IFZ group THEN EXIT SUB
  4201. '
  4202.     IF kk[] THEN
  4203.         FOR i = 0 TO UBOUND(kk[])
  4204.             k = kk[i]
  4205.             IF (k = grid) THEN DO NEXT
  4206.             IF k THEN XuiSendMessage (k, #GetGroup, @check, 0, 0, 0, 0, 0)
  4207.             IF (group = check) THEN XuiSendMessage (k, #SetValue, 0, 0, 0, 0, 0, 0)
  4208.         NEXT i
  4209.     END IF
  4210. END SUB
  4211. '
  4212. '
  4213. ' *****  RedrawGrid  *****
  4214. '
  4215. SUB RedrawGrid
  4216.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4217.     IFZ (state AND redraw) THEN EXIT SUB
  4218.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4219.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  4220.     width = x2 - x1 + 1 : height = y2 - y1 + 1
  4221.     XuiGetValue (grid, #GetValue, @state, 0, 0, 0, 0, 0)
  4222.     XuiGetColor (grid, #GetColor, @back, @draw, @lo, @hi, 0, 0)
  4223.     XuiGetColorExtra (grid, #GetColorExtra, 0, @acc, 0, 0, 0, 0)
  4224.     XuiGetAlign (grid, #GetAlign, 0, 0, @inX, @inY, 0, @bw)
  4225.     xx = x1 + ((inX - 12) >> 1) + bw - 1 + 6
  4226.     yy = y1 + (height >> 1)
  4227.     XgrMoveTo (grid, xx, yy)
  4228.     XgrDrawCircle (grid, draw, 6)
  4229.     XgrDrawCircle (grid, draw, 5)
  4230.     IF state THEN
  4231.         XgrDrawCircle (grid,  acc, 4)
  4232.         XgrDrawCircle (grid,  acc, 3)
  4233.         XgrDrawCircle (grid, draw, 2)
  4234.         XgrDrawCircle (grid, draw, 1)
  4235.         XgrDrawCircle (grid, draw, 0)
  4236.         XgrDrawLine (grid, draw, xx-1, yy-1, xx+1, yy+1)
  4237.         XgrDrawLine (grid, draw, xx-1, yy+1, xx+1, yy-1)
  4238.     END IF
  4239. END SUB
  4240. '
  4241. '
  4242. ' *****  Initialize  *****
  4243. '
  4244. SUB Initialize
  4245.     XuiGetDefaultMessageFuncArray (@func[])
  4246.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  4247. '
  4248.     func[#SetValue]                        = 0
  4249.     func[#SetValues]                    = 0
  4250. '
  4251.     DIM sub[upperMessage]
  4252.     sub[#Create]                            = SUBADDRESS (Create)
  4253.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  4254.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  4255.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  4256.     sub[#RedrawGrid]                    = SUBADDRESS (RedrawGrid)
  4257.     sub[#SetValue]                        = SUBADDRESS (SetValue)
  4258.     sub[#SetValues]                        = SUBADDRESS (SetValues)
  4259. '
  4260.     IF func[0] THEN PRINT "XuiRadioBox() : Initialize : error ::: (undefined message)"
  4261.     IF sub[0] THEN PRINT "XuiRadioBox() : Initialize : error ::: (undefined message)"
  4262.     XuiRegisterGridType (@XuiRadioBox, @"XuiRadioBox", &XuiRadioBox(), @func[], @sub[])
  4263. '
  4264.     designX = 0
  4265.     designY = 0
  4266.     designWidth = 80
  4267.     designHeight = 20
  4268. '
  4269.     gridType = XuiRadioBox
  4270.     XuiSetGridTypeValue (gridType, @"x",               designX)
  4271.     XuiSetGridTypeValue (gridType, @"y",               designY)
  4272.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  4273.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  4274.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  4275.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  4276.     XuiSetGridTypeValue (gridType, @"indentLeft",      24)
  4277.     XuiSetGridTypeValue (gridType, @"group",            2)
  4278.     XuiSetGridTypeValue (gridType, @"align",           $$AlignMiddleLeft)
  4279.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise1)
  4280.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  4281.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  4282.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  4283.     IFZ message THEN RETURN
  4284. END SUB
  4285. END FUNCTION
  4286. '
  4287. '
  4288. ' ###############################
  4289. ' #####  XuiRadioButton ()  #####
  4290. ' ###############################
  4291. '
  4292. FUNCTION  XuiRadioButton (grid, message, v0, v1, v2, v3, r0, (r1, r1[]))
  4293.     STATIC    designX,  designY,  designWidth,  designHeight
  4294.     STATIC    SUBADDR  sub[]
  4295.     STATIC    upperMessage
  4296.     STATIC    XuiRadioButton
  4297. '
  4298.     IFZ sub[] THEN GOSUB Initialize
  4299.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiRadioButton) THEN RETURN
  4300.     GOSUB @sub[message]
  4301.     RETURN
  4302. '
  4303. '
  4304. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  4305. '
  4306. SUB Create
  4307.     IF (v0 <= 0) THEN v0 = 0
  4308.     IF (v1 <= 0) THEN v1 = 0
  4309.     IF (v2 <= 0) THEN v2 = designWidth
  4310.     IF (v3 <= 0) THEN v3 = designHeight
  4311.     XuiCreateGrid (@grid, XuiRadioButton, @v0, @v1, @v2, @v3, r0, r1, &XuiRadioButton())
  4312. END SUB
  4313. '
  4314. '
  4315. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  4316. '
  4317. SUB CreateWindow
  4318.     IF (v0  = 0) THEN v0 = designX
  4319.     IF (v1  = 0) THEN v1 = designY
  4320.     IF (v2 <= 0) THEN v2 = designWidth
  4321.     IF (v3 <= 0) THEN v3 = designHeight
  4322.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  4323.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  4324.     GOSUB Create
  4325.     r1 = 0 : ATTACH display$ TO r1$
  4326.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiRadioButton")
  4327. END SUB
  4328. '
  4329. '
  4330. ' *****  KeyDown  *****
  4331. '
  4332. SUB KeyDown
  4333.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4334.     IFZ (state AND keyboard) THEN EXIT SUB
  4335.     state = v2                                                                            ' v2 = state
  4336.     key = state{8,24}                                                                ' virtual key
  4337.     IF (state AND $$AltBit) THEN EXIT SUB                        ' disallow Alt+Enter
  4338.     IF (key = $$KeyEnter) THEN GOSUB ButtonOn                ' got Enter
  4339. END SUB
  4340. '
  4341. '
  4342. ' *****  MouseDown  *****
  4343. '
  4344. SUB MouseDown
  4345.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4346.     IFZ (state AND mouse) THEN EXIT SUB
  4347.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4348.     GOSUB ButtonOn
  4349. END SUB
  4350. '
  4351. '
  4352. ' *****  SetValue  *****
  4353. '
  4354. SUB SetValue
  4355.     IF r1 THEN EXIT SUB
  4356.     GOSUB SetValues
  4357. END SUB
  4358. '
  4359. '
  4360. ' *****  SetValues  *****
  4361. '
  4362. SUB SetValues
  4363.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4364.     IF v0 THEN GOSUB ButtonOn ELSE GOSUB ButtonOff
  4365. END SUB
  4366. '
  4367. '
  4368. ' *****  ButtonOff  *****
  4369. '
  4370. SUB ButtonOff
  4371.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4372.     IFZ value0 THEN EXIT SUB
  4373.     XuiSetValue (grid, #SetValue, $$FALSE, 0, 0, 0, 0, 0)
  4374.     XuiGetBorder (grid, #GetBorder, 0, @border, 0, 0, 0, 0)
  4375.     XuiSetBorder (grid, #SetBorder, border, -1, -1, -1, 0, 0)
  4376.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4377.     XuiCallback (grid, #Selection, 0, 0, 0, 0, 0, grid)
  4378. END SUB
  4379. '
  4380. '
  4381. ' *****  ButtonOn  *****
  4382. '
  4383. SUB ButtonOn
  4384.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  4385.     IF value0 THEN EXIT SUB
  4386.     XuiSetValue (grid, #SetValue, $$TRUE, 0, 0, 0, 0, 0)
  4387.     XuiGetBorder (grid, #GetBorder, 0, 0, @border, 0, 0, 0)
  4388.     XuiSetBorder (grid, #SetBorder, border, -1, -1, -1, 0, 0)
  4389.     GOSUB ResetOtherRadioButtons
  4390.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  4391.     XuiCallback (grid, #Selection, -1, 0, 0, 0, 0, grid)
  4392. END SUB
  4393. '
  4394. '
  4395. ' *****  ResetOtherRadioButtons  *****  reset grids in same .group
  4396. '
  4397. SUB ResetOtherRadioButtons
  4398.     XuiGetEnclosingGrid (grid, #GetEnclosingGrid, @gg, 0, 0, 0, 0, 0)
  4399.     XuiGetEnclosedGrids (gg, #GetEnclosedGrids, 0, 0, 0, 0, 0, @kk[])
  4400.     XuiGetGroup (grid, #GetGroup, @group, 0, 0, 0, 0, 0)
  4401.     IFZ group THEN EXIT SUB
  4402. '
  4403.     IF kk[] THEN
  4404.         FOR i = 0 TO UBOUND(kk[])
  4405.             k = kk[i]
  4406.             IF (k = grid) THEN DO NEXT
  4407.             IF k THEN XuiSendMessage (k, #GetGroup, @check, 0, 0, 0, 0, 0)
  4408.             IF (group = check) THEN XuiSendMessage (k, #SetValue, 0, 0, 0, 0, 0, 0)
  4409.         NEXT i
  4410.     END IF
  4411. END SUB
  4412. '
  4413. '
  4414. ' *****  Initialize  *****
  4415. '
  4416. SUB Initialize
  4417.     XuiGetDefaultMessageFuncArray (@func[])
  4418.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  4419. '
  4420.     func[#SetValue]                        = 0
  4421.     func[#SetValues]                    = 0
  4422. '
  4423.     DIM sub[upperMessage]
  4424.     sub[#Create]                            = SUBADDRESS (Create)
  4425.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  4426.     sub[#KeyDown]                            = SUBADDRESS (KeyDown)
  4427.     sub[#MouseDown]                        = SUBADDRESS (MouseDown)
  4428.     sub[#SetValue]                        = SUBADDRESS (SetValue)
  4429.     sub[#SetValues]                        = SUBADDRESS (SetValues)
  4430. '
  4431.     IF func[0] THEN PRINT "XuiRadioButton() : Initialize : error ::: (undefined message)"
  4432.     IF sub[0] THEN PRINT "XuiRadioButton() : Initialize : error ::: (undefined message)"
  4433.     XuiRegisterGridType (@XuiRadioButton, @"XuiRadioButton", &XuiRadioButton(), @func[], @sub[])
  4434. '
  4435.     designX = 0
  4436.     designY = 0
  4437.     designWidth = 80
  4438.     designHeight = 20
  4439. '
  4440.     gridType = XuiRadioButton
  4441.     XuiSetGridTypeValue (gridType, @"x",               designX)
  4442.     XuiSetGridTypeValue (gridType, @"y",               designY)
  4443.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  4444.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  4445.     XuiSetGridTypeValue (gridType, @"minWidth",        32)
  4446.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  4447.     XuiSetGridTypeValue (gridType, @"group",            1)
  4448.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise2)
  4449.     XuiSetGridTypeValue (gridType, @"borderUp",        $$BorderRaise2)
  4450.     XuiSetGridTypeValue (gridType, @"borderDown",      $$BorderLower2)
  4451.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  4452.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  4453.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  4454.     IFZ message THEN RETURN
  4455. END SUB
  4456. END FUNCTION
  4457. '
  4458. '
  4459. ' #########################
  4460. ' #####  XuiRange ()  #####
  4461. ' #########################
  4462. '
  4463. FUNCTION  XuiRange (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  4464.     STATIC    designX,  designY,  designWidth,  designHeight
  4465.     STATIC    SUBADDR  sub[]
  4466.     STATIC    upperMessage
  4467.     STATIC    XuiRange
  4468. '
  4469.     $Range            = 0
  4470.     $Label            = 1
  4471.     $ButtonUp        = 2
  4472.     $ButtonDown    = 3
  4473. '
  4474.     $value            = 0
  4475.     $addStep        = 1
  4476.     $minimum        = 2
  4477.     $maximum        = 3
  4478. '
  4479.     IFZ sub[] THEN GOSUB Initialize
  4480.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiRange) THEN RETURN
  4481.     GOSUB @sub[message]
  4482.     RETURN
  4483. '
  4484. '
  4485. ' *****  Callback  *****  message = Callback : r1 = original message
  4486. '
  4487. SUB Callback
  4488.   message = r1
  4489.     callback = message
  4490.     IF (message <= upperMessage) THEN GOSUB @sub[message]
  4491. END SUB
  4492. '
  4493. '
  4494. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  4495. '
  4496. SUB Create
  4497.     IF (v0 <= 0) THEN v0 = 0
  4498.     IF (v1 <= 0) THEN v1 = 0
  4499.     IF (v2 <= 0) THEN v2 = designWidth
  4500.     IF (v3 <= 0) THEN v3 = designHeight
  4501.     XuiCreateGrid  (@grid, XuiRange, @v0, @v1, @v2, @v3, r0, r1, &XuiRange())
  4502.     XuiCreateValueArray (grid, #CreateValueArray, 3, 0, 0, 0, 0, 0)
  4503.     XuiSetValues   ( grid, #SetValues, 0, 1, 0, 100, 0, 0)
  4504.     XuiLabel       (@g, #Create, 0,  0, 48, 24, r0, grid)
  4505.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Label")
  4506.     XuiSendMessage ( g, #SetAlign, $$AlignMiddleRight, -1, -1, -1, 0, 0)
  4507.     XuiPressButton (@g, #Create, 48, 0, 12, 12, r0, grid)
  4508.     XuiSendMessage ( g, #SetCallback, grid, &XuiRange(), -1, -1, $ButtonUp, grid)
  4509.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button0")
  4510.     XuiSendMessage ( g, #SetTimer, 100, 0, 0, 0, 0, 0)
  4511.     XuiPressButton (@g, #Create, 48, 12, 12, 12, r0, grid)
  4512.     XuiSendMessage ( g, #SetCallback, grid, &XuiRange(), -1, -1, $ButtonDown, grid)
  4513.     XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"Button1")
  4514.     XuiSendMessage ( g, #SetTimer, 100, 0, 0, 0, 0, 0)
  4515.     XuiSendMessage ( g, #GetRedrawFlags, @r, 0, 0, 0, 0, 0)
  4516.     r = r AND NOT $$RedrawTextArray AND NOT $$RedrawTextString
  4517.     XuiSendMessage ( grid, #SetRedrawFlags, r, 0, 0, 0, $ButtonUp, 0)
  4518.     XuiSendMessage ( grid, #SetRedrawFlags, r, 0, 0, 0, $ButtonDown, 0)
  4519.     GOSUB Resize
  4520. END SUB
  4521. '
  4522. '
  4523. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  4524. '
  4525. SUB CreateWindow
  4526.     IF (v0  = 0) THEN v0 = designX
  4527.     IF (v1  = 0) THEN v1 = designY
  4528.     IF (v2 <= 0) THEN v2 = designWidth
  4529.     IF (v3 <= 0) THEN v3 = designHeight
  4530.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  4531.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  4532.     GOSUB Create
  4533.     r1 = 0 : ATTACH display$ TO r1$
  4534.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiRange")
  4535. END SUB
  4536. '
  4537. '
  4538. ' *****  GetSmallestSize  *****
  4539. '
  4540. SUB GetSmallestSize
  4541.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @w1, @h1, $Label, 8)
  4542.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @w2, @h2, $ButtonUp, 4)
  4543.     XuiSendToKid (grid, #GetSmallestSize, 0, 0, @w3, @h3, $ButtonDown, 4)
  4544.     big = (h1 + 1) >> 1
  4545.     IF (big < w2) THEN big = w2
  4546.     IF (big < w3) THEN big = w3
  4547.     IF (big < h2) THEN big = h2
  4548.     IF (big < h3) THEN big = h3
  4549.     w2 = big : w3 = big : h2 = big : h3 = big
  4550.     IF (h1 < (h2 + h3)) THEN h1 = h2 + h3
  4551.     IF (h1 > (h2 + h3)) THEN
  4552.         h1 = (h1 + 1) AND -2
  4553.         big = h1 >> 1
  4554.         w2 = big : w3 = big : h2 = big : h3 = big
  4555.     END IF
  4556.     IF (w1 < 16) THEN w1 = 16
  4557.     v2 = w1 + w2
  4558.     v3 = h1
  4559. END SUB
  4560. '
  4561. '
  4562. ' *****  Redraw  *****
  4563. '
  4564. SUB Redraw
  4565.     XuiGetValue (grid, #GetValue, @value, 0, 0, 0, 0, 0)
  4566.     value$ = STRING$ (value)
  4567.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Label, @value$)
  4568.     XuiRedraw (grid, #Redraw, 0, 0, 0, 0, 0, 0)
  4569. END SUB
  4570. '
  4571. '
  4572. ' *****  Resize  *****
  4573. '
  4574. SUB Resize
  4575.     vv2 = v2
  4576.     vv3 = v3
  4577.     GOSUB GetSmallestSize
  4578.     v2 = MAX (v2, vv2)
  4579.     v3 = MAX (v3, vv3)
  4580. '
  4581.     IF (v2 < ((v3 >> 1) + 16)) THEN v2 = (v3 >> 1) + 16
  4582.     IF (v2 < ((v3 >> 1) + w1)) THEN v2 = (v3 >> 1) + w1
  4583. '
  4584.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  4585.     big = v3 >> 1
  4586.     w1 = v2 - big
  4587.     w2 = big
  4588.     w3 = big
  4589.     h1 = v3
  4590.     h2 = big
  4591.     h3 = big
  4592. '
  4593.     XuiSendToKid (grid, #Resize,  0,  0, w1, h1, $Label, 0)
  4594.     XuiSendToKid (grid, #Resize, w1,  0, w2, h2, $ButtonUp, 0)
  4595.     XuiSendToKid (grid, #Resize, w1, h2, w3, h3, $ButtonDown, 0)
  4596.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  4597. END SUB
  4598. '
  4599. '
  4600. ' *****  Selection  *****
  4601. '
  4602. SUB Selection
  4603.     XuiGetValues (grid, #GetValues, 0, @add, 0, 0, 0, 0)
  4604.     SELECT CASE r0
  4605.         CASE $ButtonUp        : add = ABS(add)
  4606.         CASE $ButtonDown    : add = -ABS(add)
  4607.     END SELECT
  4608.     GOSUB UpdateValue
  4609.     XuiSendToKid (grid, #RedrawGrid, 0, 0, 0, 0, $Label, 0)
  4610.     XuiCallback (grid, #Selection, value, add, vMin, vMax, 0, 0)
  4611. END SUB
  4612. '
  4613. '
  4614. ' *****  CheckValues  *****
  4615. '
  4616. SUB CheckValues
  4617.     XuiGetValues (grid, #GetValues, @value, @add, @vMin, @vMax, 0, 0)
  4618.     IF (value < vMin) THEN value = vMin
  4619.     IF (value > vMax) THEN value = vMax
  4620.     XuiSetValues (grid, #SetValues, value, add, vMin, vMax, 0, 0)
  4621. END SUB
  4622. '
  4623. '
  4624. ' *****  TimeOut  *****
  4625. '
  4626. SUB TimeOut
  4627.     XuiGetValues (grid, #GetValues, 0, @add, 0, 0, 0, 0)
  4628.     GOSUB UpdateValue
  4629.     XuiSendToKid (grid, #Redraw, 0, 0, 0, 0, $Label, 0)
  4630.     XuiCallback (grid, #Selection, value, add, vMin, vMax, 0, 0)
  4631. END SUB
  4632. '
  4633. '
  4634. ' *****  UpdateValue  *****
  4635. '
  4636. SUB UpdateValue
  4637.     XuiGetValues (grid, #GetValues, @value, 0, @vMin, @vMax, 0, 0)
  4638.     value = value + add
  4639.     IF (value < vMin) THEN value = vMin
  4640.     IF (value > vMax) THEN value = vMax
  4641.     XuiSetValues (grid, #SetValues, value, add, vMin, vMax, 0, 0)
  4642.     value$ = STRING$ (value)
  4643.     XuiSendToKid (grid, #SetTextString, 0, 0, 0, 0, $Label, @value$)
  4644. END SUB
  4645. '
  4646. '
  4647. ' *****  Initialize  ****
  4648. '
  4649. SUB Initialize
  4650.     XuiGetDefaultMessageFuncArray (@func[])
  4651.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  4652.     func[#Callback]                        = 0
  4653.     func[#GetSmallestSize]        = 0
  4654.     func[#Redraw]                            = 0
  4655.     func[#Resize]                            = 0
  4656. '
  4657.     DIM sub[upperMessage]
  4658.     sub[#Callback]                        = SUBADDRESS (Callback)
  4659.     sub[#Create]                            = SUBADDRESS (Create)
  4660.     sub[#CreateWindow]                = SUBADDRESS (CreateWindow)
  4661.     sub[#GetSmallestSize]            = SUBADDRESS (GetSmallestSize)
  4662.     sub[#Redraw]                            = SUBADDRESS (Redraw)
  4663.     sub[#Resize]                            = SUBADDRESS (Resize)
  4664.     sub[#Selection]                        = SUBADDRESS (Selection)
  4665.     sub[#SetValue]                        = SUBADDRESS (CheckValues)
  4666.     sub[#SetValues]                        = SUBADDRESS (CheckValues)
  4667. '
  4668.     IF func[0] THEN PRINT "XuiRange() : Initialize : error ::: (undefined message)"
  4669.     IF sub[0] THEN PRINT "XuiRange() : Initialize : error ::: (undefined message)"
  4670.     XuiRegisterGridType (@XuiRange, @"XuiRange", &XuiRange(), @func[], @sub[])
  4671. '
  4672.     designX = 0
  4673.     designY = 0
  4674.     designWidth = 80
  4675.     designHeight = 24
  4676. '
  4677.     gridType = XuiRange
  4678.     XuiSetGridTypeValue (gridType, @"x",               designX)
  4679.     XuiSetGridTypeValue (gridType, @"y",               designY)
  4680.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  4681.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  4682.     XuiSetGridTypeValue (gridType, @"minWidth",        24)
  4683.     XuiSetGridTypeValue (gridType, @"minHeight",       16)
  4684.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureRaise1)
  4685.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  4686.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawBorder)
  4687.     IFZ message THEN RETURN
  4688. END SUB
  4689. END FUNCTION
  4690. '
  4691. '
  4692. ' ##############################
  4693. ' #####  XuiScrollBarH ()  #####
  4694. ' ##############################
  4695. '
  4696. FUNCTION  XuiScrollBarH (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  4697.     STATIC    designX,  designY,  designWidth,  designHeight
  4698.     STATIC    SUBADDR  sub[]
  4699.     STATIC    upperMessage
  4700.     STATIC    XuiScrollBarH
  4701.     STATIC    focusGrid
  4702. '
  4703.     $msTimeOut    = 10
  4704.     $minMouse        = 12
  4705.     $maxMouse        = 13
  4706.     $lastValue    = 15
  4707. '
  4708.     IFZ sub[] THEN GOSUB Initialize
  4709.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiScrollBarH) THEN RETURN
  4710.     GOSUB @sub[message]
  4711.     RETURN
  4712. '
  4713. '
  4714. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  4715. '
  4716. SUB Create
  4717.     IF (v0 <= 0) THEN v0 = 0
  4718.     IF (v1 <= 0) THEN v1 = 0
  4719.     IF (v2 <= 0) THEN v2 = designWidth
  4720.     IF (v3 <= 0) THEN v3 = designHeight
  4721.     XuiCreateGrid (@grid, XuiScrollBarH, @v0, @v1, @v2, @v3, r0, r1, &XuiScrollBarH())
  4722.     XuiCreateValueArray (grid, #CreateValueArray, $lastValue, 0, 0, 0, 0, 0)
  4723.     GOSUB Resize
  4724. END SUB
  4725. '
  4726. '
  4727. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  4728. '
  4729. SUB CreateWindow
  4730.     IF (v0  = 0) THEN v0 = designX
  4731.     IF (v1  = 0) THEN v1 = designY
  4732.     IF (v2 <= 0) THEN v2 = designWidth
  4733.     IF (v3 <= 0) THEN v3 = designHeight
  4734.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  4735.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  4736.     GOSUB Create
  4737.     r1 = 0 : ATTACH display$ TO r1$
  4738.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiScrollBarH")
  4739. END SUB
  4740. '
  4741. '
  4742. ' *****  MouseDown  *****
  4743. '
  4744. SUB MouseDown
  4745.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4746.     IFZ (state AND mouse) THEN EXIT SUB
  4747.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4748.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  4749.     msTimeOut = 60
  4750.     XuiGetValue (grid, #GetValue, @time, 0, 0, 0, 0, $msTimeOut)
  4751.     IFZ time THEN msTimeOut = 500
  4752.     XuiSetValue (grid, #SetValue, msTimeOut, 0, 0, 0, 0, $msTimeOut)
  4753.     SELECT CASE TRUE
  4754.         CASE (v0 < zero)
  4755.                     XuiCallback (grid, #OneLess, 0, 0, 0, 0, 0, 0)
  4756.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$TRUE)
  4757.                     XgrSetGridTimer (grid, msTimeOut)
  4758.         CASE (v0 > upper)
  4759.                     XuiCallback (grid, #OneMore, 0, 0, 0, 0, 0, 0)
  4760.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$TRUE)
  4761.                     XgrSetGridTimer (grid, msTimeOut)
  4762.         CASE (v0 < lo)
  4763.                     IF v2{1,24} THEN                                                                    ' Button 1
  4764.                         XuiCallback (grid, #MuchLess, 0, 0, 0, 0, 0, 0)
  4765.                         XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$TRUE)
  4766.                         XgrSetGridTimer (grid, msTimeOut)
  4767.                     ELSE
  4768.                         XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 8)
  4769.                         XuiSetValue (grid, #SetValue, v1, 0, 0, 0, 0, 9)
  4770.                         focusGrid = grid
  4771.                         GOSUB MouseDrag
  4772.                     END IF
  4773.         CASE (v0 > hi)
  4774.                     IF v2{1,24} THEN                                                                    ' Button 1
  4775.                         XuiCallback (grid, #MuchMore, 0, 0, 0, 0, 0, 0)
  4776.                         XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$TRUE)
  4777.                         XgrSetGridTimer (grid, msTimeOut)
  4778.                     ELSE
  4779.                         XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 8)
  4780.                         XuiSetValue (grid, #SetValue, v1, 0, 0, 0, 0, 9)
  4781.                         focusGrid = grid
  4782.                         GOSUB MouseDrag
  4783.                     END IF
  4784.         CASE ELSE
  4785.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$TRUE)
  4786.                     XuiSetValue (grid, #SetValue, v0, 0, 0, 0, 0, 8)
  4787.                     XuiSetValue (grid, #SetValue, v1, 0, 0, 0, 0, 9)
  4788.                     XuiSetValue (grid, #SetValue, v0 - (lo - zero), 0, 0, 0, 0, 12)        ' minMouse
  4789.                     XuiSetValue (grid, #SetValue, v0 + (upper - hi), 0, 0, 0, 0, 13)    ' maxMouse
  4790.                     focusGrid = grid
  4791.     END SELECT
  4792. END SUB
  4793. '
  4794. '
  4795. ' *****  MouseDrag  *****
  4796. '
  4797. SUB MouseDrag
  4798.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4799.     IFZ (state AND mouse) THEN EXIT SUB
  4800.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  4801.     IFZ focusGrid THEN EXIT SUB
  4802. '
  4803.     IF (r1 = grid) THEN
  4804.         vv0 = v0 : vv1 = v1
  4805.     ELSE
  4806.         XgrConvertLocalToDisplay (r1, v0, v1, @d0, @d1)
  4807.         XgrConvertDisplayToLocal (grid, d0, d1, @vv0, @vv1)
  4808.     END IF
  4809. '
  4810.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  4811.     XuiGetValues (grid, #GetValues, @xOld, @yOld, 0, 0, 0, 8)
  4812.     XuiGetValues (grid, #GetValues, @minMouse, @maxMouse, 0, 0, 0, 12)
  4813. '
  4814.     IF (vv0 < minMouse) THEN vv0 = minMouse
  4815.     IF (vv0 > maxMouse) THEN vv0 = maxMouse
  4816. '
  4817.     XuiSetValue (grid, #SetValue, vv0, 0, 0, 0, 0, 8)
  4818.     XuiSetValue (grid, #SetValue, vv1, 0, 0, 0, 0, 9)
  4819. '
  4820.     IF (xOld = vv0) THEN EXIT SUB                                ' ignore y only motion
  4821. '
  4822.     olo = lo
  4823.     ohi = hi
  4824.     minMove = zero - lo
  4825.     maxMove = upper - hi
  4826.     delta = vv0 - xOld
  4827.     IF (delta < 0) THEN
  4828.         move = MAX (delta, minMove)
  4829.     ELSE
  4830.         move = MIN (delta, maxMove)
  4831.     END IF
  4832. '
  4833.     IFZ move THEN EXIT SUB
  4834.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  4835.     XgrGetGridColors (grid, @back, 0, @loColor, @hiColor, 0, 0, 0, 0)
  4836.     XgrDrawBorder (grid, $$BorderFlat, back, loColor, hiColor, olo-2, y1+2, ohi+2, y2-2)
  4837.     lo = lo + move
  4838.     hi = hi + move
  4839.     IF (lo < zero) THEN
  4840.         diff = zero - lo
  4841.         lo = lo + diff
  4842.     END IF
  4843.     IF (hi > upper) THEN
  4844.         diff = upper - hi
  4845.         hi = hi + diff
  4846.     END IF
  4847.     XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 1)
  4848.     XuiSetValue (grid, #SetValue, hi, 0, 0, 0, 0, 2)
  4849.     XgrDrawBorder (grid, $$BorderRaise, back, loColor, hiColor, lo-2, y1+2, hi+2, y2-2)
  4850.     XuiCallback (grid, #Change, 0, lo-zero, hi-zero, upper-zero, 0, 0)
  4851. END SUB
  4852. '
  4853. '
  4854. ' *****  MouseUp  *****
  4855. '
  4856. SUB MouseUp
  4857.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4858.     IFZ (state AND mouse) THEN EXIT SUB
  4859.     IF (v2{$$ButtonNumber} = $$HelpButtonNumber) THEN EXIT SUB
  4860.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarH(), 0, 0, 0, $$FALSE)
  4861.     focusGrid = 0
  4862.     XuiSetValue (grid, #SetValue, 0, 0, 0, 0, 0, $msTimeOut)
  4863.     XgrSetGridTimer (grid, 0)
  4864. END SUB
  4865. '
  4866. '
  4867. ' *****  Redraw  *****
  4868. '
  4869. SUB Redraw
  4870.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  4871.     IFZ (state AND redraw) THEN EXIT SUB
  4872.     XgrClearGrid (grid, -1)
  4873.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  4874.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  4875.     XgrGetGridColors (grid, @back, 0, @lo, @hi, 0, 0, 0, 0)
  4876.     XuiGetValues (grid, #GetValues, 0, @low, @high, 0, 0, 0)
  4877.     XgrDrawBorder (grid, $$BorderRidge, back, lo, hi, x1, y1, x2, y2)
  4878.     XgrFillBox (grid, back, x1, y1, x1+11, y2)
  4879.     XgrFillBox (grid, back, x2-11, y1, x2, y2)
  4880.     left = style AND 0x0002
  4881.     right = style AND 0x0001
  4882.     IF left THEN XgrFillTriangle (grid, -1, 0, $$TriangleLeft, x1+2, y1+2, x1+8, y2-2)
  4883.     IF right THEN XgrFillTriangle (grid, -1, 0, $$TriangleRight, x2-8, y1+2, x2-2, y2-2)
  4884.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, x1, y1, x1+11, y2)
  4885.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, x2-11, y1, x2, y2)
  4886.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, low-2, y1+2, high+2, y2-2)
  4887. END SUB
  4888. '
  4889. '
  4890. ' *****  Resize  *****
  4891. '
  4892. SUB Resize
  4893.     XuiGetValues (grid, #GetValues, @lowest, @low, @high, @highest, 0, 4)
  4894.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  4895.     zero = 14
  4896.     upper = v2 - 15
  4897.     ComputeLimits (@lo, @hi, zero, upper, lowest, low, high, highest)
  4898.     XuiSetValues (grid, #SetValues, zero, lo, hi, upper, 0, 0)
  4899.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  4900. END SUB
  4901. '
  4902. '
  4903. ' *****  GetPosition  *****
  4904. '
  4905. SUB GetPosition
  4906.     XuiGetValues (grid, #GetValues, @v0, @v1, @v2, @v3, 0, 0)
  4907. END SUB
  4908. '
  4909. '
  4910. ' *****  SetPosition  *****
  4911. '
  4912. SUB SetPosition
  4913.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  4914. '
  4915.     lowest        = v0    ' lowest line # in document
  4916.     low                = v1    ' lowest line # displayed
  4917.     high            = v2    ' highest line # displayed
  4918.     highest        = v3    ' highest line # in document
  4919. '
  4920.     XuiSetValues (grid, #SetValues, v0, v1, v2, v3, 0, 4)
  4921.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  4922.     XgrGetGridColors (grid, @back, 0, @loColor, @hiColor, 0, 0, 0, 0)
  4923.     XgrDrawBorder (grid, $$BorderFlat, back, loColor, hiColor, lo-2, y1+2, hi+2, y2-2)
  4924.     ComputeLimits (@lo, @hi, zero, upper, lowest, low, high, highest)
  4925.     XgrDrawBorder (grid, $$BorderRaise, back, loColor, hiColor, lo-2, y1+2, hi+2, y2-2)
  4926.     XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 1)
  4927.     XuiSetValue (grid, #SetValue, hi, 0, 0, 0, 0, 2)
  4928. END SUB
  4929. '
  4930. '
  4931. ' *****  TimeOut  *****
  4932. '
  4933. SUB TimeOut
  4934.     XgrGetGridWindow (grid, @window)
  4935.     XgrGetMouseInfo (window, @grid, @v0, @v1, @v2, @v3)        ' x, y, state, time
  4936.     IFZ v2{2,24} THEN EXIT SUB                                                        ' buttons 12 not down
  4937.     GOSUB MouseDown
  4938. END SUB
  4939. '
  4940. '
  4941. ' *****  Initialize  *****
  4942. '
  4943. SUB Initialize
  4944.     XuiGetDefaultMessageFuncArray (@func[])
  4945.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  4946. '
  4947.     func[#GetSmallestSize]    = &XuiGetMaxMinSize()
  4948.     func[#Redraw]                        = 0
  4949.     func[#RedrawGrid]                = 0
  4950.     func[#Resize]                        = 0
  4951. '
  4952.     DIM sub[upperMessage]
  4953.     sub[#Create]                        = SUBADDRESS (Create)
  4954.     sub[#CreateWindow]            = SUBADDRESS (CreateWindow)
  4955.     sub[#GetPosition]                = SUBADDRESS (GetPosition)
  4956.     sub[#MouseDown]                    = SUBADDRESS (MouseDown)
  4957.     sub[#MouseDrag]                    = SUBADDRESS (MouseDrag)
  4958.     sub[#MouseUp]                        = SUBADDRESS (MouseUp)
  4959.     sub[#Redraw]                        = SUBADDRESS (Redraw)
  4960.     sub[#RedrawGrid]                = SUBADDRESS (Redraw)
  4961.     sub[#Resize]                        = SUBADDRESS (Resize)
  4962.     sub[#SetPosition]                = SUBADDRESS (SetPosition)
  4963.     sub[#TimeOut]                        = SUBADDRESS (TimeOut)
  4964. '
  4965.     IF func[0] THEN PRINT "XuiScrollBarH() : Initialize : error ::: (undefined message)"
  4966.     IF sub[0] THEN PRINT "XuiScrollBarH() : Initialize : error ::: (undefined message)"
  4967.     XuiRegisterGridType (@XuiScrollBarH, @"XuiScrollBarH", &XuiScrollBarH(), @func[], @sub[])
  4968. '
  4969.     designX = 0
  4970.     designY = 0
  4971.     designWidth = 80
  4972.     designHeight = 12
  4973. '
  4974.     gridType = XuiScrollBarH
  4975.     XuiSetGridTypeValue (gridType, @"x",               designX)
  4976.     XuiSetGridTypeValue (gridType, @"y",               designY)
  4977.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  4978.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  4979.     XuiSetGridTypeValue (gridType, @"minWidth",        48)
  4980.     XuiSetGridTypeValue (gridType, @"minHeight",       12)
  4981.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRidge)
  4982. '    XuiSetGridTypeValue (gridType, @"style",            3)
  4983.     XuiSetGridTypeValue (gridType, @"can",             $$Callback)
  4984.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawNone)
  4985.     IFZ message THEN RETURN
  4986. END SUB
  4987. END FUNCTION
  4988. '
  4989. '
  4990. ' ##############################
  4991. ' #####  XuiScrollBarV ()  #####
  4992. ' ##############################
  4993. '
  4994. FUNCTION  XuiScrollBarV (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
  4995.     STATIC    designX,  designY,  designWidth,  designHeight
  4996.     STATIC    SUBADDR  sub[]
  4997.     STATIC    upperMessage
  4998.     STATIC    XuiScrollBarV
  4999.     STATIC    focusGrid
  5000. '
  5001.     $msTimeOut    = 10
  5002.     $minMouse        = 12
  5003.     $maxMouse        = 13
  5004.     $lastValue    = 15
  5005. '
  5006.     IFZ sub[] THEN GOSUB Initialize
  5007.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiScrollBarV) THEN RETURN
  5008.     GOSUB @sub[message]
  5009.     RETURN
  5010. '
  5011. '
  5012. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  5013. '
  5014. SUB Create
  5015.     IF (v0 <= 0) THEN v0 = 0
  5016.     IF (v1 <= 0) THEN v1 = 0
  5017.     IF (v2 <= 0) THEN v2 = designWidth
  5018.     IF (v3 <= 0) THEN v3 = designHeight
  5019.     XuiCreateGrid (@grid, XuiScrollBarV, @v0, @v1, @v2, @v3, r0, r1, &XuiScrollBarV())
  5020.     XuiCreateValueArray (grid, #CreateValueArray, $lastValue, 0, 0, 0, 0, 0)
  5021.     GOSUB Resize
  5022. END SUB
  5023. '
  5024. '
  5025. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  5026. '
  5027. SUB CreateWindow
  5028.     IF (v0  = 0) THEN v0 = designX
  5029.     IF (v1  = 0) THEN v1 = designY
  5030.     IF (v2 <= 0) THEN v2 = designWidth
  5031.     IF (v3 <= 0) THEN v3 = designHeight
  5032.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  5033.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  5034.     GOSUB Create
  5035.     r1 = 0 : ATTACH display$ TO r1$
  5036.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiScrollBarV")
  5037. END SUB
  5038. '
  5039. '
  5040. ' *****  MouseDown  *****
  5041. '
  5042. SUB MouseDown
  5043.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  5044.     IFZ (state AND mouse) THEN EXIT SUB
  5045.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  5046.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  5047.     msTimeOut = 60
  5048.     XuiGetValue (grid, #GetValue, @time, 0, 0, 0, 0, $msTimeOut)
  5049.     IFZ time THEN msTimeOut = 500
  5050.     XuiSetValue (grid, #SetValue, msTimeOut, 0, 0, 0, 0, $msTimeOut)
  5051.     SELECT CASE TRUE
  5052.         CASE (v1 < zero)
  5053.                     XuiCallback (grid, #OneLess, 0, 0, 0, 0, 0, 0)
  5054.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$TRUE)
  5055.                     XgrSetGridTimer (grid, msTimeOut)
  5056.         CASE (v1 > upper)
  5057.                     XuiCallback (grid, #OneMore, 0, 0, 0, 0, 0, 0)
  5058.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$TRUE)
  5059.                     XgrSetGridTimer (grid, msTimeOut)
  5060.         CASE (v1 < lo)
  5061.                     IF v2{1,24} THEN                                                                    ' Button 1
  5062.                         XuiCallback (grid, #MuchLess, 0, 0, 0, 0, 0, 0)
  5063.                         XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$TRUE)
  5064.                         XgrSetGridTimer (grid, msTimeOut)
  5065.                     ELSE
  5066.                         XuiSetValue (grid, #SetValue, v0, 0, 0, 0, 0, 8)
  5067.                         XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 9)
  5068.                         focusGrid = grid
  5069.                         GOSUB MouseDrag
  5070.                     END IF
  5071.         CASE (v1 > hi)
  5072.                     IF v2{1,24} THEN                                                                    ' Button 1
  5073.                         XuiCallback (grid, #MuchMore, 0, 0, 0, 0, 0, 0)
  5074.                         XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$TRUE)
  5075.                         XgrSetGridTimer (grid, msTimeOut)
  5076.                     ELSE
  5077.                         XuiSetValue (grid, #SetValue, v0, 0, 0, 0, 0, 8)
  5078.                         XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 9)
  5079.                         focusGrid = grid
  5080.                         GOSUB MouseDrag
  5081.                     END IF
  5082.         CASE ELSE
  5083.                     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$TRUE)
  5084.                     XuiSetValue (grid, #SetValue, v0, 0, 0, 0, 0, 8)
  5085.                     XuiSetValue (grid, #SetValue, v1, 0, 0, 0, 0, 9)
  5086.                     XuiSetValue (grid, #SetValue, v1 - (lo - zero), 0, 0, 0, 0, 12)        ' minMouse
  5087.                     XuiSetValue (grid, #SetValue, v1 + (upper - hi), 0, 0, 0, 0, 13)    ' maxMouse
  5088.                     focusGrid = grid
  5089.     END SELECT
  5090. END SUB
  5091. '
  5092. '
  5093. ' *****  MouseDrag  *****
  5094. '
  5095. SUB MouseDrag
  5096.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  5097.     IFZ (state AND mouse) THEN EXIT SUB
  5098.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  5099.     IFZ focusGrid THEN EXIT SUB
  5100. '
  5101.     IF (r1 = grid) THEN
  5102.         vv0 = v0 : vv1 = v1
  5103.     ELSE
  5104.         XgrConvertLocalToDisplay (r1, v0, v1, @d0, @d1)
  5105.         XgrConvertDisplayToLocal (grid, d0, d1, @vv0, @vv1)
  5106.     END IF
  5107. '
  5108.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  5109.     XuiGetValues (grid, #GetValues, @xOld, @yOld, 0, 0, 0, 8)
  5110.     XuiGetValues (grid, #GetValues, @minMouse, @maxMouse, 0, 0, 0, 12)
  5111. '
  5112.     IF (vv1 < minMouse) THEN vv1 = minMouse
  5113.     IF (vv1 > maxMouse) THEN vv1 = maxMouse
  5114. '
  5115.     XuiSetValue (grid, #SetValue, vv0, 0, 0, 0, 0, 8)
  5116.     XuiSetValue (grid, #SetValue, vv1, 0, 0, 0, 0, 9)
  5117. '
  5118.     IF (yOld = vv1) THEN EXIT SUB                                ' ignore x only motion
  5119. '
  5120.     olo = lo
  5121.     ohi = hi
  5122.     delta = vv1 - yOld
  5123.     minMove = zero - lo
  5124.     maxMove = upper - hi
  5125.     IF (delta < 0) THEN
  5126.         move = MAX (delta, minMove)
  5127.     ELSE
  5128.         move = MIN (delta, maxMove)
  5129.     END IF
  5130. '
  5131.     IFZ move THEN EXIT SUB
  5132.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  5133.     XgrGetGridColors (grid, @back, 0, @loColor, @hiColor, 0, 0, 0, 0)
  5134.     XgrDrawBorder (grid, $$BorderFlat, back, loColor, hiColor, x1+2, olo-2, x2-2, ohi+2)
  5135.     lo = lo + move
  5136.     hi = hi + move
  5137.     IF (lo < zero) THEN
  5138.         diff = zero - lo
  5139.         lo = lo + diff
  5140.     END IF
  5141.     IF (hi > upper) THEN
  5142.         diff = upper - hi
  5143.         hi = hi + diff
  5144.     END IF
  5145.     XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 1)
  5146.     XuiSetValue (grid, #SetValue, hi, 0, 0, 0, 0, 2)
  5147.     XgrDrawBorder (grid, $$BorderRaise, back, loColor, hiColor, x1+2, lo-2, x2-2, hi+2)
  5148.     XuiCallback (grid, #Change, 0, lo-zero, hi-zero, upper-zero, 0, 0)
  5149. END SUB
  5150. '
  5151. '
  5152. ' *****  MouseUp  *****
  5153. '
  5154. SUB MouseUp
  5155.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  5156.     IFZ (state AND mouse) THEN EXIT SUB
  5157.     IF (v2{$$ButtonNumber} = $$HelpButtonNumber) THEN EXIT SUB
  5158.     XuiMonitorMouse (grid, #MonitorMouse, grid, &XuiScrollBarV(), 0, 0, 0, $$FALSE)
  5159.     focusGrid = 0
  5160.     XuiSetValue (grid, #SetValue, 0, 0, 0, 0, 0, $msTimeOut)
  5161.     XgrSetGridTimer (grid, 0)
  5162. END SUB
  5163. '
  5164. '
  5165. ' *****  Redraw  *****
  5166. '
  5167. SUB Redraw
  5168.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  5169.     IFZ (state AND redraw) THEN EXIT SUB
  5170.     XgrClearGrid (grid, -1)
  5171.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  5172.     XuiGetStyle (grid, #GetStyle, @style, 0, 0, 0, 0, 0)
  5173.     XgrGetGridColors (grid, @back, 0, @lo, @hi, 0, 0, 0, 0)
  5174.     XuiGetValues (grid, #GetValues, 0, @low, @high, 0, 0, 0)
  5175.     XgrDrawBorder (grid, $$BorderRidge, back, lo, hi, x1, y1, x2, y2)
  5176.     XgrFillBox (grid, back, x1, y1, x2, y1+11)
  5177.     XgrFillBox (grid, back, x1, y2-11, x2, y2)
  5178.     top = style AND 0x0002
  5179.     bottom = style AND 0x0001
  5180.     IF top THEN XgrFillTriangle (grid, -1, 0, $$TriangleUp, x1+2, y1+2, x2-2, y1+8)
  5181.     IF bottom THEN XgrFillTriangle (grid, -1, 0, $$TriangleDown, x1+2, y2-8, x2-2, y2-2)
  5182.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, x1, y1, x2, y1+11)
  5183.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, x1, y2-11, x2, y2)
  5184.     XgrDrawBorder (grid, $$BorderRaise, back, lo, hi, x1+2, low-2, x2-2, high+2)
  5185. END SUB
  5186. '
  5187. '
  5188. ' *****  Resize  *****
  5189. '
  5190. SUB Resize
  5191.     XuiGetValues (grid, #GetValues, @lowest, @low, @high, @highest, 0, 4)
  5192.     XuiPositionGrid (grid, @v0, @v1, @v2, @v3)
  5193.     zero = 14
  5194.     upper = v3 - 15
  5195.     ComputeLimits (@lo, @hi, zero, upper, lowest, low, high, highest)
  5196.     XuiSetValues (grid, #SetValues, zero, lo, hi, upper, 0, 0)
  5197.     XuiResizeWindowToGrid (grid, #ResizeWindowToGrid, v0, v1, v2, v3, 0, 0)
  5198. END SUB
  5199. '
  5200. '
  5201. ' *****  GetPosition  *****
  5202. '
  5203. SUB GetPosition
  5204.     XuiGetValues (grid, #GetValues, @v0, @v1, @v2, @v3, 0, 0)
  5205. END SUB
  5206. '
  5207. '
  5208. ' *****  SetPosition  *****
  5209. '
  5210. SUB SetPosition
  5211.     XuiGetValues (grid, #GetValues, @zero, @lo, @hi, @upper, 0, 0)
  5212. '
  5213.     lowest        = v0    ' lowest line # in document
  5214.     low                = v1    ' lowest line # displayed
  5215.     high            = v2    ' highest line # displayed
  5216.     highest        = v3    ' highest line # in document
  5217. '
  5218.     XuiSetValues (grid, #SetValues, v0, v1, v2, v3, 0, 4)
  5219.     XgrGetGridBoxLocal (grid, @x1, @y1, @x2, @y2)
  5220.     XgrGetGridColors (grid, @back, 0, @loColor, @hiColor, 0, 0, 0, 0)
  5221.     XgrDrawBorder (grid, $$BorderFlat, back, loColor, hiColor, x1+2, lo-2, x2-2, hi+2)
  5222.     ComputeLimits (@lo, @hi, zero, upper, lowest, low, high, highest)
  5223.     XgrDrawBorder (grid, $$BorderRaise, back, loColor, hiColor, x1+2, lo-2, x2-2, hi+2)
  5224.     XuiSetValue (grid, #SetValue, lo, 0, 0, 0, 0, 1)
  5225.     XuiSetValue (grid, #SetValue, hi, 0, 0, 0, 0, 2)
  5226. END SUB
  5227. '
  5228. '
  5229. ' *****  TimeOut  *****
  5230. '
  5231. SUB TimeOut
  5232.     XgrGetGridWindow (grid, @window)
  5233.     XgrGetMouseInfo (window, @grid, @v0, @v1, @v2, @v3)        ' x, y, state, time
  5234.     IFZ v2{2,24} THEN EXIT SUB                                                        ' buttons 12 not down
  5235.     GOSUB MouseDown
  5236. END SUB
  5237. '
  5238. '
  5239. ' *****  Initialize  *****
  5240. '
  5241. SUB Initialize
  5242.     XuiGetDefaultMessageFuncArray (@func[])
  5243.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  5244. '
  5245.     func[#GetSmallestSize]    = &XuiGetMaxMinSize()
  5246.     func[#Redraw]                        = 0
  5247.     func[#RedrawGrid]                = 0
  5248.     func[#Resize]                        = 0
  5249. '
  5250.     DIM sub[upperMessage]
  5251.     sub[#Create]                        = SUBADDRESS (Create)
  5252.     sub[#CreateWindow]            = SUBADDRESS (CreateWindow)
  5253.     sub[#GetPosition]                = SUBADDRESS (GetPosition)
  5254.     sub[#MouseDown]                    = SUBADDRESS (MouseDown)
  5255.     sub[#MouseDrag]                    = SUBADDRESS (MouseDrag)
  5256.     sub[#MouseUp]                        = SUBADDRESS (MouseUp)
  5257.     sub[#Redraw]                        = SUBADDRESS (Redraw)
  5258.     sub[#RedrawGrid]                = SUBADDRESS (Redraw)
  5259.     sub[#Resize]                        = SUBADDRESS (Resize)
  5260.     sub[#SetPosition]                = SUBADDRESS (SetPosition)
  5261.     sub[#TimeOut]                        = SUBADDRESS (TimeOut)
  5262. '
  5263.     IF func[0] THEN PRINT "ScrollBarV() : Initialize : error ::: (undefined message)"
  5264.     IF sub[0] THEN PRINT "ScrollBarV() : Initialize : error ::: (undefined message)"
  5265.     XuiRegisterGridType (@XuiScrollBarV, @"XuiScrollBarV", &XuiScrollBarV(), @func[], @sub[])
  5266. '
  5267.     designX = 0
  5268.     designY = 0
  5269.     designWidth = 12
  5270.     designHeight = 80
  5271. '
  5272.     gridType = XuiScrollBarV
  5273.     XuiSetGridTypeValue (gridType, @"x",               designX)
  5274.     XuiSetGridTypeValue (gridType, @"y",               designY)
  5275.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  5276.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  5277.     XuiSetGridTypeValue (gridType, @"minWidth",        12)
  5278.     XuiSetGridTypeValue (gridType, @"minHeight",       48)
  5279.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRidge)
  5280. '    XuiSetGridTypeValue (gridType, @"style",            3)
  5281.     XuiSetGridTypeValue (gridType, @"can",             $$Callback)
  5282.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawNone)
  5283.     IFZ message THEN RETURN
  5284. END SUB
  5285. END FUNCTION
  5286. '
  5287. '
  5288. ' ################################
  5289. ' #####  XuiToggleButton ()  #####
  5290. ' ################################
  5291. '
  5292. FUNCTION  XuiToggleButton (grid, message, v0, v1, v2, v3, r0, (r1, r1[], r1$))
  5293.     STATIC    designX,  designY,  designWidth,  designHeight
  5294.     STATIC    SUBADDR  sub[]
  5295.     STATIC    upperMessage
  5296.     STATIC    XuiToggleButton
  5297. '
  5298.     IFZ sub[] THEN GOSUB Initialize
  5299.     IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, XuiToggleButton) THEN RETURN
  5300.     GOSUB @sub[message]
  5301.     RETURN
  5302. '
  5303. '
  5304. ' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
  5305. '
  5306. SUB Create
  5307.     IF (v0 <= 0) THEN v0 = 0
  5308.     IF (v1 <= 0) THEN v1 = 0
  5309.     IF (v2 <= 0) THEN v2 = designWidth
  5310.     IF (v3 <= 0) THEN v3 = designHeight
  5311.     XuiCreateGrid (@grid, XuiToggleButton, @v0, @v1, @v2, @v3, r0, r1, &XuiToggleButton())
  5312. END SUB
  5313. '
  5314. '
  5315. ' *****  CreateWindow  *****  r0 = windowType : r1$ = display$
  5316. '
  5317. SUB CreateWindow
  5318.     IF (v0  = 0) THEN v0 = designX
  5319.     IF (v1  = 0) THEN v1 = designY
  5320.     IF (v2 <= 0) THEN v2 = designWidth
  5321.     IF (v3 <= 0) THEN v3 = designHeight
  5322.     XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
  5323.     v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
  5324.     GOSUB Create
  5325.     r1 = 0 : ATTACH display$ TO r1$
  5326.     XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"XuiToggleButton")
  5327. END SUB
  5328. '
  5329. '
  5330. ' *****  KeyDown  *****  #Selection on $$KeyEnter
  5331. '
  5332. SUB KeyDown
  5333.     XuiGetState (grid, #GetState, @state, @keyboard, 0, 0, 0, 0)
  5334.     IFZ (state AND keyboard) THEN EXIT SUB
  5335.     state = v2                                                            ' v2 = state
  5336.     key = state{8,24}                                                ' virtual key
  5337.     IF (key = $$KeyEnter) THEN GOSUB Toggle
  5338. END SUB
  5339. '
  5340. '
  5341. ' *****  MouseDown  *****
  5342. '
  5343. SUB MouseDown
  5344.     XuiGetState (grid, #GetState, @state, @keyboard, @mouse, @redraw, 0, 0)
  5345.     IFZ (state AND mouse) THEN EXIT SUB
  5346.     IF (v2 AND $$HelpButtonBit) THEN EXIT SUB
  5347.     GOSUB Toggle
  5348. END SUB
  5349. '
  5350. '
  5351. ' *****  SetValue  *****
  5352. '
  5353. SUB SetValue
  5354.     IF r1 THEN EXIT SUB
  5355.     GOSUB SetValues
  5356. END SUB
  5357. '
  5358. '
  5359. ' *****  SetValues  *****
  5360. '
  5361. SUB SetValues
  5362.     XuiGetValue (grid, #GetValue, @value0, 0, 0, 0, 0, 0)
  5363.     IF (v0 != value0) THEN GOSUB Toggle
  5364. END SUB
  5365. '
  5366. '
  5367. ' *****  Toggle  *****
  5368. '
  5369. SUB Toggle
  5370.     XuiGetValue (grid, #GetValue, @state, 0, 0, 0, 0, 0)
  5371.     state = NOT state
  5372.     XuiSetValue (grid, #SetValue, state, 0, 0, 0, 0, 0)
  5373.     XuiGetBorder (grid, #GetBorder, @border, @borderUp, @borderDown, 0, 0, 0)
  5374.     IF state THEN border = borderDown ELSE border = borderUp
  5375.     XuiSetBorder (grid, #SetBorder, border, -1, -1, -1, 0, 0)
  5376.     XuiRedrawGrid (grid, #RedrawGrid, 0, 0, 0, 0, 0, 0)
  5377.     XuiCallback (grid, #Selection, state, 0, v2, v3, 0, grid)
  5378. END SUB
  5379. '
  5380. '
  5381. ' *****  Initialize  ****
  5382. '
  5383. SUB Initialize
  5384.     XuiGetDefaultMessageFuncArray (@func[])
  5385.     XgrMessageNameToNumber (@"LastMessage", @upperMessage)
  5386. '
  5387.     func[#SetValue]                    = 0
  5388.     func[#SetValues]                = 0
  5389. '
  5390.     DIM sub[upperMessage]
  5391.     sub[#Create]                        = SUBADDRESS (Create)
  5392.     sub[#CreateWindow]            = SUBADDRESS (CreateWindow)
  5393.     sub[#KeyDown]                        = SUBADDRESS (KeyDown)
  5394.     sub[#MouseDown]                    = SUBADDRESS (MouseDown)
  5395.     sub[#SetValue]                    = SUBADDRESS (SetValue)
  5396.     sub[#SetValues]                    = SUBADDRESS (SetValues)
  5397. '
  5398.     IF func[0] THEN PRINT "XuiToggleButton() : Initialize : error ::: (undefined message)"
  5399.     IF sub[0] THEN PRINT "XuiToggleButton() : Initialize : error ::: (undefined message)"
  5400.     XuiRegisterGridType (@XuiToggleButton, @"XuiToggleButton", &XuiToggleButton(), @func[], @sub[])
  5401. '
  5402.     designX = 0
  5403.     designY = 0
  5404.     designWidth = 80
  5405.     designHeight = 20
  5406. '
  5407.     gridType = XuiToggleButton
  5408.     XuiSetGridTypeValue (gridType, @"x",               designX)
  5409.     XuiSetGridTypeValue (gridType, @"y",               designY)
  5410.     XuiSetGridTypeValue (gridType, @"width",           designWidth)
  5411.     XuiSetGridTypeValue (gridType, @"height",          designHeight)
  5412.     XuiSetGridTypeValue (gridType, @"minWidth",         4)
  5413.     XuiSetGridTypeValue (gridType, @"minHeight",        4)
  5414.     XuiSetGridTypeValue (gridType, @"align",           $$AlignMiddleCenter)
  5415.     XuiSetGridTypeValue (gridType, @"border",          $$BorderRaise2)
  5416.     XuiSetGridTypeValue (gridType, @"borderUp",        $$BorderRaise2)
  5417.     XuiSetGridTypeValue (gridType, @"borderDown",      $$BorderLower2)
  5418.     XuiSetGridTypeValue (gridType, @"texture",         $$TextureLower1)
  5419.     XuiSetGridTypeValue (gridType, @"can",             $$Focus OR $$Respond OR $$Callback)
  5420.     XuiSetGridTypeValue (gridType, @"redrawFlags",     $$RedrawDefault)
  5421.     IFZ message THEN RETURN
  5422. END SUB
  5423. END FUNCTION
  5424. END PROGRAM
  5425.