wxRect wxListCtrl::GetViewRect() const
{
- wxASSERT_MSG( !HasFlag(wxLC_REPORT | wxLC_LIST),
- _T("wxListCtrl::GetViewRect() only works in icon mode") );
+ wxRect rect;
- RECT rc;
- if ( !ListView_GetViewRect(GetHwnd(), &rc) )
+ // ListView_GetViewRect() can only be used in icon and small icon views
+ // (this is documented in MSDN and, indeed, it returns bogus results in
+ // report view, at least with comctl32.dll v6 under Windows 2003)
+ if ( HasFlag(wxLC_ICON | wxLC_SMALL_ICON) )
{
- wxLogDebug(_T("ListView_GetViewRect() failed."));
+ RECT rc;
+ if ( !ListView_GetViewRect(GetHwnd(), &rc) )
+ {
+ wxLogDebug(_T("ListView_GetViewRect() failed."));
- wxZeroMemory(rc);
+ wxZeroMemory(rc);
+ }
+
+ wxCopyRECTToRect(rc, rect);
}
+ else if ( HasFlag(wxLC_REPORT) )
+ {
+ const long count = GetItemCount();
+ if ( count )
+ {
+ GetItemRect(wxMin(GetTopItem() + GetCountPerPage(), count - 1), rect);
- wxRect rect;
- wxCopyRECTToRect(rc, rect);
+ // extend the rectangle to start at the top (we include the column
+ // headers, if any, for compatibility with the generic version)
+ rect.height += rect.y;
+ rect.y = 0;
+ }
+ }
+ else
+ {
+ wxFAIL_MSG( _T("not implemented in this mode") );
+ }
return rect;
}
*/
bool wxListCtrl::GetSubItemRect(long item, long subItem, wxRect& rect, int code) const
{
- RECT rectWin;
+ // ListView_GetSubItemRect() doesn't do subItem error checking and returns
+ // true even for the out of range values of it (even if the results are
+ // completely bogus in this case), so we check item validity ourselves
+ wxCHECK_MSG( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM ||
+ (subItem >= 0 && subItem < GetColumnCount()),
+ false, _T("invalid sub item index") );
int codeWin;
if ( code == wxLIST_RECT_BOUNDS )
codeWin = LVIR_BOUNDS;
}
- bool success;
- if( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM)
- {
- success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0;
- }
- else if( subItem >= 0)
- {
- success = ListView_GetSubItemRect( GetHwnd(), (int) item, (int) subItem, codeWin, &rectWin) != 0;
- }
- else
+ RECT rectWin;
+ if ( !ListView_GetSubItemRect
+ (
+ GetHwnd(),
+ item,
+ subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM ? 0 : subItem,
+ codeWin,
+ &rectWin
+ ) )
{
- wxFAIL_MSG( _T("incorrect subItem number in GetSubItemRect()") );
- return false;
+ return false;
}
- rect.x = rectWin.left;
- rect.y = rectWin.top;
- rect.width = rectWin.right - rectWin.left;
- rect.height = rectWin.bottom - rectWin.top;
+ wxCopyRECTToRect(rectWin, rect);
- return success;
+ // for the first sub item, i.e. the main item itself, the returned rect is
+ // the whole line one, we need to truncate it at first column ourselves
+ rect.width = GetColumnWidth(0);
+
+ return true;
}
wxLIST_STATE_SELECTED);
// <Enter> or <Space> activate the selected item if any (but
- // not with Shift and/or Ctrl as then they have a predefined
- // meaning for the list view)
+ // not with any modifiers as they have a predefined meaning
+ // then)
if ( lItem != -1 &&
(wVKey == VK_RETURN || wVKey == VK_SPACE) &&
- !(wxIsShiftDown() || wxIsCtrlDown()) )
+ !wxIsAnyModifierDown() )
{
eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED;
}