1067 lines
32 KiB
C++
1067 lines
32 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corp., 1991 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
bltlb.hxx
|
|
BLT listbox control classes: definitions
|
|
|
|
FILE HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
RustanL 22-Feb-1991 Modified for revised LC hierarchy
|
|
rustanl 22-Mar-1991 Rolled in code review changes
|
|
from CR on 20-Mar-1991, attended by
|
|
JimH, GregJ, Hui-LiCh, RustanL.
|
|
gregj 08-Apr-1991 Reintegrated caching listbox
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 14-May-1991 Made clients depend on blt.hxx
|
|
rustanl 07-Aug-1991 Added METALLIC_STR_DTE
|
|
rustanl 04-Sep-1991 Added ReplaceItem
|
|
KeithMo 23-Oct-1991 Added forward references.
|
|
beng 19-Apr-1992 Added LISTBOX, LAZY_LISTBOX
|
|
jonn 25-Apr-1992 Disabled LAZY_LISTBOX build fix
|
|
beng 10-May-1992 Re-enabled (given 1.264)
|
|
beng 01-Jun-1992 Changed GUILTT support
|
|
jonn 04-Aug-1992 HAW-for-Hawaii support
|
|
jonn 11-Aug-1992 HAW-for-Hawaii for other LBs
|
|
Yi-HsinS 10-Dec-1992 Support variable size LBI in BLT_LISTBOX
|
|
*/
|
|
|
|
#ifndef _BLT_HXX_
|
|
#error "Don't include this file directly; instead, include it through blt.hxx"
|
|
#endif // _BLT_HXX_
|
|
|
|
#ifndef _BLTLB_HXX_
|
|
#define _BLTLB_HXX_
|
|
|
|
#include "bltbitmp.hxx" // DISPLAY_MAP
|
|
#include "bltfont.hxx" // FONT
|
|
|
|
//
|
|
// Forward references.
|
|
//
|
|
|
|
DLL_CLASS DTE;
|
|
DLL_CLASS DM_DTE;
|
|
DLL_CLASS DMID_DTE;
|
|
DLL_CLASS STR_DTE;
|
|
DLL_CLASS MULTILINE_STR_DTE;
|
|
DLL_CLASS METALLIC_STR_DTE;
|
|
DLL_CLASS DISPLAY_TABLE;
|
|
DLL_CLASS LBI;
|
|
DLL_CLASS LISTBOX;
|
|
DLL_CLASS BLT_LISTBOX;
|
|
DLL_CLASS LAZY_LISTBOX;
|
|
DLL_CLASS SET_CONTROL;
|
|
|
|
|
|
// Maximum number of columns in a listbox
|
|
|
|
#define MAX_DISPLAY_TABLE_ENTRIES 10
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: GUILTT_INFO
|
|
|
|
SYNOPSIS: Packaged parameters for use in GUILTT processing
|
|
|
|
INTERFACE: pnlsOut - string into which to place output
|
|
errOut - error code to return
|
|
|
|
HISTORY:
|
|
gregj 01-May-1991 Created
|
|
beng 14-Feb-1992 Win32 conversion
|
|
beng 01-Jun-1992 GUILTT changes
|
|
|
|
**********************************************************************/
|
|
|
|
struct GUILTT_INFO
|
|
{
|
|
NLS_STR * pnlsOut;
|
|
APIERR errOut;
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: HAW_FOR_HAWAII_INFO (hawinfo)
|
|
|
|
SYNOPSIS: Packaged parameters for use in
|
|
BLT_LISTBOX::CD_Char_HAWforHawaii()
|
|
|
|
INTERFACE: _nls: string containing current HAW prefix
|
|
_time: time when this prefix will time out
|
|
|
|
HISTORY:
|
|
jonn 04-Aug-1992 HAW-for-Hawaii support
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS HAW_FOR_HAWAII_INFO : public BASE
|
|
{
|
|
|
|
public:
|
|
NLS_STR _nls;
|
|
LONG _time;
|
|
|
|
HAW_FOR_HAWAII_INFO();
|
|
~HAW_FOR_HAWAII_INFO();
|
|
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: DTE
|
|
|
|
SYNOPSIS: Display table entry abstract class
|
|
|
|
INTERFACE: Paint() - paint function
|
|
AppendDataTo() - returns GUILTT information
|
|
|
|
PARENT: BASE
|
|
|
|
CAVEATS:
|
|
While most DTEs cannot fail construction, a few, such
|
|
as DMID_DTE, can.
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 10-Jul-1991 Changed Paint protocol; inherits
|
|
from BASE
|
|
beng 04-Oct-1991 Win32 conversion
|
|
beng 07-Nov-1991 Inlined (empty) ctor
|
|
beng 01-Jun-1992 GUILTT changes
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS DTE: public BASE
|
|
{
|
|
protected:
|
|
DTE() { }
|
|
|
|
public:
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const = 0;
|
|
virtual UINT QueryLeftMargin() const;
|
|
virtual APIERR AppendDataTo( NLS_STR * pnlsOut ) const = 0;
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: DM_DTE
|
|
|
|
SYNOPSIS: DTE which works with a DISPLAY_MAP
|
|
|
|
INTERFACE: DM_DTE() - constructor
|
|
Paint() - paint function
|
|
AppendDataTo() - support for GUILTT
|
|
QueryDisplayWidth() - Returns the width (including
|
|
left margin) that the DTE
|
|
will require in order to be
|
|
displayed in full
|
|
QueryDisplayMap() - Get the display map
|
|
|
|
PARENT: DTE
|
|
|
|
USES: DISPLAY_MAP
|
|
|
|
NOTES: CODEWORK. If it would prove useful, QueryDisplayWidth
|
|
could be made virtual at the DTE level, and would then
|
|
always return the width (including the left margin)
|
|
needed to fully display the DTE.
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 10-Jul-1991 Changed Paint
|
|
rustanl 03-Sep-1991 Added QueryDisplayWidth method
|
|
beng 04-Oct-1991 Win32 conversion
|
|
beng 07-Nov-1991 Unsigned width
|
|
beng 01-Jun-1992 GUILTT changes
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS DM_DTE : public DTE
|
|
{
|
|
private:
|
|
DISPLAY_MAP * _pdm;
|
|
|
|
protected:
|
|
DM_DTE();
|
|
|
|
VOID SetPdm( DISPLAY_MAP * pdm );
|
|
|
|
public:
|
|
DM_DTE( DISPLAY_MAP * pdm );
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
virtual APIERR AppendDataTo( NLS_STR * pnlsOut ) const;
|
|
|
|
UINT QueryDisplayWidth() const;
|
|
|
|
DISPLAY_MAP *QueryDisplayMap( VOID ) const
|
|
{ return _pdm; }
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: DMID_DTE
|
|
|
|
SYNOPSIS: DTE which works from a DMID.
|
|
It constructs the DM for the client.
|
|
|
|
INTERFACE: DMID_DTE() - constructor
|
|
~DMID_DTE() - destructor
|
|
|
|
PARENT: DM_DTE
|
|
|
|
USES: DISPLAY_MAP
|
|
|
|
CAVEATS:
|
|
Since this constructs a DM, *it can fail construction*.
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
beng 10-Jul-1991 Added caveat
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS DMID_DTE : public DM_DTE
|
|
{
|
|
private:
|
|
DISPLAY_MAP _dm;
|
|
|
|
public:
|
|
DMID_DTE( DMID dmid );
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: STR_DTE
|
|
|
|
SYNOPSIS: DTE which presents a simple string
|
|
|
|
INTERFACE: STR_DTE() - constructor
|
|
Paint() - paint function
|
|
GetData() - support for GUILTT
|
|
SetPch() - Painting Optimization
|
|
|
|
PARENT: DTE
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
NOTES:
|
|
Should this use NLS_STR? Its string is presented to the user.
|
|
|
|
Need to rethink SetPch.
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 20-May-1991 Made _pch pointer-to-const
|
|
kevinl 30-May-1991 Added SetPch member
|
|
beng 10-Jul-1991 Changed Paint
|
|
beng 04-Oct-1991 Win32 conversion
|
|
beng 07-Nov-1991 Inlined ctor
|
|
beng 01-Jun-1992 GUILTT changes
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS STR_DTE : public DTE
|
|
{
|
|
private:
|
|
const TCHAR * _pch;
|
|
|
|
public:
|
|
STR_DTE( const TCHAR * pch ) : _pch(pch) { }
|
|
|
|
VOID SetPch( const TCHAR * pch )
|
|
{ _pch = pch; }
|
|
|
|
const TCHAR *QueryPch( VOID ) const
|
|
{ return _pch; }
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
virtual APIERR AppendDataTo( NLS_STR * pnlsOut ) const;
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: METALLIC_STR_DTE
|
|
|
|
SYNOPSIS: DTE which presents a simple string, painted in a
|
|
metallic colored 3D looking format.
|
|
|
|
INTERFACE: METALLIC_STR_DTE() - constructor
|
|
Paint() - virtual replacement of Paint
|
|
method
|
|
QueryLeftMargin() - virtual replacement for returning
|
|
the left margin which is to
|
|
be left in between columns.
|
|
QueryVerticalMargins() - static method returning the
|
|
number of pixels taken up by
|
|
vertical margins when the DTE
|
|
is painted
|
|
|
|
PARENT: STR_DTE
|
|
|
|
HISTORY:
|
|
rustanl 22-Jul-1991 Created
|
|
rustanl 07-Aug-1991 Added to BLT
|
|
beng 04-Oct-1991 Win32 conversion
|
|
beng 08-Nov-1991 Unsigned widths
|
|
|
|
**************************************************************************/
|
|
|
|
DLL_CLASS METALLIC_STR_DTE : public STR_DTE
|
|
{
|
|
private:
|
|
static const UINT _dyTopMargin;
|
|
static const UINT _dyBottomMargin;
|
|
|
|
inline static UINT CalcTopTextMargin();
|
|
inline static UINT CalcBottomTextMargin();
|
|
|
|
public:
|
|
METALLIC_STR_DTE( const TCHAR * pch ) : STR_DTE( pch ) { }
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
virtual UINT QueryLeftMargin() const;
|
|
|
|
static UINT QueryVerticalMargins();
|
|
};
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: MULTILINE_STR_DTE
|
|
|
|
SYNOPSIS: DTE which presents a multi-line string
|
|
|
|
INTERFACE: MULTILINE_STR_DTE() - constructor
|
|
Paint() - paint function
|
|
|
|
PARENT: STR_DTE
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 13-Dec-1992 Created
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS MULTILINE_STR_DTE : public STR_DTE
|
|
{
|
|
public:
|
|
MULTILINE_STR_DTE( const TCHAR * pch ) : STR_DTE(pch) {}
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
};
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: COUNTED_STR_DTE
|
|
|
|
SYNOPSIS: DTE which displays a counted (rather than \0 terminated)
|
|
string.
|
|
|
|
INTERFACE: COUNTED_STR_DTE() - constructor
|
|
|
|
Paint() - paint function
|
|
|
|
PARENT: STR_DTE
|
|
|
|
HISTORY:
|
|
KeithMo 15-Dec-1992 Created
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS COUNTED_STR_DTE : public STR_DTE
|
|
{
|
|
private:
|
|
INT _cch;
|
|
|
|
public:
|
|
COUNTED_STR_DTE( const TCHAR * pch, INT cch ) : STR_DTE(pch), _cch(cch) {}
|
|
|
|
INT QueryCount( VOID ) const
|
|
{ return _cch; }
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
};
|
|
|
|
|
|
#define DEFAULT_DM_DY 1
|
|
#define DEFAULT_TEXT_DY 3
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: OWNER_DRAW_STR_DTE
|
|
|
|
SYNOPSIS: STR_DTE which presents a string centered according to nDy
|
|
|
|
INTERFACE: OWNER_DRAW_STR_DTE() - constructor
|
|
Paint() - paint function
|
|
|
|
PARENT: STR_DTE
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 13-Dec-1992 Created
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS OWNER_DRAW_STR_DTE : public STR_DTE
|
|
{
|
|
private:
|
|
INT _nDy;
|
|
|
|
public:
|
|
OWNER_DRAW_STR_DTE( const TCHAR * pch, INT nDy = DEFAULT_TEXT_DY )
|
|
: STR_DTE ( pch ),
|
|
_nDy( nDy ) { }
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
};
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: OWNER_DRAW_DMID_DTE
|
|
|
|
SYNOPSIS: DMID_DTE in which the owner will paint according to nDy.
|
|
|
|
INTERFACE: OWNER_DRAW_DMID_DTE() - constructor
|
|
Paint() - paint function
|
|
|
|
PARENT: DMID_DTE
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 23-Dec-1992 Created
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS OWNER_DRAW_DMID_DTE : public DMID_DTE
|
|
{
|
|
private:
|
|
INT _nDy;
|
|
|
|
public:
|
|
OWNER_DRAW_DMID_DTE( DMID dmid, INT nDy = DEFAULT_DM_DY )
|
|
: DMID_DTE( dmid ),
|
|
_nDy( nDy ) {}
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
};
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: OWNER_DRAW_MULTILINE_STR_DTE
|
|
|
|
SYNOPSIS: MULTILINE_STR_DTE which is centered according to _nDy
|
|
|
|
INTERFACE: OWNER_DRAW_MULTILINE_STR_DTE() - constructor
|
|
Paint() - paint function
|
|
|
|
PARENT: MULTILINE_STR_DTE
|
|
|
|
USES:
|
|
|
|
CAVEATS:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Yi-HsinS 13-Dec-1992 Created
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS OWNER_DRAW_MULTILINE_STR_DTE : public MULTILINE_STR_DTE
|
|
{
|
|
private:
|
|
INT _nDy;
|
|
|
|
public:
|
|
OWNER_DRAW_MULTILINE_STR_DTE( const TCHAR * pch, INT nDy = DEFAULT_TEXT_DY )
|
|
: MULTILINE_STR_DTE(pch),
|
|
_nDy( nDy ) {}
|
|
|
|
virtual VOID Paint( HDC hdc, const RECT * prect ) const;
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: DISPLAY_TABLE
|
|
|
|
SYNOPSIS: Table of DTEs used by the BLT listbox
|
|
|
|
INTERFACE:
|
|
DISPLAY_TABLE() - constructor
|
|
Paint() - paint function
|
|
operator[]() - return the specified entry in the display table
|
|
CalcColumnWidths() - generate array of column widths
|
|
|
|
USES: DTE
|
|
|
|
NOTES:
|
|
To use this properly, a listbox should keep an array of column
|
|
widths as a member, which it gives to each display table built
|
|
within it. That array should be built with CalcColumnWidths
|
|
in order to synchronize the spacing of the listbox columns and
|
|
their respective column headers (static text controls above
|
|
the listbox).
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 04-Oct-1991 Win32 conversion
|
|
beng 07-Nov-1991 Unsigned widths
|
|
beng 08-Nov-1991 Added CalcColumnWidths
|
|
beng 21-Apr-1992 Generalized BLT_LISTBOX to LISTBOX
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS DISPLAY_TABLE
|
|
{
|
|
private:
|
|
const UINT *_pdxColWidth; // points to array of column widths
|
|
UINT _cdx;
|
|
DTE * _apdte[ MAX_DISPLAY_TABLE_ENTRIES ];
|
|
|
|
public:
|
|
DISPLAY_TABLE( UINT cColumns, const UINT * pdxColWidth );
|
|
|
|
VOID Paint( LISTBOX * plb, HDC hdc, const RECT * prect,
|
|
GUILTT_INFO * pginfo ) const;
|
|
VOID Paint( LISTBOX * plb, HDC hdc, const RECT * prect ) const;
|
|
|
|
DTE * & operator[]( UINT i ) ;
|
|
|
|
static APIERR CalcColumnWidths( UINT * pdx, UINT cdx,
|
|
OWNER_WINDOW * pwnd,
|
|
CID cidListbox, BOOL fHaveIcon );
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: LBI
|
|
|
|
SYNOPSIS: Listbox item
|
|
|
|
INTERFACE:
|
|
LBI() - constructor
|
|
~LBI() - destructor
|
|
Paint() - paint function
|
|
Compare() - compare two items in the list box
|
|
QueryLeadingChar() - unknown
|
|
Compare_HAWforHawaii() - special compare routine for
|
|
HAW-for-Hawaii purposes. Redefine iff the
|
|
listbox uses CD_Char_HAWforHawaii().
|
|
|
|
PARENT: BASE
|
|
|
|
CAVEATS:
|
|
CODEWORK - Generalize the QueryLeadingChar protocol for
|
|
Haw-for-Hawaii support.
|
|
|
|
NOTES:
|
|
The Paint() method may be called in response to a
|
|
GUILTT request as well as for a WM_DRAWITEM message.
|
|
The pGUILTT parameter to Paint() should be passed on
|
|
to the DISPLAY_TABLE class without modification.
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 20-May-1991 Added OnCompareItem and OnDeleteItem;
|
|
QueryLeadingChar now returns WCHAR
|
|
beng 04-Oct-1991 Win32 conversion
|
|
kevinl 05-Nov-1991 Added IsDestroyable
|
|
beng 21-Apr-1992 Generalized BLT_LISTBOX to LISTBOX
|
|
jonn 04-Aug-1992 HAW-for-Hawaii support
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS LBI : public BASE
|
|
{
|
|
protected:
|
|
virtual BOOL IsDestroyable();
|
|
|
|
public:
|
|
LBI();
|
|
virtual ~LBI();
|
|
|
|
// Note, CalcHeight is currently only called for variable size items
|
|
virtual UINT CalcHeight( UINT nSingleLineHeight );
|
|
|
|
virtual VOID Paint( LISTBOX * plb, HDC hdc, const RECT * prect,
|
|
GUILTT_INFO * pGUILTT ) const;
|
|
|
|
virtual INT Compare( const LBI * plbi ) const;
|
|
|
|
virtual INT Compare_HAWforHawaii( const NLS_STR & nls ) const;
|
|
|
|
virtual WCHAR QueryLeadingChar() const;
|
|
|
|
// Response code for WM_COMPAREITEM and WM_DELETEITEM
|
|
//
|
|
static INT OnCompareItem( WPARAM wParam, LPARAM lParam );
|
|
static VOID OnDeleteItem( WPARAM wParam, LPARAM lParam );
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: LISTBOX
|
|
|
|
SYNOPSIS: Listbox (owner-draw) control class
|
|
|
|
INTERFACE: LISTBOX() - constructor
|
|
InvalidateItem() - invalidate the item
|
|
IsReadOnly() - predicate, TRUE if r.o. listbox
|
|
QueryScrollPos() - return horizontal scroll position
|
|
SetScrollPos() - set scroll position (default 0)
|
|
default is zero
|
|
|
|
PARENT: LIST_CONTROL
|
|
|
|
USES: FONT
|
|
|
|
CAVEATS:
|
|
All listboxes must have LBS_OWNERDRAWFIXED or LBS_OWNERDRAWVARIABLE.
|
|
|
|
HISTORY:
|
|
beng 19-Apr-1992 Created from old BLT_LISTBOX
|
|
beng 01-Jun-1992 Changed GUILTT support
|
|
KeithMo 09-Feb-1993 Added Query/SetHorizontalExtent methods.
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS LISTBOX: public LIST_CONTROL
|
|
{
|
|
private:
|
|
BOOL _fReadOnly;
|
|
FONT _fontListBox;
|
|
UINT _dxScroll; // pane scroll increment, in pels
|
|
|
|
protected:
|
|
// Replacement of virtual CONTROL_WINDOW methods
|
|
//
|
|
virtual BOOL CD_Draw( DRAWITEMSTRUCT * pdis );
|
|
virtual INT CD_VKey( USHORT nVKey, USHORT nLastPos );
|
|
|
|
// Get a LBI, whether listbox conventional or lazy
|
|
//
|
|
virtual LBI * RequestLBI( const DRAWITEMSTRUCT * pdis ) = 0;
|
|
virtual VOID ReleaseLBI( LBI * plbi ) = 0;
|
|
|
|
public:
|
|
LISTBOX( OWNER_WINDOW * powin, CID cid,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
LISTBOX( OWNER_WINDOW * powin, CID cid,
|
|
XYPOINT xy, XYDIMENSION dxy,
|
|
ULONG flStyle,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
|
|
VOID InvalidateItem( INT i, BOOL fErase = TRUE );
|
|
|
|
BOOL IsReadOnly() const
|
|
{ return _fReadOnly; }
|
|
|
|
UINT QueryScrollPos() const
|
|
{ return _dxScroll; }
|
|
|
|
VOID SetScrollPos( UINT dxNewPos = 0 );
|
|
|
|
UINT QueryHorizontalExtent( VOID ) const;
|
|
VOID SetHorizontalExtent( UINT dxNewExtent );
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: BLT_LISTBOX
|
|
|
|
SYNOPSIS: BLT listbox control class
|
|
|
|
INTERFACE: BLT_LISTBOX() - constructor
|
|
AddItem() - add an item to the listbox
|
|
AddItemIdemp() - add an item to the listbox if the
|
|
item does not exist already.
|
|
SetItem() - set the value of the specified item
|
|
FindItem() - find an item from the listbox
|
|
QueryItem() - Query item
|
|
RemoveItem() - Removes the LBI from the listbox w/o
|
|
deleting it
|
|
RemoveAllItems - Does RemoveItem to all items in LB
|
|
CD_Char_HAWforHawaii() - Standard CD_Char handler for
|
|
listboxes with HAW-for-Hawaii functionality.
|
|
Redefine CD_Char() to call this. Pass in a
|
|
pointer to a HAW_FOR_HAWAII_INFO associated
|
|
with this listbox, which must have constructed
|
|
successfully. Also redefine
|
|
LBI::Compare_HAWforHawaii().
|
|
|
|
PARENT: LISTBOX
|
|
|
|
HISTORY:
|
|
RustanL 13-Feb-1991 Created
|
|
Johnl 05-Apr-1991 Added _fontListBox member, added font
|
|
param. to const. & defaulted to
|
|
FONT_DEFAULT
|
|
gregj 08-Apr-1991 Added extra scrolling members for two
|
|
column support
|
|
gregj 01-May-1991 Added GUILTT support
|
|
beng 16-May-1991 Added app-window constructor
|
|
beng 21-Aug-1991 Removed LC_CURRENT_ITEM magic value
|
|
beng 15-Oct-1991 Win32 conversion
|
|
beng 07-Nov-1991 Removed 2-pane listbox support
|
|
beng 19-Apr-1992 Factored out new LISTBOX control
|
|
beng 01-Jun-1992 Changed GUILTT support
|
|
jonn 04-Aug-1992 HAW-for-Hawaii support
|
|
Johnl 27-Oct-1992 Added RemoveItem
|
|
Johnl 07-Dec-1992 Added RemoveAllItems
|
|
Yi-HsinS 10-Dec-1992 Added CD_Measure for OWNERDRAWVARIABLE listbox
|
|
KeithMo 17-Dec-1992 Added InsertItem
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS BLT_LISTBOX : public LISTBOX
|
|
{
|
|
friend class SET_CONTROL;
|
|
|
|
private:
|
|
UINT _nSingleLineHeight;
|
|
|
|
VOID SetItem( INT ilbi, LBI * plbi );
|
|
|
|
// Replacement of virtual LISTBOX methods
|
|
//
|
|
virtual LBI * RequestLBI( const DRAWITEMSTRUCT * pdis );
|
|
virtual VOID ReleaseLBI( LBI * plbi );
|
|
|
|
protected:
|
|
// Replacement of virtual CONTROL_WINDOW methods
|
|
//
|
|
virtual INT CD_Char( WCHAR wch, USHORT nLastPos );
|
|
|
|
virtual APIERR CD_Guiltt( INT ilb, NLS_STR * pnlsOut );
|
|
|
|
INT CD_Char_HAWforHawaii( WCHAR wch,
|
|
USHORT nLastPos,
|
|
HAW_FOR_HAWAII_INFO * phawinfo );
|
|
|
|
// note, CD_Measure is currently only called for variable size items
|
|
virtual BOOL CD_Measure( MEASUREITEMSTRUCT * pmis );
|
|
|
|
public:
|
|
BLT_LISTBOX( OWNER_WINDOW * powin, CID cid,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
BLT_LISTBOX( OWNER_WINDOW * powin, CID cid,
|
|
XYPOINT xy, XYDIMENSION dxy,
|
|
ULONG flStyle,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
|
|
INT AddItem( LBI * plbi );
|
|
INT AddItemIdemp( LBI * plbi );
|
|
|
|
INT InsertItem( INT i, LBI * plbi );
|
|
|
|
INT FindItem( const LBI & lbi ) const;
|
|
|
|
LBI * QueryItem( INT i ) const;
|
|
LBI * QueryItem() const
|
|
{ return QueryItem(QueryCurrentItem()); }
|
|
|
|
LBI * RemoveItem( INT i ) ;
|
|
LBI * RemoveItem()
|
|
{ return RemoveItem( QueryCurrentItem()) ; }
|
|
|
|
//
|
|
// Note that the LBIs must be deleted (and are assumed to be in an
|
|
// external list)
|
|
//
|
|
void RemoveAllItems( void ) ;
|
|
|
|
APIERR ReplaceItem( INT i, LBI * plbiNew, LBI * * pplbiOld = NULL );
|
|
|
|
APIERR Resort( void );
|
|
|
|
UINT QuerySingleLineHeight( VOID )
|
|
{ return _nSingleLineHeight; }
|
|
APIERR CalcSingleLineHeight( VOID );
|
|
};
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: BLT_COMBOBOX
|
|
|
|
SYNOPSIS: Owner draw combo box
|
|
|
|
INTERFACE:
|
|
|
|
PARENT: BLT_LISTBOX
|
|
|
|
NOTES: Usage is exactly like a BLT_LISTBOX (i.e., use the same LBIs,
|
|
etc) except the container is a combo.
|
|
|
|
We subclass the window proc so the 'H' for Hawaii will work
|
|
(combo boxes don't support this functionality).
|
|
|
|
HISTORY:
|
|
Johnl 21-Oct-1992 Moved out of MPR
|
|
|
|
**************************************************************************/
|
|
|
|
DLL_CLASS BLT_COMBOBOX : public BLT_LISTBOX
|
|
{
|
|
public:
|
|
BLT_COMBOBOX( OWNER_WINDOW * powin, CID cid,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT ) ;
|
|
|
|
BLT_COMBOBOX( OWNER_WINDOW * powin, CID cid,
|
|
XYPOINT xy, XYDIMENSION dxy,
|
|
ULONG flStyle,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT ) ;
|
|
|
|
~BLT_COMBOBOX() ;
|
|
|
|
BOOL IsDropped( void ) const ;
|
|
|
|
protected:
|
|
/* We do a little bit of subclassing so the H for Hawaii works
|
|
*/
|
|
static LRESULT WINAPI CBSubclassProc( HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam ) ;
|
|
|
|
private:
|
|
//
|
|
// Old window proc (restored when all occurrences of BLT_COMBOBOX are
|
|
// destructed.
|
|
//
|
|
static WNDPROC _OldCBProc ;
|
|
|
|
//
|
|
// Reference count. When this reaches 0, the old window proc is restored
|
|
//
|
|
static UINT _cReferences ;
|
|
} ;
|
|
|
|
#if defined(WIN32)
|
|
/*************************************************************************
|
|
|
|
NAME: LAZY_LISTBOX
|
|
|
|
SYNOPSIS: Listbox control which defers line definition
|
|
|
|
A lazy listbox is a listbox-like control which postpones defining
|
|
the contents of a line until that line must be shown. Compare a
|
|
conventional listbox control, which requires a BLT_LISTBOX::AddItem
|
|
for each line therein before any may be shown.
|
|
|
|
Do not confuse this control with a "caching" listbox. I think it's
|
|
a good idea to decouple any "caching" logic of an app (such as the
|
|
event-log viewer) from the "virtual listbox" logic. This control,
|
|
then, knows nothing beyond listbox items and indices in the listbox.
|
|
It leaves all caching knowledge up to its client application.
|
|
|
|
To define the particular lazy listbox, derive a class from class
|
|
LAZY_LISTBOX which redefines the (pure, virtual) OnNewItem callback.
|
|
OnNewItem should return a pointer to a LBI for the i-th element in
|
|
the listbox. For instance, you could define it as
|
|
|
|
return new MY_FABULOUS_LBI(pmumble, i);
|
|
|
|
Return NULL if you fail to construct any LBI.
|
|
|
|
Too, if you want to support keyboard H-for-Hawaii manipulation,
|
|
redefine the CONTROL_WINDOW::CD_Char member function.
|
|
|
|
The total number of items is set, and also redefinable
|
|
at any time, via LAZY_LISTBOX::SetCount(). Alternately, you can
|
|
use the Insert etc. members of LIST_CONTROL.
|
|
|
|
The LAZY_LISTBOX::Refresh() function tells the listbox to discard all
|
|
its entries and start anew.
|
|
|
|
|
|
INTERFACE:
|
|
|
|
SetCount() - resets the total number of lines in the list
|
|
|
|
OnNewItem() - callback: returns pointer to a new item. Must
|
|
be defined by user
|
|
|
|
OnDeleteItem() - callback: process the obsolete LBI.
|
|
|
|
PARENT: LISTBOX
|
|
|
|
CAVEATS:
|
|
A lazy listbox requires the LBS_NODATA and LBS_OWNERDRAWFIXED
|
|
styles, and may never have LBS_SORT or LBS_HASSTRINGS.
|
|
|
|
NOTES:
|
|
The lazy listbox demands that the client redefine CD_Char instead
|
|
of supporting the LBI::QueryLeadingChar protocol used by its
|
|
sibling BLT_LISTBOX, since that protocol would force linear
|
|
searches potentially to walk the entire contents of the list.
|
|
|
|
HISTORY:
|
|
beng 27-Nov-1991 Created
|
|
beng 16-Apr-1992 Implemented
|
|
beng 01-Jun-1992 Changed GUILTT support
|
|
KeithMo 17-Dec-1992 Added InsertItem
|
|
|
|
**************************************************************************/
|
|
|
|
DLL_CLASS LAZY_LISTBOX: public LISTBOX
|
|
{
|
|
private:
|
|
// Replacement of virtual LISTBOX methods
|
|
//
|
|
LBI * RequestLBI( const DRAWITEMSTRUCT * pdis );
|
|
VOID ReleaseLBI( LBI * plbi );
|
|
|
|
protected:
|
|
// Called by the lazylb when it needs a new item.
|
|
// Client must supply suitable implementation.
|
|
//
|
|
virtual LBI * OnNewItem( UINT i ) = 0;
|
|
virtual VOID OnDeleteItem( LBI *plbi );
|
|
|
|
// Replace control-window implementation
|
|
//
|
|
virtual APIERR CD_Guiltt( INT ilb, NLS_STR * pnlsOut );
|
|
|
|
public:
|
|
LAZY_LISTBOX( OWNER_WINDOW * pwnd, CID cid,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT );
|
|
|
|
LAZY_LISTBOX( OWNER_WINDOW * powin, CID cid,
|
|
XYPOINT xy, XYDIMENSION dxy,
|
|
ULONG flStyle,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT );
|
|
|
|
// Sets and resets the number of elements in the listbox
|
|
//
|
|
VOID SetCount( UINT cvlbi );
|
|
|
|
INT InsertItem( INT i = -1 )
|
|
{ return InsertItemData( i, NULL ); }
|
|
};
|
|
#endif // WIN32
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
NAME: BLT_LISTBOX_HAW
|
|
|
|
SYNOPSIS: BLT listbox control class with HAW-for-Hawaii support.
|
|
Listboxes do not have to inherit from BLT_LISTBOX_HAW
|
|
to have HAW-for-Hawaii support, but it does take care
|
|
of creating the HAW_FOR_HAWAII_INFO object and
|
|
redefining CD_Char() appropriately. The LBIs must
|
|
still support Compare_HAWforHawaii.
|
|
|
|
INTERFACE: BLT_LISTBOX_HAW() - constructor
|
|
CD_Char - Standard CD_Char handler for
|
|
listboxes with HAW-for-Hawaii functionality.
|
|
|
|
PARENT: BLT_LISTBOX
|
|
|
|
HISTORY:
|
|
jonn 11-Aug-1992 HAW-for-Hawaii for other LBs
|
|
|
|
**********************************************************************/
|
|
|
|
DLL_CLASS BLT_LISTBOX_HAW : public BLT_LISTBOX
|
|
{
|
|
private:
|
|
HAW_FOR_HAWAII_INFO _hawinfo;
|
|
|
|
protected:
|
|
// Replacement of virtual CONTROL_WINDOW methods
|
|
//
|
|
virtual INT CD_Char( WCHAR wch, USHORT nLastPos );
|
|
|
|
public:
|
|
BLT_LISTBOX_HAW( OWNER_WINDOW * powin, CID cid,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
BLT_LISTBOX_HAW( OWNER_WINDOW * powin, CID cid,
|
|
XYPOINT xy, XYDIMENSION dxy,
|
|
ULONG flStyle,
|
|
BOOL fReadOnly = FALSE,
|
|
enum FontType font = FONT_DEFAULT,
|
|
BOOL fIsCombo = FALSE );
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// The following macro is used by BLT_LISTBOX subclasses to easily implement
|
|
// a new QueryItem call, which returns a different type than LBI *.
|
|
//
|
|
// Usage:
|
|
// In public section of class declaration, put
|
|
// DECLARE_LB_QUERY_ITEM( type )
|
|
// where 'type' is a class derived from LBI.
|
|
//
|
|
// Notes:
|
|
// The macro, nor the compiler, can check if 'type' is indeed a
|
|
// type derived from LBI.
|
|
//
|
|
// As a reminder, despite of the return code from the new QueryItem
|
|
// method, BLT does not guarantee that the listbox will only contain
|
|
// 'type' LBI items.
|
|
//
|
|
// In spite of its name, the macro both declares and defines the
|
|
// derived inline QueryItem method.
|
|
|
|
#define DECLARE_LB_QUERY_ITEM( type ) \
|
|
type * QueryItem() const \
|
|
{ return (type *)BLT_LISTBOX::QueryItem(); } \
|
|
type * QueryItem( INT i ) const \
|
|
{ return (type *)BLT_LISTBOX::QueryItem( i ); }
|
|
|
|
|
|
#endif // _BLTLB_HXX_ - end of file
|