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

  1. /*------------------------------------------------------------*/
  2. /* filename -       tlstview.cpp                              */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TListViewer 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_TListViewer
  20. #define Uses_TScrollBar
  21. #define Uses_TDrawBuffer
  22. #define Uses_TPoint
  23. #define Uses_TEvent
  24. #define Uses_TGroup
  25. #define Uses_opstream
  26. #define Uses_ipstream
  27. #include <tv.h>
  28.  
  29. #if !defined( __MEM_H )
  30. #include <Mem.h>
  31. #endif  // __MEM_H
  32.  
  33. #define cpListViewer "\x1A\x1A\x1B\x1C\x1D"
  34.  
  35. TListViewer::TListViewer( const TRect& bounds,
  36.                           ushort aNumCols,
  37.                           TScrollBar *aHScrollBar,
  38.                           TScrollBar *aVScrollBar) :
  39.     TView( bounds ),
  40.     range( 0 ),
  41.     numCols( aNumCols ),
  42.     focused( 0 ),
  43.     topItem( 0 )
  44. {
  45.     short arStep, pgStep;
  46.  
  47.     options |= ofFirstClick | ofSelectable;
  48.     eventMask |= evBroadcast;
  49.     if( aVScrollBar != 0 )
  50.         {
  51.         if( numCols == 1 )
  52.             {
  53.             pgStep = size.y - 1;
  54.             arStep = 1;
  55.             }
  56.         else
  57.             {
  58.             pgStep = size.y * numCols;
  59.             arStep = size.y;
  60.             }
  61.         aVScrollBar->setStep( pgStep, arStep );
  62.         }
  63.  
  64.     if( aHScrollBar != 0 )
  65.         aHScrollBar->setStep( size.x / numCols, 1 );
  66.  
  67.     hScrollBar = aHScrollBar;
  68.     vScrollBar = aVScrollBar;
  69. }
  70.  
  71. void TListViewer::changeBounds( const TRect& bounds )
  72. {
  73.     TView::changeBounds( bounds );
  74.     if( hScrollBar != 0 )
  75.         hScrollBar->setStep( size.x / numCols, 1 );
  76. }
  77.  
  78. void TListViewer::draw()
  79. {
  80.  short i, j, item;
  81.  ushort normalColor, selectedColor, focusedColor, color;
  82.  short colWidth, curCol, indent;
  83.  TDrawBuffer b;
  84.  uchar scOff;
  85.  
  86.     if( (state&(sfSelected | sfActive)) == (sfSelected | sfActive))
  87.         {
  88.         normalColor = getColor(1);
  89.         focusedColor = getColor(3);
  90.         selectedColor = getColor(4);
  91.         }
  92.     else
  93.         {
  94.         normalColor = getColor(2);
  95.         selectedColor = getColor(4);
  96.         }
  97.  
  98.     if( hScrollBar != 0 )
  99.         indent = hScrollBar->value;
  100.     else
  101.         indent = 0;
  102.  
  103.     colWidth = size.x / numCols + 1;
  104.     for( i = 0; i < size.y; i++ )
  105.         {
  106.         for( j = 0; j < numCols; j++ )
  107.             {
  108.             item =  j * size.y + i + topItem;
  109.             curCol = j * colWidth;
  110.             if( (state & (sfSelected | sfActive)) == (sfSelected | sfActive) &&
  111.                 focused == item &&
  112.                 range > 0)
  113.                 {
  114.                 color = focusedColor;
  115.                 setCursor( curCol + 1, i );
  116.                 scOff = 0;
  117.                 }
  118.             else if( item < range && isSelected(item) )
  119.                 {
  120.                 color = selectedColor;
  121.                 scOff = 2;
  122.                 }
  123.             else
  124.                 {
  125.                 color = normalColor;
  126.                 scOff = 4;
  127.                 }
  128.  
  129.             b.moveChar( curCol, ' ', color, colWidth );
  130.             if( item < range )
  131.                 {
  132.                 char text[256];
  133.                 getText( text, item, colWidth + indent );
  134.                 char buf[256];
  135.                 memmove( buf, text+indent, colWidth );
  136.                 buf[colWidth] = EOS;
  137.                 b.moveStr( curCol+1, buf, color );
  138.                 if( showMarkers )
  139.                     {
  140.                     b.putChar( curCol, specialChars[scOff] );
  141.                     b.putChar( curCol+colWidth-2, specialChars[scOff+1] );
  142.                     }
  143.                 }
  144.             else if( i == 0 && j == 0 )
  145.                 b.moveStr( curCol+1, "<empty>", getColor(1) );
  146.  
  147.             b.moveChar( curCol+colWidth-1, 179, getColor(5), 1 );
  148.             }
  149.         writeLine( 0, i, size.x, 1, b );
  150.         }
  151. }
  152.  
  153. void TListViewer::focusItem( short item )
  154. {
  155.     focused = item;
  156.     if( vScrollBar != 0 )
  157.         vScrollBar->setValue( item );
  158.     if( item < topItem )
  159.         if( numCols == 1 )
  160.             topItem = item;
  161.         else
  162.             topItem = item - item % size.y;
  163.     else
  164.         if( item >= topItem + size.y*numCols )
  165.             if( numCols == 1 )
  166.                 topItem = item - size.y + 1;
  167.             else
  168.                 topItem = item - item % size.y - (size.y * (numCols-1));
  169. }
  170.  
  171. void TListViewer::focusItemNum( short item )
  172. {
  173.     if( item < 0 )
  174.         item = 0;
  175.     else
  176.         if( item >= range && range > 0 )
  177.             item = range - 1;
  178.  
  179.     if( range !=  0 )
  180.         focusItem( item );
  181. }
  182.  
  183. TPalette& TListViewer::getPalette() const
  184. {
  185.     static TPalette palette( cpListViewer, sizeof( cpListViewer )-1 );
  186.     return palette;
  187. }
  188.  
  189. void TListViewer::getText( char *dest, short, short )
  190. {
  191.     *dest = EOS;
  192. }
  193.  
  194. Boolean TListViewer::isSelected( short item )
  195. {
  196.     return Boolean( item == focused );
  197. }
  198.  
  199. void TListViewer::handleEvent( TEvent& event )
  200. {
  201.     TPoint mouse;
  202.     ushort colWidth;
  203.     short  oldItem, newItem;
  204.     ushort count;
  205.     int mouseAutosToSkip = 4;
  206.  
  207.     TView::handleEvent(event);
  208.  
  209.     if( event.what == evMouseDown )
  210.         {
  211.         colWidth = size.x / numCols + 1;
  212.         oldItem =  focused;
  213.         mouse = makeLocal( event.mouse.where );
  214.         newItem = mouse.y + (size.y * (mouse.x / colWidth)) + topItem;
  215.         count = 0;
  216.         do  {
  217.             if( newItem != oldItem )
  218.                 focusItemNum( newItem );
  219.             oldItem = newItem;
  220.             mouse = makeLocal( event.mouse.where );
  221.             if( mouseInView( event.mouse.where ) )
  222.                 newItem = mouse.y + (size.y * (mouse.x / colWidth)) + topItem;
  223.             else
  224.                 {
  225.                 if( numCols == 1 )
  226.                     {
  227.                     if( event.what == evMouseAuto )
  228.                         count++;
  229.                     if( count == mouseAutosToSkip )
  230.                         {
  231.                         count = 0;
  232.                         if( mouse.y < 0 )
  233.                             newItem = focused - 1;
  234.                         else
  235.                             if( mouse.y >= size.y )
  236.                                 newItem = focused + 1;
  237.                         }
  238.                     }
  239.                 else
  240.                     {
  241.                     if( event.what == evMouseAuto )
  242.                         count++;
  243.                     if( count == mouseAutosToSkip )
  244.                         {
  245.                         count = 0;
  246.                         if( mouse.x < 0 )
  247.                             newItem = focused - size.y;
  248.                         else if( mouse.x >= size.x )
  249.                             newItem = focused + size.y;
  250.                         else if( mouse.y < 0 )
  251.                             newItem = focused - focused % size.y;
  252.                         else if( mouse.y > size.y )
  253.                             newItem = focused - focused % size.y + size.y - 1;
  254.                         }
  255.                     }
  256.                 }
  257.             } while( mouseEvent( event, evMouseMove | evMouseAuto ) );
  258.         focusItemNum( newItem );
  259.         if( event.mouse.doubleClick && range > focused )
  260.             selectItem( focused );
  261.         clearEvent( event );
  262.         }
  263.     else if( event.what == evKeyDown )
  264.         {
  265.         if (event.keyDown.charScan.charCode ==  ' ' && focused < range )
  266.             {
  267.             selectItem( focused );
  268.             newItem = focused;
  269.             }
  270.         else
  271.             {
  272.             switch (ctrlToArrow(event.keyDown.keyCode))
  273.                 {
  274.                 case kbUp:
  275.                     newItem = focused - 1;
  276.                     break;
  277.                 case kbDown:
  278.                     newItem = focused + 1;
  279.                     break;
  280.                 case kbRight:
  281.                     if( numCols > 1 )
  282.                         newItem = focused + size.y;
  283.                     else
  284.                         return;
  285.                     break;
  286.                 case kbLeft:
  287.                     if( numCols > 1 )
  288.                         newItem = focused - size.y;
  289.                     else
  290.                         return;
  291.                     break;
  292.                 case kbPgDn:
  293.                     newItem = focused + size.y * numCols;
  294.                     break;
  295.                 case  kbPgUp:
  296.                     newItem = focused - size.y * numCols;
  297.                     break;
  298.                 case kbHome:
  299.                     newItem = topItem;
  300.                     break;
  301.                 case kbEnd:
  302.                     newItem = topItem + (size.y * numCols) - 1;
  303.                     break;
  304.                 case kbCtrlPgDn:
  305.                     newItem = range - 1;
  306.                     break;
  307.                 case kbCtrlPgUp:
  308.                     newItem = 0;
  309.                     break;
  310.                 default:
  311.                     return;
  312.                 }
  313.             }
  314.         focusItemNum(newItem);
  315.         clearEvent(event);
  316.         }
  317.     else if( event.what == evBroadcast )
  318.         {
  319.         if( (options & ofSelectable) != 0 )
  320.             {
  321.             if( event.message.command == cmScrollBarClicked &&
  322.                   ( event.message.infoPtr == hScrollBar || 
  323.                     event.message.infoPtr == vScrollBar ) )
  324.                 select();
  325.             else if( event.message.command == cmScrollBarChanged )
  326.                 {
  327.                 if( vScrollBar == event.message.infoPtr )
  328.                     {
  329.                     focusItemNum( vScrollBar->value );
  330.                     drawView();
  331.                     }
  332.                 else if( hScrollBar == event.message.infoPtr )
  333.                     drawView();
  334.                 }
  335.             }
  336.         }
  337. }
  338.  
  339. void TListViewer::selectItem( short )
  340. {
  341.     message( owner, evBroadcast, cmListItemSelected, this );
  342. }
  343.  
  344. void TListViewer::setRange( short aRange )
  345. {
  346.     range = aRange;
  347.     if( vScrollBar != 0 )
  348.         {
  349.         if( focused > aRange )
  350.             focused = 0;
  351.         vScrollBar->setParams( focused,
  352.                                0,
  353.                                aRange - 1,
  354.                                vScrollBar->pgStep,
  355.                                vScrollBar->arStep
  356.                              );
  357.         }
  358. }
  359.  
  360. void TListViewer::setState( ushort aState, Boolean enable )
  361. {
  362.     TView::setState( aState, enable );
  363.     if( (aState & (sfSelected | sfActive)) != 0 )
  364.         {
  365.         if( hScrollBar != 0 )
  366.             if( getState(sfActive) )
  367.                 hScrollBar->show();
  368.             else
  369.                 hScrollBar->hide();
  370.         if( vScrollBar != 0 )
  371.             if( getState(sfActive) )
  372.                 vScrollBar->show();
  373.             else
  374.                 vScrollBar->hide();
  375.         drawView();
  376.         }
  377. }
  378.  
  379. void TListViewer::shutDown()
  380. {
  381.      hScrollBar = 0;
  382.      vScrollBar = 0;
  383.      TView::shutDown();
  384. }
  385.  
  386. void TListViewer::write( opstream& os )
  387. {
  388.     TView::write( os );
  389.     os << hScrollBar << vScrollBar << numCols
  390.        << topItem << focused << range;
  391. }
  392.  
  393. void *TListViewer::read( ipstream& is )
  394. {
  395.     TView::read( is );
  396.     is >> hScrollBar >> vScrollBar >> numCols
  397.        >> topItem >> focused >> range;
  398.     return this;
  399. }
  400.  
  401. TStreamable *TListViewer::build()
  402. {
  403.     return new TListViewer( streamableInit );
  404. }
  405.  
  406. TListViewer::TListViewer( StreamableInit ) : TView( streamableInit )
  407. {
  408. }
  409.  
  410.  
  411.