Introduction

I have seen many requests in the Turbo Vision forum for a Combo Box class
similar to the one available in Microsoft Windows.  Here is a family of
classes that provide the functionality of the Windows Combo Box.

Combo Box Classes

There are three classes that make up the Combo Box family:  TComboBox,
TComboWindow, and TComboViewer.  TComboBox provides the icon in the dialog
box that represents the whole TComboBox; by clicking on the icon or pressing
the down arrow while the linked TInputLine is selected, the Combo Box
selection window becomes active.  The selection window is made up of a
TComboWindow, a TComboViewer, and a TScrollBar.  While active, the
TComboWindow is the modal view; clicking outside of the window area causes
the TComboWindow to terminate with a cmCancel command.

The TComboBox is only one character wide, so it should be place directly
after the inputline to which it will be linked.  For example:

   tv = new TInputLine(TRect(2,2,20,3), 25);
   insert(tv);
   insert(new TComboBox(TRect(20,2,21,3), tv, list));

The TComboWindow automatically sizes itself to be as wide as the inputline
and the combo box together.

When used with a regular TInputLine, TComboBox acts just like a THistory
object.  However, when used with the TStaticInputLine (also in this zip
file), TComboBox acts like a Combo Box in Windows, only allowing those items
already in the list to be selected.
Class Descriptions

TComboBox

TComboBox  implements a pick listof items for the user to choose.  When used
with a standard TInputLine, it acts very much like a THistory object.  If
used with a TStaticInputLine, only the items which are currently in the list
can be selected.

Data Members
char *icon;
     Points to the character that is used by the draw() function to display
     the icon on the screen.

TInputLine *link;
     Points to the related TInputLine, or a descendant of TInputLine.  Used
     to update the TInputLine data member when an item is selected from the
     list.

TCollection *list;
     Points to the list of items that are currently available for selection
     by the user.  This list is updated whenever the selected state of link
     is changed.

Member Functions
TComboBox(TRect& bounds, TInputLine *aLink, TCollection *aList);
     Constructs a new TComboBox.  If the extent of bounds is greater than a
     1 by 1 square, the extent is changed to that size.

virtual ushort dataSize();
     Returns the size of the data read or written by getData and setData.
     Currently returns sizeof(void *).

virtual void draw();
     Draws the character pointed to by icon in the specified color.

virtual void getData(void *rec);
     Returns a pointer to list in rec.

TPalette& getPalette() const;
     Returns the defined palette cpComboBox.

virtual void handleEvent(TEvent& event);
     Handles mouse events and a down arrow key event to open a TComboWindow.

virtual void newList(TCollection *aList);
     Sets a new list for TComboBox by first deleting the old list and then
     setting list to aList.

virtual void setData(void *rec);
     Reads a pointer from rec and assigns it to list.



void shutDown();
     Sets link = 0 and list = 0, then calls TView::shutDown().  Deleting the
     actual TCollection is the responsibility of the program; this provides
     for a persistent list between calls to the same dialog box.
TComboViewer

TComboViewer is a descendant of TListViewer; it provides the actual list
viewing mechanism for the TComboBox.

Data Members
TCollection *list;
     Points to the list of items that are currently available for selection
     by the user.  This list is updated whenever the selected state of link
     is changed.

Member Functions
TComboViewer(const TRect& bounds, TCollection *aList, TScrollBar *sb);
     Constructs a TComboViewer by setting list = aList and calling
     TListViewer(bounds, 1, 0, sb).

virtual ushort dataSize();
     Returns the size of the data read and written by getData and setData.

TPalette& getPalette() const;
     Returns the defined palette cpComboViewer.

virtual void getData(void *data);
     Accepts data in the format of a TListBoxRec.

virtual void getText(char *dest, short item, short maxLen);
     Returns the itemth item from list in dest, not copying more than maxLen
     characters.

virtual void handleEvent(TEvent& event);
     Checks for keyboard or mouse events that will end the modal view of
     TComboViewer.  All other events are passed on to
     TListViewer::handleEvent.

virtual void newList(TCollection *aList);
     Accepts a new list to be displayed, and disposes of the old list.

virtual void setData(void *data);
     Returns data in the format of a TListBoxRec.

void shutDown();
     Sets list = 0, then calls TListViewer::shutDown().  Disposing of the
     list is the responsibility of the programmer.
TComboWindow

Data Members
TComboViewer *viewer;
     A pointer to the TComboViewer that is a subview of TComboWindow.

Member Functions
TComboWindow(const TRect& bounds, TCollection *aList);
     Calls TWindow(bounds, 0, 0), the creates a TComboViewer and a TScrollBar
     to fit within its bounds.  The aList parameter is passed on to
     TComboViewer.

TPalette& getPalette() const;
     Returns the defined palette cpComboWindow.

void getSelection(char *dest);
     Returns in dest the item selected from the list.

virtual void handleEvent(TEvent&);
     Checks for mouse events outside of the bounds of TComboWindow; all other
     events are passed on to TWindow::handleEvent.

void setSelection(char *data);
     Sets the selected item in the list to data.
TStaticInputLine

Data Members
TCollection *list;
     Points to the list of items that are currently available for selection
     by the user.  This list is updated whenever the selected state of link
     is changed.

Member Functions
TStaticInputLine(const TRect& bounds, int maxLen, TCollection *aList);
     Created a TStaticInputLine by setting list = aList, and calling
     TInputLine(bounds, maxLen).

virtual void getNextMatch();
     A replacement for the call to matchFirstChar().  Currently getNextMatch
     calls matchFirstChar(), but later versions will have an algorithm to
     provide a circular search queue making TStaticInputLine behave more like
     Windows.

virtual void handleEvent(TEvent& event);
     Handles most keyboard events for TStaticInputLine; keyboard events
     handled include all printable characters, up and down arrow keys.  All
     other events are passed on to TInputLine::handleEvent.

virtual void newList(TCollection *aList);
     Accepts a new list to be displayed, and disposes of the old list.


Boolean matchFirstChar(void *, void *);
     matchFirstChar is not a member or a friend function of TStaticInputLine,
     but is called by TStaticInputLine::handleEvent.  This function is of
     type ccTestFunc and is used to test if the first characters of the two
     items passed are the same.  This function is case insensitive.
