#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"
// 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);
{
// get internal item data
// perhaps a cache here ?
- wxListItemInternalData *data = wxGetInternalData(this, info.m_itemId);
+ wxListItemInternalData *data = wxGetInternalData(this, id);
if (! data)
{
// 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);
}
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;
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);
// TODO: support for centred/right aligned columns
::DrawText(hdc, text, -1, &rc,
- DT_WORD_ELLIPSIS | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
+#ifndef __WXWINCE__
+ DT_WORD_ELLIPSIS |
+#endif // __WXWINCE__
+ DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER);
}
static void HandleItemPostpaint(NMCUSTOMDRAW nmcd)
{
NMCUSTOMDRAW& nmcd = pLVCD->nmcd; // just a shortcut
- HWND hwndList = nmcd.hdr.hwndFrom;
+ const HWND hwndList = nmcd.hdr.hwndFrom;
+ const int item = nmcd.dwItemSpec;
// unfortunately we can't trust CDIS_SELECTED, it is often set even when
// the item is not at all selected for some reason (comctl32 6), but we
break;
}
- if ( (DWORD)i == nmcd.dwItemSpec )
+ if ( i == item )
{
nmcd.uItemState |= CDIS_SELECTED;
break;
}
}
+ // same thing for CDIS_FOCUS (except simpler as there is only one of them)
+ if ( ::GetFocus() == hwndList &&
+ ListView_GetNextItem(hwndList, (WPARAM)-1, LVNI_FOCUSED) == item )
+ {
+ nmcd.uItemState |= CDIS_FOCUS;
+ }
+ else
+ {
+ nmcd.uItemState &= ~CDIS_FOCUS;
+ }
+
if ( nmcd.uItemState & CDIS_SELECTED )
{
int syscolFg, syscolBg;
// 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() )
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);
}
#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;