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

  1. /*  Copyright (C) 1993   Marc Stern  (internet: stern@mble.philips.be)  */
  2.  
  3. #define Uses_TComboBox
  4. #include "tvtools.h"
  5. #include <string.h>
  6.  
  7.  
  8. #define cpComboBox "\x13"    // for normal TInputLine link
  9. #define cpSComboBox "\x1A"   // for TStaticInputLine link
  10.  
  11.  
  12. TComboBox::TComboBox( const TRect& bounds,
  13.                       TInputLine *aLink,
  14.                       TGenCollection *aList
  15.                     ) :
  16.        TView( bounds )
  17. {
  18.   initBox( aLink, aList );
  19. }
  20.  
  21.  
  22. TComboBox::TComboBox( TInputLine *aLink,
  23.                       TGenCollection *aList
  24.                     ) :
  25.        TView( TRect(aLink->origin.x+aLink->size.x, aLink->origin.y, aLink->origin.x+aLink->size.x+1, aLink->origin.y+1) )
  26. {
  27.   initBox( aLink, aList );
  28. }
  29.  
  30.  
  31. void TComboBox::initBox( TInputLine *aLink, TGenCollection *aList )
  32. {
  33.   options |= ofPostProcess;
  34.   eventMask |= evBroadcast;
  35.   link = aLink;
  36.   list = aList;
  37.   icon = "\x19";
  38. }
  39.  
  40.  
  41. void TComboBox::shutDown()
  42. {
  43.    link = 0;
  44.    TView::shutDown();
  45. }
  46.  
  47.  
  48. void TComboBox::draw()
  49. {
  50.   TDrawBuffer b;
  51.  
  52.   b.moveStr( 0, icon, getColor(0x01) );
  53.   writeLine( 0, 0, size.x, size.y, b );
  54. }
  55.  
  56.  
  57. TPalette& TComboBox::getPalette() const
  58. {
  59.   static TPalette palette( cpComboBox, sizeof(cpComboBox)-1 );
  60.   static TPalette spalette( cpSComboBox, sizeof(cpSComboBox)-1 );
  61.  
  62.   return spalette;
  63. //  if ( ! strcmp(link->name, "TStaticInputLine") ) return spalette;
  64. //                                             else return palette;
  65. }
  66.  
  67.  
  68. void TComboBox::handleEvent( TEvent& event )
  69. {
  70.   TComboWindow *ComboWindow;
  71.   TRect  r, p;
  72.  
  73.   TView::handleEvent( event );
  74.  
  75.   if ( (event.what == evMouseDown) ||
  76.        (event.what == evKeyDown && ctrlToArrow(event.keyDown.keyCode) == kbDown
  77.                 && (link->state & sfFocused)
  78.        )
  79.      )
  80.      { if ( ! (link->state & sfDisabled) )    // Make InputLine the active view
  81.           link->select();
  82.  
  83.        r = link->getBounds();                 // Get bounds of the InputLine
  84.  
  85.        r.b.x = r.a.x + max(list->getTextLength() + 1, link->size.x) + 1;
  86.        int delta = owner->size.x - r.b.x - 1;
  87.        if ( delta < 0 ) { r.a.x += delta;
  88.                           r.b.x += delta;
  89.                         }
  90.        r.a.x = max( r.a.x, 1 );
  91.  
  92.        r.a.y += 1;
  93.        r.b.y = r.a.y + list->getCount();
  94.        delta = owner->size.y - r.b.y - 1;
  95.        if ( delta < 0 ) { r.a.y += delta;
  96.                           r.b.y += delta;
  97.                         }
  98.        r.a.y = max( r.a.y, 1 );
  99.  
  100.        // Create a new TComboWindow
  101.        ComboWindow = new TComboWindow( r, list );
  102.        if ( ComboWindow )
  103.           {
  104.             ushort c = owner->execView( ComboWindow );    // Execute TComboWindow as modal view
  105.  
  106.             // If TComboWindow return cmOK and line is not disabled
  107.         if ( (c == cmOK) && ! (link->state & sfDisabled) )
  108.                {
  109.              char rslt[256];
  110.              ComboWindow->getSelection(rslt);     // Set the link data to the selection
  111.              strncpy(link->data, rslt, link->maxLen);
  112.              link->selectAll(True);               // Select all in the linked view
  113.              link->drawView();                    // Redraw the linked view
  114.            }
  115.  
  116.         destroy( ComboWindow );
  117.           }
  118.  
  119.        clearEvent( event );
  120.        return;
  121.      }
  122.  
  123. }