home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0678.ZIP / CCE_0678.PD / E_GEM135 / SOURCE / OBJC.C < prev    next >
C/C++ Source or Header  |  1994-03-27  |  6KB  |  297 lines

  1.  
  2. #include <string.h>
  3. #include "proto.h"
  4.  
  5. void ob_draw_list(reg DIAINFO *info,reg int *ob_lst,reg GRECT *area)
  6. {
  7.     reg OBJECT *tree = info->di_tree;
  8.  
  9.     if (info==NULL || info->di_flag==CLOSED || info->di_iconified)
  10.         return;
  11.     else if (_dia_len>0 && (info->di_flag>=WINDOW || info!=_dia_list[_dia_len-1]))
  12.         return;
  13.  
  14.     if (info->di_flag<WINDOW)
  15.     {
  16.         reg int ob;
  17.  
  18.         if (area==NULL)
  19.             area = (GRECT *) &tree->ob_x;
  20.         while ((ob=*ob_lst++)>0)
  21.             objc_draw(tree,ob,MAX_DEPTH,area->g_x,area->g_y,area->g_w,area->g_h);
  22.     }
  23.     else
  24.     {
  25.         GRECT win;
  26.  
  27.         if (area)
  28.             win = *area;
  29.         else
  30.             win = *((GRECT *) &tree->ob_x);
  31.  
  32.         if (rc_intersect(&desk,&win))
  33.         {
  34.             GRECT work;
  35.             reg int *objs,ob,handle = info->di_handle,pxy[4];
  36.             reg GRECT *w=&work;
  37.  
  38.             wind_update(BEG_UPDATE);
  39.             wind_get(handle,WF_FIRSTXYWH,&w->g_x,&w->g_y,&w->g_w,&w->g_h);
  40.  
  41.             while (w->g_w>0 && w->g_h>0)
  42.             {
  43.                 if (rc_intersect(&win,w))
  44.                 {
  45.                     rc_grect_to_array(w,pxy);
  46.                     _set_clip(pxy);
  47.  
  48.                     objs = ob_lst;
  49.                     while ((ob = *objs++)>0)
  50.                         objc_draw(tree,ob,MAX_DEPTH,w->g_x,w->g_y,w->g_w,w->g_h);
  51.                 }
  52.  
  53.                 wind_get(handle,WF_NEXTXYWH,&w->g_x,&w->g_y,&w->g_w,&w->g_h);
  54.             }
  55.  
  56.             _set_clip((int *) &clip);
  57.             wind_update(END_UPDATE);
  58.         }
  59.     }
  60. }
  61.  
  62. void ob_draw_chg(DIAINFO *info,int obj,GRECT *area,int new_state,boolean top)
  63. {
  64.     reg OBJECT *tree = info->di_tree;
  65.  
  66.     if (info==NULL || info->di_flag==CLOSED || info->di_iconified)
  67.         return;
  68.     else if (_dia_len>0 && (info->di_flag>=WINDOW || info!=_dia_list[_dia_len-1]))
  69.         return;
  70.  
  71.     if (top || info->di_flag<WINDOW)
  72.     {
  73.         if (area==NULL)
  74.             area = (GRECT *) &tree->ob_x;
  75.         if (new_state>=0)
  76.             objc_change(tree,obj,0,area->g_x,area->g_y,area->g_w,area->g_h,new_state,1);
  77.         else
  78.             objc_draw(tree,obj,MAX_DEPTH,area->g_x,area->g_y,area->g_w,area->g_h);
  79.     }
  80.     else
  81.     {
  82.         reg OBJECT *ob = tree + obj;
  83.         GRECT win;
  84.  
  85.         if (area)
  86.             win = *area;
  87.         else
  88.             win = *((GRECT *) &tree->ob_x);
  89.  
  90.         if (rc_intersect(&desk,&win))
  91.         {
  92.             reg int handle = info->di_handle,state = ob->ob_state,pxy[4];
  93.             GRECT work;
  94.  
  95.             wind_update(BEG_UPDATE);
  96.             wind_get(handle,WF_FIRSTXYWH,&work.g_x,&work.g_y,&work.g_w,&work.g_h);
  97.  
  98.             while (work.g_w>0 && work.g_h>0)
  99.             {
  100.                 if (rc_intersect(&win,&work))
  101.                 {
  102.                     rc_grect_to_array(&work,pxy);
  103.                     _set_clip(pxy);
  104.                     if (new_state>=0)
  105.                     {
  106.                         objc_change(tree,obj,0,work.g_x,work.g_y,work.g_w,work.g_h,new_state,1);
  107.                         ob->ob_state = state;
  108.                     }
  109.                     else
  110.                         objc_draw(tree,obj,MAX_DEPTH,work.g_x,work.g_y,work.g_w,work.g_h);
  111.                 }
  112.                 wind_get(handle,WF_NEXTXYWH,&work.g_x,&work.g_y,&work.g_w,&work.g_h);
  113.             }
  114.  
  115.             if (new_state>=0)
  116.                 ob->ob_state = new_state;
  117.             _set_clip((int *) &clip);
  118.             wind_update(END_UPDATE);
  119.         }
  120.     }
  121. }
  122.  
  123. int ob_radio(OBJECT *tree,int parent,int object)
  124. {
  125.     reg int i,radio = 0,first = tree[parent].ob_head,last = tree[parent].ob_tail;
  126.     reg OBJECT *obj;
  127.  
  128.     i = first;
  129.     while (i>=first && i<=last)
  130.     {
  131.         obj = tree + i;
  132.         if (obj->ob_flags & RBUTTON)
  133.         {
  134.              if (!(obj->ob_state & DISABLED))
  135.              {
  136.                 if (radio==object)
  137.                     obj->ob_state |= SELECTED;
  138.                 else if (obj->ob_state & SELECTED)
  139.                 {
  140.                     if (object>=0)
  141.                         obj->ob_state &= ~SELECTED;
  142.                     else
  143.                         object = radio;
  144.                 }
  145.             }
  146.             radio++;
  147.         }
  148.         i = obj->ob_next;
  149.     }
  150.     return (object);
  151. }
  152.  
  153. int ob_get_parent(OBJECT *tree,int obj)
  154. {
  155.     reg int index = 0,parent = 0;
  156.  
  157.     do
  158.     {
  159.         if (tree->ob_head<=obj && tree->ob_tail>=obj)
  160.             parent = index;
  161.         tree++;index++;
  162.     }
  163.     while (!(tree->ob_flags & LASTOB));
  164.  
  165.     return(parent);
  166. }
  167.  
  168. int _get_hotkey(OBJECT *tree,int button)
  169. {
  170.     reg OBJECT *obj = &tree[button];
  171.     reg int i,last,type;
  172.  
  173.     type = obj->ob_type & (~G_MODAL);
  174.     if ((unsigned char) type!=G_USERDEF)
  175.         type = (unsigned char) type;
  176.  
  177.     switch (type)
  178.     {
  179.     case G_IND:
  180.     case G_HOTKEY:
  181.         return (button);
  182.     case G_CHK:
  183.     case G_RB:
  184.         if ((button = obj->ob_next)<0)
  185.             return (FAIL);
  186.         obj = &tree[button];
  187.     case G_TEXT:
  188.     case G_FTEXT:
  189.     case G_BOXTEXT:
  190.     case G_FBOXTEXT:
  191.     case G_STRING:
  192.     case G_BUTTON:
  193.     case G_BOXCHAR:
  194.         if ((i=obj->ob_head)>0)
  195.             for (last=obj->ob_tail,obj=&tree[i];i<=last;i++,obj++)
  196.             {
  197.                 switch (obj->ob_type & (~G_MODAL))
  198.                 {
  199.                 case G_IND:
  200.                 case G_HOTKEY:
  201.                     return (i);
  202.                 }
  203.             }
  204.     }
  205.  
  206.     return (FALSE);
  207. }
  208.  
  209. char ob_get_hotkey(OBJECT *tree,int button)
  210. {
  211.     reg int obj = _get_hotkey(tree,button);
  212.  
  213.     if (obj>0)
  214.         return(tree[obj].ob_state>>8);
  215.     else
  216.         return(0);
  217. }
  218.  
  219.  
  220. int ob_set_hotkey(OBJECT *tree,int button,char hot)
  221. {
  222.     reg int obj = _get_hotkey(tree,button);
  223.  
  224.     if (obj>0)
  225.     {
  226.         reg int width,parent = ob_get_parent(tree,obj);
  227.         reg OBJECT *ob_ptr = &tree[obj],*par_ptr = &tree[parent];
  228.         reg char *text = ob_get_text(tree,parent,FALSE),*pos;
  229.  
  230.         if (text && ((pos = strchr(text,_upper(hot)))!=NULL || (pos = strchr(text,_lower(hot)))!=NULL))
  231.         {
  232.             width = (int) strlen(text);
  233.  
  234.             switch((unsigned char) par_ptr->ob_type)
  235.             {
  236.             case G_TEXT:
  237.             case G_FTEXT:
  238.             case G_BOXTEXT:
  239.             case G_FBOXTEXT:
  240.                 if (par_ptr->ob_spec.tedinfo->te_font==SMALL)
  241.                     width *= gr_sw;
  242.                 else
  243.                     width *= gr_cw;
  244.  
  245.                 switch (par_ptr->ob_spec.tedinfo->te_just)
  246.                 {
  247.                 case TE_LEFT:
  248.                     ob_ptr->ob_x = 0;
  249.                     break;
  250.                 case TE_RIGHT:
  251.                     ob_ptr->ob_x = par_ptr->ob_width - width;
  252.                     break;
  253.                 case TE_CNTR:
  254.                     ob_ptr->ob_x = (par_ptr->ob_width - width)>>1;
  255.                 }
  256.  
  257.                 if (par_ptr->ob_spec.tedinfo->te_font==SMALL)
  258.                     ob_ptr->ob_x += (int) ((long) (pos - text) * gr_sw);
  259.                 else
  260.                     ob_ptr->ob_x += (int) ((long) (pos - text) * gr_cw);
  261.                 break;
  262.             case G_BUTTON:
  263.                 width *= gr_cw;
  264.                 ob_ptr->ob_x = (par_ptr->ob_width - width)>>1;
  265.                 ob_ptr->ob_x += (int) ((long) (pos - text) * gr_cw);
  266.                 break;
  267.             case G_STRING:
  268.                 ob_ptr->ob_x = (int) ((long) (pos - text) * gr_cw);
  269.                 break;
  270.             default:
  271.                 return(FALSE);
  272.             }
  273.         }
  274.         else if ((unsigned char) par_ptr->ob_type==G_BOXCHAR)
  275.         {
  276.             if (par_ptr->ob_spec.obspec.character==hot)
  277.                 ob_ptr->ob_x = (par_ptr->ob_width - gr_cw)>>1;
  278.             else
  279.                 return(FALSE);
  280.         }
  281.         else if (hot) 
  282.             return(FALSE);
  283.  
  284.         if (hot=='\0')
  285.             ob_ptr->ob_flags |= HIDETREE;
  286.         else
  287.             ob_ptr->ob_flags &= ~HIDETREE;
  288.  
  289.         ob_ptr->ob_state &= 0x00ff;
  290.         ob_ptr->ob_state |= _upper(hot)<<8;
  291.  
  292.         return (TRUE);
  293.     }
  294.  
  295.     return(FALSE);
  296. }
  297.