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 / GRAF.C < prev    next >
C/C++ Source or Header  |  1994-03-09  |  10KB  |  442 lines

  1.  
  2. #include <time.h>
  3. #include "proto.h"
  4.  
  5. static EVENT event =
  6. { 0,1,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,{0,0,0,0,0,0,0,0} };
  7.  
  8. static void draw_rubber(int *);
  9.  
  10. static int mouse_index;
  11. static long last_mouse;
  12.  
  13. static MFORM mouse_form[4] = {
  14. { 7,7,1,0,1,
  15.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  16.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  17.   {0x0000, 0x03C0, 0x0CF0, 0x10F8, 0x20FC, 0x20FC, 0x40FE, 0x40FE, 
  18.    0x7F02, 0x7F02, 0x3F04, 0x3F04, 0x1F08, 0x0F30, 0x03C0, 0x0000}},
  19. { 7,7,1,0,1,
  20.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  21.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  22.   {0x0000, 0x03C0, 0x0C30, 0x1008, 0x381C, 0x3C3C, 0x7E7E, 0x7FFE, 
  23.    0x7FFE, 0x7E7E, 0x3C3C, 0x381C, 0x1008, 0x0C30, 0x03C0, 0x0000}},
  24. { 7,7,1,0,1,
  25.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  26.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  27.   {0x0000, 0x03C0, 0x0F30, 0x1F08, 0x3F04, 0x3F04, 0x7F02, 0x7F02, 
  28.    0x40FE, 0x40FE, 0x20FC, 0x20FC, 0x10F8, 0x0CF0, 0x03C0, 0x0000}},
  29. { 7,7,1,0,1,
  30.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  31.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  32.   {0x0000, 0x03C0, 0x0FF0, 0x1FF8, 0x2FF4, 0x27E4, 0x43C2, 0x4182, 
  33.    0x4182, 0x43C2, 0x27E4, 0x2FF4, 0x1FF8, 0x0FF0, 0x03C0, 0x0000}}};
  34.  
  35. void graf_busy_mouse(void)
  36. {
  37.     long time;
  38.  
  39.     if (((time=clock())-last_mouse)<20)
  40.         return;
  41.  
  42.     last_mouse = time;
  43.     graf_mouse(USER_DEF,&mouse_form[mouse_index++]);
  44.     mouse_index &= 3;
  45. }
  46.  
  47. void graf_rt_slidebox(SLINFO *sl,int obj)
  48. {
  49.     reg DIAINFO *info = sl->sl_info;
  50.     reg OBJECT *ptree = info->di_tree;
  51.     reg OBJECT *ob_ptr = ptree+sl->sl_slider,*par_ptr = ptree+sl->sl_parent;
  52.     reg int pos,prev,max_pos,max_val;
  53.     reg long y;
  54.     int    top,start_x,start_y,delta,events,flag = 0,count,index,offset = 0;
  55.     boolean sl_mode;
  56.     GRECT par;
  57.  
  58.     if (info->di_flag>=WINDOW)
  59.     {
  60.         wind_get(0,WF_TOP,&top);
  61.         top = (top==info->di_handle);
  62.     }
  63.     else
  64.         top = TRUE;
  65.  
  66.     start_x = ob_ptr->ob_x;
  67.     start_y = ob_ptr->ob_y;
  68.  
  69.     if ((max_val = sl->sl_max - sl->sl_page)<0)
  70.         max_val = 0;
  71.  
  72.     if (obj==sl->sl_dec || obj==sl->sl_inc)
  73.     {
  74.         sl_mode = TRUE;
  75.         count = index = 0;
  76.         if (obj==sl->sl_dec)
  77.             sl->sl_dec = FAIL;
  78.         else
  79.             sl->sl_inc = FAIL;
  80.     }
  81.     else
  82.     {
  83.         if (obj==sl->sl_slider)
  84.         {
  85.             _mouse_pos(&event.ev_mm1x, &event.ev_mm1y);
  86.             start_x -= event.ev_mm1x;
  87.             start_y -= event.ev_mm1y;
  88.             sl_mode = FAIL;
  89.         }
  90.         else
  91.         {
  92.             _mouse_pos(&start_x, &start_y);
  93.             sl_mode = FALSE;
  94.         }
  95.     }
  96.  
  97.     objc_offset(ptree,sl->sl_parent,&par.g_x,&par.g_y);
  98.     par.g_w = par_ptr->ob_width;
  99.     par.g_h = par_ptr->ob_height;
  100.  
  101.     if (sl->sl_vh)
  102.         max_pos = par_ptr->ob_height - ob_ptr->ob_height;
  103.     else
  104.         max_pos = par_ptr->ob_width - ob_ptr->ob_width;
  105.  
  106.     _beg_ctrl();
  107.     event.ev_mflags    = MU_BUTTON|MU_TIMER;
  108.     event.ev_mtlocount = sl->sl_speed;
  109.  
  110.     if (sl_mode>0)
  111.         ob_draw_chg(info,obj,NULL,ptree[obj].ob_state | SELECTED,top);
  112.     else if (!sl_mode)
  113.     {
  114.         delta = sl->sl_page - 1;
  115.  
  116.         if (sl->sl_vh)
  117.         {
  118.             if (start_y<par.g_y + ob_ptr->ob_y)
  119.                 delta = -delta;
  120.         }
  121.         else if (start_x<(par.g_x+ob_ptr->ob_x))
  122.             delta = -delta;
  123.     }
  124.     else
  125.     {
  126.         event.ev_mflags = MU_BUTTON|MU_M1;
  127.         graf_mouse (FLAT_HAND,NULL);
  128.     }
  129.  
  130.     if (sl_mode>=0)
  131.         evnt_timer(sl->sl_delay,0);
  132.  
  133.     do
  134.     {
  135.         if (sl_mode>=0 && sl->sl_mode==SL_LOG)
  136.         {
  137.             count++;
  138.             event.ev_mtlocount = sl->sl_speed/count;
  139.         }
  140.  
  141.         events = Event_Multi(&event,0);
  142.         event.ev_mm1x = event.ev_mmox;
  143.         event.ev_mm1y = event.ev_mmoy;
  144.  
  145.         if (max_pos>0)
  146.         {
  147.             prev = sl->sl_pos;
  148.  
  149.             if (sl_mode>0)
  150.             {
  151.                 switch (sl->sl_mode)
  152.                 {
  153.                 case SL_EXP:
  154.                     offset += ++index;
  155.                     break;
  156.                 case SL_LOG:
  157.                     offset = ++index;
  158.                     break;
  159.                 default:
  160.                     offset = 1;
  161.                 }
  162.  
  163.                 if (sl->sl_dec<0)
  164.                     pos = prev - offset;
  165.                 else
  166.                     pos = prev + offset;
  167.  
  168.                 if (pos<0 || pos>max_val)
  169.                     flag = TRUE;
  170.             }
  171.             else if (sl_mode<0)
  172.             {
  173.                 if (sl->sl_vh)
  174.                     pos = start_y + event.ev_mm1y;
  175.                 else
  176.                     pos = start_x + event.ev_mm1x;
  177.                 y = pos; y *= max_val; y /= max_pos;
  178.                 pos = (int) y;
  179.             }
  180.             else
  181.                 pos = prev + delta;
  182.             pos = min(max(pos,0),max_val);
  183.  
  184.             if (pos!=prev)
  185.             {
  186.                 reg GRECT area = par;
  187.                 reg int dif,n_pos,n_prev;
  188.  
  189.                 sl->sl_pos = pos;
  190.  
  191.                 y = pos;y *= max_pos;y /= max_val;
  192.                 n_pos = (int) y;
  193.  
  194.                 y = prev;y *= max_pos;y /= max_val;
  195.                 n_prev = (int) y;
  196.  
  197.                 dif = (n_pos < n_prev) ? (n_prev - n_pos + 1) : (n_pos - n_prev + 1);
  198.  
  199.                 if (sl->sl_vh)
  200.                 {
  201.                     area.g_h = dif;
  202.                     if (n_pos<n_prev)
  203.                         area.g_y += n_pos + ob_ptr->ob_height;
  204.                     else
  205.                         area.g_y += n_prev - 1;
  206.                     ob_ptr->ob_y = n_pos;
  207.                 }
  208.                 else
  209.                 {
  210.                     area.g_w = dif;
  211.                     if (n_pos<n_prev)
  212.                         area.g_x += n_pos + ob_ptr->ob_width;
  213.                     else
  214.                         area.g_x += n_prev - 1;
  215.                     ob_ptr->ob_x = n_pos;
  216.                 }
  217.  
  218.                 if (sl->sl_do)
  219.                     sl->sl_do(ob_ptr,pos,prev,max_val);
  220.  
  221.                 ob_draw_chg(info,sl->sl_slider,NULL,FAIL,top);
  222.                 ob_draw_chg(info,sl->sl_parent,&area,FAIL,top);
  223.  
  224.                 graf_set_slider(sl,ptree,GRAF_SET_ARROWS|GRAF_DRAW_SLIDER);
  225.             }
  226.         }
  227.     } while (!((events & MU_BUTTON) || flag || (sl_mode>0 && sl->sl_mode==SL_STEP)));
  228.  
  229.     if (sl_mode>0)
  230.     {
  231.         if (sl->sl_dec<0)
  232.             sl->sl_dec = obj;
  233.         else
  234.             sl->sl_inc = obj;
  235.         ob_draw_chg(info,obj,NULL,ptree[obj].ob_state & (~SELECTED),top);
  236.         graf_set_slider(sl,ptree,GRAF_SET_ARROWS|GRAF_DRAW_SLIDER);
  237.     }
  238.     else
  239.         graf_mouse(ARROW, NULL);
  240.  
  241.     _no_click();
  242.     _end_ctrl();
  243. }
  244.  
  245. void graf_arrows(SLINFO *sl,OBJECT *tree,int show)
  246. {
  247.     graf_set_slider(sl,tree,(show) ? (GRAF_SET_ARROWS|GRAF_DRAW_SLIDER) : GRAF_SET_ARROWS);
  248. }
  249.  
  250. void graf_set_slider(SLINFO *sl,OBJECT *tree,int show)
  251. {
  252.     reg OBJECT *ob_ptr;
  253.  
  254.     if (sl->sl_info->di_flag==CLOSED)
  255.         show &= ~GRAF_DRAW_SLIDER;
  256.  
  257.     if (show & GRAF_SET_SIZE_POS)
  258.     {
  259.         reg OBJECT *par_ptr;
  260.         reg long y = sl->sl_pos,size;
  261.         reg int vh = sl->sl_vh,max_val = sl->sl_max - sl->sl_page;
  262.  
  263.         par_ptr = tree+sl->sl_parent;
  264.         ob_ptr = tree+sl->sl_slider;
  265.  
  266.         if (sl->sl_page>1)
  267.         {
  268.             size = (vh==VERT_SLIDER) ? par_ptr->ob_height : par_ptr->ob_width;
  269.  
  270.             if (max_val>0)
  271.             {
  272.                 size *= sl->sl_page;
  273.                 size /= sl->sl_max;
  274.             }
  275.             else if (vh==VERT_SLIDER)
  276.                 ob_ptr->ob_y = 0;
  277.             else
  278.                 ob_ptr->ob_x = 0;
  279.         }
  280.         else
  281.             size = (vh==VERT_SLIDER) ? ob_ptr->ob_height : ob_ptr->ob_width;
  282.  
  283.         if (size<gr_ch)
  284.             size = gr_ch;
  285.  
  286.         if (vh==VERT_SLIDER)
  287.         {
  288.             ob_ptr->ob_height = (int) size;
  289.  
  290.             if (max_val>0)
  291.             {
  292.                 y *= (par_ptr->ob_height - (int) size);
  293.                 y /= max_val;
  294.                 ob_ptr->ob_y = (int) y;
  295.             }
  296.         }
  297.         else
  298.         {
  299.             ob_ptr->ob_width = (int) size;
  300.  
  301.             if (max_val>0)
  302.             {
  303.                 y *= (par_ptr->ob_width - (int) size);
  304.                 y /= max_val;
  305.                 ob_ptr->ob_x = (int) y;
  306.             }
  307.         }
  308.  
  309.         if (show & GRAF_DRAW_SLIDER)
  310.             ob_draw_chg(sl->sl_info,sl->sl_parent,NULL,FAIL,FALSE);
  311.     }
  312.  
  313.     if (show & GRAF_SET_ARROWS)
  314.     {
  315.         if (sl->sl_dec>0)
  316.         {
  317.             reg int state;
  318.     
  319.             ob_ptr = tree+sl->sl_dec;
  320.             state = ob_ptr->ob_state;
  321.  
  322.             if (sl->sl_pos>0)
  323.                 state &= ~DISABLED;
  324.             else
  325.                 state |= DISABLED;
  326.     
  327.             if (state!=ob_ptr->ob_state)
  328.             {
  329.                 ob_ptr->ob_state = state;
  330.         
  331.                 if (show & GRAF_DRAW_SLIDER)
  332.                     ob_draw_chg(sl->sl_info,sl->sl_dec,NULL,FAIL,FALSE);
  333.             }
  334.         }
  335.         
  336.         if (sl->sl_inc>0)
  337.         {
  338.             reg int state;
  339.     
  340.             ob_ptr = tree+sl->sl_inc;
  341.             state = ob_ptr->ob_state;
  342.  
  343.             if (sl->sl_pos<(sl->sl_max - sl->sl_page))
  344.                 state &= ~DISABLED;
  345.             else
  346.                 state |= DISABLED;
  347.     
  348.             if (state!=ob_ptr->ob_state)
  349.             {
  350.                 ob_ptr->ob_state = state;
  351.         
  352.                 if (show & GRAF_DRAW_SLIDER)
  353.                     ob_draw_chg(sl->sl_info,sl->sl_inc,NULL,FAIL,FALSE);
  354.             }
  355.         }
  356.     }
  357. }
  358.  
  359. int graf_rt_rubberbox(int s_x,int s_y,GRECT *rect,int *r_w,int *r_h,void (*call_func)(int *new_rect))
  360. {
  361.     EVENT event;
  362.     reg int pxy[4],rect_xy[4];
  363.     reg int events,max_1,max_2,dif;
  364.  
  365.     if (!rc_inside(s_x,s_y,rect))
  366.         return(FALSE);
  367.  
  368.     rc_grect_to_array(rect,rect_xy);
  369.  
  370.     pxy[0] = s_x;
  371.     pxy[1] = s_y;
  372.  
  373.     max_1 = min(s_x - rect_xy[0],s_y - rect_xy[1]);
  374.     max_2 = min(rect_xy[2] - s_x,rect_xy[3] - s_y);
  375.  
  376.     _vdi_attr(MD_XOR,1,1);
  377.     vsl_type(x_handle,7);
  378.  
  379.     _beg_ctrl();    
  380.     graf_mouse(POINT_HAND,NULL);
  381.     _mouse_pos(&event.ev_mm1x,&event.ev_mm1y);
  382.  
  383.     event.ev_mflags = MU_BUTTON|MU_M1;
  384.     event.ev_mbclicks = event.ev_bmask = event.ev_mm1flags = 1;
  385.     event.ev_mbstate = 0;
  386.     event.ev_mm1width = event.ev_mm1height = event.ev_mmokstate = 1;
  387.     do
  388.     {
  389.         pxy[2] = max(event.ev_mm1x,rect_xy[0]);
  390.         Min(pxy+2,rect_xy[2]);
  391.  
  392.         pxy[3] = max(event.ev_mm1y,rect_xy[1]);
  393.         Min(pxy+3,rect_xy[3]);
  394.  
  395.         if (event.ev_mmokstate)
  396.         {
  397.             dif = pxy[2] - pxy[0];
  398.             dif = (dif>0) ? min(dif,max_2) : max(dif,-max_1);
  399.             pxy[2] = pxy[0] + dif;
  400.             pxy[3] = pxy[1] + dif;
  401.         }
  402.  
  403.         draw_rubber(pxy);
  404.  
  405.         if (call_func)
  406.             call_func(pxy);
  407.  
  408.         events = Event_Multi(&event,0);
  409.  
  410.         draw_rubber(pxy);
  411.     }
  412.     while(!(events & MU_BUTTON));
  413.  
  414.     vsl_udsty(x_handle,0x5555);
  415.     vsl_type(x_handle,1);
  416.  
  417.     graf_mouse(ARROW,NULL);
  418.     _end_ctrl();    
  419.  
  420.     *r_w = pxy[2] - pxy[0];
  421.     *r_h = pxy[3] - pxy[1];
  422.  
  423.     return(TRUE);
  424. }
  425.  
  426. void draw_rubber(reg int *pxy)
  427. {
  428.     graf_mouse(M_OFF,0l);
  429.     vsl_udsty(x_handle,(pxy[0] & 1) == (pxy[1] & 1) ? 21845 : (int) 43690L);
  430.     _line(pxy[0],pxy[1],pxy[0],pxy[3]);
  431.     
  432.     vsl_udsty(x_handle,(pxy[2] & 1) == (pxy[1] & 1) ? 21845 : (int) 43690L);
  433.     _line(pxy[2],pxy[1],pxy[2],pxy[3]);
  434.  
  435.     vsl_udsty(x_handle,(pxy[1] & 1) ? (int) 43690L : 21845);
  436.     _line(pxy[0],pxy[1],pxy[2],pxy[1]);
  437.     
  438.     vsl_udsty(x_handle,(pxy[3] & 1) ? (int) 43690L : 21845);
  439.     _line(pxy[0],pxy[3],pxy[2],pxy[3]);
  440.     graf_mouse(M_ON,0l);
  441. }
  442.