home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / BOOPSI / gadgets / stringgadget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-12  |  11.3 KB  |  436 lines

  1. #include <classes/BOOPSI/gadgets.h>
  2. #include <classes/BOOPSI/boopsilib.h>
  3.  
  4. #include <intuition/icclass.h>
  5. #include <exec/libraries.h>
  6.  
  7. #pragma -
  8. #include <pragma/utility_lib.h>
  9. #include <clib/alib_protos.h>
  10. #include <pragma/intuition_lib.h>
  11. #include <pragma/graphics_lib.h>
  12. #include <graphics/gfxmacros.h>
  13. #pragma +
  14.  
  15. extern struct Library *IntuitionBase;
  16.  
  17. struct InstanceData {
  18.     struct TextAttr *tattr;
  19.     struct TextFont *font;
  20.     WORD leftborder;
  21.     WORD rightborder;
  22.     WORD topborder;
  23.     WORD bottomborder;
  24.     UBYTE labelmark;
  25.     Object *string;
  26.     Object *frame;
  27.     ULONG columns;
  28.     struct LabelText *label;
  29. };
  30.  
  31. static Tag stringtags[] = {
  32.     STRA_Font, STRA_LabelMark,
  33.     STRA_LeftBorder, STRA_RightBorder, STRA_TopBorder, STRA_BottomBorder,
  34.     STRA_AutoWidth, STRA_AutoHeight, STRA_Columns,
  35.     GA_Text,
  36.     TAG_END };
  37.  
  38. StringClass::StringClass()
  39.     : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,GADGETCLASS,NULL)
  40. {
  41. }
  42.  
  43. ULONG StringClass::dispatcher(Class *cl, Object *o, Msg msg)
  44. {
  45.     struct InstanceData *data;
  46.     ULONG retval = FALSE;
  47.     switch (msg->MethodID)
  48.     {
  49.         case OM_NEW:
  50.         {
  51.             Object *object;
  52.             if (object = (Object *) DoSuperMethodA(cl,o,msg))
  53.             {
  54.                 data = (struct InstanceData *) INST_DATA(cl,object);
  55.                 data->tattr = NULL;
  56.                 data->font = NULL;
  57.                 data->labelmark = '_';
  58.                 data->columns = 0;
  59.                 TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
  60.                 while (!tic.isDone()) {
  61.                     /* register */ ULONG ticData = tic.itemData();
  62.                     switch (tic.itemTag())
  63.                     {
  64.                         case STRA_Font:
  65.                             data->tattr = (struct TextAttr *) ticData;
  66.                             break;
  67.                         case STRA_LabelMark:
  68.                             data->labelmark = (UBYTE) ticData;
  69.                             break;
  70.                         case STRA_Columns:
  71.                             data->columns = (ULONG) ticData;
  72.                             break;
  73.                         default:
  74.                             break;
  75.                     };
  76.                     tic.next();
  77.                 };
  78.                 if (data->tattr)
  79.                 {
  80.                     data->font = OpenFont(data->tattr);
  81.                 };
  82.                 data->label = AllocLText(
  83.                     (STRPTR) ((struct Gadget *) object)->GadgetText,
  84.                     data->tattr,1,0,JAM2,data->labelmark);
  85.                 calcBorders(cl,(struct Gadget *) object, data);
  86.                 data->frame = (Object *) NewObject(NULL,FRAMEICLASS,
  87.                     IA_FrameType, FRAME_RIDGE,
  88.                     IA_Recessed, FALSE,
  89.                     TAG_END);
  90.                 FilterTagItems(((struct opSet *) msg)->ops_AttrList,
  91.                     stringtags, TAGFILTER_NOT);
  92.                 data->string = (Object *) NewObjectA(NULL,STRGCLASS,
  93.                     ((struct opSet *) msg)->ops_AttrList);
  94.                 if (data->string)
  95.                 {
  96.                     SetAttrs(data->string,
  97.                         GA_Left, ((struct Gadget *) object)->LeftEdge + 6,
  98.                         GA_Top, ((struct Gadget *) object)->TopEdge + 2,
  99.                         GA_Width, ((struct Gadget *) object)->Width - 12,
  100.                         GA_Height, ((struct Gadget *) object)->Height - 4,
  101.                         ICA_TARGET,object,
  102.                         STRINGA_Font,data->font,
  103.                         TAG_END);
  104.                 };
  105.                 retval = (ULONG) object;
  106.             };
  107.             break;
  108.         };
  109.         case OM_DISPOSE:
  110.         {
  111.             data = (struct InstanceData *) INST_DATA(cl,o);
  112.             if (data->string)
  113.                 DisposeObject(data->string);
  114.             if (data->frame)
  115.                 DisposeObject(data->frame);
  116.             FreeLText(data->label);
  117.             retval = DoSuperMethodA(cl,o,msg);
  118.             break;
  119.         };
  120.         case OM_GET:
  121.         {
  122.             data = (struct InstanceData *) INST_DATA(cl,o);
  123.             switch (((struct opGet *) msg)->opg_AttrID)
  124.             {
  125.                 case GA_Left:
  126.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->LeftEdge;
  127.                     retval = TRUE;
  128.                     break;
  129.                 case GA_Top:
  130.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->TopEdge;
  131.                     retval = TRUE;
  132.                     break;
  133.                 case GA_Width:
  134.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Width;
  135.                     retval = TRUE;
  136.                     break;
  137.                 case GA_Height:
  138.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Height;
  139.                     retval = TRUE;
  140.                     break;
  141.                 case STRA_Font:
  142.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->tattr;
  143.                     retval = TRUE;
  144.                     break;
  145.                 case STRA_LabelMark:
  146.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->labelmark;
  147.                     retval = TRUE;
  148.                     break;
  149.                 case STRA_LeftBorder:
  150.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->leftborder;
  151.                     retval = TRUE;
  152.                     break;
  153.                 case STRA_RightBorder:
  154.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->rightborder;
  155.                     retval = TRUE;
  156.                     break;
  157.                 case STRA_TopBorder:
  158.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->topborder;
  159.                     retval = TRUE;
  160.                     break;
  161.                 case STRA_BottomBorder:
  162.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->bottomborder;
  163.                     retval = TRUE;
  164.                     break;
  165.                 case STRA_AutoWidth:
  166.                     *(((struct opGet *) msg)->opg_Storage) =
  167.                         (ULONG) calcWidth(cl,(struct Gadget *) o, data);
  168.                     retval = TRUE;
  169.                     break;
  170.                 case STRA_AutoHeight:
  171.                     *(((struct opGet *) msg)->opg_Storage) =
  172.                         (ULONG) calcHeight(cl,(struct Gadget *) o, data);
  173.                     retval = TRUE;
  174.                     break;
  175.                 case STRA_Columns:
  176.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->columns;
  177.                     retval = TRUE;
  178.                     break;
  179.                 default:
  180.                     if (!(retval = DoSuperMethodA(cl,o,msg)))
  181.                     {
  182.                         if (data->string)
  183.                             retval = DoMethodA(data->string,(Msg) msg);
  184.                     };
  185.                     break;
  186.             };
  187.             break;
  188.         };
  189.         case OM_SET:
  190.         {
  191.             data = (struct InstanceData *) INST_DATA(cl,o);
  192.             BOOL recalcIt = FALSE;
  193.             TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
  194.             while (!tic.isDone()) {
  195.                 /* register */ ULONG ticData = tic.itemData();
  196.                 switch (tic.itemTag())
  197.                 {
  198.                     case GA_Top:
  199.                     case GA_Left:
  200.                     case GA_Width:
  201.                     case GA_Height:
  202.                         recalcIt = TRUE;
  203.                         break;
  204.                     case STRA_Font:
  205.                         if (data->font)
  206.                         {
  207.                             CloseFont(data->font);
  208.                             data->font = NULL;
  209.                         };
  210.                         data->tattr = (struct TextAttr *) ticData;
  211.                         if (data->tattr)
  212.                             data->font = OpenFont(data->tattr);
  213.                         if (data->string)
  214.                             SetGInfoAttrs(data->string,((struct opSet *) msg)->ops_GInfo,
  215.                                 STRINGA_Font,data->font,
  216.                                 TAG_END);
  217.                         ChangeLTextFont(data->label,data->tattr);
  218.                         calcBorders(cl,(struct Gadget *) o, data);
  219.                         break;
  220.                     case STRA_Columns:
  221.                         data->columns = (ULONG) ticData;
  222.                         break;
  223.                     default:
  224.                         break;
  225.                 };
  226.                 tic.next();
  227.             };
  228.             retval = DoSuperMethodA(cl,o,msg);
  229.             if (data->string)
  230.             {
  231.                 FilterTagItems(((struct opSet *) msg)->ops_AttrList,
  232.                     stringtags, TAGFILTER_NOT);
  233.                 DoMethodA(data->string,(Msg) msg);
  234.                 if (recalcIt)
  235.                 {
  236.                     SetGInfoAttrs(data->string,((struct opSet *) msg)->ops_GInfo,
  237.                         GA_Left, ((struct Gadget *) o)->LeftEdge + 6,
  238.                         GA_Top, ((struct Gadget *) o)->TopEdge + 2,
  239.                         GA_Width, ((struct Gadget *) o)->Width - 12,
  240.                         GA_Height, ((struct Gadget *) o)->Height - 4,
  241.                         TAG_END);
  242.                 };
  243.             };
  244.             break;
  245.         };
  246.         case GM_RENDER:
  247.         {
  248.             data = (struct InstanceData *) INST_DATA(cl,o);
  249.             retval = render(cl,(struct Gadget *) o,
  250.                 (struct gpRender *) msg,data);
  251.             break;
  252.         };
  253.         case GM_HITTEST:
  254.         {
  255.             retval = GMR_GADGETHIT;
  256.             break;
  257.         };
  258.         case GM_GOACTIVE:
  259.         {
  260.             data = (struct InstanceData *) INST_DATA(cl,o);
  261.             struct gpInput *gpi = (struct gpInput *) msg;
  262.             gpi->gpi_Mouse.X -= 6;
  263.             gpi->gpi_Mouse.Y -= 2;
  264.             if (data->string)
  265.                 retval = DoMethodA(data->string,(Msg) msg)
  266.             else
  267.                 retval = GMR_NOREUSE;
  268.             break;
  269.         };
  270.         case GM_GOINACTIVE:
  271.         {
  272.             data = (struct InstanceData *) INST_DATA(cl,o);
  273.             if (data->string)
  274.                 retval = DoMethodA(data->string,(Msg) msg);
  275.             break;
  276.         };
  277.         case GM_HANDLEINPUT:
  278.         {
  279.             data = (struct InstanceData *) INST_DATA(cl,o);
  280.             struct gpInput *gpi = (struct gpInput *) msg;
  281.             gpi->gpi_Mouse.X -= 6;
  282.             gpi->gpi_Mouse.Y -= 3;
  283.             if (data->string)
  284.                 retval = DoMethodA(data->string,(Msg) msg)
  285.             else
  286.                 retval = GMR_NOREUSE;
  287.             break;
  288.         };
  289.         default:
  290.         {
  291.             retval = DoSuperMethodA(cl,o,msg);
  292.             break;
  293.         };
  294.     };
  295.     return retval;
  296. }
  297.  
  298. ULONG StringClass::render(Class *cl, struct Gadget *g,
  299.     struct gpRender *msg, struct InstanceData *data)
  300. {
  301.     struct RastPort *rp;
  302.     struct GadgetInfo *ginfo;
  303.     if (msg->MethodID == OM_SET || msg->MethodID == OM_UPDATE)
  304.         ginfo = ((struct opSet *) msg)->ops_GInfo
  305.     else
  306.         ginfo = msg->gpr_GInfo;
  307.     if (!ginfo)
  308.         return TRUE;
  309.     UWORD *pens = ginfo->gi_DrInfo->dri_Pens;
  310.     if (msg->MethodID == GM_RENDER)
  311.         rp = msg->gpr_RPort
  312.     else
  313.         rp = ObtainGIRPort(ginfo);
  314.     if (rp)
  315.     {
  316.         if (IntuitionBase->lib_Version >= 39)
  317.         {
  318.             if (data->frame)
  319.             {
  320.                 SetAttrs(data->frame,
  321.                     IA_Left, g->LeftEdge,
  322.                     IA_Top, g->TopEdge,
  323.                     IA_Width, g->Width,
  324.                     IA_Height, g->Height,
  325.                     TAG_END);
  326.                 DrawImageState(rp,(struct Image *) data->frame,0,0,IDS_NORMAL,
  327.                     ginfo->gi_DrInfo);
  328.             };
  329.         }
  330.         else {
  331.             SetAPen(rp,pens[SHINEPEN]);
  332.             SetDrMd(rp,JAM1);
  333.             Move(rp,g->LeftEdge, g->TopEdge);
  334.             Draw(rp,g->LeftEdge, g->TopEdge + g->Height - 1);
  335.             Move(rp,g->LeftEdge + 1, g->TopEdge);
  336.             Draw(rp,g->LeftEdge + 1, g->TopEdge + g->Height - 2);
  337.             Move(rp,g->LeftEdge, g->TopEdge);
  338.             Draw(rp,g->LeftEdge + g->Width - 2, g->TopEdge);
  339.             Move(rp,g->LeftEdge + g->Width - 4, g->TopEdge + 2);
  340.             Draw(rp,g->LeftEdge + g->Width - 4, g->TopEdge + g->Height - 2);
  341.             Move(rp,g->LeftEdge + g->Width - 3, g->TopEdge + 1);
  342.             Draw(rp,g->LeftEdge + g->Width - 3, g->TopEdge + g->Height - 2);
  343.             Move(rp,g->LeftEdge + 3, g->TopEdge + g->Height - 2);
  344.             Draw(rp,g->LeftEdge + g->Width - 3, g->TopEdge + g->Height - 2);
  345.             SetAPen(rp,pens[SHADOWPEN]);
  346.             Move(rp,g->LeftEdge + 2, g->TopEdge + 1);
  347.             Draw(rp,g->LeftEdge + 2, g->TopEdge + g->Height - 2);
  348.             Move(rp,g->LeftEdge + 3, g->TopEdge + 1);
  349.             Draw(rp,g->LeftEdge + 3, g->TopEdge + g->Height - 3);
  350.             Move(rp,g->LeftEdge + 2, g->TopEdge + 1);
  351.             Draw(rp,g->LeftEdge + g->Width - 4, g->TopEdge + 1);
  352.             Move(rp,g->LeftEdge + g->Width - 2, g->TopEdge + 1);
  353.             Draw(rp,g->LeftEdge + g->Width - 2, g->TopEdge + g->Height - 1);
  354.             Move(rp,g->LeftEdge + g->Width - 1, g->TopEdge);
  355.             Draw(rp,g->LeftEdge + g->Width - 1, g->TopEdge + g->Height - 1);
  356.             Move(rp,g->LeftEdge + 1, g->TopEdge + g->Height - 1);
  357.             Draw(rp,g->LeftEdge + g->Width - 1, g->TopEdge + g->Height - 1);
  358.         };
  359.         if (data->font && g->GadgetText)
  360.         {
  361.             PrintLText(rp,data->label,
  362.                 g->LeftEdge - data->leftborder, g->TopEdge,
  363.                 data->leftborder, g->Height,
  364.                 STADJUST_Left);
  365.         };
  366.         if (data->string)
  367.         {
  368.             DoMethodA(data->string,(Msg) msg);
  369.         };
  370.         if (msg->MethodID != GM_RENDER)
  371.             ReleaseGIRPort(rp);
  372.         return TRUE;
  373.     };
  374.     return FALSE;
  375. }
  376.  
  377. VOID StringClass::calcBorders(Class *cl, struct Gadget *g,
  378.         struct InstanceData *data)
  379. {
  380.     data->leftborder = 0;
  381.     data->rightborder = 0;
  382.     data->topborder = 0;
  383.     data->bottomborder = 0;
  384.     if (data->tattr && g->GadgetText)
  385.     {
  386.         data->leftborder = MeasureLText(data->label) + 4;
  387.     };
  388. }
  389.  
  390. WORD StringClass::calcWidth(Class *cl, struct Gadget *g,
  391.         struct InstanceData *data)
  392. {
  393.     if (data->tattr && data->string)
  394.     {
  395.         if (data->columns != 0)
  396.             return MeasureTextLength("0",data->tattr)*data->columns + 12;
  397.         WORD maxChars = (((struct StringInfo *) ((struct Gadget *) data->string)->SpecialInfo)->MaxChars);
  398.         if (maxChars > 25)
  399.             maxChars = 25;
  400.         if (maxChars == 0)
  401.             maxChars = 12;
  402.         return MeasureTextLength("0",data->tattr)*maxChars + 12;
  403.     };
  404.     return 100;
  405. }
  406.  
  407. WORD StringClass::calcHeight(Class *cl, struct Gadget *g,
  408.         struct InstanceData *data)
  409. {
  410.     if (data->tattr)
  411.     {
  412.         return data->tattr->ta_YSize + 6;
  413.     };
  414.     return 14;
  415. }
  416.  
  417. // *************************************************************
  418.  
  419. StringClass BStringC::lc;
  420.  
  421. // *************************************************************
  422.  
  423. BIntegerC::BIntegerC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
  424.     : BGadgetC(ev,lc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type)
  425. {
  426.     set(get());
  427. };
  428.  
  429. BIntegerC::BIntegerC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
  430.     : BGadgetC(ev,lc.boopsiclass(),NULL,w,tags)
  431. {
  432.     set(get());
  433. };
  434.  
  435. StringClass BIntegerC::lc;
  436.