home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / programming / utils / dialoglib / entry.c < prev    next >
C/C++ Source or Header  |  1993-03-06  |  8KB  |  299 lines

  1. #include <libraries/gadtools.h>
  2. #include <graphics/text.h>
  3. #include <proto/diskfont.h>
  4. #include <proto/gadtools.h>
  5. #include <proto/graphics.h>
  6. #include <proto/intuition.h>
  7. #include <proto/utility.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10. #include "dialog.h"
  11. #ifdef DEBUG1
  12.     #include <stdio.h>
  13. #endif
  14.  
  15. static ULONG getEntryStructure( DialogElement *de )
  16. {
  17.     ULONG place, structure = DESF_HBaseline;
  18.  
  19.     if( !de )
  20.         return 0;
  21.  
  22.     if( GetTagData( NGDA_GadgetText, 0, de->taglist ) )
  23.     {
  24.         place = getTextPlacement( GetTagData( NGDA_Flags, 0, de->taglist ), PLACETEXT_LEFT );
  25.         switch( place )
  26.         {
  27.         case PLACETEXT_LEFT:
  28.         case PLACETEXT_RIGHT:
  29.             structure |= DESF_VBaseline;
  30.             break;
  31.         }
  32.     }
  33.     return structure;
  34. }
  35.  
  36. static VOID setupEntry( DialogElement *de, ULONG kind )
  37. {
  38.     struct TextExtent te;
  39.     struct RastPort rp;
  40.     struct TextAttr *ta;
  41.     struct TextFont *tf;
  42.     STRPTR text;
  43.     ULONG place;
  44.     LONG minwidth, mintop, minbottom, textwidth, texttop, textbottom;
  45.  
  46.     if( !de )
  47.         return;
  48.  
  49.     switch( kind )
  50.     {
  51.     case STRING_KIND:
  52.         de->idcmp_mask |= STRINGIDCMP;
  53.         break;
  54.     case INTEGER_KIND:
  55.         de->idcmp_mask |= INTEGERIDCMP;
  56.         break;
  57.     }
  58.     de->idcmp_mask |= IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY;
  59.  
  60.     ta = (struct TextAttr *)GetTagData( NGDA_TextAttr, 0, de->taglist );
  61.     if( !ta )
  62.         return;
  63.     tf = OpenDiskFont( ta );
  64.     if( !tf )
  65.         return;
  66.     InitRastPort( &rp );
  67.     SetFont( &rp, tf );
  68.  
  69.     minwidth = 8 + 3 * tf->tf_XSize;
  70.     mintop = 3 + tf->tf_Baseline;
  71.     minbottom = 3 + tf->tf_YSize - tf->tf_Baseline;
  72.  
  73.     text = (STRPTR)GetTagData( NGDA_GadgetText, 0, de->taglist );
  74.     if( text )
  75.         TextExtent( &rp, text, strlen( text ), &te );
  76.     else
  77.     {
  78.         te.te_Extent.MinX = te.te_Extent.MinY = 0;
  79.         te.te_Extent.MaxX = te.te_Extent.MaxY = -1;
  80.     }
  81.  
  82.     CloseFont( tf );
  83.  
  84.     textwidth = te.te_Extent.MaxX + 1 - te.te_Extent.MinX;
  85.     texttop = - te.te_Extent.MinY;
  86.     textbottom = te.te_Extent.MaxY + 1;
  87.  
  88.     place = getTextPlacement( GetTagData( NGDA_Flags, 0, de->taglist ), PLACETEXT_LEFT );
  89.     switch( place )
  90.     {
  91.     case PLACETEXT_ABOVE:
  92.         if( minwidth < textwidth )
  93.             minwidth = textwidth;
  94.         setMinWidth( de, minwidth );
  95.         setMaxWidth( de, MAX_SPACE );
  96.         setMinTopExtent( de, texttop + textbottom + INTERHEIGHT );
  97.         setMaxTopExtent( de, texttop + textbottom + INTERHEIGHT );
  98.         setMinBottomExtent( de, mintop + minbottom );
  99.         setMaxBottomExtent( de, mintop + minbottom );
  100.         break;
  101.     case PLACETEXT_BELOW:
  102.         if( minwidth < textwidth )
  103.             minwidth = textwidth;
  104.         setMinWidth( de, minwidth );
  105.         setMaxWidth( de, MAX_SPACE );
  106.         setMinTopExtent( de, mintop + minbottom );
  107.         setMaxTopExtent( de, mintop + minbottom );
  108.         setMinBottomExtent( de, texttop + textbottom + INTERHEIGHT );
  109.         setMaxBottomExtent( de, texttop + textbottom + INTERHEIGHT );
  110.         break;
  111.     case PLACETEXT_LEFT:
  112.         if( mintop < texttop )
  113.             mintop = texttop;
  114.         if( minbottom < textbottom )
  115.             minbottom = textbottom;
  116.         setMinLeftExtent( de, textwidth + INTERWIDTH  );
  117.         setMaxLeftExtent( de, textwidth + INTERWIDTH  );
  118.         setMinRightExtent( de, minwidth );
  119.         setMaxRightExtent( de, MAX_SPACE );
  120.         setMinTopExtent( de, mintop );
  121.         setMaxTopExtent( de, mintop );
  122.         setMinBottomExtent( de, minbottom );
  123.         setMaxBottomExtent( de, minbottom );
  124.         break;
  125.     case PLACETEXT_RIGHT:
  126.         if( mintop < texttop )
  127.             mintop = texttop;
  128.         if( minbottom < textbottom )
  129.             minbottom = textbottom;
  130.         setMinLeftExtent( de, minwidth );
  131.         setMaxLeftExtent( de, MAX_SPACE );
  132.         setMinRightExtent( de, textwidth + INTERWIDTH );
  133.         setMaxRightExtent( de, textwidth + INTERWIDTH );
  134.         setMinTopExtent( de, mintop );
  135.         setMaxTopExtent( de, mintop );
  136.         setMinBottomExtent( de, minbottom );
  137.         setMaxBottomExtent( de, minbottom );
  138.         break;
  139.     case PLACETEXT_IN:
  140.         if( minwidth < textwidth )
  141.             minwidth = textwidth;
  142.         if( mintop < texttop )
  143.             mintop = texttop;
  144.         if( minbottom < textbottom )
  145.             minbottom = textbottom;
  146.         setMinWidth( de, minwidth );
  147.         setMaxWidth( de, MAX_SPACE );
  148.         setMinTopExtent( de, mintop );
  149.         setMaxTopExtent( de, mintop );
  150.         setMinBottomExtent( de, minbottom );
  151.         setMaxBottomExtent( de, minbottom );
  152.         break;
  153.     }
  154. }
  155.  
  156. static ULONG layoutEntry( DialogElement *de, LayoutMessage *lm, ULONG kind )
  157. {
  158.     struct NewGadget ng;
  159.     ULONG error = DIALOGERR_OK;
  160.  
  161.     if( !de )
  162.         return DIALOGERR_BAD_ARGS;
  163.     if( !lm )
  164.         return DIALOGERR_BAD_ARGS;
  165.  
  166. #ifdef DEBUG1
  167.     printf(
  168.     "layoutEntry : x %d, y %d, width %d, height %d, left %d, right %d, top %d, bottom %d\n",
  169.         lm->lm_X, lm->lm_Y, lm->lm_Width, lm->lm_Height,
  170.         lm->lm_Left, lm->lm_Right, lm->lm_Top, lm->lm_Bottom );
  171. #endif
  172.     ng.ng_GadgetText = (UBYTE *)GetTagData( NGDA_GadgetText, 0, de->taglist );
  173.     ng.ng_TextAttr = (struct TextAttr *)GetTagData( NGDA_TextAttr, 0, de->taglist );
  174.     ng.ng_VisualInfo = (APTR)GetTagData( NGDA_VisualInfo, 0, de->taglist );
  175.     ng.ng_Flags = GetTagData( NGDA_Flags, 0, de->taglist );
  176.     layoutGTSingleLined( &ng, lm, PLACETEXT_LEFT );
  177.     de->object = CreateGadgetA( kind, *lm->lm_PreviousPtr, &ng, de->taglist );
  178.     *lm->lm_PreviousPtr = de->object;    /* advance "previous" pointer to new object */
  179.     if( !de->object )
  180.         error = DIALOGERR_NO_MEMORY;
  181.     return error;
  182. }
  183.  
  184. static DialogElement *matchString( DialogElement *de, MatchMessage *mm )
  185. {
  186.     struct IntuiMessage *imsg;
  187.     struct TagItem *tag;
  188.     DialogElement *match = NULL;
  189.     struct Gadget *gadget;
  190.     STRPTR buffer;
  191.  
  192.     if( !de )
  193.         return NULL;
  194.     if( !mm )
  195.         return NULL;
  196.  
  197.     imsg = mm->mm_IntuiMsg;
  198.     switch( imsg->Class )
  199.     {
  200.     case IDCMP_GADGETUP:
  201.         if( de->object == imsg->IAddress )
  202.         {
  203.             gadget = de->object;
  204.             if( buffer = (STRPTR)GetTagData( DA_Storage, 0, de->taglist ) )
  205.                 strcpy( buffer, ( (struct StringInfo *)gadget->SpecialInfo )->Buffer );
  206.             match = de;
  207.         }
  208.         break;
  209.     case IDCMP_VANILLAKEY:
  210.         if( tag = FindTagItem( DA_EquivalentKey, de->taglist ) )
  211.             if( tolower( imsg->Code ) == tolower( tag->ti_Data ) )
  212.                 ActivateGadget( de->object, imsg->IDCMPWindow, NULL );
  213.         break;
  214.     }
  215.     return match;
  216. }
  217.  
  218. ULONG dispatchString( struct Hook *hook, DialogElement *de, DialogMessage *dm )
  219. {
  220.     ULONG result;
  221.  
  222.     switch( dm->dm_MethodID )
  223.     {
  224.     case DIALOGM_GETSTRUCT:
  225.         result = getEntryStructure( de );
  226.         break;
  227.     case DIALOGM_SETUP:
  228.         setupEntry( de, STRING_KIND );
  229.         break;
  230.     case DIALOGM_LAYOUT:
  231.         result = layoutEntry( de, (LayoutMessage *)dm, STRING_KIND );
  232.         break;
  233.     case DIALOGM_MATCH:
  234.         result = (ULONG)matchString( de, (MatchMessage *)dm );
  235.         break;
  236.     case DIALOGM_CLEAR:
  237.         break;
  238.     case DIALOGM_SETATTRS:
  239.         setGTAttrs( de, (SetAttrsMessage *)dm );
  240.         break;
  241.     }
  242.     return result;
  243. }
  244.  
  245. static DialogElement *matchInteger( DialogElement *de, MatchMessage *mm )
  246. {
  247.     struct IntuiMessage *imsg = mm->mm_IntuiMsg;
  248.     struct TagItem *tag;
  249.     DialogElement *match = NULL;
  250.     struct Gadget *gadget;
  251.     LONG *buffer;
  252.  
  253.     switch( imsg->Class )
  254.     {
  255.     case IDCMP_GADGETUP:
  256.         if( de->object == imsg->IAddress )
  257.         {
  258.             gadget = de->object;
  259.             if( buffer = (LONG *)GetTagData( DA_Storage, 0, de->taglist ) )
  260.                 *buffer = ( (struct StringInfo *)gadget->SpecialInfo )->LongInt;
  261.             match = de;
  262.         }
  263.         break;
  264.     case IDCMP_VANILLAKEY:
  265.         if( tag = FindTagItem( DA_EquivalentKey, de->taglist ) )
  266.             if( tolower( imsg->Code ) == tolower( tag->ti_Data ) )
  267.                 ActivateGadget( de->object, imsg->IDCMPWindow, NULL );
  268.         break;
  269.     }
  270.     return match;
  271. }
  272.  
  273. ULONG dispatchInteger( struct Hook *hook, DialogElement *de, DialogMessage *dm )
  274. {
  275.     ULONG result;
  276.  
  277.     switch( dm->dm_MethodID )
  278.     {
  279.     case DIALOGM_GETSTRUCT:
  280.         result = getEntryStructure( de );
  281.         break;
  282.     case DIALOGM_SETUP:
  283.         setupEntry( de, INTEGER_KIND );
  284.         break;
  285.     case DIALOGM_LAYOUT:
  286.         result = layoutEntry( de, (LayoutMessage *)dm, INTEGER_KIND );
  287.         break;
  288.     case DIALOGM_MATCH:
  289.         result = (ULONG)matchInteger( de, (MatchMessage *)dm );
  290.         break;
  291.     case DIALOGM_CLEAR:
  292.         break;
  293.     case DIALOGM_SETATTRS:
  294.         setGTAttrs( de, (SetAttrsMessage *)dm );
  295.         break;
  296.     }
  297.     return result;
  298. }
  299.