home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tv20cpp.zip / src / TScroller.cpp < prev    next >
C/C++ Source or Header  |  1998-01-19  |  4KB  |  189 lines

  1. /*
  2.  * TScroller.cc
  3.  *
  4.  * Turbo Vision - Version 2.0
  5.  *
  6.  * Copyright (c) 1994 by Borland International
  7.  * All Rights Reserved.
  8.  *
  9.  * Modified by Sergio Sigala <ssigala@globalnet.it>
  10.  */
  11.  
  12. #define Uses_TScroller
  13. #define Uses_TScrollBar
  14. #define Uses_TEvent
  15. #define Uses_TRect
  16. #define Uses_opstream
  17. #define Uses_ipstream
  18. #include <tvision/tv.h>
  19.  
  20. #include <ctype.h>
  21. #include <string.h>
  22.  
  23. #define cpScroller "\x06\x07"
  24.  
  25. TScroller::TScroller( const TRect& bounds,
  26.                       TScrollBar *aHScrollBar,
  27.                       TScrollBar *aVScrollBar) :
  28.     TView( bounds ),
  29.     drawLock( 0 ),
  30.     drawFlag( False ),
  31.     hScrollBar( aHScrollBar ),
  32.     vScrollBar( aVScrollBar )
  33. {
  34.     delta.x = delta.y = limit.x = limit.y = 0;
  35.     options |= ofSelectable;
  36.     eventMask |= evBroadcast;
  37. }
  38.  
  39. void TScroller::shutDown()
  40. {
  41.     hScrollBar = 0;
  42.     vScrollBar = 0;
  43.     TView::shutDown();
  44. }
  45.  
  46. void TScroller::changeBounds( const TRect& bounds )
  47. {
  48.     setBounds(bounds);
  49.     drawLock++;
  50.     setLimit(limit.x, limit.y);
  51.     drawLock--;
  52.     drawFlag = False;
  53.     drawView();
  54. }
  55.  
  56. void TScroller::checkDraw()
  57. {
  58.     if( drawLock == 0 && drawFlag != False )
  59.         {
  60.         drawFlag = False;
  61.         drawView();
  62.         }
  63. }
  64.  
  65. TPalette& TScroller::getPalette() const
  66. {
  67.     static TPalette palette( cpScroller, sizeof( cpScroller )-1 );
  68.     return palette;
  69. }
  70.  
  71. void TScroller::handleEvent(TEvent& event)
  72. {
  73.     TView::handleEvent(event);
  74.  
  75.     if( event.what == evBroadcast &&
  76.         event.message.command == cmScrollBarChanged &&
  77.           ( event.message.infoPtr == hScrollBar ||
  78.             event.message.infoPtr == vScrollBar )
  79.       )
  80.         scrollDraw();
  81. }
  82.  
  83. void TScroller::scrollDraw()
  84. {
  85.     TPoint  d;
  86.  
  87.     if( hScrollBar != 0 )
  88.         d.x = hScrollBar->value;
  89.     else
  90.         d.x = 0;
  91.  
  92.     if( vScrollBar != 0 )
  93.         d.y = vScrollBar->value;
  94.     else
  95.         d.y = 0;
  96.  
  97.     if( d.x != delta.x || d.y != delta.y )
  98.         {
  99.         setCursor( cursor.x + delta.x - d.x, cursor.y + delta.y - d.y );
  100.         delta = d;
  101.         if( drawLock != 0 )
  102.             drawFlag = True;
  103.         else
  104.             drawView();
  105.         }
  106. }
  107.  
  108. void TScroller::scrollTo( int x, int y )
  109. {
  110.     drawLock++;
  111.     if( hScrollBar != 0 )
  112.         hScrollBar->setValue(x);
  113.     if( vScrollBar != 0 )
  114.         vScrollBar->setValue(y);
  115.     drawLock--;
  116.     checkDraw();
  117. }
  118.  
  119. void TScroller::setLimit( int x, int y )
  120. {
  121.     limit.x = x;
  122.     limit.y = y;
  123.     drawLock++;
  124.     if( hScrollBar != 0 )
  125.         hScrollBar->setParams( hScrollBar->value,
  126.                                0,
  127.                                x - size.x,
  128.                                size.x-1,
  129.                                hScrollBar->arStep
  130.                              );
  131.     if( vScrollBar != 0 )
  132.         vScrollBar->setParams( vScrollBar->value,
  133.                                0,
  134.                                y - size.y,
  135.                                size.y-1,
  136.                                vScrollBar->arStep
  137.                              );
  138.     drawLock--;
  139.     checkDraw();
  140. }
  141.  
  142. void TScroller::showSBar( TScrollBar *sBar )
  143. {
  144.     if( sBar != 0 )
  145.         if( getState(sfActive | sfSelected) != 0 )
  146.             sBar->show();
  147.         else
  148.             sBar->hide();
  149. }
  150.  
  151. void TScroller::setState( ushort aState, Boolean enable )
  152. {
  153.     TView::setState(aState, enable);
  154.     if( (aState & (sfActive | sfSelected)) != 0 )
  155.         {
  156.         showSBar(hScrollBar);
  157.         showSBar(vScrollBar);
  158.         }
  159. }
  160.  
  161. #if !defined(NO_STREAMABLE)
  162.  
  163. void TScroller::write( opstream& os )
  164. {
  165.     TView::write( os );
  166.     os << hScrollBar << vScrollBar << delta << limit;
  167. }
  168.  
  169. void *TScroller::read( ipstream& is )
  170. {
  171.     TView::read( is );
  172.     is >> hScrollBar >> vScrollBar >> delta >> limit;
  173.     drawLock = 0;
  174.     drawFlag = False;
  175.     return this;
  176. }
  177.  
  178. TStreamable *TScroller::build()
  179. {
  180.     return new TScroller( streamableInit );
  181. }
  182.  
  183. TScroller::TScroller( StreamableInit ) : TView( streamableInit )
  184. {
  185. }
  186.  
  187.  
  188. #endif
  189.