home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / misc / vcb.lha / vcb / vcxclass.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-15  |  9.7 KB  |  371 lines

  1. #include <intuition/intuition.h>
  2. #include <intuition/cghooks.h>
  3. #include <intuition/classes.h>
  4. #include <intuition/classusr.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <intuition/icclass.h>
  7. #include <intuition/imageclass.h>
  8. #include <libraries/gadtools.h>
  9. #include <functions.h>
  10. #include "vcx_private.h"
  11.  
  12. /***************************** private section **************************/
  13.  
  14. static int create_sub_gadgets( Class *class, Object *object,
  15.     struct DrawInfo *drawinfo, ULONG imagesize )
  16. {
  17.     struct VCX *vcx = INST_DATA( class, object );
  18.     struct Gadget *gadget = (struct Gadget *)object;
  19.     int success = 0;
  20.  
  21.     if( !drawinfo )
  22.         goto terminate;
  23.     vcx->more_image = NewObject( NULL, "sysiclass",
  24.         SYSIA_Which, ( vcx->freedom == FREEHORIZ ) ? RIGHTIMAGE : DOWNIMAGE,
  25.         SYSIA_DrawInfo, drawinfo,
  26.         SYSIA_Size, imagesize,
  27.         TAG_DONE );
  28.     if( !vcx->more_image )
  29.         goto terminate;
  30.     vcx->more = NewObject( NULL, "buttongclass",
  31.         GA_Image, (ULONG)vcx->more_image,
  32.         GA_ID, MORE_ID,
  33.         ( vcx->freedom == FREEHORIZ ) ?
  34.         (
  35.             ( ( gadget->Flags & GFLG_RELRIGHT ) || ( gadget->Flags & GFLG_RELWIDTH ) ) ?
  36.                 GA_RelRight
  37.             :
  38.                 GA_Left
  39.         )
  40.         :
  41.         (
  42.             ( gadget->Flags & GFLG_RELRIGHT ) ?
  43.                 GA_RelRight
  44.             :
  45.                 GA_Left
  46.         ),
  47.         ( vcx->freedom == FREEHORIZ ) ?
  48.             gadget->LeftEdge + gadget->Width - ((struct Image *)vcx->more_image)->Width
  49.         :
  50.             gadget->LeftEdge,
  51.         ( vcx->freedom == FREEVERT ) ?
  52.         (
  53.             ( ( gadget->Flags & GFLG_RELBOTTOM ) || ( gadget->Flags & GFLG_RELHEIGHT ) ) ?
  54.                 GA_RelBottom
  55.             :
  56.                 GA_Top
  57.         )
  58.         :
  59.         (
  60.             ( gadget->Flags & GFLG_RELBOTTOM ) ?
  61.                 GA_RelBottom
  62.             :
  63.                 GA_Top
  64.         ),
  65.         ( vcx->freedom == FREEVERT ) ?
  66.             gadget->TopEdge + gadget->Height - ((struct Image *)vcx->more_image)->Height
  67.         :
  68.             gadget->TopEdge,
  69.         GA_Previous, (ULONG)gadget,
  70.         ICA_TARGET, (ULONG)object,
  71.         TAG_DONE );
  72.     if( !vcx->more )
  73.         goto terminate;
  74.     vcx->less_image = NewObject( NULL, "sysiclass",
  75.         SYSIA_Which, ( vcx->freedom == FREEHORIZ ) ? LEFTIMAGE : UPIMAGE,
  76.         SYSIA_DrawInfo, drawinfo,
  77.         SYSIA_Size, imagesize,
  78.         TAG_DONE );
  79.     if( !vcx->less_image )
  80.         goto terminate;
  81.     vcx->less = NewObject( NULL, "buttongclass",
  82.         GA_Image, (ULONG)vcx->less_image,
  83.         GA_ID, LESS_ID,
  84.         ( vcx->freedom == FREEHORIZ ) ?
  85.         (
  86.             ( ( gadget->Flags & GFLG_RELRIGHT ) || ( gadget->Flags & GFLG_RELWIDTH ) ) ?
  87.                 GA_RelRight
  88.             :
  89.                 GA_Left
  90.         )
  91.         :
  92.         (
  93.             ( gadget->Flags & GFLG_RELRIGHT ) ?
  94.                 GA_RelRight
  95.             :
  96.                 GA_Left
  97.         ),
  98.         ( vcx->freedom == FREEHORIZ ) ?
  99.             gadget->LeftEdge + gadget->Width -
  100.             ((struct Gadget *)vcx->more)->Width -
  101.             ((struct Image *)vcx->less_image)->Width
  102.         :
  103.             gadget->LeftEdge,
  104.         ( vcx->freedom == FREEVERT ) ?
  105.         (
  106.             ( ( gadget->Flags & GFLG_RELBOTTOM ) || ( gadget->Flags & GFLG_RELHEIGHT ) ) ?
  107.                 GA_RelBottom
  108.             :
  109.                 GA_Top
  110.         )
  111.         :
  112.         (
  113.             ( gadget->Flags & GFLG_RELBOTTOM ) ?
  114.                 GA_RelBottom
  115.             :
  116.                 GA_Top
  117.         ),
  118.         ( vcx->freedom == FREEVERT ) ?
  119.             gadget->TopEdge + gadget->Height -
  120.             ((struct Gadget *)vcx->more)->Height -
  121.             ((struct Image *)vcx->less_image)->Height
  122.         :
  123.             gadget->TopEdge,
  124.         GA_Previous, (ULONG)vcx->more,
  125.         ICA_TARGET, (ULONG)object,
  126.         TAG_DONE );
  127.     if( !vcx->less )
  128.         goto terminate;
  129.     vcx->prop = NewObject( NULL, "propgclass",
  130.         PGA_Freedom, vcx->freedom,
  131.         ( gadget->Flags & GFLG_RELRIGHT ) ? GA_RelRight : GA_Left,
  132.         gadget->LeftEdge + ( ( vcx->freedom == FREEHORIZ ) ? 1 : 4 ),
  133.         ( gadget->Flags & GFLG_RELBOTTOM ) ? GA_RelBottom : GA_Top,
  134.         gadget->TopEdge + ( ( vcx->freedom == FREEHORIZ ) ? 2 : 1 ),
  135.         ( vcx->freedom == FREEHORIZ ) ?
  136.         (
  137.             ( gadget->Flags & GFLG_RELWIDTH ) ?
  138.                 GA_RelWidth
  139.             :
  140.                 GA_Width
  141.         )
  142.         :
  143.             GA_Width,
  144.         ( vcx->freedom == FREEHORIZ ) ?
  145.             gadget->Width -
  146.             ((struct Gadget *)vcx->more)->Width -
  147.             ((struct Gadget *)vcx->less)->Width - 4
  148.         :
  149.             ((struct Gadget *)vcx->less)->Width - 8,
  150.         ( vcx->freedom == FREEVERT ) ?
  151.         (
  152.             ( gadget->Flags & GFLG_RELHEIGHT ) ?
  153.                 GA_RelHeight
  154.             :
  155.                 GA_Height
  156.         )
  157.         :
  158.             GA_Height,
  159.         ( vcx->freedom == FREEVERT ) ?
  160.             gadget->Height -
  161.             ((struct Gadget *)vcx->more)->Height -
  162.             ((struct Gadget *)vcx->less)->Height - 3
  163.         :
  164.             ((struct Gadget *)vcx->less)->Height - 4,
  165.         GA_Previous, (ULONG)vcx->less,
  166.         PGA_Total, vcx->total,
  167.         PGA_Top, vcx->top,
  168.         PGA_Visible, vcx->visible,
  169.         PGA_NewLook, 1,
  170.         ICA_TARGET, (ULONG)object,
  171.         TAG_DONE );
  172.     if( !vcx->prop )
  173.         goto terminate;
  174.     success = 1;
  175. terminate:
  176.     return success;
  177. }
  178.  
  179. static void delete_sub_gadgets( struct VCX *vcx )
  180. {
  181.     if( vcx->prop )
  182.         DisposeObject( vcx->prop );
  183.     if( vcx->less )
  184.         DisposeObject( vcx->less );
  185.     if( vcx->less_image )
  186.         DisposeObject( vcx->less_image );
  187.     if( vcx->more )
  188.         DisposeObject( vcx->more );
  189.     if( vcx->more_image )
  190.         DisposeObject( vcx->more_image );
  191. }
  192.  
  193. static ULONG newVCX( Class *class, Object *object, struct opSet *ops )
  194. {
  195.     APTR new;
  196.     struct VCX *vcx;
  197.     struct DrawInfo *drawinfo;
  198.     ULONG imagesize;
  199.  
  200.     if( new = (APTR)DoSuperMethodA( class, object, (Msg)ops ) )
  201.     {
  202.         struct Gadget *gadget = (struct Gadget *)new;
  203.         vcx = INST_DATA( class, new );
  204.         vcx->target = (APTR)GetTagData( ICA_TARGET, 0, ops->ops_AttrList );
  205.         vcx->total = GetTagData( PGA_Total, 2, ops->ops_AttrList );
  206.         vcx->top = GetTagData( PGA_Top, 0, ops->ops_AttrList );
  207.         vcx->visible = GetTagData( PGA_Visible, 0, ops->ops_AttrList );
  208.         vcx->freedom = GetTagData( PGA_Freedom, FREEVERT, ops->ops_AttrList );
  209.         drawinfo = (struct DrawInfo *)GetTagData( SYSIA_DrawInfo, 0, ops->ops_AttrList );
  210.         imagesize = GetTagData( SYSIA_Size, SYSISIZE_MEDRES, ops->ops_AttrList );
  211.         if( create_sub_gadgets( class, new, drawinfo, imagesize ) )
  212.         {
  213.             if( vcx->freedom == FREEHORIZ )
  214.                 gadget->Height = ((struct Gadget *)vcx->prop)->Height;
  215.             else
  216.                 gadget->Width = ((struct Gadget *)vcx->prop)->Width;
  217.             return (ULONG)new;
  218.         }
  219.         delete_sub_gadgets( vcx );
  220.         DoSuperMethod( class, object, OM_DISPOSE );
  221.     }
  222.     return 0;
  223. }
  224.  
  225. static ULONG disposeVCX( Class *class, Object *object, Msg msg )
  226. {
  227.     struct VCX *vcx = INST_DATA( class, object );
  228.  
  229.     delete_sub_gadgets( vcx );
  230.     DoSuperMethodA( class, object, msg );
  231. }
  232.  
  233. static ULONG setVCX( Class *class, Object *object, struct opSet *ops )
  234. {
  235.     struct VCX *vcx = INST_DATA( class, object );
  236. #ifdef DEBUG
  237.     kprintf( "setVCX : GadgetInfo %08lx, window %08lx, req %08lx\n",
  238.         ops->ops_GInfo, ops->ops_GInfo->gi_Window, ops->ops_GInfo->gi_Requester );
  239. #endif
  240.     DoSuperMethodA( class, object, (Msg)ops );
  241.     vcx->total = GetTagData( PGA_Total, vcx->total, ops->ops_AttrList );
  242.     vcx->top = GetTagData( PGA_Top, vcx->top, ops->ops_AttrList );
  243.     vcx->visible = GetTagData( PGA_Visible, vcx->visible, ops->ops_AttrList );
  244. #ifdef DEBUG
  245.     kprintf( "setVCX : new total %ld top %ld visible %ld\n",
  246.         vcx->total, vcx->top, vcx->visible );
  247. #endif
  248.     return SetGadgetAttrs( (struct Gadget *)vcx->prop,
  249.         ops->ops_GInfo->gi_Window, ops->ops_GInfo->gi_Requester,
  250.         PGA_Total, vcx->total,
  251.         PGA_Top, vcx->top,
  252.         PGA_Visible, vcx->visible,
  253.         TAG_DONE );
  254. }
  255.  
  256. static void update_target( Class *class, Object *object, struct GadgetInfo *gi, ULONG flags )
  257. {
  258.     struct Gadget *gadget = (struct Gadget *)object;
  259.     struct VCX *vcx = INST_DATA( class, object );
  260.     static struct TagItem attr_list[] = { { GA_ID }, { PGA_Top }, { TAG_DONE } };
  261.  
  262.     if( vcx->target )
  263.     {
  264.         attr_list[0].ti_Data = gadget->GadgetID;
  265.         attr_list[1].ti_Data = vcx->top;
  266.         DoMethod( vcx->target, OM_UPDATE, attr_list, gi, flags );
  267.     }
  268. }
  269.  
  270. static ULONG updateVCX( Class *class, Object *object, struct opUpdate *opu )
  271. {
  272.     struct VCX *vcx = INST_DATA( class, object );
  273.     struct TagItem *ti, *tstate = opu->opu_AttrList;
  274.  
  275.     /* DoSuperMethodA( class, object, (Msg)opu );    we overload this completely */
  276.     while( ti = NextTagItem( &tstate ) )
  277.     {
  278.         switch( ti->ti_Tag )
  279.         {
  280.         case GA_ID:
  281.             switch( ti->ti_Data )
  282.             {
  283.             case LESS_ID:
  284.                 if( vcx->top && ( opu->opu_Flags & OPUF_INTERIM ) )
  285.                 {
  286.                     vcx->top--;
  287.                     SetGadgetAttrs( (struct Gadget *)vcx->prop,
  288.                         opu->opu_GInfo->gi_Window, opu->opu_GInfo->gi_Requester,
  289.                         PGA_Top, vcx->top, TAG_DONE );
  290.                 }
  291.                 update_target( class, object, opu->opu_GInfo, opu->opu_Flags );
  292.                 break;
  293.             case MORE_ID:
  294.                 if( ( vcx->top < vcx->total - vcx->visible ) &&
  295.                     ( opu->opu_Flags & OPUF_INTERIM ) )
  296.                 {
  297.                     vcx->top++;
  298.                     SetGadgetAttrs( (struct Gadget *)vcx->prop,
  299.                         opu->opu_GInfo->gi_Window, opu->opu_GInfo->gi_Requester,
  300.                         PGA_Top, vcx->top, TAG_DONE );
  301.                     update_target( class, object, opu->opu_GInfo, opu->opu_Flags );
  302.                 }
  303.                 update_target( class, object, opu->opu_GInfo, opu->opu_Flags );
  304.                 break;
  305.             }
  306.             break;
  307.         case PGA_Top:
  308.             vcx->top = ti->ti_Data;
  309.             if( !( opu->opu_Flags & OPUF_INTERIM ) )
  310.             {
  311.                 SetGadgetAttrs( (struct Gadget *)vcx->prop,
  312.                     opu->opu_GInfo->gi_Window, opu->opu_GInfo->gi_Requester,
  313.                     PGA_Top, vcx->top, TAG_DONE );
  314.             }
  315.             update_target( class, object, opu->opu_GInfo, opu->opu_Flags );
  316.             break;
  317.         }
  318.     }
  319.     return 1;
  320. }
  321.  
  322. static ULONG dispatchVCX( Class *class, Object *object, Msg msg )
  323. {
  324.     geta4();
  325. #ifdef DEBUG
  326.     kprintf( "dispatchVCX : MethodID %08lx\n", msg->MethodID );
  327. #endif
  328.     switch( msg->MethodID )
  329.     {
  330.     case OM_NEW:
  331.         return newVCX( class, object, (struct opSet *)msg );
  332.     case OM_SET:
  333.         return setVCX( class, object, (struct opSet *)msg );
  334.     case OM_UPDATE:
  335.         return updateVCX( class, object, (struct opUpdate *)msg );
  336.     case OM_DISPOSE:
  337.         return disposeVCX( class, object, msg );
  338.     case GM_HITTEST:
  339.         return 0;        /* never be hit, never go active, never process input */
  340.     default:
  341.         return DoSuperMethodA( class, object, msg );
  342.     }
  343. }
  344.  
  345. /***************************** public section **************************/
  346.  
  347. /*
  348.  *    initVCXClass() and freeVCXClass() do the obvious.
  349.  *    These are the only targets to public reference within this module.
  350.  *    Everything else is private (static) stuff.
  351.  */
  352. Class *initVCXClass( void )
  353. {
  354.     Class *class;
  355.  
  356.     if( class = MakeClass( NULL, "gadgetclass", NULL, sizeof( struct VCX ), 0 ) )
  357.     {
  358.         SetupHook( &class->cl_Dispatcher, dispatchVCX, NULL );
  359.         class->cl_UserData = 0;
  360.         return class;
  361.     }
  362.     return NULL;
  363. }
  364.  
  365. int freeVCXClass( Class *class )
  366. {
  367.     if( FreeClass( class ) )
  368.         return 1;
  369.     return 0;
  370. }
  371.