home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 10.ddi / TVSRC.ZIP / TSCRLBAR.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  9.5 KB  |  343 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tscrlbar.cpp                              */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TScrollBar member functions               */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision -  Version 1.0                             */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Copyright (c) 1991 by Borland International             */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*------------------------------------------------------------*/
  17.  
  18. #define Uses_TKeys
  19. #define Uses_TScrollBar
  20. #define Uses_TRect
  21. #define Uses_TDrawBuffer
  22. #define Uses_TEvent
  23. #define Uses_TGroup
  24. #define Uses_opstream
  25. #define Uses_ipstream
  26. #include <tv.h>
  27.  
  28. #if !defined( __CTYPE_H )
  29. #include <ctype.h>
  30. #endif  // __CTYPE_H
  31.  
  32. #if !defined( __STRING_H )
  33. #include <String.h>
  34. #endif  // __STRING_H
  35.  
  36. #if !defined( __DOS_H )
  37. #include <Dos.h>
  38. #endif  // __DOS_H
  39.  
  40. #define cpScrollBar  "\x04\x05\x05"
  41.  
  42. TScrollBar::TScrollBar( const TRect& bounds ) :
  43.     TView( bounds ),
  44.     value( 0 ),
  45.     minVal( 0 ),
  46.     maxVal( 0 ),
  47.     pgStep( 1 ),
  48.     arStep( 1 )
  49. {
  50.     if( size.x == 1 )
  51.         {
  52.         growMode = gfGrowLoX | gfGrowHiX | gfGrowHiY;
  53.         memcpy( chars, vChars, sizeof(vChars) );
  54.         }
  55.     else
  56.         {
  57.         growMode = gfGrowLoY | gfGrowHiX | gfGrowHiY;
  58.         memcpy( chars, hChars, sizeof(hChars) );
  59.         }
  60. }
  61.  
  62. void TScrollBar::draw()
  63. {
  64.     drawPos(getPos());
  65. }
  66.  
  67. void TScrollBar::drawPos( short pos )
  68. {
  69.     TDrawBuffer b;
  70.  
  71.     short s = getSize() - 1;
  72.     b.moveChar( 0, chars[0], getColor(2), 1 );
  73.     if( maxVal == minVal )
  74.         b.moveChar( 1, chars[4], getColor(1), s-1 );
  75.     else
  76.         {
  77.         b.moveChar( 1, chars[2], getColor(1), s-1 );
  78.         b.moveChar( pos, chars[3], getColor(3), 1 );
  79.         }
  80.  
  81.     b.moveChar( s, chars[1], getColor(2), 1 );
  82.     writeBuf( 0, 0, size.x, size.y, b );
  83. }
  84.  
  85. TPalette& TScrollBar::getPalette() const
  86. {
  87.     static TPalette palette( cpScrollBar, sizeof( cpScrollBar )-1 );
  88.     return palette;
  89. }
  90.  
  91. short TScrollBar::getPos()
  92. {
  93.     short r = maxVal - minVal;
  94.     if( r == 0 )
  95.         return 1;
  96.     else
  97.         return  short(( ((long(value - minVal) * (getSize() - 3)) + (r >> 1)) / r) + 1);
  98. }
  99.  
  100. short TScrollBar::getSize()
  101. {
  102.     short s;
  103.  
  104.     if( size.x == 1 )
  105.         s = size.y;
  106.     else
  107.         s = size.x;
  108.  
  109.     return max( 3, s );
  110. }
  111.  
  112. static TPoint mouse;
  113. static short p, s;
  114. static TRect extent;
  115.  
  116. short TScrollBar::getPartCode()
  117. {
  118.     short part= - 1;
  119.     if( extent.contains(mouse) )
  120.         {
  121.         short mark = (size.x == 1) ? mouse.y : mouse.x;
  122.  
  123.         if (mark == p)
  124.             part= sbIndicator;
  125.         else
  126.             {
  127.             if( mark < 1 )
  128.                 part = sbLeftArrow;
  129.             else if( mark < p )
  130.                 part= sbPageLeft;
  131.             else if( mark < s )
  132.                 part= sbPageRight;
  133.             else
  134.                 part= sbRightArrow;
  135.  
  136.             if( size.x == 1 )
  137.                 part += 4;
  138.             }
  139.         }
  140.     return part;
  141. }
  142.  
  143. void TScrollBar::handleEvent( TEvent& event )
  144. {
  145.     Boolean Tracking;
  146.     short i, clickPart;
  147.  
  148.     TView::handleEvent(event);
  149.     switch( event.what )
  150.         {
  151.         case evMouseDown:
  152.             message(owner, evBroadcast, cmScrollBarClicked,this); // Clicked()
  153.             mouse = makeLocal( event.mouse.where );
  154.             extent = getExtent();
  155.             extent.grow(1, 1);
  156.             p = getPos();
  157.             s = getSize() - 1;
  158.             clickPart= getPartCode();
  159.             if( clickPart != sbIndicator )
  160.                 {
  161.                 do  {
  162.                     mouse = makeLocal( event.mouse.where );
  163.                     if( getPartCode() == clickPart )
  164.                         setValue(value + scrollStep(clickPart) );
  165.                     } while( mouseEvent(event, evMouseAuto) );
  166.                 }
  167.             else
  168.                 {
  169.                 do  {
  170.                     mouse = makeLocal( event.mouse.where );
  171.                     Tracking = extent.contains(mouse);
  172.                     if( Tracking )
  173.                         {
  174.                         if( size.x == 1 )
  175.                             i = mouse.y;
  176.                         else
  177.                             i = mouse.x;
  178.                         i = max( i, 1 );
  179.                         i = min( i, s-1 );
  180.                         }
  181.                     else
  182.                         i = getPos();
  183.                     if(i != p )
  184.                         {
  185.                         drawPos(i);
  186.                         p = i;
  187.                         }
  188.                     } while( mouseEvent(event,evMouseMove) );
  189.                 if( Tracking && s > 2 )
  190.                     {
  191.                     s -= 2;
  192.                     setValue( short(((long(p - 1) * (maxVal - minVal) + (s >> 1)) / s) + minVal));
  193.                     }
  194.                 }
  195.             clearEvent(event);
  196.             break;
  197.         case  evKeyDown:
  198.             if( (state & sfVisible) != 0 )
  199.                 {
  200.                 clickPart = sbIndicator;
  201.                 if( size.y == 1 )
  202.                     switch( ctrlToArrow(event.keyDown.keyCode) )
  203.                         {
  204.                         case kbLeft:
  205.                             clickPart = sbLeftArrow;
  206.                             break;
  207.                         case kbRight:
  208.                             clickPart = sbRightArrow;
  209.                             break;
  210.                         case kbCtrlLeft:
  211.                             clickPart = sbPageLeft;
  212.                             break;
  213.                         case kbCtrlRight:
  214.                             clickPart = sbPageRight;
  215.                             break;
  216.                         case kbHome:
  217.                             i = minVal;
  218.                             break;
  219.                         case kbEnd:
  220.                             i = maxVal;
  221.                             break;
  222.                         default:
  223.                             return;
  224.                         }
  225.                 else
  226.                     switch( ctrlToArrow(event.keyDown.keyCode) )
  227.                         {
  228.                         case kbUp:
  229.                             clickPart = sbUpArrow;
  230.                             break;
  231.                         case kbDown:
  232.                             clickPart = sbDownArrow;
  233.                             break;
  234.                         case kbPgUp:
  235.                             clickPart = sbPageUp;
  236.                             break;
  237.                         case kbPgDn:
  238.                             clickPart = sbPageDown;
  239.                             break;
  240.                         case kbCtrlPgUp:
  241.                             i = minVal;
  242.                             break;
  243.                         case kbCtrlPgDn:
  244.                             i = maxVal;
  245.                             break;
  246.                         default:
  247.                             return;
  248.                         }
  249.                 message(owner,evBroadcast,cmScrollBarClicked,this); // Clicked
  250.                 if( clickPart != sbIndicator )
  251.                     i = value + scrollStep(clickPart);
  252.                 setValue(i);
  253.                 clearEvent(event);
  254.                 }
  255.         }
  256. }
  257.  
  258. void TScrollBar::scrollDraw()
  259. {
  260.     message(owner, evBroadcast, cmScrollBarChanged,this);
  261. }
  262.  
  263. short TScrollBar::scrollStep( short part )
  264. {
  265.     short  step;
  266.  
  267.     if( !(part & 2) )
  268.         step = arStep;
  269.     else
  270.         step = pgStep;
  271.     if( !(part & 1) )
  272.         return -step;
  273.     else
  274.         return step;
  275. }
  276.  
  277. void TScrollBar::setParams( short aValue,
  278.                             short aMin,
  279.                             short aMax,
  280.                             short aPgStep,
  281.                             short aArStep
  282.                           )
  283. {
  284.  short  sValue;
  285.  
  286.     aMax = max( aMax, aMin );
  287.     aValue = max( aMin, aValue );
  288.     aValue = min( aMax, aValue );
  289.     sValue = value;
  290.     if( sValue != aValue || minVal != aMin || maxVal != aMax )
  291.         {
  292.         value = aValue;
  293.         minVal = aMin;
  294.         maxVal = aMax;
  295.         drawView();
  296.         if( sValue != aValue )
  297.             scrollDraw();
  298.         }
  299.     pgStep = aPgStep;
  300.     arStep = aArStep;
  301. }
  302.  
  303. void TScrollBar::setRange( short aMin, short aMax )
  304. {
  305.     setParams( value, aMin, aMax, pgStep, arStep );
  306. }
  307.  
  308. void TScrollBar::setStep( short aPgStep, short aArStep )
  309. {
  310.     setParams( value, minVal, maxVal, aPgStep, aArStep );
  311. }
  312.  
  313. void TScrollBar::setValue( short aValue )
  314. {
  315.     setParams( aValue, minVal, maxVal, pgStep, arStep );
  316. }
  317.  
  318. void TScrollBar::write( opstream& os )
  319. {
  320.     TView::write( os );
  321.     os << value << minVal << maxVal << pgStep << arStep;
  322.     os.writeBytes(chars, sizeof(chars));
  323. }
  324.  
  325. void *TScrollBar::read( ipstream& is )
  326. {
  327.     TView::read( is );
  328.     is >> value >> minVal >> maxVal >> pgStep >> arStep;
  329.     is.readBytes(chars, sizeof(TScrollChars));
  330.     return this;
  331. }
  332.  
  333. TStreamable *TScrollBar::build()
  334. {
  335.     return new TScrollBar( streamableInit );
  336. }
  337.  
  338. TScrollBar::TScrollBar( StreamableInit ) : TView( streamableInit )
  339. {
  340. }
  341.  
  342.  
  343.