home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tv20os2.zip / src / TListViewer.cpp < prev    next >
C/C++ Source or Header  |  1999-05-21  |  12KB  |  432 lines

  1. /*
  2.  * TListViewer.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_TKeys
  13. #define Uses_TListViewer
  14. #define Uses_TScrollBar
  15. #define Uses_TDrawBuffer
  16. #define Uses_TPoint
  17. #define Uses_TEvent
  18. #define Uses_TGroup
  19. #define Uses_opstream
  20. #define Uses_ipstream
  21. #include <tvision/tv.h>
  22.  
  23. #include <string.h>
  24.  
  25. #define cpListViewer "\x1A\x1A\x1B\x1C\x1D"
  26.  
  27. TListViewer::TListViewer( const TRect& bounds,
  28.                           ushort aNumCols,
  29.                           TScrollBar *aHScrollBar,
  30.                           TScrollBar *aVScrollBar) :
  31.     TView( bounds ),
  32.     range( 0 ),
  33.     numCols( aNumCols ),
  34.     focused( 0 ),
  35.     topItem( 0 )
  36. {
  37.     short arStep, pgStep;
  38.  
  39.     options |= ofFirstClick | ofSelectable;
  40.     eventMask |= evBroadcast;
  41.     if( aVScrollBar != 0 )
  42.         {
  43.         if( numCols == 1 )
  44.             {
  45.             pgStep = size.y - 1;
  46.             arStep = 1;
  47.             }
  48.         else
  49.             {
  50.             pgStep = size.y * numCols;
  51.             arStep = size.y;
  52.             }
  53.         aVScrollBar->setStep( pgStep, arStep );
  54.         }
  55.  
  56.     if( aHScrollBar != 0 )
  57.         aHScrollBar->setStep( size.x / numCols, 1 );
  58.  
  59.     hScrollBar = aHScrollBar;
  60.     vScrollBar = aVScrollBar;
  61. }
  62.  
  63. void TListViewer::changeBounds( const TRect& bounds )
  64. {
  65.     TView::changeBounds( bounds );
  66.     if( hScrollBar != 0 )
  67.         hScrollBar->setStep( size.x / numCols, hScrollBar->arStep);
  68. #ifndef __UNPATCHED
  69.     if( vScrollBar != 0 )
  70.         vScrollBar->setStep( size.y, vScrollBar->arStep);
  71. #else
  72.     if( vScrollBar != 0 )
  73.         vScrollBar->setStep( size.y, hScrollBar->arStep);
  74. #endif
  75. }
  76.  
  77. void TListViewer::draw()
  78. {
  79.     short i, j, item;
  80. //    ushort normalColor, selectedColor, focusedColor, color; /* XXX */
  81.     ushort normalColor, selectedColor, focusedColor = 0, color; /* XXX */
  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, emptyText, getColor(1) );
  146.  
  147. /*            b.moveChar( curCol+colWidth-1, 179, getColor(5), 1 );*/
  148.             b.moveChar( curCol+colWidth-1, separatorChar, getColor(5), 1 );
  149.             }
  150.         writeLine( 0, i, size.x, 1, b );
  151.         }
  152. }
  153.  
  154. void TListViewer::focusItem( short item )
  155. {
  156.     focused = item;
  157.     if( vScrollBar != 0 )
  158.         vScrollBar->setValue( item );
  159.     else
  160.         drawView();
  161.     if( item < topItem )
  162.         if( numCols == 1 )
  163.             topItem = item;
  164.         else
  165.             topItem = item - item % size.y;
  166.     else
  167.         if( item >= topItem + size.y*numCols )
  168.             if( numCols == 1 )
  169.                 topItem = item - size.y + 1;
  170.             else
  171.                 topItem = item - item % size.y - (size.y * (numCols-1));
  172. }
  173.  
  174. void TListViewer::focusItemNum( short item )
  175. {
  176.     if( item < 0 )
  177.         item = 0;
  178.     else
  179.         if( item >= range && range > 0 )
  180.             item = range - 1;
  181.  
  182.     if( range !=  0 )
  183.         focusItem( item );
  184. }
  185.  
  186. TPalette& TListViewer::getPalette() const
  187. {
  188.     static TPalette palette( cpListViewer, sizeof( cpListViewer )-1 );
  189.     return palette;
  190. }
  191.  
  192. void TListViewer::getText( char *dest, short, short )
  193. {
  194.     *dest = EOS;
  195. }
  196.  
  197. Boolean TListViewer::isSelected( short item )
  198. {
  199.     return Boolean( item == focused );
  200. }
  201.  
  202. void TListViewer::handleEvent( TEvent& event )
  203. {
  204.     TPoint mouse;
  205.     ushort colWidth;
  206.     short  oldItem, newItem;
  207.     ushort count;
  208.     int mouseAutosToSkip = 4;
  209.  
  210.     TView::handleEvent(event);
  211.  
  212.     if( event.what == evMouseDown )
  213.         {
  214.         colWidth = size.x / numCols + 1;
  215.         oldItem =  focused;
  216.         mouse = makeLocal( event.mouse.where );
  217.         if (mouseInView(event.mouse.where))
  218.             newItem = mouse.y + (size.y * (mouse.x / colWidth)) + topItem;
  219.         else
  220.             newItem = oldItem;
  221.         count = 0;
  222.         do  {
  223.             if( newItem != oldItem )
  224.                 {
  225.                 focusItemNum( newItem );
  226.                 drawView();
  227.                 }
  228.             oldItem = newItem;
  229.             mouse = makeLocal( event.mouse.where );
  230.             if( mouseInView( event.mouse.where ) )
  231.                 newItem = mouse.y + (size.y * (mouse.x / colWidth)) + topItem;
  232.             else
  233.                 {
  234.                 if( numCols == 1 )
  235.                     {
  236.                     if( event.what == evMouseAuto )
  237.                     count++;
  238.                     if( count == mouseAutosToSkip )
  239.                         {
  240.                         count = 0;
  241.                         if( mouse.y < 0 )
  242.                             newItem = focused - 1;
  243.                         else if( mouse.y >= size.y )
  244.                             newItem = focused + 1;
  245.                         }
  246.                     }
  247.                 else
  248.                     {
  249.                     if( event.what == evMouseAuto )
  250.                         count++;
  251.                     if( count == mouseAutosToSkip )
  252.                         {
  253.                         count = 0;
  254.                         if( mouse.x < 0 )
  255.                             newItem = focused - size.y;
  256.                         else if( mouse.x >= size.x )
  257.                             newItem = focused + size.y;
  258.                         else if( mouse.y < 0 )
  259.                             newItem = focused - focused % size.y;
  260.                         else if( mouse.y > size.y )
  261.                             newItem = focused - focused % size.y + size.y - 1;
  262.                         }
  263.                     }
  264.                 }
  265.                 if( event.mouse.eventFlags & meDoubleClick )
  266.                     break;
  267.             } while( mouseEvent( event, evMouseMove | evMouseAuto ) );
  268.         focusItemNum( newItem );
  269.         drawView();
  270.         if( (event.mouse.eventFlags & meDoubleClick) && range > newItem )
  271.             selectItem( newItem );
  272.         clearEvent( event );
  273.         }
  274.     else if( event.what == evKeyDown )
  275.         {
  276.         if (event.keyDown.charScan.charCode ==  ' ' && focused < range )
  277.             {
  278.             selectItem( focused );
  279.             newItem = focused;
  280.             }
  281.         else
  282.             {
  283.             switch (ctrlToArrow(event.keyDown.keyCode))
  284.                 {
  285.                 case kbUp:
  286.                     newItem = focused - 1;
  287.                     break;
  288.                 case kbDown:
  289.                     newItem = focused + 1;
  290.                     break;
  291.                 case kbRight:
  292.                     if( numCols > 1 )
  293.                         newItem = focused + size.y;
  294.                     else
  295.                         return;
  296.                     break;
  297.                 case kbLeft:
  298.                     if( numCols > 1 )
  299.                         newItem = focused - size.y;
  300.                     else
  301.                         return;
  302.                     break;
  303.                 case kbPgDn:
  304.                     newItem = focused + size.y * numCols;
  305.                     break;
  306.                 case  kbPgUp:
  307.                     newItem = focused - size.y * numCols;
  308.                     break;
  309.                 case kbHome:
  310.                     newItem = topItem;
  311.                     break;
  312.                 case kbEnd:
  313.                     newItem = topItem + (size.y * numCols) - 1;
  314.                     break;
  315.                 case kbCtrlPgDn:
  316.                     newItem = range - 1;
  317.                     break;
  318.                 case kbCtrlPgUp:
  319.                     newItem = 0;
  320.                     break;
  321.                 default:
  322.                     return;
  323.                 }
  324.             }
  325.         focusItemNum(newItem);
  326.         drawView();
  327.         clearEvent(event);
  328.         }
  329.     else if( event.what == evBroadcast )
  330.         {
  331.         if( (options & ofSelectable) != 0 )
  332.             {
  333.             if( event.message.command == cmScrollBarClicked &&
  334.                 ( event.message.infoPtr == hScrollBar ||
  335.                   event.message.infoPtr == vScrollBar ))
  336. #ifndef __UNPATCHED
  337.         focus();        // BUG FIX                  <<------ Change
  338. #else
  339.                 select();
  340. #endif
  341.             else if( event.message.command == cmScrollBarChanged )
  342.                 {
  343.                 if( vScrollBar == event.message.infoPtr )
  344.                     {
  345.                     focusItemNum( vScrollBar->value );
  346.                     drawView();
  347.                     }
  348.                 else if( hScrollBar == event.message.infoPtr )
  349.                     drawView();
  350.                 }
  351.             }
  352.         }
  353. }
  354.  
  355. void TListViewer::selectItem( short )
  356. {
  357.     message( owner, evBroadcast, cmListItemSelected, this );
  358. }
  359.  
  360. void TListViewer::setRange( short aRange )
  361. {
  362.     range = aRange;
  363.  
  364. #ifndef __UNPATCHED
  365.     if( focused >= aRange ) // BUG FIX - EFW - Tue 06/26/95
  366.         focused = (aRange - 1 >= 0) ? aRange - 1 : 0;
  367. #else
  368.     if( focused > aRange )
  369.         focused = 0;
  370. #endif
  371.     if( vScrollBar != 0 )
  372.         vScrollBar->setParams( focused, 0, aRange - 1, vScrollBar->pgStep,
  373.                                vScrollBar->arStep );
  374.     else
  375.         drawView();
  376. }
  377.  
  378. void TListViewer::setState( ushort aState, Boolean enable )
  379. {
  380.     TView::setState( aState, enable );
  381.     if( (aState & (sfSelected | sfActive | sfVisible)) != 0 )
  382.         {
  383.         if( hScrollBar != 0 )
  384.             if( getState(sfActive) && getState(sfVisible))
  385.                 hScrollBar->show();
  386.             else
  387.                 hScrollBar->hide();
  388.         if( vScrollBar != 0 )
  389.             if( getState(sfActive) && getState(sfVisible))
  390.                 vScrollBar->show();
  391.             else
  392.                 vScrollBar->hide();
  393.         drawView();
  394.         }
  395. }
  396.  
  397. void TListViewer::shutDown()
  398. {
  399.      hScrollBar = 0;
  400.      vScrollBar = 0;
  401.      TView::shutDown();
  402. }
  403.  
  404. #if !defined(NO_STREAMABLE)
  405.  
  406. void TListViewer::write( opstream& os )
  407. {
  408.     TView::write( os );
  409.     os << hScrollBar << vScrollBar << numCols
  410.        << topItem << focused << range;
  411. }
  412.  
  413. void *TListViewer::read( ipstream& is )
  414. {
  415.     TView::read( is );
  416.     is >> hScrollBar >> vScrollBar >> numCols
  417.        >> topItem >> focused >> range;
  418.     return this;
  419. }
  420.  
  421. TStreamable *TListViewer::build()
  422. {
  423.     return new TListViewer( streamableInit );
  424. }
  425.  
  426. TListViewer::TListViewer( StreamableInit ) : TView( streamableInit )
  427. {
  428. }
  429.  
  430.  
  431. #endif
  432.