home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_10 / DEVELOP.LZH / FADER / SCROLL.C < prev    next >
C/C++ Source or Header  |  1992-07-24  |  4KB  |  241 lines

  1.  
  2. #include <aes.h>
  3. #include "scroll.h"
  4.  
  5. /*****************************************************************************/
  6.  
  7. extern OBJECT *obj_addr;
  8.  
  9. /*****************************************************************************/
  10.  
  11. void
  12. set_slider( scr, drawflag )
  13. ScrollBox *scr;
  14. short drawflag;
  15. {
  16. long x, z;
  17. OBJECT *scroll, *slider;
  18.  
  19.     scroll = &obj_addr[scr->scrollobj];
  20.     slider = &obj_addr[scr->sliderobj];
  21.  
  22.     x = (long)(scr->value) * 1000L;
  23.     z = (long)scr->maxvalue;
  24.  
  25.     if( (x > 0) && z )
  26.       scr->sliderpos = (short)(x / z);
  27.     else
  28.       scr->sliderpos = 0;
  29.  
  30.     if( scr->alignflag )
  31.     {
  32.         x = z = (long)scroll->ob_height;
  33.  
  34.         if( scr->adj_size )
  35.         {
  36.             x *= scr->slidersize;
  37.             x /= 1000;
  38.             slider->ob_height = (short)x;
  39.         }
  40.         else
  41.           x = slider->ob_height;
  42.  
  43.         x = z - x;
  44.         x *= scr->sliderpos;
  45.         x /= 1000;
  46.  
  47.         if( ! scr->inverted )
  48.           slider->ob_y = (short)x;
  49.         else
  50.           slider->ob_y = scroll->ob_height - slider->ob_height - (short)x;
  51.     }
  52.     else
  53.     {
  54.         x = z = (long)scroll->ob_width;
  55.  
  56.         if( scr->adj_size )
  57.         {
  58.             x *= scr->slidersize;
  59.             x /= 1000;
  60.             slider->ob_width = (short)x;
  61.         }
  62.         else
  63.           x = slider->ob_width;
  64.  
  65.         x = z - x;
  66.         x *= scr->sliderpos;
  67.         x /= 1000;
  68.  
  69.         if( ! scr->inverted )
  70.           slider->ob_x = (short)x;
  71.         else
  72.           slider->ob_x = scroll->ob_width - slider->ob_width - (short)x;
  73.     }
  74.  
  75.     if( scr->val )
  76.     {
  77.         if( (scr->value <= scr->maxvalue) && (scr->value >= 0) )
  78.           sprintf( scr->val, "%d", scr->value );
  79.         else
  80.           sprintf( scr->val, "-" );
  81.     }
  82.     if( drawflag )
  83.       obj_draw( scr->scrollobj );
  84. }
  85.  
  86. void
  87. reset_slider( scr, val, drawflag )
  88. ScrollBox *scr;
  89. short val, drawflag;
  90. {
  91.     scr->value = val;
  92.     set_slider( scr, drawflag );
  93. }
  94.  
  95. void
  96. init_slider( scr, val, numshown, numitems )
  97. ScrollBox *scr;
  98. short val, numshown, numitems;
  99. {
  100. TEDINFO *teddy;
  101.  
  102.     scr->value = val;
  103.     scr->numshown = numshown;
  104.     scr->numitems = numitems;
  105.  
  106.     if( scr->adj_size )
  107.     {
  108.         scr->maxvalue = (numitems + 1 - numshown);
  109.         scr->slidersize = ((5+(scr->numshown * 1000)) / scr->numitems);
  110.     }
  111.  
  112.     if( obj_addr[scr->sliderobj].ob_type == G_BOXTEXT )
  113.     {
  114.         teddy = (TEDINFO *)obj_addr[scr->sliderobj].ob_spec;
  115.         scr->val = teddy->te_ptext;
  116.     }
  117.  
  118.     set_slider( scr, 0 );
  119. }
  120.  
  121. void
  122. scroll_bounds( scr )
  123. ScrollBox *scr;
  124. {
  125.     if( scr->value > scr->maxvalue )
  126.       scr->value = scr->maxvalue;
  127.  
  128.     if( scr->value < 0 )
  129.       scr->value = 0;
  130. }
  131.  
  132.  
  133. short
  134. process_scroll( scr, obj )
  135. ScrollBox *scr;
  136. short obj;
  137. {
  138. short xpos, ypos, button, obj_x, obj_y, obj_bottom;
  139. long tmp;
  140.  
  141.     if( obj == scr->sliderobj )
  142.     {
  143.         scr->sliderpos = graf_slidebox( obj_addr, scr->scrollobj, scr->sliderobj, scr->alignflag );
  144.  
  145.         if( scr->inverted )
  146.           scr->sliderpos = 1000 - scr->sliderpos;
  147.  
  148.         tmp = ((long)scr->maxvalue * (long)scr->sliderpos) / 1000L;
  149.         scr->value = (short)tmp;
  150.  
  151.         scroll_bounds( scr );
  152.         return(1);
  153.     }
  154.  
  155.     if( obj == scr->scrollobj )
  156.     {
  157.         mouse_info( &xpos, &ypos, &button );
  158.         objc_offset( obj_addr, scr->sliderobj, &obj_x, &obj_y );
  159.  
  160.         if( scr->alignflag )
  161.         {
  162.             obj_bottom = obj_y + obj_addr[scr->sliderobj].ob_height;
  163.             if( scr->inverted )
  164.             {
  165.                 if( ypos < obj_y )
  166.                   scr->value += scr->numshown;
  167.                 if( ypos > obj_bottom )
  168.                   scr->value -= scr->numshown;
  169.             }
  170.             else
  171.             {
  172.                 if( ypos < obj_y )
  173.                   scr->value -= scr->numshown;
  174.                 if( ypos > obj_bottom )
  175.                   scr->value += scr->numshown;
  176.             }
  177.         }
  178.         else
  179.         {
  180.             obj_bottom = obj_x + obj_addr[scr->sliderobj].ob_width;
  181.  
  182.             if( scr->inverted )
  183.             {
  184.                 if( xpos < obj_x )
  185.                   scr->value -= scr->numshown;
  186.                 if( xpos > obj_bottom )
  187.                   scr->value += scr->numshown;
  188.             }
  189.             else
  190.             {
  191.                 if( xpos < obj_x )
  192.                   scr->value += scr->numshown;
  193.                 if( xpos > obj_bottom )
  194.                   scr->value -= scr->numshown;
  195.             }
  196.  
  197.         }
  198.         scroll_bounds( scr );
  199.         return(1);
  200.     }
  201.  
  202.     if( obj == scr->up_arrow )
  203.     {
  204.         if( scr->mv_up )
  205.         {
  206.             (*scr->mv_up)();
  207.         }
  208.         else
  209.         {
  210.             if( scr->inverted )
  211.               scr->value++;
  212.             else
  213.               scr->value--;
  214.         }
  215.  
  216.         scroll_bounds( scr );
  217.         return(1);
  218.     }
  219.  
  220.     if( obj == scr->down_arrow )
  221.     {
  222.         if( scr->mv_dwn )
  223.         {
  224.             (*scr->mv_dwn)();
  225.         }
  226.         else
  227.         {
  228.             if( scr->inverted )
  229.               scr->value--;
  230.             else
  231.               scr->value++;
  232.         }
  233.  
  234.         scroll_bounds( scr );
  235.         return(1);
  236.     }
  237.  
  238.     return(0);
  239. }
  240.  
  241.