home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / gui / IEdit231.lha / IEditor / Expanders / ScrollerWindow.desc < prev    next >
Encoding:
Text File  |  1997-01-18  |  18.7 KB  |  617 lines

  1. ##RENDPRI
  2. -20
  3. ##HEADER
  4.  
  5. #ifndef IM
  6. #define IM(o) ((struct Image *) o)
  7. #endif
  8.  
  9. #ifndef GAD
  10. #define GAD(o) ((struct Gadget *) o)
  11. #endif
  12.  
  13. #ifndef MAX
  14. #define MAX(x,y) ((x) > (y) ? (x) : (y))
  15. #endif
  16.  
  17. #ifndef MIN
  18. #define MIN(x,y) ((x) < (y) ? (x) : (y))
  19. #endif
  20.  
  21. /* DICE specific */
  22. #define HOOK __geta4
  23. #define A0(stuff) __A0 stuff
  24. #define A1(stuff) __A1 stuff
  25. #define A2(stuff) __A2 stuff
  26.  
  27. #define HORIZ_GID       1
  28. #define VERT_GID        2
  29. #define LEFT_GID        3
  30. #define RIGHT_GID       4
  31. #define UP_GID          5
  32. #define DOWN_GID        6
  33.  
  34. extern int SysISize( void );
  35. extern Object *NewImageObject( ULONG );
  36. extern Object *NewPropObject( ULONG, Tag, ... );
  37. extern Object *NewButtonObject( Object *, Tag, ... );
  38. extern void NotifyAttrChanges( Object *, struct GadgetInfo *, ULONG, Tag, ... );
  39. extern ULONG HandleMyButton( struct Gadget *, struct gpInput *, struct ButtonData * );
  40. extern HOOK ULONG DispatchMyButtongClass( A0(Class *), A2(Object *), A1(struct gpInput *));
  41. extern HOOK ULONG DispatchMyPropgClass(A0(Class *), A2(Object *), A1(struct gpLayout *));
  42. extern void UpdateProp( struct Window *, Object *, ULONG, LONG );
  43. extern HOOK ULONG BFHookFunc( void );
  44.  
  45. extern struct Library           *UtilityBase;
  46. extern struct DrawInfo          *dri;
  47. extern Class                    *mypropgclass;
  48. extern Class                    *mybuttongclass;
  49. extern Object                   *SizeImage, *LeftImage, *RightImage;
  50. extern Object                   *UpImage, *DownImage;
  51.  
  52. ##SUPPORT
  53.  
  54. int SysISize( void )
  55. {
  56.         return(( Scr->Flags & SCREENHIRES ) ? SYSISIZE_MEDRES : SYSISIZE_LOWRES );
  57. }
  58.  
  59.  
  60. Object *NewImageObject( ULONG which )
  61. {
  62.         return( NewObject( NULL, SYSICLASS,
  63.                            SYSIA_DrawInfo, dri,
  64.                            SYSIA_Which, which,
  65.                            SYSIA_Size, SysISize(),
  66.                            TAG_DONE ));
  67. }
  68.  
  69. Object *NewPropObject( ULONG freedom, Tag tag1, ... )
  70. {
  71.         return( NewObject( mypropgclass, NULL,
  72.                            ICA_TARGET, ICTARGET_IDCMP,
  73.                            PGA_Freedom, freedom,
  74.                            PGA_NewLook, TRUE,
  75.                            PGA_Borderless, (( dri->dri_Flags & DRIF_NEWLOOK ) && ( dri->dri_Depth != 1 )),
  76.                            TAG_MORE, &tag1 ));
  77. }
  78.  
  79. Object *NewButtonObject( Object *image, Tag tag1, ... )
  80. {
  81.         return( NewObject( mybuttongclass, NULL,
  82.                            ICA_TARGET, ICTARGET_IDCMP,
  83.                            GA_Image, image,
  84.                            TAG_MORE, &tag1 ));
  85. }
  86.  
  87. struct ButtonData
  88. {
  89.         ULONG   TickCounter;
  90. };
  91.  
  92. struct PropData
  93. {
  94.         LONG   *Visible;
  95. };
  96.  
  97. void NotifyAttrChanges( Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ... )
  98. {
  99.         DoMethod( o, OM_NOTIFY, &attr1, gi, flags );
  100. }
  101.  
  102. ULONG HandleMyButton( struct Gadget *gad, struct gpInput *gpi, struct ButtonData *bd )
  103. {
  104.         UWORD            selected = 0;
  105.         struct RastPort *rp;
  106.         ULONG            retval = GMR_MEACTIVE;
  107.  
  108.         if (PointInImage((gpi->gpi_Mouse.X << 16) + (gpi->gpi_Mouse.Y), gad->GadgetRender))
  109.         {
  110.                 selected = GFLG_SELECTED;
  111.         }
  112.         if (gpi->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE && gpi->gpi_IEvent->ie_Code == SELECTUP)
  113.         {
  114.                 retval = GMR_NOREUSE;
  115.                 selected = 0;
  116.         }
  117.         if (gpi->gpi_IEvent->ie_Class == IECLASS_TIMER)
  118.         {
  119.                 if (selected && !(--bd->TickCounter))
  120.                 {
  121.                         bd->TickCounter = 1;
  122.                         NotifyAttrChanges( (Object *) gad, gpi->gpi_GInfo, 0,
  123.                                            GA_ID, gad->GadgetID,
  124.                                            TAG_DONE);
  125.                 }
  126.         }
  127.         if ((gad->Flags & GFLG_SELECTED) != selected)
  128.         {
  129.                 gad->Flags ^= GFLG_SELECTED;
  130.                 if (rp = ObtainGIRPort(gpi->gpi_GInfo))
  131.                 {
  132.                         DoMethod((Object *) gad, GM_RENDER, gpi->gpi_GInfo, rp, GREDRAW_UPDATE);
  133.                         ReleaseGIRPort(rp);
  134.                 }
  135.         }
  136.         return (retval);
  137. }
  138.  
  139. HOOK ULONG DispatchMyButtongClass( A0(Class *cl), A2(Object *o), A1(struct gpInput *gpi))
  140. {
  141.         struct ButtonData *bd = (struct ButtonData *) INST_DATA(cl, o);
  142.  
  143.         switch (gpi->MethodID)
  144.         {
  145.         case GM_GOACTIVE:
  146.                 bd->TickCounter = 2;
  147.                 NotifyAttrChanges( o, gpi->gpi_GInfo, 0,
  148.                                    GA_ID, GAD(o)->GadgetID,
  149.                                    TAG_DONE );
  150.                 return (GMR_MEACTIVE);
  151.         case GM_HANDLEINPUT:
  152.                 return (HandleMyButton(GAD(o), gpi, bd));
  153.         default:
  154.                 return( DoSuperMethodA( cl, o, ( Msg ) gpi ));
  155.         }
  156. }
  157.  
  158.  
  159. #define RecalcHVisible(window) (window->GZZWidth)
  160. #define RecalcVVisible(window) (window->GZZHeight)
  161.  
  162. HOOK ULONG DispatchMyPropgClass(A0(Class *cl), A2(Object *o), A1(struct gpLayout *gpl))
  163. {
  164.         if (gpl->MethodID == GM_LAYOUT)
  165.         {
  166.                 struct Window      *win = gpl->gpl_GInfo->gi_Window;
  167.                 struct PropInfo    *pi = (struct PropInfo *)GAD(o)->SpecialInfo;
  168.                 LONG                visible;
  169.                 struct PropData    *pd = (struct PropData *)INST_DATA( cl, o );
  170.  
  171.                 if (pi->Flags & FREEHORIZ)
  172.                 {
  173.                         visible = RecalcHVisible( win );
  174.                 }
  175.                 else
  176.                 {
  177.                         visible = RecalcVVisible( win );
  178.                 }
  179.  
  180.                 *pd->Visible = visible;
  181.  
  182.                 SetAttrs( o, PGA_Visible, visible, TAG_DONE );
  183.         }
  184.  
  185.         return ( DoSuperMethodA( cl, o, (Msg) gpl ));
  186. }
  187.  
  188. void UpdateProp( struct Window *window, Object *gadget, ULONG attr, LONG value)
  189. {
  190.         if (SetAttrs(gadget, attr, value, TAG_DONE))
  191.         {
  192.                 struct PropInfo *pi = (struct PropInfo *) (GAD(gadget))->SpecialInfo;
  193.                 NewModifyProp(GAD(gadget), window, NULL, pi->Flags, pi->HorizPot, pi->VertPot, pi->HorizBody, pi->VertBody, 1);
  194.         }
  195. }
  196.  
  197.  
  198. HOOK ULONG BFHookFunc( void )
  199. {
  200.         return (1);
  201. }
  202.  
  203. static struct Hook BFHook =
  204. {
  205.         NULL, NULL,
  206.         BFHookFunc,
  207. };
  208.  
  209. #define QUAL_SHIFT      (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  210. #define QUAL_ALT        (IEQUALIFIER_LALT | IEQUALIFIER_RALT)
  211. #define QUAL_CTRL       (IEQUALIFIER_CONTROL)
  212.  
  213. ##SETUP
  214.  
  215.         if(!( dri = GetScreenDrawInfo( Scr )))
  216.             return( 3L );
  217.  
  218.         SizeImage   = NewImageObject( SIZEIMAGE  );
  219.         LeftImage   = NewImageObject( LEFTIMAGE  );
  220.         RightImage  = NewImageObject( RIGHTIMAGE );
  221.         UpImage     = NewImageObject( UPIMAGE    );
  222.         DownImage   = NewImageObject( DOWNIMAGE  );
  223.  
  224.         if(!( SizeImage && LeftImage && RightImage && UpImage && DownImage ))
  225.             return( 4L );
  226.  
  227.         if(!( mypropgclass = MakeClass( NULL, PROPGCLASS, NULL, sizeof( struct PropData ), 0 )))
  228.             return( 5L );
  229.  
  230.         mypropgclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyPropgClass;
  231.  
  232.         if(!( mybuttongclass = MakeClass( NULL, BUTTONGCLASS, NULL, sizeof( struct ButtonData ), 0 )))
  233.             return( 5L );
  234.  
  235.         mybuttongclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyButtongClass;
  236.  
  237. ##CLOSEDOWN
  238.  
  239.         DisposeObject( SizeImage );
  240.         DisposeObject( LeftImage );
  241.         DisposeObject( RightImage );
  242.         DisposeObject( UpImage );
  243.         DisposeObject( DownImage );
  244.  
  245.         FreeScreenDrawInfo( Scr, dri );
  246.  
  247.         if( mybuttongclass )
  248.                 FreeClass( mybuttongclass );
  249.  
  250.         if( mypropgclass )
  251.                 FreeClass( mypropgclass );
  252.  
  253. ##INCLUDE
  254. #ifndef EXEC_EXECBASE_H
  255. #include <exec/execbase.h>
  256. #endif
  257. #ifndef EXEC_LIBRARIES_H
  258. #include <exec/libraries.h>
  259. #endif
  260. #ifndef INTUITION_ICCLASS_H
  261. #include <intuition/icclass.h>
  262. #endif
  263. #ifndef INTUITION_CLASSUSR_H
  264. #include <intuition/classusr.h>
  265. #endif
  266. #ifndef INTUITION_IMAGECLASS_H
  267. #include <intuition/imageclass.h>
  268. #endif
  269. #ifndef CLIB_ALIB_PROTOS_H
  270. #include <clib/alib_protos.h>
  271. #endif
  272. #ifndef CLIB_UTILITY_PROTOS_H
  273. #include <clib/utility_protos.h>
  274. #endif
  275. #ifdef PRAGMAS
  276.   #ifndef PRAGMAS_UTILITY_PRAGMAS
  277.   #include <pragmas/utility_pragmas.h>
  278.   #endif
  279. #endif
  280.  
  281.  
  282. ##GLOBAL
  283. struct DrawInfo         *dri;
  284. Class                   *mypropgclass;
  285. Class                   *mybuttongclass;
  286. Object                  *SizeImage, *LeftImage, *RightImage;
  287. Object                  *UpImage, *DownImage;
  288.  
  289. ##DATA
  290. struct BitMap           *%wBitMap;
  291.  
  292. BOOL                    %wFrozen = FALSE;
  293. Object                  *%wHorizGadget, *%wVertGadget;
  294. Object                  *%wLeftGadget, *%wRightGadget;
  295. Object                  *%wUpGadget, *%wDownGadget;
  296.  
  297. LONG                    %wHTotal, %wVTotal;
  298. LONG                    %wHVisible, %wVVisible;
  299.  
  300. ##OPENWND
  301.  
  302. LONG Open%wWindow( void )
  303. {
  304.         int resolution = SysISize();
  305.         WORD topborder = YOffset + 1;
  306.         WORD w = IM( SizeImage )->Width;
  307.         WORD h = IM( SizeImage )->Height;
  308.         WORD bw = ( resolution == SYSISIZE_LOWRES ) ? 1 : 2;
  309.         WORD bh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  310.         WORD rw = ( resolution == SYSISIZE_HIRES  ) ? 3 : 2;
  311.         WORD rh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  312.         WORD gw, gh;
  313.         struct PropData *pd;
  314.  
  315.         gh = MAX( IM( LeftImage  )->Height, h  );
  316.         gh = MAX( IM( RightImage )->Height, gh );
  317.         gw = MAX( IM( UpImage    )->Width,  w  );
  318.         gw = MAX( IM( DownImage  )->Width,  gw );
  319.  
  320.         if(!( %wHorizGadget = NewPropObject( FREEHORIZ,
  321.                               GA_Left, rw + 1,
  322.                               GA_RelBottom, bh - gh + 2,
  323.                               GA_RelWidth, -gw - 1 - IM( LeftImage )->Width - IM( RightImage )->Width - rw - rw,
  324.                               GA_Height, gh - bh - bh - 2,
  325.                               GA_BottomBorder, TRUE,
  326.                               GA_ID, HORIZ_GID,
  327.                               PGA_Total, %wHTotal,
  328.                               PGA_Visible, %wHVisible,
  329.                               TAG_DONE )))
  330.             return( 2L );
  331.  
  332.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wHorizGadget );
  333.         pd->Visible = &%wHVisible;
  334.  
  335.         if(!( %wVertGadget = NewPropObject( FREEVERT,
  336.                              GA_RelRight, bw - gw + 3,
  337.                              GA_Top, topborder + rh,
  338.                              GA_Width, gw - bw - bw - 4,
  339.                              GA_RelHeight, -topborder - h - IM( UpImage )->Height - IM( DownImage )->Height - rh - rh,
  340.                              GA_RightBorder, TRUE,
  341.                              GA_Previous, %wHorizGadget,
  342.                              GA_ID, VERT_GID,
  343.                              PGA_Total, %wVTotal,
  344.                              PGA_Visible, %wVVisible,
  345.                              TAG_DONE )))
  346.             return( 2L );
  347.  
  348.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wVertGadget );
  349.         pd->Visible = &%wVVisible;
  350.  
  351.         if(!( %wLeftGadget = NewButtonObject( LeftImage,
  352.                              GA_RelRight, 1 - IM( LeftImage )->Width - IM( RightImage )->Width - gw,
  353.                              GA_RelBottom, 1 - IM( LeftImage )->Height,
  354.                              GA_BottomBorder, TRUE,
  355.                              GA_Previous, %wVertGadget,
  356.                              GA_ID, LEFT_GID,
  357.                              TAG_DONE )))
  358.             return( 2L );
  359.  
  360.         if(!( %wRightGadget = NewButtonObject( RightImage,
  361.                               GA_RelRight, 1 - IM( RightImage )->Width - gw,
  362.                               GA_RelBottom, 1 - IM( RightImage )->Height,
  363.                               GA_BottomBorder, TRUE,
  364.                               GA_Previous, %wLeftGadget,
  365.                               GA_ID, RIGHT_GID,
  366.                               TAG_DONE )))
  367.             return( 2L );
  368.  
  369.         if(!( %wUpGadget = NewButtonObject( UpImage,
  370.                            GA_RelRight, 1 - IM( UpImage )->Width,
  371.                            GA_RelBottom, 1 - IM( UpImage )->Height - IM( DownImage )->Height - h,
  372.                            GA_RightBorder, TRUE,
  373.                            GA_Previous, %wRightGadget,
  374.                            GA_ID, UP_GID,
  375.                            TAG_DONE )))
  376.             return( 2L );
  377.  
  378.         if(!( %wDownGadget = NewButtonObject( DownImage,
  379.                              GA_RelRight, 1 - IM( DownImage )->Width,
  380.                              GA_RelBottom, 1 - IM( DownImage )->Height - h,
  381.                              GA_RightBorder, TRUE,
  382.                              GA_Previous, %wUpGadget,
  383.                              GA_ID, DOWN_GID,
  384.                              TAG_DONE )))
  385.             return( 2L );
  386.  
  387. ##OPENWND-LOCALE
  388.  
  389.         if(!( Localized[ %n ] )) {
  390.  
  391.             %wWTags[ 9 ].ti_Data = (ULONG)CatCompArray[ %wWTags[ 9 ].ti_Data ].cca_Str;
  392.  
  393. ##OPENWND-LOCALE-MENUS
  394.  
  395.             LocalizeMenus( &%wNewMenu[0] );
  396.  
  397. ##OPENWND-LOCALE-2
  398.  
  399.             Localized[ %n ] = TRUE;
  400.         }
  401.  
  402. ##OPENWND-MENUS
  403.  
  404.         if(!( %wMenus = CreateMenus( %wNewMenu, TAG_END )))
  405.                 return( 5L );
  406.  
  407.         LayoutMenus( %wMenus, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_END );
  408.  
  409. ##OPENWND-2
  410.  
  411.         %wWTags[4].ti_Data = MAX( 80, gw + 1 + IM(LeftImage)->Width + IM(RightImage)->Width + rw + rw + KNOBHMIN );
  412.         %wWTags[6].ti_Data = MAX(50, topborder + h + IM(UpImage)->Height + IM(DownImage)->Height + rh + rh + KNOBVMIN);
  413.         %wWTags[8].ti_Data = Scr;
  414.  
  415.         if(!( %wWnd = OpenWindowTags( NULL,
  416.                                       WA_Gadgets, %wHorizGadget,
  417.                                       WA_BackFill, &BFHook,
  418.                                       TAG_MORE, %wWTags )))
  419.             return( 4L );
  420.  
  421. ##OPENWND-MENUS-2
  422.  
  423.         SetMenuStrip( %wWnd, %wMenus );
  424.  
  425. ##OPENWND-END
  426.  
  427.         Update%wSWindow();
  428.  
  429.         return( 0L );
  430. }
  431.  
  432. void Update%wBitMap( void )
  433. {
  434.         ULONG srcx, srcy;
  435.  
  436.         if (!%wFrozen) {
  437.                 GetAttr(PGA_Top, %wHorizGadget, &srcx);
  438.                 GetAttr(PGA_Top, %wVertGadget, &srcy);
  439.                 BltBitMapRastPort( %wBitMap, srcx, srcy, %wWnd->RPort, %wWnd->BorderLeft, %wWnd->BorderTop, MIN( %wHTotal, %wHVisible ), MIN( %wVTotal, %wVVisible), 0xC0 );
  440.         }
  441. }
  442.  
  443. void Update%wSWindow( void )
  444. {
  445.         if( SysBase->LibNode.lib_Version < 39 ) {
  446.                 %wHVisible = RecalcHVisible( %wWnd );
  447.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Visible, %wHVisible );
  448.                 %wVVisible = RecalcVVisible( %wWnd );
  449.                 UpdateProp( %wWnd, %wVertGadget, PGA_Visible, %wVVisible );
  450.         }
  451.  
  452.         if (!%wFrozen) {
  453.             SetAPen( %wWnd->RPort, 0 );
  454.             RectFill( %wWnd->RPort,
  455.                       %wWnd->BorderLeft + 1, %wWnd->BorderTop + 1,
  456.                       %wWnd->Width - %wWnd->BorderRight - 1,
  457.                       %wWnd->Height - %wWnd->BorderBottom - 1 );
  458.         }
  459.  
  460.         Update%wBitMap();
  461. }
  462.  
  463. void %wScrollerLeft(LONG amount)
  464. {
  465.         LONG oldtop;
  466.  
  467.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  468.         if (oldtop > 0)
  469.         {
  470.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MAX(0, oldtop - amount));
  471.                 Update%wBitMap();
  472.         }
  473. }
  474.  
  475. void %wScrollerRight(LONG amount)
  476. {
  477.         LONG oldtop;
  478.  
  479.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  480.         if (oldtop < %wHTotal - %wHVisible)
  481.         {
  482.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MIN( %wHTotal - %wHVisible, oldtop + amount));
  483.                 Update%wBitMap();
  484.         }
  485. }
  486.  
  487. void %wScrollerUp(LONG amount)
  488. {
  489.         LONG oldtop;
  490.  
  491.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  492.         if (oldtop > 0)
  493.         {
  494.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MAX(0, oldtop - amount));
  495.                 Update%wBitMap();
  496.         }
  497. }
  498.  
  499. void %wScrollerDown(LONG amount)
  500. {
  501.         LONG oldtop;
  502.  
  503.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  504.         if (oldtop < %wVTotal - %wVVisible)
  505.         {
  506.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MIN( %wVTotal - %wVVisible, oldtop + amount));
  507.                 Update%wBitMap();
  508.         }
  509. }
  510.  
  511. BOOL %wRawKey( void )
  512. {
  513.         switch( %wMsg.Code )
  514.         {
  515.         case CURSORLEFT:
  516.                 if( %wMsg.Qualifier & QUAL_CTRL ) %wScrollerLeft( %wHTotal );
  517.                 else if( %wMsg.Qualifier & QUAL_SHIFT) %wScrollerLeft( %wHVisible - 1 );
  518.                 else if( %wMsg.Qualifier & QUAL_ALT) %wScrollerLeft( 16 );
  519.                 else %wScrollerLeft( 1 );
  520.                 break;
  521.         case CURSORRIGHT:
  522.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerRight( %wHTotal);
  523.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerRight( %wHVisible - 1);
  524.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerRight( 16 );
  525.                 else %wScrollerRight( 1 );
  526.                 break;
  527.         case CURSORUP:
  528.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerUp( %wVTotal );
  529.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerUp( %wVVisible - 1 );
  530.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerUp( 16 );
  531.                 else %wScrollerUp( 1 );
  532.                 break;
  533.         case CURSORDOWN:
  534.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerDown( %wVTotal);
  535.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerDown( %wVVisible - 1);
  536.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerDown( 16 );
  537.                 else %wScrollerDown( 1 );
  538.                 break;
  539.         }
  540.  
  541.         return( TRUE );
  542. }
  543.  
  544. BOOL %wIDCMPUpdate( void )
  545. {
  546.         struct TagItem *attrs = (struct TagItem *)%wMsg.IAddress;
  547.  
  548.         switch (GetTagData(GA_ID, 0, attrs))
  549.         {
  550.         case HORIZ_GID:
  551.         case VERT_GID:
  552.                 Update%wBitMap();
  553.                 break;
  554.         case LEFT_GID:
  555.                 %wScrollerLeft( 1 );
  556.                 break;
  557.         case RIGHT_GID:
  558.                 %wScrollerRight( 1 );
  559.                 break;
  560.         case UP_GID:
  561.                 %wScrollerUp( 1 );
  562.                 break;
  563.         case DOWN_GID:
  564.                 %wScrollerDown( 1 );
  565.                 break;
  566.         }
  567.  
  568.         return( TRUE );
  569. }
  570.  
  571. BOOL %wSizeVerify( void )
  572. {
  573.         %wFrozen = TRUE;
  574.         return( TRUE );
  575. }
  576.  
  577. BOOL %wNewSize( void )
  578. {
  579.         %wFrozen = FALSE;
  580.         Update%wSWindow();
  581.         return( TRUE );
  582. }
  583.  
  584.  
  585. ##CLOSEWND
  586.  
  587.         DisposeObject( %wHorizGadget );
  588.         DisposeObject( %wVertGadget );
  589.         DisposeObject( %wLeftGadget );
  590.         DisposeObject( %wRightGadget );
  591.         DisposeObject( %wUpGadget );
  592.         DisposeObject( %wDownGadget );
  593.  
  594.         %wHorizGadget = NULL;
  595.         %wVertGadget  = NULL;
  596.         %wLeftGadget  = NULL;
  597.         %wRightGadget = NULL;
  598.         %wUpGadget    = NULL;
  599.         %wDownGadget  = NULL;
  600.  
  601. ##EXTERN
  602. extern struct BitMap *%wBitMap;
  603. extern LONG %wHTotal, %wVTotal, %wHVisible, %wVVisible;
  604. extern Object *%wHorizGadget, *%wVertGadget;
  605. extern void Update%wBitMap( void );
  606. extern void Update%wSWindow( void );
  607. extern void %wScrollerLeft( LONG );
  608. extern void %wScrollerRight( LONG );
  609. extern void %wScrollerUp( LONG );
  610. extern void %wScrollerDown( LONG );
  611.  
  612. ##RENDER
  613.  
  614.         Update%wBitMap();
  615.  
  616. ##end
  617.