home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / LT_GetAttributes.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-25  |  5.7 KB  |  297 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1994 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. LONG __stdargs
  10. LT_GetAttributes(LayoutHandle *Handle,LONG ID,...)
  11. {
  12.     va_list VarArgs;
  13.     LONG    Result;
  14.  
  15.     va_start(VarArgs,ID);
  16.     Result = LT_GetAttributesA(Handle,ID,(struct TagItem *)VarArgs);
  17.     va_end(VarArgs);
  18.  
  19.     return(Result);
  20. }
  21.  
  22. LONG LIBENT
  23. LT_GetAttributesA(REG(a0) LayoutHandle *Handle,REG(d0) LONG ID,REG(a1) struct TagItem *TagList)
  24. {
  25.     if(Handle)
  26.     {
  27.         struct TagItem    *ThisTag;
  28.         ObjectNode    *Node = NULL;
  29.  
  30.         if(ThisTag = FindTagItem(LAPR_Gadget,TagList))
  31.             Node = ((struct Gadget *)ThisTag -> ti_Data) -> UserData;
  32.  
  33.         if(!Node)
  34.         {
  35.             if(ThisTag = FindTagItem(LAPR_Object,TagList))
  36.                 Node = (ObjectNode *)ThisTag -> ti_Data;
  37.         }
  38.  
  39.         if(!Node)
  40.             Node = LTP_FindNode(Handle -> TopGroup,ID);
  41.  
  42.         if(Node)
  43.         {
  44.             if(TagList)
  45.             {
  46.                 struct TagItem    *TagItem,
  47.                         *TempPtr = TagList;
  48.                 LONG        *Value;
  49.  
  50.                 while(TagItem = NextTagItem(&TempPtr))
  51.                 {
  52.                     Value = (LONG *)TagItem -> ti_Data;
  53.  
  54.                     switch(TagItem -> ti_Tag)
  55.                     {
  56.                         case LA_Left:
  57.  
  58.                             if(Node -> Type == FRAME_KIND && Node -> Special . Frame . DrawBox)
  59.                                 *Value = Node -> Left + 4;
  60.                             else
  61.                                 *Value = Node -> Left;
  62.  
  63.                             break;
  64.  
  65.                         case LA_Top:
  66.  
  67.                             if(Node -> Type == FRAME_KIND && Node -> Special . Frame . DrawBox)
  68.                                 *Value = Node -> Top + 2;
  69.                             else
  70.                                 *Value = Node -> Top;
  71.  
  72.                             break;
  73.  
  74.                         case LA_Width:
  75.  
  76.                             if(Node -> Type == FRAME_KIND && Node -> Special . Frame . DrawBox)
  77.                                 *Value = Node -> Width - 8;
  78.                             else
  79.                                 *Value = Node -> Width;
  80.  
  81.                             break;
  82.  
  83.                         case LA_Height:
  84.  
  85.                             if(Node -> Type == FRAME_KIND && Node -> Special . Frame . DrawBox)
  86.                                 *Value = Node -> Height - 4;
  87.                             else
  88.                                 *Value = Node -> Height;
  89.  
  90.                             break;
  91.  
  92.                         case LA_Chars:
  93.  
  94.                             *Value = Node -> Chars;
  95.                             break;
  96.  
  97.                         case LA_Lines:
  98.  
  99.                             *Value = Node -> Lines;
  100.                             break;
  101.  
  102.                         case LA_LabelLeft:
  103.  
  104.                             switch(Node -> LabelPlace)
  105.                             {
  106.                                 case PLACE_LEFT:
  107.  
  108.                                     *Value    = Node -> Left - (INTERWIDTH + Node -> LabelWidth);
  109.                                     break;
  110.  
  111.                                 case PLACE_RIGHT:
  112.  
  113.                                     *Value    = Node -> Left + Node -> Width + INTERWIDTH;
  114.                                     break;
  115.  
  116.                                 case PLACE_ABOVE:
  117.  
  118.                                     *Value    = Node -> Left + (Node -> Width - Node -> LabelWidth) / 2;
  119.                                     break;
  120.  
  121.                                 case PLACE_BELOW:
  122.  
  123.                                     *Value    = Node -> Left + (Node -> Width - Node -> LabelWidth) / 2;
  124.                                     break;
  125.  
  126.                                 case PLACE_IN:
  127.  
  128.                                     *Value    = Node -> Left + (Node -> Width - Node -> LabelWidth) / 2;
  129.                                     break;
  130.                             }
  131.  
  132.                             break;
  133.  
  134.                         case LA_LabelTop:
  135.  
  136.                             switch(Node -> LabelPlace)
  137.                             {
  138.                                 case PLACE_LEFT:
  139.  
  140.                                     *Value    = Node -> Top + (Node -> Height - Handle -> RPort . TxHeight) / 2;
  141.                                     break;
  142.  
  143.                                 case PLACE_RIGHT:
  144.  
  145.                                     *Value    = Node -> Top + (Node -> Height - Handle -> RPort . TxHeight) / 2;
  146.                                     break;
  147.  
  148.                                 case PLACE_ABOVE:
  149.  
  150.                                     *Value    = Node -> Top - (Handle -> RPort . TxHeight + INTERHEIGHT);
  151.                                     break;
  152.  
  153.                                 case PLACE_BELOW:
  154.  
  155.                                     *Value    = Node -> Top + Node -> Height + INTERHEIGHT;
  156.                                     break;
  157.  
  158.                                 case PLACE_IN:
  159.  
  160.                                     *Value    = Node -> Top + (Node -> Height - Handle -> RPort . TxHeight) / 2;
  161.                                     break;
  162.                             }
  163.  
  164.                             break;
  165.                     }
  166.                 }
  167.             }
  168.  
  169.             if(Node -> Host)
  170.             {
  171.                 struct Gadget *Gadget = Node -> Host;
  172.  
  173.                 switch(Node -> Type)
  174.                 {
  175.                     case CHECKBOX_KIND:
  176.                     case LISTVIEW_KIND:
  177.                     case MX_KIND:
  178.                     case CYCLE_KIND:
  179.                     case PALETTE_KIND:
  180.                     case SLIDER_KIND:
  181.                     case SCROLLER_KIND:
  182. #ifdef DO_GAUGE_KIND
  183.                     case GAUGE_KIND:
  184. #endif
  185. #ifdef DO_TAPEDECK_KIND
  186.                     case TAPEDECK_KIND:
  187. #endif    /* DO_TAPEDECK_KIND */
  188.                         return(Node -> Current);
  189.  
  190. #ifdef DO_FRACTION_KIND
  191.                     case FRACTION_KIND:
  192.                     {
  193.                         STRPTR String;
  194.  
  195.                         if(Gadget)
  196.                             String = ((struct StringInfo *)Gadget -> SpecialInfo) -> Buffer;
  197.                         else
  198.                             String = Node -> Special . String . String;
  199.  
  200.                         if(String)
  201.                         {
  202.                             FIXED Contents;
  203.  
  204.                             Contents = LT_String2Fixed(String);
  205.  
  206.                             if(Contents < Node -> Min)
  207.                                 Contents = Node -> Min;
  208.                             else
  209.                             {
  210.                                 if(Contents > Node -> Max)
  211.                                     Contents = Node -> Max;
  212.                             }
  213.  
  214.                             LT_SetAttributes(Handle,Gadget -> GadgetID,LAFC_Number,Contents,TAG_DONE);
  215.  
  216.                             return((LONG)Contents);
  217.                         }
  218.                     }
  219.                     break;
  220. #endif
  221.  
  222. #ifdef DO_LEVEL_KIND
  223.                     case LEVEL_KIND:
  224.  
  225.                         return(Node -> Special . Level . Level);
  226. #endif    /* DO_LEVEL_KIND */
  227.                     case STRING_KIND:
  228.  
  229.                         if(Gadget)
  230.                         {
  231.                             struct StringInfo *StringInfo;
  232.  
  233.                             StringInfo = (struct StringInfo *)Gadget -> SpecialInfo;
  234.  
  235.                             return((LONG)StringInfo -> Buffer);
  236.                         }
  237.                         else
  238.                         {
  239.                             STRPTR String = Node -> Special . String . String;
  240.  
  241.                             if(String)
  242.                                 return((LONG)String);
  243.                             else
  244.                                 return((LONG)"");
  245.                         }
  246.  
  247.                         break;
  248. #ifdef DO_PASSWORD_KIND
  249.                     case PASSWORD_KIND:
  250.  
  251.                         return((LONG)Node -> Special . String . Original);
  252.  
  253.                         break;
  254. #endif
  255.                     case INTEGER_KIND:
  256.  
  257.                         if(Gadget)
  258.                         {
  259.                             struct StringInfo    *StringInfo;
  260.                             LONG             Contents;
  261.  
  262.                             StringInfo = (struct StringInfo *)Gadget -> SpecialInfo;
  263.  
  264.                             Contents = StringInfo -> LongInt;
  265.  
  266.                             if(Contents < Node -> Min)
  267.                                 Contents = Node -> Min;
  268.                             else
  269.                             {
  270.                                 if(Contents > Node -> Max)
  271.                                     Contents = Node -> Max;
  272.                             }
  273.  
  274.                             LT_SetAttributes(Handle,Gadget -> GadgetID,
  275.                                 GTIN_Number,Contents,
  276.                             TAG_DONE);
  277.  
  278.                             return(Contents);
  279.                         }
  280.                         else
  281.                             return(Node -> Current);
  282.  
  283.                         break;
  284.  
  285.                     case GROUP_KIND:
  286.  
  287.                         return((LONG)Node -> Special . Group . ActivePage);
  288.                 }
  289.             }
  290.         }
  291.         else
  292.             return((LONG)Handle -> UserData);
  293.     }
  294.  
  295.     return(NULL);
  296. }
  297.