// LISTVIEW PRIVATE DECLARATIONS #ifndef _INC_LISTVIEW #define _INC_LISTVIEW #include "selrange.h" #include #define COBJMACROS #include //#define USE_SORT_FLARE // // Apps steal our userdata space so make sure we don't use it. // #undef GWLP_USERDATA #undef GWL_USERDATA // define this to get single click activate to activate immediately. // if a second click comes to the same window within a double-click-timeout // period, we blow it off. we try to keep focus on the app that launched, // but we can't figure out how to do that yet... with this not defined, // the single-click-activate waits a double-click-timeout before activating. // //#define ONECLICKHAPPENED // REVIEW: max items in a OWNERDATA listview // due to currently unknown reasons the listview will not handle much more // items than this. Since this number is very high, no time has yet been // spent on finding the reason(s). // #define MAX_LISTVIEWITEMS (100000000) #define CLIP_HEIGHT ((plv->cyLabelChar * 2) + g_cyEdge) #define CLIP_HEIGHT_DI ((plvdi->plv->cyLabelChar * 2) + g_cyEdge) #define CLIP_WIDTH ((plv->cxIconSpacing - g_cxLabelMargin * 2)) // Timer IDs #define IDT_NAMEEDIT 42 #define IDT_SCROLLWAIT 43 #define IDT_MARQUEE 44 #define IDT_ONECLICKOK 45 #define IDT_ONECLICKHAPPENED 46 #define IDT_SORTFLARE 47 #define IDT_TRACKINGTIP 48 // Keyboard tracking tooltip display pause // // use g_cxIconSpacing when you want the the global system metric // use _GetCurrentItemSize when you want the padded size of "icon" in a ListView // extern BOOL g_fListviewAlphaSelect; extern BOOL g_fListviewShadowText; extern BOOL g_fListviewWatermarkBackgroundImages; extern BOOL g_fListviewEnableWatermark; extern int g_cxIcon; extern int g_cyIcon; #define g_cxIconOffset ((g_cxIconSpacing - g_cxIcon) / 2) #define g_cyIconOffset (g_cyBorder * 2) // NOTE: Must be >= cyIconMargin! #define DT_LV (DT_CENTER | DT_SINGLELINE | DT_NOPREFIX | DT_EDITCONTROL) #define DT_LVWRAP (DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_EDITCONTROL) #define DT_LVTILEWRAP (DT_WORDBREAK | DT_NOPREFIX | DT_EDITCONTROL) #define CCHLABELMAX MAX_PATH #define CCMAX_TILE_COLUMNS 20 // Max number of slots per tile. Having a value means the drawing code doesn't need to Alloc #define BORDERSELECT_THICKNESS 3 #define IsEqualRect(rc1, rc2) ( ((rc1).left==(rc2).left) && ((rc1).top==(rc2).top) && ((rc1).right==(rc2).right) && ((rc1).bottom==(rc2).bottom) ) BOOL ListView_Init(HINSTANCE hinst); LRESULT CALLBACK _export ListView_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); #define ListView_DefProc DefWindowProc typedef struct _IMAGE IMAGE; typedef struct tagLISTGROUP { LPWSTR pszHeader; LPWSTR pszFooter; UINT state; UINT uAlign; int iGroupId; HDPA hdpa; RECT rc; int cyTitle; } LISTGROUP, *PLISTGROUP; #define LISTGROUP_HEIGHT(plv, pgrp) (max((plv)->rcBorder.top, (pgrp)->cyTitle + 6) + (plv)->paddingTop) #define LISTITEM_HASASKEDFORGROUP(plvi) ((plvi)->pGroup != (LISTGROUP*)I_GROUPIDCALLBACK) #define LISTITEM_HASGROUP(plvi) ((plvi)->pGroup != NULL && LISTITEM_HASASKEDFORGROUP(plvi)) #define LISTITEM_SETASKEDFORGROUP(plvi) ((plvi)->pGroup = NULL) #define LISTITEM_SETHASNOTASKEDFORGROUP(plvi) ((plvi)->pGroup = (LISTGROUP*)I_GROUPIDCALLBACK) #define LISTITEM_GROUP(plvi) (LISTITEM_HASGROUP(plvi)? (plvi)->pGroup: NULL) typedef struct _LISTITEM // li { LPTSTR pszText; POINT pt; short iImage; short cxSingleLabel; short cxMultiLabel; short cyFoldedLabel; short cyUnfoldedLabel; short iWorkArea; // Which workarea do I belong WORD state; // LVIS_* short iIndent; LPARAM lParam; // Region listview stuff HRGN hrgnIcon; // Region which describes the icon for this item POINT ptRgn; // Location that this item's hrgnIcon was calculated for RECT rcTextRgn; LISTGROUP* pGroup; // Tile column info UINT cColumns; PUINT puColumns; DWORD dwId; } LISTITEM; // Report view sub-item structure typedef struct _LISTSUBITEM { LPTSTR pszText; short iImage; WORD state; SIZE sizeText; } LISTSUBITEM, *PLISTSUBITEM; #define COLUMN_VIEW #define LV_HDPA_GROW 16 // Grow chunk size for DPAs #define LV_HIML_GROW 8 // Grow chunk size for ImageLists typedef struct _LV { CCONTROLINFO ci; // common control header info BITBOOL fNoDismissEdit:1; // don't dismiss in-place edit control BITBOOL fButtonDown:1; // we're tracking the mouse with a button down BITBOOL fOneClickOK:1; // true from creation to double-click-timeout BITBOOL fOneClickHappened:1; // true from item-activate to double-click-timeout BITBOOL fPlaceTooltip:1; // should we do the placement of tooltip over the text? BITBOOL fImgCtxComplete:1; // TRUE if we have complete bk image BITBOOL fNoEmptyText:1; // we don't have text for an empty view. BITBOOL fGroupView:1; BITBOOL fIconsPositioned:1; BITBOOL fInsertAfter:1; // insert after (or before) iInsertSlot slot. BITBOOL fListviewAlphaSelect:1; BITBOOL fListviewShadowText:1; BITBOOL fListviewWatermarkBackgroundImages:1; BITBOOL fListviewEnableWatermark:1; BITBOOL fInFixIScrollPositions:1; WORD wView; // Which view are we in? HDPA hdpa; // item array structure DWORD flags; // LVF_ state bits DWORD exStyle; // the listview LVM_SETEXTENDEDSTYLE DWORD dwExStyle; // the windows ex style HFONT hfontLabel; // font to use for labels COLORREF clrBk; // Background color COLORREF clrBkSave; // Background color saved during disable COLORREF clrText; // text color COLORREF clrTextBk; // text background color COLORREF clrOutline; // focus rect outline color HBRUSH hbrBk; HANDLE hheap; // The heap to use to allocate memory from. int cyLabelChar; // height of '0' in hfont int cxLabelChar; // width of '0' int cxEllipses; // width of "..." int iDrag; // index of item being dragged int iFocus; // index of currently-focused item int iMark; // index of "mark" for range selection int iItemDrawing; // item currently being drawn int iFirstChangedNoRedraw; // Index of first item added during no redraw. UINT stateCallbackMask; // item state callback mask SIZE sizeClient; // current client rectangle int nWorkAreas; // Number of workareas LPRECT prcWorkAreas; // The workarea rectangles -- nWorkAreas of them. UINT nSelected; int iPuntChar; HRGN hrgnInval; HWND hwndToolTips; // handle of the tooltip window for this view int iTTLastHit; // last item hit for text int iTTLastSubHit; // last subitem hit for text LPTSTR pszTip; // buffer for tip #ifdef USE_SORT_FLARE int iSortFlare; #endif // Small icon view fields HIMAGELIST himlSmall; // small icons int cxSmIcon; // image list x-icon size int cySmIcon; // image list y-icon size int xOrigin; // Horizontal scroll posiiton int cxItem; // Width of small icon items int cyItem; // item height int cItemCol; // Number of items per column int cxIconSpacing; int cyIconSpacing; // Icon view fields HIMAGELIST himl; int cxIcon; // image list x-icon size int cyIcon; // image list y-icon size HDPA hdpaZOrder; // Large icon Z-order array // Some definitions, to help make sense of the next two variables: // // Lets call the pitem->pt coordinate values "listview coordinates". // // Lets use rcClient as short-hand for the client area of the listview window. // // (1) ptOrigin is defined as the listview coordinate that falls on rcClient's 0,0 position. // // i.e., here's how to calculate the x,y location on rcClient for some item: // * pitem->pt.x - ptOrigin.x , pitem->pt.y - ptOrigin.y // Let's call that these values "window coordinates". // // (2) rcView is defined as the bounding rect of: each item's unfolded rcview bounding rect and a bit of buffer // note: ListView_ValidatercView() checks this // // (3) For scrolling listviews (!LVS_NOSCROLL), there are two scrolling cases to consider: // First, where rcClient is smaller than rcView: // * rcView.left <= ptOrigin.x <= ptOrigin.x+RECTWIDTH(rcClient) <= rcView.right // Second, where rcClient is larger than rcView (no scrollbars visible): // * ptOrigin.x <= rcView.left <= rcView.right <= ptOrigin.x+RECTWIDTH(rcClient) // note: ListView_ValidateScrollPositions() checks this // // (4) For non scrolling listviews (LVS_NOSCROLL), we have some legacy behavior to consider: // For clients that persist icon positions but not the ptOrigin value, we must ensure: // * 0 == ptOrigin.x // note: ListView_ValidateScrollPositions() checks this // POINT ptOrigin; // Scroll position RECT rcView; // Bounds of all icons (ptOrigin relative) int iFreeSlot; // Most-recently found free icon slot since last reposition (-1 if none) int cSlots; HWND hwndEdit; // edit field for edit-label-in-place int iEdit; // item being edited WNDPROC pfnEditWndProc; // edit field subclass proc NMITEMACTIVATE nmOneClickHappened; #define SMOOTHSCROLLLIMIT 10 int iScrollCount; // how many times have we gotten scroll messages before an endscroll? // Report view fields int iLastColSort; int cCol; HDPA hdpaSubItems; HWND hwndHdr; // Header control int yTop; // First usable pixel (below header) int xTotalColumnWidth; // Total width of all columns POINTL ptlRptOrigin; // Origin of Report. int iSelCol; // to handle column width changing. changing col int iSelOldWidth; // to handle column width changing. changing col width int cyItemSave; // in ownerdrawfixed mode, we put the height into cyItem. use this to save the old value // Tile View fields SIZE sizeTile; // the size of a tile int cSubItems; // Count of the number of sub items to display in a tile DWORD dwTileFlags; // LVTVIF_FIXEDHEIGHT | LVTVIF_FIXEDWIDTH RECT rcTileLabelMargin; // addition space to reserve around label // Group View fields HDPA hdpaGroups; // Groups RECT rcBorder; // Border thickness COLORREF crHeader; COLORREF crFooter; COLORREF crTop; COLORREF crBottom; COLORREF crLeft; COLORREF crRight; HFONT hfontGroup; UINT paddingLeft; UINT paddingTop; UINT paddingRight; UINT paddingBottom; TCHAR szItems[50]; // state image stuff HIMAGELIST himlState; int cxState; int cyState; // OWNERDATA stuff ILVRange *plvrangeSel; // selection ranges ILVRange *plvrangeCut; // Cut Range int cTotalItems; // number of items in the ownerdata lists int iDropHilite; // which item is drop hilited, assume only 1 int iMSAAMin, iMSAAMax; // keep track of what we told accessibility UINT uUnplaced; // items that have been added but not placed (pt.x == RECOMPUTE) int iHot; // which item is hot HFONT hFontHot; // the underlined font .. assume this has the same size metrics as hFont int iNoHover; // don't allow hover select on this guy because it's the one we just hover selected (avoids toggling) DWORD dwHoverTime; // Defaults to HOVER_DEFAULT HCURSOR hCurHot; // the cursor when we're over a hot item // BkImage stuff IImgCtx *pImgCtx; // Background image interface ULONG ulBkImageFlags; // LVBKIF_* HBITMAP hbmBkImage; // Background bitmap (LVBKIF_SOURCE_HBITMAP) LPTSTR pszBkImage; // Background URL (LVBKIF_SOURCE_URL) int xOffsetPercent; // X offset for LVBKIF_STYLE_NORMAL images int yOffsetPercent; // Y offset for LVBKIF_STYLE_NORMAL images HPALETTE hpalHalftone; // Palette for drawing bk images LPTSTR pszEmptyText; // buffer for empty view text. COLORREF clrHotlight; // Hot light color set explicitly for this listview. POINT ptCapture; //incremental search stuff ISEARCHINFO is; // Themes HTHEME hTheme; // Insertmark int iInsertItem; // The item to insert next to int clrim; // The color of the insert mark. int iTracking; // Used for tooltips via keyboard (current item in focus for info display, >= 0 is tracking active) LPARAM lLastMMove; // Filter out mouse move messages that didn't result in an actual move (for track tooltip canceling) // Frozen Slot int iFrozenSlot; // The slot that should not be used by anyone other than the frozen item LISTITEM *pFrozenItem; // Pointer to the frozen item. RECT rcViewMargin; // the EnsureVisible margine around an item -- the rcView margin RECT rcMarquee; // Watermarks HBITMAP hbmpWatermark; SIZE szWatermark; // Id Tracking DWORD idNext; // Stores the next ID. DWORD iLastId; // Stores the index to the previous item for searches DWORD iIncrement; } LV; #define LV_StateImageValue(pitem) ((int)(((DWORD)((pitem)->state) >> 12) & 0xF)) #define LV_StateImageIndex(pitem) (LV_StateImageValue(pitem) - 1) // listview flag values #define LVF_FOCUSED 0x00000001 #define LVF_VISIBLE 0x00000002 #define LVF_ERASE 0x00000004 // is hrgnInval to be erased? #define LVF_NMEDITPEND 0x00000008 #define LVF_REDRAW 0x00000010 // Value from WM_SETREDRAW message #define LVF_ICONPOSSML 0x00000020 // X, Y coords are in small icon view #define LVF_INRECOMPUTE 0x00000040 // Check to make sure we are not recursing #define LVF_UNFOLDED 0x00000080 #define LVF_FONTCREATED 0x00000100 // we created the LV font #define LVF_SCROLLWAIT 0x00000200 // we're waiting to scroll #define LVF_COLSIZESET 0x00000400 // Has the caller explictly set width for list view #define LVF_USERBKCLR 0x00000800 // user set the bk color (don't follow syscolorchange) #define LVF_ICONSPACESET 0x00001000 // the user has set the icon spacing #define LVF_CUSTOMFONT 0x00002000 // there is at least one item with a custom font #define LVF_DONTDRAWCOMP 0x00004000 // do not draw IME composition if true #define LVF_INSERTINGCOMP 0x00008000 // Avoid recursion #define LVF_INRECALCREGION 0x00010000 // prevents recursion in RecalcRegion #define LVF_DRAGIMAGE 0x00020000 // Generating a drag image #define LVF_MARQUEE 0x00040000 #define ENTIRE_REGION 1 // listview DrawItem flags #define LVDI_NOIMAGE 0x0001 // don't draw image #define LVDI_TRANSTEXT 0x0002 // draw text transparently in black #define LVDI_NOWAYFOCUS 0x0004 // don't allow focus to drawing #define LVDI_FOCUS 0x0008 // focus is set (for drawing) #define LVDI_SELECTED 0x0010 // draw selected text #define LVDI_SELECTNOFOCUS 0x0020 #define LVDI_HOTSELECTED 0x0040 #define LVDI_UNFOLDED 0x0080 // draw the item unfolded (forced) #define LVDI_NOICONSELECT 0x0100 #define LVDI_GLOW 0x0200 #define LVDI_SHADOW 0x0400 #define LVDI_NOEFFECTS 0x0800 // listview private insertmark flags (Note: these must not conflict with the public ones in commctrl.w) #define LVIM_SETFROMINFO 0x80000000 typedef struct { LV* plv; LPPOINT lpptOrg; LPRECT prcClip; UINT flags; LISTITEM* pitem; DWORD dwCustom; NMLVCUSTOMDRAW nmcd; } LVDRAWITEM, *PLVDRAWITEM; // listview child control ids #define LVID_HEADER 0 // listview keyboard tooltip tracking #define LVKTT_NOTRACK -1 // When there is no frozen slot, it is -1. #define LV_NOFROZENSLOT -1 // When no item is frozen, the index of the frozen item is -1. #define LV_NOFROZENITEM -1 // Instance data pointer access functions #define ListView_GetPtr(hwnd) (LV*)GetWindowPtr(hwnd, 0) #define ListView_SetPtr(hwnd, p) (LV*)SetWindowPtr(hwnd, 0, p) // view type check functions #define ListView_IsIconView(plv) ((plv)->wView == LV_VIEW_ICON) #define ListView_IsTileView(plv) ((plv)->wView == LV_VIEW_TILE) #define ListView_IsSmallView(plv) ((plv)->wView == LV_VIEW_SMALLICON) #define ListView_IsListView(plv) ((plv)->wView == LV_VIEW_LIST) #define ListView_IsReportView(plv) ((plv)->wView == LV_VIEW_DETAILS) #define ListView_IsAutoArrangeView(plv) ((((plv)->wView == LV_VIEW_ICON) || ((plv)->wView == LV_VIEW_SMALLICON) || ((plv)->wView == LV_VIEW_TILE))) #define ListView_IsSlotView(plv) ((((plv)->wView == LV_VIEW_ICON) || ((plv)->wView == LV_VIEW_SMALLICON) || ((plv)->wView == LV_VIEW_TILE))) #define ListView_UseLargeIcons(plv) (((plv)->wView == LV_VIEW_ICON) || ((plv)->wView == LV_VIEW_TILE)) #define ListView_IsRearrangeableView(plv) (((plv)->wView == LV_VIEW_ICON) || ((plv)->wView == LV_VIEW_SMALLICON) || ((plv)->wView == LV_VIEW_TILE)) #define ListView_IsIScrollView(plv) (((plv)->wView == LV_VIEW_ICON) || ((plv)->wView == LV_VIEW_SMALLICON) || ((plv)->wView == LV_VIEW_TILE)) #define ListView_IsGroupedView(plv) ((plv)->wView != LV_VIEW_LIST) #define ListView_IsOwnerData( plv ) (plv->ci.style & (UINT)LVS_OWNERDATA) #define ListView_CheckBoxes(plv) (plv->exStyle & LVS_EX_CHECKBOXES) #define ListView_FullRowSelect(plv) (plv->exStyle & LVS_EX_FULLROWSELECT) #define ListView_IsInfoTip(plv) (plv->exStyle & LVS_EX_INFOTIP) #define ListView_OwnerDraw(plv) (plv->ci.style & LVS_OWNERDRAWFIXED) #define ListView_IsLabelTip(plv) (plv->exStyle & LVS_EX_LABELTIP) #define ListView_SingleRow(plv) (plv->exStyle & LVS_EX_SINGLEROW) #define ListView_HideLabels(plv) (plv->exStyle & LVS_EX_HIDELABELS) #define ListView_IsBorderSelect(plv) (plv->exStyle & LVS_EX_BORDERSELECT) #define ListView_IsWatermarked(plv) ((plv)->fListviewEnableWatermark && (plv)->hbmpWatermark) #define ListView_IsWatermarkedBackground(plv) ((plv)->fListviewWatermarkBackgroundImages && (plv)->pImgCtx && (plv)->fImgCtxComplete) #define ListView_IsSimpleSelect(plv) (plv->exStyle & LVS_EX_SIMPLESELECT) #ifdef DPITEST #define ListView_IsDPIScaled(plv) TRUE #else #define ListView_IsDPIScaled(plv) (CCDPIScale((plv)->ci)) #endif #ifdef DEBUG_PAINT #define ListView_IsDoubleBuffer(plv) (FALSE) #else #define ListView_IsDoubleBuffer(plv) (plv->exStyle & LVS_EX_DOUBLEBUFFER) #endif #define ListView_IsKbdTipTracking(plv) (plv->iTracking != LVKTT_NOTRACK) // Some helper macros for checking some of the flags... #define ListView_RedrawEnabled(plv) ((plv->flags & (LVF_REDRAW | LVF_VISIBLE)) == (LVF_REDRAW|LVF_VISIBLE)) // The hdpaZorder is acutally an array of DWORDS which contains the // indexes of the items and not actual pointers... // NOTE: linear search! this can be slow #define ListView_ZOrderIndex(plv, i) DPA_GetPtrIndex((plv)->hdpaZOrder, IntToPtr(i)) // Message handler functions (listview.c): LRESULT CALLBACK _export ListView_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); BOOL ListView_NotifyCacheHint( LV* plv, int iFrom, int iTo ); void ListView_NotifyRecreate(LV *plv); BOOL ListView_OnCreate(LV* plv, CREATESTRUCT* lpCreateStruct); void ListView_OnNCDestroy(LV* plv); void ListView_OnPaint(LV* plv, HDC hdc); BOOL ListView_OnEraseBkgnd(LV* plv, HDC hdc); void ListView_OnCommand(LV* plv, int id, HWND hwndCtl, UINT codeNotify); void ListView_OnEnable(LV* plv, BOOL fEnable); BOOL ListView_OnWindowPosChanging(LV* plv, WINDOWPOS* lpwpos); void ListView_OnWindowPosChanged(LV* plv, const WINDOWPOS* lpwpos); void ListView_OnSetFocus(LV* plv, HWND hwndOldFocus); void ListView_OnKillFocus(LV* plv, HWND hwndNewFocus); void ListView_OnKey(LV* plv, UINT vk, BOOL fDown, int cRepeat, UINT flags); BOOL ListView_OnImeComposition(LV* plv, WPARAM wParam, LPARAM lParam); #ifndef UNICODE BOOL SameDBCSChars(LPTSTR lpsz, WORD w); #endif void ListView_OnChar(LV* plv, UINT ch, int cRepeat); void ListView_OnButtonDown(LV* plv, BOOL fDoubleClick, int x, int y, UINT keyFlags); void ListView_OnLButtonUp(LV* plv, int x, int y, UINT keyFlags); void ListView_OnCancelMode(LV* plv); void ListView_OnTimer(LV* plv, UINT id); void ListView_SetupPendingNameEdit(LV* plv); #define ListView_CancelPendingEdit(plv) ListView_CancelPendingTimer(plv, LVF_NMEDITPEND, IDT_NAMEEDIT) #define ListView_CancelScrollWait(plv) ListView_CancelPendingTimer(plv, LVF_SCROLLWAIT, IDT_SCROLLWAIT) BOOL ListView_CancelPendingTimer(LV* plv, UINT fFlag, int idTimer); void ListView_OnHScroll(LV* plv, HWND hwndCtl, UINT code, int pos); void ListView_OnVScroll(LV* plv, HWND hwndCtl, UINT code, int pos); BOOL ListView_CommonArrange(LV* plv, UINT style, HDPA hdpaSort); BOOL ListView_CommonArrangeEx(LV* plv, UINT style, HDPA hdpaSort, int iWorkArea); BOOL ListView_OnSetCursor(LV* plv, HWND hwndCursor, UINT codeHitTest, UINT msg); UINT ListView_OnGetDlgCode(LV* plv, MSG* lpmsg); HBRUSH ListView_OnCtlColor(LV* plv, HDC hdc, HWND hwndChild, int type); void ListView_OnSetFont(LV* plvCtl, HFONT hfont, BOOL fRedraw); HFONT ListView_OnGetFont(LV* plv); void ListViews_OnTimer(LV* plv, UINT id); void ListView_OnWinIniChange(LV* plv, WPARAM wParam, LPARAM lParam); void ListView_OnSysColorChange(LV* plv); void ListView_OnSetRedraw(LV* plv, BOOL fRedraw); BOOL ListView_OnSetTileViewInfo(LV* plv, PLVTILEVIEWINFO pTileViewInfo); BOOL ListView_OnGetTileViewInfo(LV* plv, PLVTILEVIEWINFO pTileViewInfo); BOOL ListView_OnSetTileInfo(LV* plv, PLVTILEINFO pTileInfo); BOOL ListView_OnGetTileInfo(LV* plv, PLVTILEINFO pTileInfo); HIMAGELIST ListView_OnCreateDragImage(LV *plv, int iItem, LPPOINT lpptUpLeft); BOOL ListView_ISetColumnWidth(LV* plv, int iCol, int cx, BOOL fExplicit); typedef void (*SCROLLPROC)(LV*, int dx, int dy, UINT uSmooth); void ListView_ComOnScroll(LV* plv, UINT code, int posNew, int sb, int cLine, int cPage); #ifdef UNICODE BOOL ListView_OnGetItemA(LV* plv, LV_ITEMA* plvi); BOOL ListView_OnSetItemA(LV* plv, LV_ITEMA* plvi); int ListView_OnInsertItemA(LV* plv, LV_ITEMA* plvi); int ListView_OnFindItemA(LV* plv, int iStart, LV_FINDINFOA* plvfi); int ListView_OnGetStringWidthA(LV* plv, LPCSTR psz, HDC hdc); BOOL ListView_OnGetColumnA(LV* plv, int iCol, LV_COLUMNA* pcol); BOOL ListView_OnSetColumnA(LV* plv, int iCol, LV_COLUMNA* pcol); int ListView_OnInsertColumnA(LV* plv, int iCol, LV_COLUMNA* pcol); int ListView_OnGetItemTextA(LV* plv, int i, LV_ITEMA *lvitem); BOOL WINAPI ListView_OnSetItemTextA(LV* plv, int i, int iSubItem, LPCSTR pszText); BOOL WINAPI ListView_OnGetBkImageA(LV* plv, LPLVBKIMAGEA pbiA); BOOL WINAPI ListView_OnSetBkImageA(LV* plv, LPLVBKIMAGEA pbiA); #endif BOOL ListView_IsItemUnfolded2(LV* plv, int iItem, int iSubItem, LPTSTR pszText, int cchTextMax); BOOL WINAPI ListView_OnSetBkImage(LV* plv, LPLVBKIMAGE pbi); BOOL WINAPI ListView_OnGetBkImage(LV* plv, LPLVBKIMAGE pbi); BOOL ListView_OnSetBkColor(LV* plv, COLORREF clrBk); HIMAGELIST ListView_OnSetImageList(LV* plv, HIMAGELIST himl, BOOL fSmallImages); BOOL ListView_OnDeleteAllItems(LV* plv); LISTITEM* ListView_InsertItemInternal(LV* plv, const LV_ITEM* plvi, int* pi); int ListView_OnInsertItem(LV* plv, const LV_ITEM* plvi); BOOL ListView_OnDeleteItem(LV* plv, int i); BOOL ListView_OnReplaceItem(LV* plv, const LV_ITEM* plvi); int ListView_OnFindItem(LV* plv, int iStart, const LV_FINDINFO* plvfi); BOOL ListView_OnSetItemPosition(LV* plv, int i, int x, int y); BOOL ListView_OnSetItem(LV* plv, const LV_ITEM* plvi); BOOL ListView_OnGetItem(LV* plv, LV_ITEM* plvi); BOOL ListView_OnGetItemPosition(LV* plv, int i, POINT* ppt); BOOL ListView_OnEnsureVisible(LV* plv, int i, BOOL fPartialOK); BOOL ListView_OnScroll(LV* plv, int dx, int dy); int ListView_OnHitTest(LV* plv, LV_HITTESTINFO* pinfo); int ListView_OnGetStringWidth(LV* plv, LPCTSTR psz, HDC hdc); BOOL ListView_OnGetItemRect(LV* plv, int i, RECT* prc); BOOL ListView_OnRedrawItems(LV* plv, int iFirst, int iLast); int ListView_OnGetNextItem(LV* plv, int i, UINT flags); BOOL ListView_OnSetColumnWidth(LV* plv, int iCol, int cx); int ListView_OnGetColumnWidth(LV* plv, int iCol); void ListView_OnStyleChanging(LV* plv, UINT gwl, LPSTYLESTRUCT pinfo); void ListView_OnStyleChanged(LV* plv, UINT gwl, LPSTYLESTRUCT pinfo); int ListView_OnGetTopIndex(LV* plv); int ListView_OnGetCountPerPage(LV* plv); BOOL ListView_OnGetOrigin(LV* plv, POINT* ppt); int ListView_OnGetItemText(LV* plv, int i, LV_ITEM *lvitem); BOOL WINAPI ListView_OnSetItemText(LV* plv, int i, int iSubItem, LPCTSTR pszText); HIMAGELIST ListView_OnGetImageList(LV* plv, int iImageList); UINT ListView_OnGetItemState(LV* plv, int i, UINT mask); BOOL ListView_OnSetItemState(LV* plv, int i, UINT data, UINT mask); LRESULT WINAPI ListView_OnSetInfoTip(LV *plv, PLVSETINFOTIP plvSetInfoTip); // Private functions (listview.c): #define QUERY_DEFAULT 0x0 #define QUERY_FOLDED 0x1 #define QUERY_UNFOLDED 0x2 #define QUERY_RCVIEW 0x4 #define IsQueryFolded(dw) (((dw)&(QUERY_FOLDED|QUERY_UNFOLDED)) == QUERY_FOLDED) #define IsQueryUnfolded(dw) (((dw)&(QUERY_FOLDED|QUERY_UNFOLDED)) == QUERY_UNFOLDED) #define IsQueryrcView(dw) (((dw)&(QUERY_RCVIEW)) == QUERY_RCVIEW) BOOL ListView_Notify(LV* plv, int i, int iSubItem, int code); void ListView_GetRects(LV* plv, int i, UINT fQueryLabelRects, RECT* prcIcon, RECT* prcLabel, RECT* prcBounds, RECT* prcSelectBounds); BOOL ListView_DrawItem(PLVDRAWITEM); #define ListView_InvalidateItem(p,i,s,r) ListView_InvalidateItemEx(p,i,s,r,0) void ListView_InvalidateItemEx(LV* plv, int i, BOOL fSelectionOnly, UINT fRedraw, UINT maskChanged); void ListView_TypeChange(LV* plv, WORD wViewOld, BOOL fOwnerDrawFixed); void ListView_DeleteHrgnInval(LV* plv); void ListView_Redraw(LV* plv, HDC hdc, RECT* prc); void ListView_RedrawSelection(LV* plv); BOOL ListView_FreeItem(LV* plv, LISTITEM* pitem); void ListView_FreeSubItem(PLISTSUBITEM plsi); LISTITEM* ListView_CreateItem(LV* plv, const LV_ITEM* plvi); void ListView_UpdateScrollBars(LV* plv); int ListView_SetFocusSel(LV* plv, int iNewFocus, BOOL fSelect, BOOL fDeselectAll, BOOL fToggleSel); void ListView_GetRectsOwnerData(LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, RECT* prcBounds, RECT* prcSelectBounds, LISTITEM* pitem); void ListView_CalcMinMaxIndex( LV* plv, PRECT prcBounding, int* iMin, int* iMax ); int ListView_LCalcViewItem( LV* plv, int x, int y ); void LVSeeThruScroll(LV *plv, LPRECT lprcUpdate); BOOL ListView_UnfoldRects(LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, RECT* prcBounds, RECT* prcSelectBounds); BOOL ListView_FindWorkArea(LV * plv, POINT pt, short * piWorkArea); __inline int ListView_Count(LV *plv) { ASSERT(ListView_IsOwnerData(plv) || plv->cTotalItems == DPA_GetPtrCount(plv->hdpa)); return plv->cTotalItems; } // Forcing (i) to UINT lets us catch bogus negative numbers, too. #define ListView_IsValidItemNumber(plv, i) ((UINT)(i) < (UINT)ListView_Count(plv)) #define ListView_GetItemPtr(plv, i) ((LISTITEM*)DPA_GetPtr((plv)->hdpa, (i))) #ifdef DEBUG #define ListView_FastGetItemPtr(plv, i) ((LISTITEM*)DPA_GetPtr((plv)->hdpa, (i))) #define ListView_FastGetZItemPtr(plv, i) ((LISTITEM*)DPA_GetPtr((plv)->hdpa, \ (int)OFFSETOF(DPA_GetPtr((plv)->hdpaZOrder, (i))))) #else #define ListView_FastGetItemPtr(plv, i) ((LISTITEM*)DPA_FastGetPtr((plv)->hdpa, (i))) #define ListView_FastGetZItemPtr(plv, i) ((LISTITEM*)DPA_FastGetPtr((plv)->hdpa, \ (int)OFFSETOF(DPA_FastGetPtr((plv)->hdpaZOrder, (i))))) #endif BOOL ListView_OnGetInsertMarkRect(LV* plv, LPRECT prc); COLORREF ListView_OnGetInsertMarkColor(LV* plv); void ListView_InvalidateMark(LV* plv); BOOL ListView_OnInsertMarkHitTest(LV* plv, int x, int y, LPLVINSERTMARK ptbim); LRESULT ListView_OnSetInsertMark(LV* plv, LPLVINSERTMARK plvim); BOOL ListView_CalcMetrics(); void ListView_ColorChange(); void ListView_DrawBackground(LV* plv, HDC hdc, RECT *prcClip); BOOL ListView_NeedsEllipses(HDC hdc, LPCTSTR pszText, RECT* prc, int* pcchDraw, int cxEllipses); int ListView_CompareString(LV* plv, int i, LPCTSTR pszFind, UINT flags, int iLen); int ListView_GetLinkedTextWidth(HDC hdc, LPCTSTR psz, UINT cch, BOOL bLink); int ListView_GetCxScrollbar(LV* plv); int ListView_GetCyScrollbar(LV* plv); DWORD ListView_GetWindowStyle(LV* plv); #define ListView_GetScrollInfo(plv, flag, lpsi) \ ((plv)->exStyle & LVS_EX_FLATSB ? \ FlatSB_GetScrollInfo((plv)->ci.hwnd, (flag), (lpsi)) : \ GetScrollInfo((plv)->ci.hwnd, (flag), (lpsi))) int ListView_SetScrollInfo(LV *plv, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw); #define ListView_SetScrollRange(plv, flag, min, max, fredraw) \ ((plv)->exStyle & LVS_EX_FLATSB ? \ FlatSB_SetScrollRange((plv)->ci.hwnd, (flag), (min), (max), (fredraw)) : \ SetScrollRange((plv)->ci.hwnd, (flag), (min), (max), (fredraw))) // lvicon.c functions BOOL ListView_OnArrange(LV* plv, UINT style); HWND ListView_OnEditLabel(LV* plv, int i, LPTSTR pszText); int ListView_IItemHitTest(LV* plv, int x, int y, UINT* pflags, int *piSubItem); void ListView_IGetRects(LV* plv, LISTITEM* pitem, UINT fQueryLabelRects, RECT* prcIcon, RECT* prcLabel, LPRECT prcBounds); void ListView_IGetRectsOwnerData(LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, LISTITEM* pitem, BOOL fUsepitem); void _ListView_GetRectsFromItem(LV* plv, BOOL bSmallIconView, LISTITEM *pitem, UINT fQueryLabelRects, LPRECT prcIcon, LPRECT prcLabel, LPRECT prcBounds, LPRECT prcSelectBounds); __inline void ListView_SetSRecompute(LISTITEM *pitem) { pitem->cxSingleLabel = SRECOMPUTE; pitem->cxMultiLabel = SRECOMPUTE; pitem->cyFoldedLabel = SRECOMPUTE; pitem->cyUnfoldedLabel = SRECOMPUTE; } void ListView_RecomputeLabelSize(LV* plv, LISTITEM FAR* pitem, int i, HDC hdc, BOOL fUsepitem); BOOL ListView_SetIconPos(LV* plv, LISTITEM* pitem, int iSlot, int cSlot); BOOL ListView_IsCleanRect(LV * plv, RECT * prc, int iExcept, UINT fQueryLabelRect, BOOL * pfUpdate, HDC hdc); int ListView_FindFreeSlot(LV* plv, int i, int iSlot, int cSlot, UINT fQueryLabelRect, BOOL* pfUpdateSB, BOOL* pfAppend, HDC hdc, int iWidth, int iHeight); int ListView_CalcHitSlot( LV* plv, POINT pt, int cslot, int iWidth, int iHeight ); BOOL ListView_OnGetViewRect(LV* plv, RECT* prcView); void ListView_GetViewRect2(LV* plv, RECT* prcView, int cx, int cy); int CALLBACK ArrangeIconCompare(LISTITEM* pitem1, LISTITEM* pitem2, LPARAM lParam); int ListView_GetSlotCountEx(LV* plv, BOOL fWithoutScroll, int iWorkArea, int *piWidth, int *piHeight); int ListView_GetSlotCount(LV* plv, BOOL fWithoutScroll, int *piWidth, int *piHeight); void ListView_CalcSlotRect(LV* plv, LISTITEM *pItem, int iSlot, int cSlot, BOOL fBias, int iWidth, int iHeight, LPRECT lprc); void ListView_IUpdateScrollBars(LV* plv); DWORD ListView_GetStyleAndClientRectGivenViewRect(LV* plv, RECT *prcViewRect, RECT* prcClient); DWORD ListView_GetClientRect(LV* plv, RECT* prcClient, BOOL fSubScrolls, RECT *prcViewRect); void ListView_SetEditSize(LV* plv); BOOL ListView_DismissEdit(LV* plv, BOOL fCancel); LRESULT CALLBACK _export ListView_EditWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); UINT ListView_DrawImageEx(LV* plv, LV_ITEM* pitem, HDC hdc, int x, int y, COLORREF crBk, UINT fDraw, int xMax); UINT ListView_DrawImageEx2(LV* plv, LV_ITEM* pitem, HDC hdc, int x, int y, COLORREF crBk, UINT fDraw, int xMax, int iIconEffect, int iFrame); #define ListView_DrawImage(plv, pitem, hdc, x, y, fDraw) \ ListView_DrawImageEx(plv, pitem, hdc, x, y, plv->clrBk, fDraw, -1) #if defined(FE_IME) || !defined(WINNT) void ListView_SizeIME(HWND hwnd); void ListView_InsertComposition(HWND hwnd, WPARAM wParam, LPARAM lParam, LV *plv); void ListView_PaintComposition(HWND hwnd, LV *plv); #endif // lvsmall.c functions: void ListView_SGetRects(LV* plv, LISTITEM* pitem, RECT* prcIcon, RECT* prcLabel, LPRECT prcBounds); void ListView_SGetRectsOwnerData(LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, LISTITEM* pitem, BOOL fUsepitem); int ListView_SItemHitTest(LV* plv, int x, int y, UINT* pflags, int *piSubItem); int ListView_LookupString(LV* plv, LPCTSTR lpszLookup, UINT flags, int iStart); // lvlist.c functions: void ListView_LGetRects(LV* plv, int i, RECT* prcIcon, RECT* prcLabel, RECT *prcBounds, RECT* prcSelectBounds); int ListView_LItemHitTest(LV* plv, int x, int y, UINT* pflags, int *piSubItem); void ListView_LUpdateScrollBars(LV* plv); BOOL ListView_MaybeResizeListColumns(LV* plv, int iFirst, int iLast); // lvrept.c functions: int ListView_OnSubItemHitTest(LV* plv, LPLVHITTESTINFO lParam); void ListView_GetSubItem(LV* plv, int i, int iSubItem, PLISTSUBITEM plsi); BOOL LV_ShouldItemDrawGray(LV* plv, UINT fText); int ListView_OnInsertColumn(LV* plv, int iCol, const LV_COLUMN* pcol); BOOL ListView_OnDeleteColumn(LV* plv, int iCol); BOOL ListView_OnGetColumn(LV* plv, int iCol, LV_COLUMN* pcol); BOOL ListView_OnSetColumn(LV* plv, int iCol, const LV_COLUMN* pcol); BOOL ListView_ROnEnsureVisible(LV* plv, int i, BOOL fPartialOK); void ListView_RInitialize(LV* plv, BOOL fInval); BOOL ListView_OnGetSubItemRect(LV* plv, int i, LPRECT lprc); int ListView_RYHitTest(plv, cy); BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi); void ListView_RAfterRedraw(LV* plv, HDC hdc); int ListView_RGetColumnWidth(LV* plv, int iCol); BOOL ListView_RSetColumnWidth(LV* plv, int iCol, int cx); LPTSTR ListView_GetSubItemText(LV* plv, int i, int iCol); void ListView_RDestroy(LV* plv); LPTSTR ListView_RGetItemText(LV* plv, int i, int iCol); int ListView_RItemHitTest(LV* plv, int x, int y, UINT* pflags, int *piSubItem); void ListView_RUpdateScrollBars(LV* plv); void ListView_RGetRects(LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, RECT* prcBounds, RECT* prcSelectBounds); LRESULT ListView_HeaderNotify(LV* plv, HD_NOTIFY *pnm); int ListView_FreeColumnData(LPVOID d, LPVOID p); BOOL SameChars(LPTSTR lpsz, TCHAR c); #define ListView_GetSubItemDPA(plv, idpa) \ ((HDPA)DPA_GetPtr((plv)->hdpaSubItems, (idpa))) int ListView_Arrow(LV* plv, int iStart, UINT vk); BOOL ListView_IsItemUnfolded(LV *plv, int item); BOOL ListView_IsItemUnfoldedPtr(LV *plv, LISTITEM *pitem); // lvtile.c functions: int ListView_TItemHitTest(LV* plv, int x, int y, UINT* pflags, int *piSubItem); void ListView_TGetRectsOwnerData( LV* plv, int iItem, RECT* prcIcon, RECT* prcLabel, LISTITEM* pitem, BOOL fUsepitem ); void ListView_TGetRects(LV* plv, LISTITEM* pitem, RECT* prcIcon, RECT* prcLabel, LPRECT prcBounds); BOOL TCalculateSubItemRect(LV* plv, LISTITEM *pitem, LISTSUBITEM* plsi, int i, int iSubItem, HDC hdc, RECT* prc, BOOL *pbUnfolded); typedef struct LVTILECOLUMNSENUM { int iColumnsRemainingMax; int iTotalSpecifiedColumns; UINT *puSpecifiedColumns; int iCurrentSpecifiedColumn; int iSortedColumn; BOOL bUsedSortedColumn; } LVTILECOLUMNSENUM, *PLVTILECOLUMNSENUM; int _GetNextColumn(PLVTILECOLUMNSENUM plvtce); void _InitTileColumnsEnum(PLVTILECOLUMNSENUM plvtce, LV* plv, UINT cColumns, UINT *puColumns, BOOL fOneLessLine); BOOL Tile_Set(UINT **ppuColumns, UINT *pcColumns, UINT *puColumns, UINT cColumns); // Fake customdraw. See comment block in lvrept.c typedef struct LVFAKEDRAW { NMLVCUSTOMDRAW nmcd; LV* plv; DWORD dwCustomPrev; DWORD dwCustomItem; DWORD dwCustomSubItem; LV_ITEM *pitem; HFONT hfontPrev; } LVFAKEDRAW, *PLVFAKEDRAW; void ListView_BeginFakeCustomDraw(LV* plv, PLVFAKEDRAW plvfd, LV_ITEM *pitem); DWORD ListView_BeginFakeItemDraw(PLVFAKEDRAW plvfd); void ListView_EndFakeItemDraw(PLVFAKEDRAW plvfd); void ListView_EndFakeCustomDraw(PLVFAKEDRAW plvfd); //============ External declarations ======================================= //extern HFONT g_hfontLabel; extern HBRUSH g_hbrActiveLabel; extern HBRUSH g_hbrInactiveLabel; extern HBRUSH g_hbrBackground; // function tables #define LV_TYPEINDEX(plv) ((plv)->wView) BOOL ListView_RDrawItem(PLVDRAWITEM); BOOL ListView_IDrawItem(PLVDRAWITEM); BOOL ListView_LDrawItem(PLVDRAWITEM); BOOL ListView_TDrawItem(PLVDRAWITEM); typedef BOOL (*PFNLISTVIEW_DRAWITEM)(PLVDRAWITEM); extern const PFNLISTVIEW_DRAWITEM pfnListView_DrawItem[5]; #define _ListView_DrawItem(plvdi) \ pfnListView_DrawItem[LV_TYPEINDEX(plvdi->plv)](plvdi) void ListView_RUpdateScrollBars(LV* plv); typedef void (*PFNLISTVIEW_UPDATESCROLLBARS)(LV* plv); extern const PFNLISTVIEW_UPDATESCROLLBARS pfnListView_UpdateScrollBars[5]; #define _ListView_UpdateScrollBars(plv) \ pfnListView_UpdateScrollBars[LV_TYPEINDEX(plv)](plv) typedef DWORD (*PFNLISTVIEW_APPROXIMATEVIEWRECT)(LV* plv, int, int, int); extern const PFNLISTVIEW_APPROXIMATEVIEWRECT pfnListView_ApproximateViewRect[5]; #define _ListView_ApproximateViewRect(plv, iCount, iWidth, iHeight) \ pfnListView_ApproximateViewRect[LV_TYPEINDEX(plv)](plv, iCount, iWidth, iHeight) typedef int (*PFNLISTVIEW_ITEMHITTEST)(LV* plv, int, int, UINT *, int *); extern const PFNLISTVIEW_ITEMHITTEST pfnListView_ItemHitTest[5]; #define _ListView_ItemHitTest(plv, x, y, pflags, piSubItem) \ pfnListView_ItemHitTest[LV_TYPEINDEX(plv)](plv, x, y, pflags, piSubItem) BOOL ListView_SendScrollNotify(LV* plv, BOOL fBegin, int dx, int dy); void ListView_IOnScroll(LV* plv, UINT code, int posNew, UINT fVert); void ListView_LOnScroll(LV* plv, UINT code, int posNew, UINT sb); void ListView_ROnScroll(LV* plv, UINT code, int posNew, UINT sb); typedef void (*PFNLISTVIEW_ONSCROLL)(LV* plv, UINT, int, UINT ); extern const PFNLISTVIEW_ONSCROLL pfnListView_OnScroll[5]; #define _ListView_OnScroll(plv, x, y, pflags) \ pfnListView_OnScroll[LV_TYPEINDEX(plv)](plv, x, y, pflags) void ListView_IRecomputeLabelSize(LV* plv, LISTITEM* pitem, int i, HDC hdc, BOOL fUsepitem); void ListView_TRecomputeLabelSize(LV* plv, LISTITEM* pitem, int i, HDC hdc, BOOL fUsepitem); typedef void (*PFNLISTVIEW_RECOMPUTELABELSIZE)(LV* plv, LISTITEM* pitem, int i, HDC hdc, BOOL fUsepitem); extern const PFNLISTVIEW_RECOMPUTELABELSIZE pfnListView_RecomputeLabelSize[5]; #define _ListView_RecomputeLabelSize(plv, pitem, i, hdc, fUsepitem) \ pfnListView_RecomputeLabelSize[LV_TYPEINDEX(plv)](plv, pitem, i, hdc, fUsepitem) void ListView_Scroll2(LV* plv, int dx, int dy); void ListView_IScroll2(LV* plv, int dx, int dy, UINT uSmooth); void ListView_LScroll2(LV* plv, int dx, int dy, UINT uSmooth); void ListView_RScroll2(LV* plv, int dx, int dy, UINT uSmooth); typedef void (*PFNLISTVIEW_SCROLL2)(LV* plv, int, int, UINT ); extern const PFNLISTVIEW_SCROLL2 pfnListView_Scroll2[5]; #define _ListView_Scroll2(plv, x, y, pflags) \ pfnListView_Scroll2[LV_TYPEINDEX(plv)](plv, x, y, pflags) int ListView_IGetScrollUnitsPerLine(LV* plv, UINT sb); int ListView_LGetScrollUnitsPerLine(LV* plv, UINT sb); int ListView_RGetScrollUnitsPerLine(LV* plv, UINT sb); typedef int (*PFNLISTVIEW_GETSCROLLUNITSPERLINE)(LV* plv, UINT sb); extern const PFNLISTVIEW_GETSCROLLUNITSPERLINE pfnListView_GetScrollUnitsPerLine[5]; #define _ListView_GetScrollUnitsPerLine(plv, sb) \ pfnListView_GetScrollUnitsPerLine[LV_TYPEINDEX(plv)](plv, sb) UINT ListView_GetTextSelectionFlags(LV* plv, LV_ITEM *pitem, UINT fDraw); BOOL NEAR ListView_IRecomputeEx(LV* plv, HDPA hdpaSort, int iFrom, BOOL fForce); BOOL NEAR ListView_RRecomputeEx(LV* plv, HDPA hdpaSort, int iFrom, BOOL fForce); BOOL NEAR ListView_NULLRecomputeEx(LV* plv, HDPA hdpaSort, int iFrom, BOOL fForce); typedef int (*PFNLISTVIEW_RECOMPUTEEX)(LV* plv, HDPA hdpaSort, int iFrom, BOOL fForce); extern const PFNLISTVIEW_RECOMPUTEEX pfnListView_RecomputeEx[5]; #define _ListView_RecomputeEx(plv, hdpaSort, iFrom, fForce)\ pfnListView_RecomputeEx[LV_TYPEINDEX(plv)](plv, hdpaSort, iFrom, fForce); #define ListView_Recompute(plv) _ListView_RecomputeEx(plv, NULL, 0, FALSE) LISTGROUP* ListView_FindFirstVisibleGroup(LV* plv); UINT LV_IsItemOnViewEdge(LV* plv, LISTITEM *pitem); void _GetCurrentItemSize(LV* plv, int * pcx, int *pcy); void ListView_CalcItemSlotAndRect(LV* plv, LISTITEM* pitem, int* piSlot, RECT* prcSlot); // Expand the "rcIcon" by this much for glow #define GLOW_EXPAND 10 // pixel offset from the state image to the #define LV_ICONTOSTATECX 3 // list view state offset, this is the gap between the icon and the #define LV_ICONTOSTATEOFFSET(plv) ((plv->cxState > 0) ? LV_ICONTOSTATECX:0) //#define DEBUG_PAINT #ifdef DEBUG_PAINT void ListView_DebugDrawInvalidRegion(LV* plv, RECT* prc, HRGN hrgn); void ListView_DebugDisplayClipRegion(LV* plv, RECT* prc, HRGN hrgn); #else #define ListView_DebugDrawInvalidRegion(plv, prc, hrgn) #define ListView_DebugDisplayClipRegion(plv, prc, hrgn) #endif #define LVMI_PLACEITEMS (WM_USER) int ListView_GetIconBufferX(LV* plv); int ListView_GetIconBufferY(LV* plv); BOOL ListView_ICalcViewRect(LV* plv, BOOL fNoRecalc, RECT* prcView); void ListView_CalcBounds(LV* plv, UINT fQueryLabelRects, RECT *prcIcon, RECT *prcLabel, RECT *prcBounds); void ListView_AddViewRectBuffer(LV* plv, RECT* prcView); BOOL ListView_FixIScrollPositions(LV *plv, BOOL fNoScrollbarUpdate, RECT* prcClient); void ListView_InvalidateWindow(LV* plv); BOOL ListView_OnScrollSelectSmooth(LV* plv, int dx, int dy, UINT uSmooth); #ifdef DEBUG BOOL ListView_ValidateScrollPositions(LV* plv, RECT* prcClient); BOOL ListView_ValidatercView(LV* plv, RECT* prcView, BOOL fRecalcDone); #endif #endif //!_INC_LISTVIEW