home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / actlib11 / tvtools / combovwr.cpp < prev    next >
Text File  |  1993-01-14  |  3KB  |  147 lines

  1. /*  Copyright (C) 1993   Marc Stern  (internet: stern@mble.philips.be)  */
  2.  
  3. #define Uses_TKeys
  4. #define Uses_TComboBox
  5. #include "tvtools.h"
  6. #include "strings.h"
  7. #include "tools.h"
  8. #include <ctype.h>
  9.  
  10.  
  11. #define cpComboViewer "\x06\x06\x07\x06\x06"
  12.  
  13. struct TComboViewerRec { TGenCollection *items;
  14.                          ushort selection;
  15.                        };
  16.  
  17.  
  18. static Boolean matchChars( void *item, void *target )
  19. {
  20.   return strncomp((char *)item, (char *)target, strlen((char *)target)) == 0 ;
  21. }
  22.  
  23.  
  24. TComboViewer::TComboViewer( const TRect& bounds,
  25.                             TGenCollection *aList,
  26.                             TScrollBar *ts
  27.                           ) :
  28.           TListViewer( bounds, 1, 0, ts )
  29. {
  30.   list = 0;
  31.   newList( aList );
  32. //  focused = list->indexOf( (char *)list->firstThat(matchChars, ((TComboBox*)(owner->owner))->link->data) );
  33. }
  34.  
  35.  
  36. TPalette& TComboViewer::getPalette() const
  37.  
  38. {
  39.   static TPalette palette( cpComboViewer, sizeof(cpComboViewer)-1 );
  40.   return palette;
  41. }
  42.  
  43.  
  44. void TComboViewer::getData( void * rec )
  45.  
  46. {
  47.   TComboViewerRec *p = (TComboViewerRec *)rec;
  48.   p->items = list;
  49.   p->selection = focused;
  50. }
  51.  
  52.  
  53. void TComboViewer::getData( char *dest, short item, short maxLen )
  54.  
  55. {
  56.   strncpy( dest, list->getData(item), maxLen );
  57.   dest[maxLen] = '\0';
  58. }
  59.  
  60.  
  61. void TComboViewer::getText( char *dest, short item, short maxLen )
  62.  
  63. {
  64.   strncpy( dest, list->getText(item), maxLen );
  65.   dest[maxLen] = '\0';
  66. }
  67.  
  68.  
  69. void TComboViewer::handleEvent( TEvent& event )
  70.  
  71. {
  72.   if ( (event.what == evMouseDown && event.mouse.doubleClick) ||
  73.        (event.what == evKeyDown && event.keyDown.keyCode == kbEnter)
  74.      )
  75.      { endModal( cmOK );
  76.        clearEvent( event );
  77.        return;
  78.      }
  79.  
  80.   if ( (event.what ==  evKeyDown && event.keyDown.keyCode == kbEsc) ||
  81.        (event.what ==  evCommand && event.message.command ==  cmCancel)
  82.      )
  83.      { endModal( cmCancel );
  84.        clearEvent( event );
  85.        return;
  86.      }
  87.  
  88.   static char testChar[255] = "";
  89.  
  90.   if ( event.what == evKeyDown )
  91.      {
  92.        if ( isprint(event.keyDown.charScan.charCode) )
  93.           {
  94.             // Add character to buffer string
  95.             char *tempData = strend( testChar );
  96.             *tempData++ = event.keyDown.charScan.charCode;
  97.             *tempData = EOS;
  98.  
  99.             tempData = (char *)list->firstTextThat(matchChars, testChar);
  100.             if ( tempData )
  101.                focusItem( list->indexOfText(tempData) );
  102.             else { testChar[strlen(testChar) - 1] = EOS;
  103.                    buzzer();
  104.                  }
  105.  
  106.             clearEvent( event );
  107.             return;
  108.           }
  109.        else *testChar = EOS;
  110.      }
  111.  
  112.   TListViewer::handleEvent( event );
  113. }
  114.  
  115.  
  116. void TComboViewer::newList( TGenCollection *aList )
  117.  
  118. {
  119.    if ( list ) destroy( list );
  120.  
  121.    list = aList;
  122.  
  123.    setRange( aList->getCount() );
  124.  
  125.    if( range > 0 ) focusItem( 0 );
  126.  
  127.    drawView();
  128. }
  129.  
  130.  
  131. void TComboViewer::setData( void *rec )
  132.  
  133. {
  134.   TComboViewerRec *p = (TComboViewerRec *)rec;
  135.   newList( p->items );
  136.   focusItem( p->selection );
  137.   drawView();
  138. }
  139.  
  140.  
  141. void TComboViewer::shutDown()
  142.  
  143. {
  144.   list = 0;
  145.   TListViewer::shutDown();
  146. }
  147.