X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/13845bd57c75764de50f420949a6ea9999d6d9e0..77a1771911ed222ba6861ead327c3735fc16a0b1:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 410219a869..33c6741c59 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -31,12 +31,12 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/settings.h" + #include "wx/dcclient.h" #endif #include "wx/textctrl.h" #include "wx/imaglist.h" #include "wx/listctrl.h" -#include "wx/dcclient.h" #include "wx/msw/private.h" @@ -761,6 +761,10 @@ bool wxListCtrl::GetItem(wxListItem& info) const // Sets information about the item bool wxListCtrl::SetItem(wxListItem& info) { + const long id = info.GetId(); + wxCHECK_MSG( id >= 0 && id < GetItemCount(), false, + _T("invalid item index in SetItem") ); + LV_ITEM item; wxConvertToMSWListItem(this, info, item); @@ -773,7 +777,7 @@ bool wxListCtrl::SetItem(wxListItem& info) { // get internal item data // perhaps a cache here ? - wxListItemInternalData *data = wxGetInternalData(this, info.m_itemId); + wxListItemInternalData *data = wxGetInternalData(this, id); if (! data) { @@ -918,12 +922,19 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask) // Sets the item image bool wxListCtrl::SetItemImage(long item, int image, int WXUNUSED(selImage)) +{ + return SetItemColumnImage(item, 0, image); +} + +// Sets the item image +bool wxListCtrl::SetItemColumnImage(long item, long column, int image) { wxListItem info; info.m_mask = wxLIST_MASK_IMAGE; info.m_image = image; info.m_itemId = item; + info.m_col = column; return SetItem(info); } @@ -1056,11 +1067,15 @@ wxSize wxListCtrl::GetItemSpacing() const return wxSize(LOWORD(spacing), HIWORD(spacing)); } +#if WXWIN_COMPATIBILITY_2_6 + int wxListCtrl::GetItemSpacing(bool isSmall) const { return ListView_GetItemSpacing(GetHwnd(), (BOOL) isSmall); } +#endif // WXWIN_COMPATIBILITY_2_6 + void wxListCtrl::SetItemTextColour( long item, const wxColour &col ) { wxListItem info; @@ -2409,18 +2424,27 @@ static void HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) it.cchTextMax = WXSIZEOF(text); ListView_GetItem(hwndList, &it); - if ( it.iImage != -1 ) + HIMAGELIST himl = ListView_GetImageList(hwndList, LVSIL_SMALL); + if ( himl && ImageList_GetImageCount(himl) ) { - HIMAGELIST himl = ListView_GetImageList(hwndList, LVSIL_SMALL); - - ImageList_Draw(himl, it.iImage, hdc, rc.left, rc.top, - nmcd.uItemState & CDIS_SELECTED ? ILD_SELECTED - : ILD_TRANSPARENT); + if ( it.iImage != -1 ) + { + ImageList_Draw(himl, it.iImage, hdc, rc.left, rc.top, + nmcd.uItemState & CDIS_SELECTED ? ILD_SELECTED + : ILD_TRANSPARENT); + } - int wImage, hImage; - ImageList_GetIconSize(himl, &wImage, &hImage); + // notice that even if this item doesn't have any image, the list + // control still leaves space for the image in the first column if the + // image list is not empty (presumably so that items with and without + // images align?) + if ( it.iImage != -1 || it.iSubItem == 0 ) + { + int wImage, hImage; + ImageList_GetIconSize(himl, &wImage, &hImage); - rc.left += wImage + 2; + rc.left += wImage + 2; + } } ::SetBkMode(hdc, TRANSPARENT); @@ -2474,7 +2498,8 @@ static void HandleItemPaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) } // same thing for CDIS_FOCUS (except simpler as there is only one of them) - if ( ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED) == item ) + if ( ::GetFocus() == hwndList && + ListView_GetNextItem(hwndList, (WPARAM)-1, LVNI_FOCUSED) == item ) { nmcd.uItemState |= CDIS_FOCUS; } @@ -2535,12 +2560,12 @@ static WXLPARAM HandleItemPrepaint(wxListCtrl *listctrl, // set the colours to use for text drawing - pLVCD->clrText = wxColourToRGB(attr->HasTextColour() - ? attr->GetTextColour() - : listctrl->GetTextColour()); - pLVCD->clrTextBk = wxColourToRGB(attr->HasBackgroundColour() - ? attr->GetBackgroundColour() - : listctrl->GetBackgroundColour()); + pLVCD->clrText = attr->HasTextColour() + ? wxColourToRGB(attr->GetTextColour()) + : wxColourToRGB(listctrl->GetTextColour()); + pLVCD->clrTextBk = attr->HasBackgroundColour() + ? wxColourToRGB(attr->GetBackgroundColour()) + : wxColourToRGB(listctrl->GetBackgroundColour()); // select the font if non default one is specified if ( attr->HasFont() ) @@ -2678,15 +2703,26 @@ void wxListCtrl::OnPaint(wxPaintEvent& event) WXLRESULT wxListCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { -#ifdef WM_PRINT - if ( nMsg == WM_PRINT ) + switch ( nMsg ) { - // we should bypass our own WM_PRINT handling as we don't handle - // PRF_CHILDREN flag, so leave it to the native control itself - return MSWDefWindowProc(nMsg, wParam, lParam); - } +#ifdef WM_PRINT + case WM_PRINT: + // we should bypass our own WM_PRINT handling as we don't handle + // PRF_CHILDREN flag, so leave it to the native control itself + return MSWDefWindowProc(nMsg, wParam, lParam); #endif // WM_PRINT + case WM_CONTEXTMENU: + // because this message is propagated upwards the child-parent + // chain, we get it for the right clicks on the header window but + // this is confusing in wx as right clicking there already + // generates a separate wxEVT_COMMAND_LIST_COL_RIGHT_CLICK event + // so just ignore them + if ( (HWND)wParam == ListView_GetHeader(GetHwnd()) ) + return 0; + //else: break + } + return wxControl::MSWWindowProc(nMsg, wParam, lParam); } @@ -3021,7 +3057,7 @@ static void wxConvertToMSWListCol(HWND hwndList, #ifdef NM_CUSTOMDRAW // _WIN32_IE >= 0x0300 if ( item.m_mask & wxLIST_MASK_IMAGE ) { - if ( wxTheApp->GetComCtl32Version() >= 470 ) + if ( wxApp::GetComCtl32Version() >= 470 ) { lvCol.mask |= LVCF_IMAGE;