home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / gui / ClassFree_src.lha / ClassFree_src / CFtexticlass / texticlass.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  4.4 KB  |  158 lines

  1. /* Sample class  for StormC*/
  2.  
  3. #include <clib/alib_protos.h>
  4. #include <clib/graphics_protos.h>
  5. #include <clib/intuition_protos.h>
  6. #include <clib/utility_protos.h>
  7. #include <exec/libraries.h>
  8. #include <intuition/classes.h>
  9. #include <intuition/imageclass.h>
  10. #include <dos/dos.h>
  11. #include <string.h>
  12. #include "class.h"
  13. #include "CFtexti.h"
  14.  
  15. Class *initclass(struct classbase *base)
  16. {
  17.   Class *cl;
  18.  
  19.   if(cl = MakeClass(CFtextiClassName,IMAGECLASS,NULL,
  20.           sizeof(struct objectdata),NULL))
  21.   {
  22.     cl->cl_Dispatcher.h_Entry = hookEntry;
  23.     cl->cl_Dispatcher.h_SubEntry = dispatcher;
  24.     AddClass(cl);
  25.   }
  26.   base->cl = cl;
  27.  
  28.   return(cl);
  29. }
  30.  
  31. BOOL removeclass(struct classbase *base)
  32. {
  33.   BOOL result;
  34.  
  35.   if(result = FreeClass(base->cl)) base->cl = NULL;
  36.  
  37.   return(result);
  38. }
  39.  
  40. ULONG dispatcher(Class *cl,Object *o,Msg msg)
  41. {
  42.   switch(msg->MethodID)
  43.   {
  44.     case OM_NEW:
  45.     {
  46.       struct TagItem *attrs = ((struct opSet *)msg)->ops_AttrList;
  47.       struct objectdata *dt;
  48.       struct Image *img;
  49.       UWORD *pens;
  50.  
  51.       if(img = (struct Image *)DoSuperMethodA(cl,o,msg))
  52.       {
  53.         dt = (struct objectdata *)INST_DATA(((Class *)o),img);
  54.         dt->flags = TXIF_LAYOUT;
  55.         if(GetTagData(IA_Outline,TRUE,attrs)) dt->flags |= TXIF_EDGES;
  56.         if(GetTagData(CFTI_Redraw,TRUE,attrs)) dt->flags |=TXIF_REDRAW;
  57.         dt->flags |= GetTagData(CFTI_PosFlags,TIPOS_LEFT,attrs);
  58.       }
  59.       return((ULONG)img);
  60.     }
  61.     case OM_SET:
  62.     {
  63.       struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  64.  
  65.       dt->flags |= TXIF_LAYOUT;
  66.       return(DoSuperMethodA(cl,o,msg));
  67.     }
  68.     case IM_HITTEST:
  69.     {
  70.       struct Image *img = (struct Image *)o;
  71.       WORD x = ((struct impHitTest *)msg)->imp_Point.X,
  72.            y = ((struct impHitTest *)msg)->imp_Point.Y;
  73.       /* The width/height bug strikes yet again */
  74.       if(x<img->LeftEdge||x>(img->LeftEdge+img->Width-1)||
  75.          y<img->TopEdge||y>(img->TopEdge+img->Height-1)) return(FALSE);
  76.       else return(TRUE);
  77.     }
  78.     case IM_DRAW:
  79.     {
  80.       struct impDraw *id = (struct impDraw *)msg;
  81.       struct Image *img = (struct Image *)o;
  82.       struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  83.       struct RastPort *rp = id->imp_RPort;
  84.       char *text;
  85.       UBYTE fgpen = img->PlanePick,bgpen = img->PlaneOnOff, tmp;
  86.       ULONG maxlen;
  87.       UWORD *pens;
  88.       struct TextExtent te;
  89.  
  90.       text = (char *)img->ImageData;
  91.       if(dt->flags&TXIF_LAYOUT)
  92.       {
  93.         img->Height = rp->TxHeight;
  94.         dt->xmin = img->LeftEdge;
  95.         dt->ymin = img->TopEdge;
  96.         dt->txty = dt->ymin+rp->TxBaseline;
  97.         if(dt->flags&TXIF_EDGES)
  98.         {
  99.           img->Height++; dt->txty++;
  100.         }
  101.         /* IMPORTANT! Next time remember that Width and Height
  102.           counts pixel 0, so just adding them will make the box
  103.           one pixel wider than it really should be.
  104.           Remeber to subtract 1 next time!!!! Grrrr!   */
  105.         dt->xmax = dt->xmin+img->Width-1;
  106.         dt->ymax = dt->ymin+img->Height-1;
  107.         dt->len = strlen(text);
  108.         maxlen = TextFit(rp,text,dt->len,&te,NULL,1,img->Width-4,img->Height);
  109.         if(dt->len>maxlen) dt->len = maxlen;
  110.         if(dt->flags&TIPOS_LEFT) dt->txtx = dt->xmin+2;
  111.         /* Again we need to adjust!! */
  112.         else if(dt->flags&TIPOS_RIGHT) dt->txtx = dt->xmin +
  113.             img->Width - TextLength(rp,text,dt->len) - 2;
  114.         /* The rounding down of / should adjust.. maybe.. */
  115.         else dt->txtx = dt->xmin + img->Width/2 - TextLength(rp,text,dt->len)/2;
  116.         dt->flags &= ~TXIF_LAYOUT;
  117.       }
  118.       if(id->imp_State&IDS_SELECTED)
  119.       {
  120.         tmp = fgpen;
  121.         fgpen = bgpen;
  122.         bgpen = tmp;
  123.       }
  124.       if(id->imp_DrInfo)
  125.       {
  126.         pens = id->imp_DrInfo->dri_Pens;
  127.         if(id->imp_State == IDS_NORMAL)
  128.         {
  129.           fgpen = pens[TEXTPEN];
  130.           bgpen = pens[BACKGROUNDPEN];
  131.         }
  132.         else
  133.         {
  134.           fgpen = pens[FILLTEXTPEN];
  135.           bgpen = pens[FILLPEN];
  136.         }
  137.       }
  138.       SetDrMd(rp,JAM1);
  139.       SetAPen(rp,bgpen);
  140.       if(dt->flags&TXIF_REDRAW)
  141.       {
  142.         BltPattern(rp,NULL,dt->xmin+id->imp_Offset.X,
  143.                  dt->ymin+id->imp_Offset.Y,
  144.                  dt->xmax+id->imp_Offset.X,
  145.                  dt->ymax+id->imp_Offset.Y,NULL);
  146.       }
  147.       SetAPen(rp,fgpen);
  148.       Move(rp,dt->txtx+id->imp_Offset.X,dt->txty+id->imp_Offset.Y);
  149.       Text(rp,text,dt->len);
  150.  
  151.       return(1);
  152.     }
  153.     default:
  154.       return(DoSuperMethodA(cl,o,msg));
  155.   }
  156. }
  157.  
  158.