mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
12 KiB
399 lines
12 KiB
/*
|
|
* v l b . h
|
|
*
|
|
* Purpose:
|
|
* Virtual Listbox Control - external definitions
|
|
*
|
|
* Owner:
|
|
* JohnKal
|
|
*/
|
|
|
|
#ifndef CHAR
|
|
typedef char CHAR;
|
|
#endif
|
|
|
|
// Messages the VLB reacts to ////////////////////////////////////////
|
|
|
|
#ifdef WIN32
|
|
#define VLB_MIN (WM_USER + 1)
|
|
#else
|
|
#define VLB_MIN (LB_FINDSTRINGEXACT + 1)
|
|
#endif
|
|
|
|
#ifndef BEGIN_INTERFACE
|
|
#ifndef MACPORT
|
|
#define BEGIN_INTERFACE
|
|
#else
|
|
#error BEGIN_INTERFACE should be defined.
|
|
#endif
|
|
#endif
|
|
|
|
typedef struct tagVLBFRACTION
|
|
{
|
|
ULONG ulNumer;
|
|
ULONG ulDenom;
|
|
} VLBFRACTION, FAR * LPVLBFRACTION;
|
|
|
|
// VLB styles. We can reuse LBS_ values since we're not gonna support the
|
|
// LBS flavours anyway.
|
|
|
|
#define VLBS_DRAGDROP LBS_USETABSTOPS
|
|
#define VLBS_WANTRETURN LBS_MULTICOLUMN
|
|
|
|
// VLB notification messages.
|
|
|
|
#define VLBN_HSCROLL (LBN_KILLFOCUS + 1)
|
|
#define VLBN_RETURN (LBN_KILLFOCUS + 2)
|
|
#define VLBN_RIGHTCLICK (LBN_KILLFOCUS + 3)
|
|
#define VLBN_KEY (LBN_KILLFOCUS + 4)
|
|
#define VLBN_LEFTCLICK (LBN_KILLFOCUS + 5)
|
|
#define VLBN_SHIFTF10 (LBN_KILLFOCUS + 6)
|
|
#define VLBN_ERROR (LBN_KILLFOCUS + 7)
|
|
|
|
#define VLB_SETMAPITABLE (VLB_MIN + 1)
|
|
#define VLB_SETVLBCALLBACK (VLB_MIN + 2)
|
|
#define VLB_GETMAPITABLE (VLB_MIN + 3)
|
|
#define VLB_REFRESH (VLB_MIN + 4)
|
|
#define VLB_GETCARETFRACTION (VLB_MIN + 5)/**/
|
|
#define VLB_SETCARETFRACTION (VLB_MIN + 6)/**/
|
|
#define VLB_GETSELCURSOR (VLB_MIN + 7)/**/
|
|
#define VLB_PREVNEXT (VLB_MIN + 8)
|
|
#define VLB_MAKECARETVISIBLE (VLB_MIN + 10)
|
|
#define VLB_GETTOPFRACTION (VLB_MIN + 11)/**/
|
|
#define VLB_DISCARDITEMS (VLB_MIN + 12)/**/
|
|
#define VLB_CREATEVLBENUM (VLB_MIN + 13)
|
|
#define VLB_SETSELECTIONMODE (VLB_MIN + 14)
|
|
#define VLB_REMOVEITEMSEL (VLB_MIN + 15)
|
|
#define VLB_AUTOSCROLL (VLB_MIN + 16)
|
|
#define VLB_ACTIVESELECTION (VLB_MIN + 17)
|
|
#define VLB_DICECURSOR (VLB_MIN + 18)
|
|
#define VLB_GETPEGGEDSTATUS (VLB_MIN + 19)
|
|
#define VLB_SELECTITEM (VLB_MIN + 20)
|
|
#define VLB_PREPAREFORNOTIFY (VLB_MIN + 21)
|
|
#define VLB_REGISTERDRAGFORMAT (VLB_MIN + 22)
|
|
#define VLB_KEYMOVECURSOR (VLB_MIN + 23)
|
|
#define VLB_SELECTALL (VLB_MIN + 24)
|
|
#define VLB_TELESCOPEITEM (VLB_MIN + 25)
|
|
#define VLB_GETLASTERROR (VLB_MIN + 26)
|
|
|
|
// Test hook messages.
|
|
#define VLB_GETVISIBLECOUNT (VLB_MIN + 30)
|
|
|
|
// win32 test hooks
|
|
#define PIPE_OFFSET 10
|
|
#define VLB_CONNECTPIPE (VLB_MIN + PIPE_OFFSET+30)
|
|
#define VLB_DISCONNECTPIPE (VLB_MIN + PIPE_OFFSET+31)
|
|
#define VLB_PIPGETROW (VLB_MIN + PIPE_OFFSET+32)
|
|
#define VLB_PIPGETSELLIST (VLB_MIN + PIPE_OFFSET+33)
|
|
#define VLB_PIPRELEASEENUM (VLB_MIN + PIPE_OFFSET+34)
|
|
#define VLB_PIPSETSEL (VLB_MIN + PIPE_OFFSET+35)
|
|
|
|
// Vlb_Refresh hints.
|
|
|
|
#define VLBH_NONE 0
|
|
#define VLBH_ITEMSADDED 1
|
|
#define VLBH_ITEMSREMOVED 2
|
|
#define VLBH_ITEMSCHANGED 3
|
|
#define VLBH_FORCERELOAD 4
|
|
|
|
#define VLBH_ITEMEXPANDED 5
|
|
#define VLBH_ITEMCOLLAPSED 6
|
|
|
|
|
|
// Vlb_GetPeggedStatus return values.
|
|
|
|
#define VLBGPS_TOP 1
|
|
#define VLBGPS_MIDDLE 2
|
|
#define VLBGPS_BOTTOM 4
|
|
#define VLBGPS_EMPTY 8
|
|
|
|
#define Vlb_SetMAPITable(_hwndVlb, _lpmt, _fGoToBottom) \
|
|
SendMessage(_hwndVlb, VLB_SETMAPITABLE, (WPARAM) _fGoToBottom, (LPARAM) _lpmt)
|
|
|
|
#define Vlb_SetVlbCallback(_hwndVlb, _lpvlbcbc) \
|
|
SendMessage(_hwndVlb, VLB_SETVLBCALLBACK, 0, (LPARAM) _lpvlbcbc)
|
|
|
|
#define Vlb_GetMAPITable(_hwndVlb) \
|
|
(LPMAPITABLE) SendMessage(_hwndVlb, VLB_GETMAPITABLE, 0, 0)
|
|
|
|
#define Vlb_Refresh(_hwndVlb, _vlbh, _item) \
|
|
SendMessage(_hwndVlb, VLB_REFRESH, (WPARAM)_vlbh, (LPARAM)(const VOID FAR *) _item)
|
|
|
|
#define Vlb_GetCaretFraction(_hwndVlb, _lpVlbFraction) \
|
|
SendMessage(_hwndVlb, VLB_GETCARETFRACTION, 0, (LPARAM) _lpVlbFraction)
|
|
|
|
#define Vlb_SetCaretFraction(_hwndVlb, _lpVlbFraction) \
|
|
SendMessage(_hwndVlb, VLB_SETCARETFRACTION, 0, (LPARAM)(const VLBFRACTION FAR *) _lpVlbFraction)
|
|
|
|
#define Vlb_GetSelCursor(_hwndVlb, _lpVlbFraction) \
|
|
SendMessage(_hwndVlb, VLB_GETSELCURSOR, 0, (LPARAM) _lpVlbFraction)
|
|
|
|
#define Vlb_PrevNext(_hwndVlb, _lpVlbPrevNext) \
|
|
(HRESULT) SendMessage(_hwndVlb, VLB_PREVNEXT, 0, (LPARAM) _lpVlbPrevNext)
|
|
|
|
#define Vlb_MakeCaretVisible(_hwndVlb) \
|
|
SendMessage(_hwndVlb, VLB_MAKECARETVISIBLE, 0, 0)
|
|
|
|
#define Vlb_GetTopFraction(_hwndVlb, _lpVlbFraction) \
|
|
SendMessage(_hwndVlb, VLB_GETTOPFRACTION, 0, (LPARAM) _lpVlbFraction)
|
|
|
|
#define Vlb_DiscardItems(_hwndVlb) \
|
|
SendMessage(_hwndVlb, VLB_DISCARDITEMS, 0, 0)
|
|
|
|
#define Vlb_CreateVlbEnum(_hwndVlb, _lplpVlbEnum) \
|
|
SendMessage(_hwndVlb, VLB_CREATEVLBENUM, 0, (LPARAM)(const IVlbEnum FAR *) (_lplpVlbEnum))
|
|
|
|
#define Vlb_SetSelectionMode(_hwndVlb, _fMultipleSelection) \
|
|
SendMessage(_hwndVlb, VLB_SETSELECTIONMODE, (WPARAM) _fMultipleSelection, 0)
|
|
|
|
#define Vlb_RemoveItemSel(_hwndVlb, _pitem) \
|
|
SendMessage(_hwndVlb, VLB_REMOVEITEMSEL, 0, (LPARAM)(const void FAR *) _pitem)
|
|
|
|
#define Vlb_SetActiveSelection(_hwndVlb, _fOn) \
|
|
SendMessage(_hwndVlb, VLB_ACTIVESELECTION, _fOn, 0)
|
|
|
|
#define Vlb_DiceCursor(_hwndVlb, _prw) \
|
|
SendMessage(_hwndVlb, VLB_DICECURSOR, 0, (LPARAM)(const void FAR *) _prw)
|
|
|
|
#define Vlb_GetPeggedStatus(_hwndVlb) \
|
|
SendMessage(_hwndVlb, VLB_GETPEGGEDSTATUS, 0, 0)
|
|
|
|
#define Vlb_SelectItem(_hwndVlb, _prw) \
|
|
(BOOL)SendMessage(_hwndVlb, VLB_SELECTITEM, 0, (LPARAM)(const void FAR *) _prw)
|
|
|
|
#define Vlb_PrepareForNotify(_hwndVlb, _vlbh) \
|
|
SendMessage(_hwndVlb, VLB_PREPAREFORNOTIFY, (WPARAM) _vlbh, 0)
|
|
|
|
#define Vlb_RegisterDragFormat(_hwndVlb, _szFmt) \
|
|
(UINT)(SendMessage(_hwndVlb, VLB_REGISTERDRAGFORMAT, 0, (LPARAM)(const void FAR *) _szFmt))
|
|
|
|
#define Vlb_KeyMoveCursor(_hwndVlb, _vk) \
|
|
(BOOL)(SendMessage(_hwndVlb, VLB_KEYMOVECURSOR, 0, (LPARAM) _vk))
|
|
|
|
#define Vlb_SelectAll(_hwndVlb) \
|
|
(SendMessage(_hwndVlb, VLB_SELECTALL, 0, 0))
|
|
|
|
#define Vlb_TelescopeItem(_hwndVlb, _fExplode, _prw) \
|
|
(SendMessage(_hwndVlb, VLB_TELESCOPEITEM, (WPARAM) (_fExplode), (LPARAM)(_prw)))
|
|
typedef struct
|
|
{
|
|
LPSRow prwItem; // Row to match.
|
|
LPSPropValue pvalInstanceKey; // Instance key used to exp/collapse
|
|
} VLBTELESCOPE;
|
|
|
|
#define Vlb_GetLastError(_hwndVlb, _plasterr) \
|
|
(VOID *)(SendMessage(_hwndVlb, VLB_GETLASTERROR, 0, (LPARAM) (_plasterr)))
|
|
|
|
// Selection enumerator interface //////////////////////////////
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IVlbEnum
|
|
|
|
DECLARE_INTERFACE_(IVlbEnum, IUnknown)
|
|
{
|
|
BEGIN_INTERFACE
|
|
// *** IUnknown methods ***
|
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;
|
|
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
|
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
|
|
|
// *** IVlbEnum methods ***
|
|
STDMETHOD_(BOOL, FNextItem) (THIS_ LPSRow pprw) PURE;
|
|
STDMETHOD_(VOID, Reset) (THIS) PURE;
|
|
STDMETHOD_(ULONG,CItems) (THIS) PURE;
|
|
};
|
|
|
|
typedef IVlbEnum FAR * LPVLBENUM;
|
|
|
|
|
|
|
|
// VLB Callback interface ////////////////////////////////////////
|
|
|
|
/*
|
|
* Your application is required to provide a pointer to a chunk of
|
|
* memory for a VlbCallback object. The first part of this memory is a
|
|
* pointer to a table of function pointers (a.k.a. virtual table). The
|
|
* format of this table is described by the DTBLVLBCALLBACK structure.
|
|
*
|
|
* Use Vlb_SetVlbCallback(hwndVlb, lpVlbCallback) to tell the VLB what
|
|
* object you are going to use for rendering &c.
|
|
*/
|
|
|
|
// Structure with which to paint
|
|
typedef struct
|
|
{
|
|
UINT cbSize; // Set to sizeof(VLBPAINT)
|
|
HDC hdc; // DC to paint in.
|
|
RECT rc; // Painting arena.
|
|
HPEN hpenBk; // Background pen to use.
|
|
HBRUSH hbrushBk; // Background brush to use.
|
|
HBRUSH hbrushFg; // Foreground brush to use.
|
|
COLORREF clrFg; // Foreground color.
|
|
COLORREF clrBk; // Background color.
|
|
INT dxOffset; // how far to the left we scrolled.
|
|
BOOL fSelected; // This item is selected.
|
|
BOOL fRenderSelected; // Paint this item as selected.
|
|
BOOL fHasFocus; // LBX has focus (or not).
|
|
BOOL fPreviousRowSelected; // Previous row was selected.
|
|
} VLBPAINT, *LPVLBPAINT;
|
|
|
|
// Structure for prev/next operations
|
|
// *** CALLER MUST FREE RW.LPPROPS AFTERWARDS WITH MAPIFREEBUFFER ***
|
|
typedef struct
|
|
{
|
|
UINT cbSize; // Set to sizeof(VLBPREVNEXT)
|
|
DWORD dwDir; // Direction (VLBDIR_PREV or _NEXT)
|
|
LPVOID pvItem; // Item to find prev/next of
|
|
ULONG cbItem; // Size of that item
|
|
SRow rw; // Row where prev/next item is put
|
|
} VLBPREVNEXT, *LPVLBPREVNEXT;
|
|
|
|
// Flags for VLBPREVNEXT: should be same as in mapiform.h
|
|
#define VLBDIR_NEXT 0x0001
|
|
#define VLBDIR_PREV 0x0002
|
|
|
|
// Flags for IVlbCallback::FDrop
|
|
// VCFD_TARGETISSOURCE: the drop occurred on the source VLB. (self-drop)
|
|
|
|
#define VCFD_TARGETISSOURCE 0x00000001
|
|
|
|
// Return values for IVlbCallback::OnMouseButton ("I" is the IVlbCallback
|
|
// implementor):
|
|
// VCMB_NONE: go ahead Mr. VLB, I'm happy.
|
|
// VCMB_KEEPSELECTION: Avoid wiping out existing selection.
|
|
// VCMB_INTERCEPTED: Bug off, VLB, *I'm* in charge of this mouse command.
|
|
|
|
#define VCMB_NONE 0
|
|
#define VCMB_KEEPSELECTION 1
|
|
#define VCMB_INTERCEPTED 2
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IVlbCallback
|
|
|
|
DECLARE_INTERFACE_(IVlbCallback, IUnknown)
|
|
{
|
|
BEGIN_INTERFACE
|
|
// *** IUnknown methods ***
|
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
|
|
|
// *** IVlbCallback methods ***
|
|
STDMETHOD_(ULONG,OnMouseButton)(THIS_
|
|
LPSRow prw,
|
|
UINT msg,
|
|
BOOL fDoubleClick,
|
|
int x,
|
|
int y,
|
|
UINT keyflags) PURE;
|
|
STDMETHOD_(ULONG,OnChar)(THIS_ UINT ch, int cRepeat) PURE;
|
|
|
|
// Drag/Drop methods.
|
|
|
|
STDMETHOD_(BOOL,FAllowDrag)(THIS_
|
|
LPSRow prw,
|
|
UINT uMsg,
|
|
int x,
|
|
int y,
|
|
LPDWORD pdwEffect) PURE;
|
|
STDMETHOD_(BOOL,FAllowDrop)(THIS_
|
|
LPSRow prw,
|
|
int x,
|
|
int y,
|
|
IDataObject FAR * pdo,
|
|
UINT FAR * pcf) PURE;
|
|
STDMETHOD_(BOOL,FDrop)(THIS_
|
|
LPSRow prw,
|
|
int x,
|
|
int y,
|
|
DWORD grfKeyState,
|
|
ULONG ulFlags,
|
|
IVlbEnum FAR * pve,
|
|
HANDLE hCtx) PURE;
|
|
STDMETHOD_(BOOL,FDropDataObject)(THIS_
|
|
LPSRow prw,
|
|
int x,
|
|
int y,
|
|
DWORD grfKeyState,
|
|
ULONG ulFlags,
|
|
IDataObject FAR * pdo) PURE;
|
|
STDMETHOD_(BOOL,FTrackCursor)(THIS) PURE;
|
|
STDMETHOD(HrFreezeItem)(THIS_
|
|
LPSRow prw,
|
|
ULONG FAR * pcb,
|
|
LPBYTE FAR * ppb) PURE;
|
|
STDMETHOD(HrThawItem)(THIS_
|
|
ULONG cb,
|
|
LPBYTE pb,
|
|
LPSRow prwDst) PURE;
|
|
STDMETHOD_(VOID,DestroyFrozenItem)(THIS_ LPBYTE pb) PURE;
|
|
STDMETHOD(HrGetContextData)(THIS_ HANDLE * phGlobal) PURE;
|
|
|
|
STDMETHOD_(VOID,DestroyItem)(THIS_ LPSRow prw) PURE;
|
|
STDMETHOD_(VOID,DestroyRowSet)(THIS_ LPSRowSet prws) PURE;
|
|
STDMETHOD_(SCODE,CopyItem)(THIS_ LPSRow prw1, LPSRow prw2) PURE;
|
|
STDMETHOD_(SCODE,CopyItemId)(THIS_ LPSRow prw1, LPSRow prw2) PURE;
|
|
STDMETHOD_(BOOL,FItemsEqual)(THIS_ LPSRow prw1, LPSRow prw2) PURE;
|
|
STDMETHOD_(BOOL,FFindItem)(THIS_ LPSRow prw, LPMAPITABLE pmt) PURE;
|
|
STDMETHOD_(BOOL,FItemHasPrefix)(THIS_ LPSRow prw, LPTSTR szPrefix) PURE;
|
|
STDMETHOD_(BOOL,FFindItemPrefix)(THIS_ LPTSTR szPrefix, LPMAPITABLE pmt) PURE;
|
|
STDMETHOD_(VOID,PaintItem)(THIS_
|
|
LPSRow prw,
|
|
LPVLBPAINT pvp,
|
|
BOOL fIsCursorItem) PURE;
|
|
STDMETHOD_(VOID,PreparePaint)(THIS_ LPVLBPAINT pvp, BOOL fStarting) PURE;
|
|
STDMETHOD(HrPrevNext)(THIS_ LPMAPITABLE pmt, LPVLBPREVNEXT pvpn) PURE;
|
|
|
|
STDMETHOD_(BOOL,AdminInterface)(THIS_
|
|
LPSRow prw,
|
|
UINT * pcParams,
|
|
BYTE * pbRes) PURE;
|
|
};
|
|
|
|
typedef IVlbCallback FAR * LPVLBCALLBACK;
|
|
|
|
#define CF_VLBDATA "Vlb Selection Data Format"
|
|
|
|
// Initialization and deinitialization API's ////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
VOID WINAPI InitVlb();
|
|
VOID WINAPI DeinitVlb();
|
|
|
|
// Create a VlbEnum from a drop ////////////////////
|
|
|
|
HRESULT WINAPI HrCreatePveFromPdo(
|
|
UINT cfDrop,
|
|
IVlbCallback * pvc,
|
|
IDataObject * pdo,
|
|
IVlbEnum * * pve,
|
|
HANDLE * phCtx);
|
|
|
|
// Create a DataObject that can be dropped as a LBX drop.
|
|
|
|
SCODE WINAPI ScCreatePrwDataObject(
|
|
LPSRow prw,
|
|
IVlbCallback * pvc,
|
|
UINT cf,
|
|
IDataObject * * ppdo);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
// Testing hooks & general magic ////////////////////////////////////////
|
|
|
|
#define MSM_GETWINDOW (WM_USER+2)
|
|
// The following are the wParam values for MSM_GETWINDOW
|
|
#define MSMGW_CONTENTS 1
|
|
#define MSMGW_HEADER 2
|
|
#define MSMGW_STATUSBAR 3
|
|
#define MSMGW_TOOLBAR 4
|
|
#define MSMGW_SCOPE 5
|
|
|
|
|
|
// end of vlb.h ////////////////////////////////////////
|