X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c1dc9f8394c1488ad8e7d945e6f943f7b34554ce..7f73c398d5bb0d820520dde635c712b8b7c66634:/src/msw/listctrl.cpp diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 97defbafcd..65fb65b7d0 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -205,7 +205,7 @@ public: { if (attr) delete attr; - }; + } DECLARE_NO_COPY_CLASS(wxListItemInternalData) }; @@ -948,7 +948,7 @@ wxUIntPtr wxListCtrl::GetItemData(long item) const } // Sets the item data -bool wxListCtrl::SetItemData(long item, long data) +bool wxListCtrl::SetItemPtrData(long item, wxUIntPtr data) { wxListItem info; @@ -1424,7 +1424,7 @@ long wxListCtrl::FindItem(long start, const wxString& str, bool partial) findInfo.flags = LVFI_STRING; if ( partial ) findInfo.flags |= LVFI_PARTIAL; - findInfo.psz = str; + findInfo.psz = str.wx_str(); // ListView_FindItem() excludes the first item from search and to look // through all the items you need to start from -1 which is unnatural and @@ -1770,7 +1770,7 @@ bool wxListCtrl::MSWCommand(WXUINT cmd, WXWORD id) } // utility used by wxListCtrl::MSWOnNotify and by wxDataViewHeaderWindowMSW::MSWOnNotify -int wxMSWGetColumnClicked(NMHDR *nmhdr, POINT *ptClick) +int WXDLLIMPEXP_CORE wxMSWGetColumnClicked(NMHDR *nmhdr, POINT *ptClick) { wxASSERT(nmhdr && ptClick); @@ -1780,10 +1780,10 @@ int wxMSWGetColumnClicked(NMHDR *nmhdr, POINT *ptClick) // where did the click occur? #if defined(__WXWINCE__) && !defined(__HANDHELDPC__) && _WIN32_WCE < 400 - if (nmhdr->code == GN_CONTEXTMENU) + if (nmhdr->code == GN_CONTEXTMENU) { *ptClick = ((NMRGINFO*)nmhdr)->ptAction; - } + } else #endif //__WXWINCE__ if ( !::GetCursorPos(ptClick) ) @@ -2417,22 +2417,23 @@ static RECT GetCustomDrawnItemRect(const NMCUSTOMDRAW& nmcd) return rc; } -static void HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) +static +bool HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont, int colCount) { NMCUSTOMDRAW& nmcd = pLVCD->nmcd; HDC hdc = nmcd.hdc; HWND hwndList = nmcd.hdr.hwndFrom; + const int col = pLVCD->iSubItem; const DWORD item = nmcd.dwItemSpec; - // the font must be valid, otherwise we wouldn't be painting the item at all SelectInHDC selFont(hdc, hfont); // get the rectangle to paint RECT rc; - ListView_GetSubItemRect(hwndList, item, pLVCD->iSubItem, LVIR_BOUNDS, &rc); - if ( !pLVCD->iSubItem ) + ListView_GetSubItemRect(hwndList, item, col, LVIR_BOUNDS, &rc); + if ( !col && colCount > 1 ) { // broken ListView_GetSubItemRect() returns the entire item rect for // 0th subitem while we really need just the part for this column @@ -2453,7 +2454,7 @@ static void HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) wxZeroMemory(it); it.mask = LVIF_TEXT | LVIF_IMAGE; it.iItem = item; - it.iSubItem = pLVCD->iSubItem; + it.iSubItem = col; it.pszText = text; it.cchTextMax = WXSIZEOF(text); ListView_GetItem(hwndList, &it); @@ -2483,12 +2484,38 @@ static void HandleSubItemPrepaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) ::SetBkMode(hdc, TRANSPARENT); - // TODO: support for centred/right aligned columns - ::DrawText(hdc, text, -1, &rc, + UINT fmt = DT_SINGLELINE | #ifndef __WXWINCE__ DT_WORD_ELLIPSIS | #endif // __WXWINCE__ - DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER); + DT_NOPREFIX | + DT_VCENTER; + + LV_COLUMN lvCol; + wxZeroMemory(lvCol); + lvCol.mask = LVCF_FMT; + if ( ListView_GetColumn(hwndList, col, &lvCol) ) + { + switch ( lvCol.fmt & LVCFMT_JUSTIFYMASK ) + { + case LVCFMT_LEFT: + fmt |= DT_LEFT; + break; + + case LVCFMT_CENTER: + fmt |= DT_CENTER; + break; + + case LVCFMT_RIGHT: + fmt |= DT_RIGHT; + break; + } + } + //else: failed to get alignment, assume it's DT_LEFT (default) + + DrawText(hdc, text, -1, &rc, fmt); + + return true; } static void HandleItemPostpaint(NMCUSTOMDRAW nmcd) @@ -2576,7 +2603,7 @@ static void HandleItemPaint(LPNMLVCUSTOMDRAW pLVCD, HFONT hfont) for ( int col = 0; col < colCount; col++ ) { pLVCD->iSubItem = col; - HandleSubItemPrepaint(pLVCD, hfont); + HandleSubItemPrepaint(pLVCD, hfont, colCount); } HandleItemPostpaint(nmcd); @@ -3040,7 +3067,7 @@ static void wxConvertToMSWListItem(const wxListCtrl *ctrl, else { // pszText is not const, hence the cast - lvItem.pszText = (wxChar *)info.m_text.c_str(); + lvItem.pszText = (wxChar *)info.m_text.wx_str(); if ( lvItem.pszText ) lvItem.cchTextMax = info.m_text.length(); else @@ -3061,7 +3088,7 @@ static void wxConvertToMSWListCol(HWND hwndList, if ( item.m_mask & wxLIST_MASK_TEXT ) { lvCol.mask |= LVCF_TEXT; - lvCol.pszText = (wxChar *)item.m_text.c_str(); // cast is safe + lvCol.pszText = (wxChar *)item.m_text.wx_str(); // cast is safe } if ( item.m_mask & wxLIST_MASK_FORMAT )