home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / proasm / routines / scrollbars.r < prev    next >
Text File  |  1994-11-13  |  17KB  |  880 lines

  1.  
  2. ;---;  scrollbars.r  ;---------------------------------------------------------
  3. *
  4. *    ****    GTFACE ADDENDUM FOR H/V SCROLLBARS    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        1.00
  8. *    Last Revision    22.10.94
  9. *    Identifier    scb_defined
  10. *       Prefix        scb_    (Scrollbars)
  11. *                 ¯¯    ¯
  12. *    Functions    InitScrollBars, ResetScrollBars, MakeHScrollBar,
  13. *            MakeVScrollBar, UpdateScrollBar, AskScrollBar,
  14. *            DisposeScrollBar, HandleScrollBar
  15. *
  16. ;------------------------------------------------------------------------------
  17.  
  18.  
  19. ;------------------
  20.     ifnd    scb_defined
  21. scb_defined    =1
  22.  
  23. ;------------------
  24. scb_oldbase    equ __base
  25.     base    scb_base
  26. scb_base:
  27.  
  28. ;------------------
  29.     include    exec/libraries.i
  30.     include    exec/types.i
  31.     include    intuition/imageclass.i
  32.     include    intuition/icclass.i
  33.  
  34.  
  35. ;------------------------------------------------------------------------------
  36.  
  37.     STRUCTURE    sck,0
  38.     APTR    sck_SliderObject
  39.     LABEL    sck_LeftObject
  40.     APTR    sck_UpObject
  41.     LABEL    sck_RightObject
  42.     APTR    sck_DownObject
  43.  
  44.     ULONG    sck_ID
  45.     ULONG    sck_DelayTimeSecs
  46.     ULONG    sck_DelayTimeMicros
  47.     UBYTE    sck_NewScroll
  48.     UBYTE    sck_NewSlide
  49.  
  50.     ULONG    sck_LastTop
  51.     ULONG    sck_LastVisible
  52.     LABEL   sck_SIZEOF
  53.  
  54.  
  55. SCB_ACTION_NONE        equ    0    ;take no action
  56. SCB_ACTION_LINE_UP    equ    1    ;up/left arrow hit
  57. SCB_ACTION_LINE_LEFT    equ    1
  58. SCB_ACTION_LINE_DOWN    equ    2    ;down/right arrow hit
  59. SCB_ACTION_LINE_RIGHT    equ    2
  60. SCB_ACTION_PAGE_UP    equ    3    ;slider clicked up/left
  61. SCB_ACTION_PAGE_LEFT    equ    3
  62. SCB_ACTION_PAGE_DOWN    equ    4    ;slider clicked down/right
  63. SCB_ACTION_PAGE_RIGHT    equ    4
  64. SCB_ACTION_SLIDE    equ    5    ;slider currently sliding
  65. SCB_ACTION_RELEASE    equ    6    ;slider released
  66. SCB_ACTION_TOO_FAST    equ    7    ;user too fast, slider not moved
  67.  
  68.  
  69.  
  70. ;------------------------------------------------------------------------------
  71. *
  72. * InitScrollBars    Prepare for usage of scrollbars on a screen
  73. *
  74. * INPUT:    a0    Screen address.
  75. *
  76. ;------------------------------------------------------------------------------
  77.     IFD    xxx_InitScrollBars
  78. InitScrollBars:
  79. ;------------------
  80. .start:    movem.l    d1-a6,-(sp)
  81.     lea    scb_base(pc),a4
  82.     move.l    a0,scb_Screen(a4)
  83.     move.l    IntBase(pc),a6
  84.     jsr    _LVOGetScreenDrawInfo(a6)
  85.     move.l    d0,scb_DrawInfo(a4)
  86.     beq    .err1
  87.  
  88.     moveq    #4+8+8,d0
  89.     lea    scb_MyPrefs(pc),a0
  90.     jsr    _LVOGetPrefs(a6)
  91.  
  92.     move.l    scb_Screen(pc),a0
  93.     moveq    #SYSISIZE_LOWRES,d0
  94.     move.w    sc_Flags(a0),d1
  95.     and.w    #SCREENHIRES,d1
  96.     beq.s    1$
  97.     moveq    #SYSISIZE_MEDRES,d0
  98. 1$:    move.b    d0,scb_SysISize(a4)
  99.  
  100.     move.l    #$01020302,scb_bw(a4)
  101.     cmp.w    #SYSISIZE_LOWRES,d0
  102.     beq.s    2$
  103.     move.b    #2,scb_bw(a4)
  104. 2$:    cmp.w    #SYSISIZE_HIRES,d0
  105.     beq.s    3$
  106.     move.b    #$01,scb_bh(a4)
  107.     move.w    #$0201,scb_rw(a4)
  108.  
  109. 3$:    move.l    scb_DrawInfo(pc),a0
  110.     moveq    #0,d1
  111.     move.l    dri_Flags(a0),d0
  112.     and.l    #DRIF_NEWLOOK,d0
  113.     beq.s    4$
  114.     move.w    dri_Depth(a0),d0
  115.     subq.w    #1,d0
  116.     beq.s    4$
  117.     moveq    #1,d1
  118. 4$:    move.l    d1,scb_proptags+4(a4)
  119.  
  120.     move.l    #SIZEIMAGE,d0
  121.     CALL_    NewImageObject
  122.     move.l    d0,scb_SizeObject(a4)
  123.     beq    .err2
  124.     move.l    #LEFTIMAGE,d0
  125.     CALL_    NewImageObject
  126.     move.l    d0,scb_LeftObject(a4)
  127.     beq.s    .err2
  128.     move.l    #RIGHTIMAGE,d0
  129.     CALL_    NewImageObject
  130.     move.l    d0,scb_RightObject(a4)
  131.     beq.s    .err2
  132.     move.l    #UPIMAGE,d0
  133.     CALL_    NewImageObject
  134.     move.l    d0,scb_UpObject(a4)
  135.     beq.s    .err2
  136.     move.l    #DOWNIMAGE,d0
  137.     CALL_    NewImageObject
  138.     move.l    d0,scb_DownObject(a4)
  139.     beq.s    .err2
  140.  
  141.     move.l    scb_SizeObject(pc),a0
  142.     move.w    ig_Height(a0),d1
  143.     move.l    scb_LeftObject(pc),a0
  144.     move.w    ig_Height(a0),d0
  145.     cmp.w    d0,d1
  146.     bhs.s    5$
  147.     move.w    d0,d1
  148. 5$:    move.l    scb_RightObject(pc),a0
  149.     move.w    ig_Height(a0),d0
  150.     cmp.w    d0,d1
  151.     bhs.s    6$
  152.     move.w    d0,d1
  153. 6$:    move.w    d0,scb_gh(a4)
  154.  
  155.     move.l    scb_SizeObject(pc),a0
  156.     move.w    ig_Width(a0),d1
  157.     move.l    scb_UpObject(pc),a0
  158.     move.w    ig_Width(a0),d0
  159.     cmp.w    d0,d1
  160.     bhs.s    7$
  161.     move.w    d0,d1
  162. 7$:    move.l    scb_DownObject(pc),a0
  163.     move.w    ig_Width(a0),d0
  164.     cmp.w    d0,d1
  165.     bhs.s    8$
  166.     move.w    d0,d1
  167. 8$:    move.w    d0,scb_gw(a4)
  168.  
  169.     moveq    #1,d0
  170.     bra.s    .done
  171.  
  172. .err2:    move.l    scb_Screen(pc),a0
  173.     move.l    scb_DrawInfo(pc),a1
  174.     jsr    _LVOFreeScreenDrawInfo(a6)
  175. .err1:    moveq    #0,d0
  176.  
  177. .done:    movem.l    (sp)+,d1-a6
  178.     rts
  179.  
  180. ;------------------
  181.     ENDIF
  182.  
  183.  
  184.  
  185. ;------------------------------------------------------------------------------
  186. *
  187. * ResetScrollBars    Free scrollbar resources.
  188. *
  189. ;------------------------------------------------------------------------------
  190.     IFD    xxx_ResetScrollBars
  191. ResetScrollBars:
  192. ;------------------
  193. .start:    movem.l    d0-a6,-(sp)
  194.     move.l    IntBase(pc),a6
  195.  
  196.     move.l    scb_SizeObject(pc),a0
  197.     jsr    _LVODisposeObject(a6)
  198.     move.l    scb_LeftObject(pc),a0
  199.     jsr    _LVODisposeObject(a6)
  200.     move.l    scb_RightObject(pc),a0
  201.     jsr    _LVODisposeObject(a6)
  202.     move.l    scb_UpObject(pc),a0
  203.     jsr    _LVODisposeObject(a6)
  204.     move.l    scb_DownObject(pc),a0
  205.     jsr    _LVODisposeObject(a6)
  206.  
  207.     move.l    scb_Screen(pc),a0
  208.     move.l    scb_DrawInfo(pc),a1
  209.     jsr    _LVOFreeScreenDrawInfo(a6)
  210.  
  211.     movem.l    (sp)+,d0-a6
  212.     rts
  213.  
  214. ;------------------
  215.     ENDIF
  216.  
  217.  
  218.  
  219. ;------------------------------------------------------------------------------
  220. *
  221. * MakeHScrollBar    Generate a horizontal Scrollbar.
  222. *
  223. * INPUT:    a0    GTFScrollBar structure.
  224. *        d0    Gadget ID (gadget IDs d0+1 and d0+2 also used!)
  225. *        d1    GA_Top
  226. *        d2    GA_Total
  227. *        d3    GA_Visible
  228. *
  229. * OUTPUT:    d0    First gadget or 0.
  230. ;------------------------------------------------------------------------------
  231.     IFD    xxx_MakeHScrollBar
  232. MakeHScrollBar:
  233. ;------------------
  234. .start:    movem.l    d1-a6,-(sp)
  235.     CALL_    scb_InitKey
  236.     move.l    d1,.t8+4(a4)
  237.     move.l    d2,.t6+4(a4)
  238.     move.l    d3,.t7+4(a4)
  239.     move.l    d1,sck_LastTop(a0)
  240.     move.l    d3,sck_LastVisible(a0)
  241.  
  242.     moveq    #1,d0
  243.     add.b    scb_rw(pc),d0
  244.     move.b    d0,.t1+7(a4)
  245.  
  246.     moveq    #2,d0
  247.     add.b    scb_bh(pc),d0
  248.     sub.w    scb_gh(pc),d0
  249.     ext.l    d0
  250.     move.l    d0,.t2+4(a4)
  251.  
  252.     moveq    #-1,d0
  253.     sub.b    scb_rw(pc),d0
  254.     sub.b    scb_rw(pc),d0
  255.     sub.w    scb_gw(pc),d0
  256.     move.l    scb_LeftObject(pc),a0
  257.     sub.w    ig_Width(a0),d0    
  258.     move.l    scb_RightObject(pc),a0
  259.     sub.w    ig_Width(a0),d0    
  260.     ext.l    d0
  261.     move.l    d0,.t3+4(a4)
  262.  
  263.     moveq    #-2,d0
  264.     sub.b    scb_bh(pc),d0
  265.     sub.b    scb_bh(pc),d0
  266.     add.w    scb_gh(pc),d0
  267.     ext.l    d0
  268.     move.l    d0,.t4+4(a4)
  269.  
  270.     move.l    d7,.t5+4(a4)
  271.     addq.l    #1,d7
  272.  
  273.     suba.l    a0,a0
  274.     lea    PROPGCLASS,a1
  275.     lea    .hptags(pc),a2
  276.     jsr    _LVONewObjectA(a6)
  277.     move.l    d0,(a3)
  278.     beq    .err1
  279.  
  280.  
  281.     
  282.     move.l    d0,.l4+4(a4)
  283.     move.l    scb_LeftObject(pc),.l1+4(a4)
  284.     move.l    d7,.l5+4(a4)
  285.     addq.l    #1,d7
  286.  
  287.     moveq    #1,d0
  288.     move.l    scb_LeftObject(pc),a0
  289.     sub.w    ig_Width(a0),d0    
  290.     move.l    scb_RightObject(pc),a0
  291.     sub.w    ig_Width(a0),d0    
  292.     sub.w    scb_gw(pc),d0
  293.     ext.l    d0
  294.     move.l    d0,.l2+4(a4)
  295.     
  296.     moveq    #1,d0
  297.     move.l    scb_LeftObject(pc),a0
  298.     sub.w    ig_Height(a0),d0    
  299.     ext.l    d0
  300.     move.l    d0,.l3+4(a4)
  301.  
  302.     suba.l    a0,a0
  303.     lea    BUTTONGCLASS(pc),a1
  304.     lea    .hbtags(pc),a2
  305.     jsr    _LVONewObjectA(a6)
  306.     move.l    d0,4(a3)
  307.     beq.s    .err2
  308.  
  309.         
  310.     
  311.     move.l    d0,.l4+4(a4)
  312.     move.l    scb_RightObject(pc),.l1+4(a4)
  313.     move.l    d7,.l5+4(a4)
  314.  
  315.     moveq    #1,d0
  316.     move.l    scb_RightObject(pc),a0
  317.     sub.w    ig_Width(a0),d0    
  318.     sub.w    scb_gw(pc),d0
  319.     ext.l    d0
  320.     move.l    d0,.l2+4(a4)
  321.     
  322.     moveq    #1,d0
  323.     move.l    scb_RightObject(pc),a0
  324.     sub.w    ig_Height(a0),d0    
  325.     ext.l    d0
  326.     move.l    d0,.l3+4(a4)
  327.  
  328.     suba.l    a0,a0
  329.     lea    BUTTONGCLASS(pc),a1
  330.     lea    .hbtags(pc),a2
  331.     jsr    _LVONewObjectA(a6)
  332.     move.l    d0,8(a3)
  333.     beq.s    .err2
  334.  
  335.     move.l    (a3),d0
  336.     bra.s    .done
  337.         
  338.     
  339.  
  340. .err3:    move.l    4(a3),a0
  341.     jsr    _LVODisposeObject(a6)
  342. .err2:    move.l    (a3),a0
  343.     jsr    _LVODisposeObject(a6)
  344. .err1:    moveq    #0,d0
  345. .done:    movem.l    (sp)+,d1-a6
  346.     rts
  347.  
  348.  
  349.  
  350. .hptags:dc.l    PGA_Freedom,FREEHORIZ
  351. .t1    dc.l    GA_Left,0
  352. .t2    dc.l    GA_RelBottom,0
  353. .t3    dc.l    GA_RelWidth,0
  354. .t4    dc.l    GA_Height,0
  355.     dc.l    GA_BottomBorder,1
  356. .t5    dc.l    GA_ID,0
  357. .t6    dc.l    PGA_Total,10000
  358. .t7    dc.l    PGA_Visible,2500
  359. .t8    dc.l    PGA_Top,5000
  360.     dc.l    TAG_MORE,scb_proptags
  361.  
  362. .hbtags:
  363. .l1:    dc.l    GA_Image,0
  364. .l2:    dc.l    GA_RelRight,0
  365. .l3:    dc.l    GA_RelBottom,0
  366.     dc.l    GA_BottomBorder,1
  367. .l4:    dc.l    GA_Previous,0
  368. .l5:    dc.l    GA_ID,0
  369.         dc.l    ICA_TARGET,ICTARGET_IDCMP
  370.     dc.l    TAG_DONE
  371.  
  372.     
  373. ;------------------
  374.     ENDIF
  375.  
  376.  
  377.  
  378. ;------------------------------------------------------------------------------
  379. *
  380. * MakeVScrollBar    Generate a vertical Scrollbar.
  381. *
  382. * INPUT:    a0    GTFScrollBar structure.
  383. *        d0    Gadget ID (gadget IDs d0+1 and d0+2 also used!)
  384. *        d1    GA_Top
  385. *        d2    GA_Total
  386. *        d3    GA_Visible
  387. *
  388. * OUTPUT:    d0    First gadget or 0.
  389. ;------------------------------------------------------------------------------
  390.     IFD    xxx_MakeVScrollBar
  391. MakeVScrollBar:
  392. ;------------------
  393. .start:    movem.l    d1-a6,-(sp)
  394.     CALL_    scb_InitKey
  395.     move.l    d1,.t8+4(a4)
  396.     move.l    d2,.t6+4(a4)
  397.     move.l    d3,.t7+4(a4)
  398.     move.l    d1,sck_LastTop(a0)
  399.     move.l    d3,sck_LastVisible(a0)
  400.  
  401.     move.l    scb_Screen(pc),a0
  402.     move.b    sc_WBorTop(a0),d4
  403.     ext.w    d4
  404.     move.l    sc_Font(a0),a0
  405.     add.w    ta_YSize(a0),d4
  406.     addq.w    #1,d4
  407.  
  408.  
  409.  
  410.     moveq    #0,d0
  411.     move.b    scb_rh(pc),d0
  412.     add.w    d4,d0
  413.     ext.l    d0
  414.     move.l    d0,.t1+4(a4)
  415.  
  416.     moveq    #3,d0
  417.     add.b    scb_bw(pc),d0
  418.     sub.w    scb_gw(pc),d0
  419.     ext.l    d0
  420.     move.l    d0,.t2+4(a4)
  421.  
  422.     moveq    #0,d0
  423.     sub.b    scb_rh(pc),d0
  424.     sub.b    scb_rh(pc),d0
  425.     ext.w    d0
  426.     move.l    scb_SizeObject(pc),a0
  427.     sub.w    ig_Height(a0),d0    
  428.     move.l    scb_UpObject(pc),a0
  429.     sub.w    ig_Height(a0),d0    
  430.     move.l    scb_DownObject(pc),a0
  431.     sub.w    ig_Height(a0),d0    
  432.     sub.w    d4,d0
  433.     ext.l    d0
  434.     move.l    d0,.t3+4(a4)
  435.  
  436.     moveq    #-4,d0
  437.     sub.b    scb_bw(pc),d0
  438.     sub.b    scb_bw(pc),d0
  439.     add.w    scb_gw(pc),d0
  440.     ext.l    d0
  441.     move.l    d0,.t4+4(a4)
  442.  
  443.     move.l    d7,.t5+4(a4)
  444.     addq.l    #1,d7
  445.  
  446.     suba.l    a0,a0
  447.     lea    PROPGCLASS,a1
  448.     lea    .vptags(pc),a2
  449.     jsr    _LVONewObjectA(a6)
  450.     move.l    d0,(a3)
  451.     beq    .err1
  452.  
  453.  
  454.     
  455.     move.l    d0,.l4+4(a4)
  456.     move.l    scb_UpObject(pc),.l1+4(a4)
  457.     move.l    d7,.l5+4(a4)
  458.     addq.l    #1,d7
  459.  
  460.     moveq    #1,d0
  461.     move.l    scb_UpObject(pc),a0
  462.     sub.w    ig_Width(a0),d0    
  463.     ext.l    d0
  464.     move.l    d0,.l2+4(a4)
  465.     
  466.     moveq    #1,d0
  467.     move.l    scb_UpObject(pc),a0
  468.     sub.w    ig_Height(a0),d0    
  469.     move.l    scb_DownObject(pc),a0
  470.     sub.w    ig_Height(a0),d0    
  471.     move.l    scb_SizeObject(pc),a0
  472.     sub.w    ig_Height(a0),d0    
  473.     ext.l    d0
  474.     move.l    d0,.l3+4(a4)
  475.  
  476.     suba.l    a0,a0
  477.     lea    BUTTONGCLASS(pc),a1
  478.     lea    .vbtags(pc),a2
  479.     jsr    _LVONewObjectA(a6)
  480.     move.l    d0,4(a3)
  481.     beq.s    .err2
  482.  
  483.         
  484.     
  485.     move.l    d0,.l4+4(a4)
  486.     move.l    scb_DownObject(pc),.l1+4(a4)
  487.     move.l    d7,.l5+4(a4)
  488.  
  489.     moveq    #1,d0
  490.     move.l    scb_DownObject(pc),a0
  491.     sub.w    ig_Width(a0),d0    
  492.     ext.l    d0
  493.     move.l    d0,.l2+4(a4)
  494.     
  495.     moveq    #1,d0
  496.     move.l    scb_DownObject(pc),a0
  497.     sub.w    ig_Height(a0),d0    
  498.     move.l    scb_SizeObject(pc),a0
  499.     sub.w    ig_Height(a0),d0    
  500.     ext.l    d0
  501.     move.l    d0,.l3+4(a4)
  502.  
  503.     suba.l    a0,a0
  504.     lea    BUTTONGCLASS(pc),a1
  505.     lea    .vbtags(pc),a2
  506.     jsr    _LVONewObjectA(a6)
  507.     move.l    d0,8(a3)
  508.     beq.s    .err2
  509.  
  510.     move.l    (a3),d0
  511.     bra.s    .done
  512.         
  513.     
  514.  
  515. .err3:    move.l    4(a3),a0
  516.     jsr    _LVODisposeObject(a6)
  517. .err2:    move.l    (a3),a0
  518.     jsr    _LVODisposeObject(a6)
  519. .err1:    moveq    #0,d0
  520. .done:    movem.l    (sp)+,d1-a6
  521.     rts
  522.  
  523.  
  524.  
  525. .vptags:dc.l    PGA_Freedom,FREEVERT
  526. .t1    dc.l    GA_Top,0
  527. .t2    dc.l    GA_RelRight,0
  528. .t3    dc.l    GA_RelHeight,0
  529. .t4    dc.l    GA_Width,0
  530.     dc.l    GA_RightBorder,1
  531. .t5    dc.l    GA_ID,0
  532. .t6    dc.l    PGA_Total,10000
  533. .t7    dc.l    PGA_Visible,2500
  534. .t8    dc.l    PGA_Top,2500
  535.     dc.l    TAG_MORE,scb_proptags
  536.  
  537. .vbtags:
  538. .l1:    dc.l    GA_Image,0
  539. .l2:    dc.l    GA_RelRight,0
  540. .l3:    dc.l    GA_RelBottom,0
  541.     dc.l    GA_RightBorder,1
  542. .l4:    dc.l    GA_Previous,0
  543. .l5:    dc.l    GA_ID,0
  544.         dc.l    ICA_TARGET,ICTARGET_IDCMP
  545.     dc.l    TAG_DONE
  546.  
  547.     
  548. ;------------------
  549.     ENDIF
  550.  
  551.  
  552.     IFD    xxx_scb_InitKey
  553. scb_InitKey:
  554. ;------------------
  555.     lea    scb_base(pc),a4
  556.     move.l    IntBase(pc),a6
  557.     move.l    d0,d7
  558.     move.l    a0,a3
  559.     move.l    d0,sck_ID(a3)
  560.     clr.l    sck_DelayTimeSecs(a3)
  561.     clr.l    sck_DelayTimeMicros(a3)
  562.     clr.w    sck_NewScroll(a3)
  563.     rts
  564.  
  565.  
  566. ;------------------
  567.     ENDIF
  568.  
  569.  
  570.  
  571. ;------------------------------------------------------------------------------
  572. *
  573. * DisposeScrollBar    Free a scrollbar.
  574. *
  575. * INPUT:    a0    GTFScrollBar structure.
  576. ;------------------------------------------------------------------------------
  577.     IFD    xxx_DisposeScrollBar
  578. DisposeScrollBar:
  579. ;------------------
  580. .start:    movem.l    d0-a6,-(sp)
  581.     move.l    a0,a3
  582.     move.l    IntBase(pc),a6
  583.  
  584.     move.l    8(a3),a0
  585.     jsr    _LVODisposeObject(a6)
  586.     move.l    4(a3),a0
  587.     jsr    _LVODisposeObject(a6)
  588.     move.l    (a3),a0
  589.     jsr    _LVODisposeObject(a6)
  590.  
  591.     movem.l    (sp)+,d0-a6
  592.     rts
  593.     
  594. ;------------------
  595.     ENDIF
  596.  
  597.  
  598.  
  599. ;------------------------------------------------------------------------------
  600. *
  601. * HandleScrollBar    Deal with events from a scrollbar. Does repeat
  602. *            delay for arrows.
  603. *
  604. * INPUT:    a0    GTFScrollBar structure.
  605. *        a2    WindowKey.
  606. *
  607. * OUTPUT:    d0    Action to take, SCB_ACTION_*.
  608. *        d1    Absolute value for SCB_ACTION_SLIDE and SCB_ACTION_RELEASE
  609. *            or count for SCB_ACTION_PAGE_*.
  610. ;------------------------------------------------------------------------------
  611.     IFD    xxx_HandleScrollBar
  612. HandleScrollBar:
  613. ;------------------
  614. .start:    movem.l    d2-a6,-(sp)
  615.  
  616.     move.l    a0,a5
  617.     move.l    #GA_ID,d0
  618.     move.l    gfw_msgaddr(a2),a0
  619.     moveq    #0,d1
  620.     move.l    UtilBase(pc),a6
  621.     jsr    _LVOGetTagData(a6)
  622.  
  623.     move.w    gfw_msgqualifier(a2),d3
  624.     sub.l    sck_ID(a5),d0
  625.     beq    .scroll
  626.     subq.l    #1,d0
  627.     beq.s    .left
  628.     subq.l    #1,d0
  629.     beq.s    .right
  630.  
  631. .none:    moveq    #SCB_ACTION_NONE,d4
  632. .done:    move.l    d4,d0
  633.     movem.l    (sp)+,d2-a6
  634.     rts
  635.  
  636.  
  637. .left:    moveq    #SCB_ACTION_LINE_UP,d4
  638.     bra.s    .both
  639.  
  640. .right:    moveq    #SCB_ACTION_LINE_DOWN,d4
  641.  
  642. .both:    tst.b    sck_NewScroll(a5)
  643.     bne.s    .nodel
  644.     move.l    gfw_msgseconds(a2),d0
  645.     move.l    gfw_msgmicros(a2),d1
  646.     add.l    scb_RepDelay+4(pc),d1
  647.     cmp.l    #999999,d1
  648.     bls.s    .nover
  649.     sub.l    #1000000,d1
  650.     addq.l    #1,d0
  651. .nover:    add.l    scb_RepDelay(pc),d0
  652.     move.l    d0,sck_DelayTimeSecs(a5)
  653.     move.l    d1,sck_DelayTimeMicros(a5)
  654.     st.b    sck_NewScroll(a5)
  655.  
  656. .nodel:    tst.w    d3
  657.     bne.s    .nol1
  658.     clr.b    sck_NewScroll(a5)    
  659.     bra.s    .done
  660. .nol1:    move.l    gfw_msgseconds(a2),d0
  661.     cmp.l    sck_DelayTimeSecs(a5),d0
  662.     bhi.s    .done
  663.     blo.s    .none
  664.     move.l    gfw_msgmicros(a2),d0
  665.     cmp.l    sck_DelayTimeMicros(a5),d0
  666.     blo.s    .none
  667.     bra.s    .done
  668.  
  669. .scroll:
  670.     move.l    a5,a0
  671.     CALL_    AskScrollBar
  672.     move.l    d0,d1
  673.     tst.w    d3
  674.     beq.s    .nod2
  675.     st.b    sck_NewSlide(a5)    
  676.     moveq    #SCB_ACTION_SLIDE,d4
  677.     bra    .done
  678.  
  679. .sla:    clr.b    sck_NewSlide(a5)
  680.     moveq    #SCB_ACTION_RELEASE,d4
  681.     bra    .done
  682.  
  683. .nod2:    tst.b    sck_NewSlide(a5)
  684.     bne.s    .sla
  685.     clr.b    sck_NewSlide(a5)
  686.     move.l    sck_LastTop(a5),d0
  687.     move.l    d1,sck_LastTop(a5)
  688.     cmp.l    d0,d1
  689.     beq    .over
  690.     blt.s    .pup
  691.  
  692. .pdown:    moveq    #SCB_ACTION_PAGE_DOWN,d4
  693.     exg    d1,d0
  694.     bra.s    .cntp
  695. .pup:    moveq    #SCB_ACTION_PAGE_UP,d4
  696. .cntp:    sub.l    d1,d0
  697.     move.l    sck_LastVisible(a5),d2
  698.     moveq    #1,d1
  699. .cntpl:    cmp.l    d2,d0
  700.     ble    .done
  701.     sub.l    d2,d0
  702.     addq.l    #1,d1
  703.     bra    .cntpl
  704.  
  705. .over:    moveq    #SCB_ACTION_TOO_FAST,d4
  706.     bra    .done
  707.  
  708.  
  709. ;------------------
  710.     ENDIF
  711.  
  712.  
  713.  
  714. ;------------------------------------------------------------------------------
  715. *
  716. * AskScrollBar    Get scrollbar position.
  717. *
  718. * INPUT:    a0    GTFScrollBar structure.
  719. *
  720. * OUTPUT:    d0    PGA_Top.
  721. ;------------------------------------------------------------------------------
  722.     IFD    xxx_AskScrollBar
  723. AskScrollBar:
  724. ;------------------
  725. .start:    movem.l    d0-a6,-(sp)
  726.     
  727.     move.l    #PGA_Top,d0
  728.     move.l    (a0),a0
  729.     lea    (sp),a1
  730.     move.l    IntBase(pc),a6
  731.     jsr    _LVOGetAttr(a6)
  732.  
  733.     movem.l    (sp)+,d0-a6
  734.     rts
  735.  
  736. ;------------------
  737.     ENDIF
  738.  
  739.  
  740.  
  741. ;------------------------------------------------------------------------------
  742. *
  743. * UpdateScrollBar    Update a scrollbar.
  744. *
  745. * INPUT:    a0    GTFScrollBar structure.
  746. *        a1    Window.
  747. *        d0    GA_Top
  748. *        d1    GA_Total
  749. *        d2    GA_Visible
  750. ;------------------------------------------------------------------------------
  751.     IFD    xxx_UpdateScrollBar
  752. UpdateScrollBar:
  753. ;------------------
  754. .start:    movem.l    d0-a6,-(sp)
  755.     move.l    d0,sck_LastTop(a0)
  756.     move.l    d2,sck_LastVisible(a0)
  757.     move.l    (a0),a0
  758.     move.l    a0,d7
  759.     move.l    a1,d6
  760.  
  761.     lea    .tags,a1
  762.     move.l    d0,4(a1)
  763.     move.l    d1,12(a1)
  764.     move.l    d2,20(a1)
  765.     move.l    IntBase(pc),a6
  766.     jsr    _LVOSetAttrsA(a6)
  767.  
  768.     move.l    d7,a0
  769.     move.l    d6,a1
  770.     suba.l    a2,a2
  771.     moveq    #1,d0
  772.     jsr    _LVORefreshGList(a6)
  773.  
  774.     movem.l    (sp)+,d0-a6
  775.     rts
  776.  
  777. .tags:    dc.l    PGA_Top,0
  778.     dc.l    PGA_Total,0
  779.     dc.l    PGA_Visible,0
  780.     dc.l    TAG_DONE
  781.  
  782. ;------------------
  783.     ENDIF
  784.  
  785.  
  786.  
  787. ;------------------------------------------------------------------------------
  788. *
  789. * Subroutines
  790. *
  791. ;------------------------------------------------------------------------------
  792.  
  793. *
  794. * d0=NewImageObject(which)(d0)
  795. *
  796.     IFD    xxx_NewImageObject
  797. NewImageObject:
  798. ;------------------
  799. .start:    movem.l    d1-a6,-(sp)
  800.     suba.l    a0,a0
  801.     lea    SYSICLASS(pc),a1
  802.     lea    .tags(pc),a2
  803.     move.l    scb_DrawInfo,4(a2)
  804.     move.l    d0,12(a2)
  805.     move.b    scb_SysISize(pc),20+3(a2)
  806.     move.l    IntBase(pc),a6
  807.     jsr    _LVONewObjectA(a6)    
  808.     movem.l    (sp)+,d1-a6
  809.     rts
  810.  
  811. .tags:    dc.l    SYSIA_DrawInfo,0
  812.     dc.l    SYSIA_Which,0
  813.     dc.l    SYSIA_Size,0
  814.     dc.l    TAG_DONE
  815.  
  816. ;------------------
  817.     ENDIF
  818.  
  819.  
  820.     IFD    xxx_CalcHScrollGfx
  821. CalcHScrollGfx:
  822. ;------------------
  823. .start:    movem.l    d0-a6,-(sp)
  824.     
  825.     movem.l    (sp)+,d0-a6
  826.     rts
  827.  
  828. ;------------------
  829.     ENDIF
  830.  
  831.  
  832.  
  833. ;--------------------------------------------------------------------
  834.  
  835. ;------------------
  836. scb_Screen:    dc.l    0
  837. scb_SysISize:    dc.b    0
  838.         dc.b    0
  839. scb_DrawInfo:    dc.l    0
  840.  
  841. scb_SizeObject:    dc.l    0
  842. scb_LeftObject:    dc.l    0
  843. scb_RightObject:dc.l    0
  844. scb_UpObject:    dc.l    0
  845. scb_DownObject:    dc.l    0
  846.  
  847. scb_bw:        dc.b    0    ;\
  848. scb_bh:        dc.b    0    ; |
  849. scb_rw:        dc.b    0    ; |
  850. scb_rh:        dc.b    0    ;/
  851.  
  852. scb_gw:        dc.w    0
  853. scb_gh:        dc.w    0
  854.  
  855. scb_MyPrefs:    dc.l    0
  856.         dc.l    0,0
  857. scb_RepDelay:    dc.l    0,0
  858.  
  859. scb_proptags:    dc.l    PGA_Borderless,0        ;must be first!
  860.         dc.l    ICA_TARGET,ICTARGET_IDCMP
  861.         dc.l    PGA_NewLook,1
  862.         dc.l    TAG_DONE
  863.  
  864. PROPGCLASS:    dc.b    "propgclass",0
  865. BUTTONGCLASS:    dc.b    "buttongclass",0
  866. SYSICLASS:    dc.b    "sysiclass",0
  867.         even
  868.  
  869. ;------------------
  870.  
  871. ;--------------------------------------------------------------------
  872.  
  873. ;------------------
  874.     base    scb_oldbase
  875.  
  876. ;------------------
  877.     endif
  878.     end
  879.  
  880.