From: Vadim Zeitlin Date: Sun, 21 Dec 2008 02:13:58 +0000 (+0000) Subject: fix Get(Sub)ItemRect() after changes of r54437; added test for it (see #10175) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6756186271a8394db23bc817e1aa36c27c52076a fix Get(Sub)ItemRect() after changes of r54437; added test for it (see #10175) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57458 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index d7bac52606..9e23d1db3f 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -91,7 +91,9 @@ namespace // 4.3+ // // this function does no error checking on item and subitem parameters, notice -// that subitem is 0 for whole item or 1-based for the individual columns +// that subitem 0 means the whole item so there is no way to retrieve the +// rectangle of the first subitem using this function, in particular notice +// that the index is *not* 1-based, in spite of what MSDN says inline bool wxGetListCtrlSubItemRect(HWND hwnd, int item, int subitem, int flags, RECT& rect) { @@ -1151,19 +1153,6 @@ bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const return GetSubItemRect( item, wxLIST_GETSUBITEMRECT_WHOLEITEM, rect, code) ; } -/*! - * Retrieve coordinates and size of a specified subitem of a listview control. - * This function only works if the listview control is in the report mode. - * - * @param item : Item number - * @param subItem : Subitem or column number, use -1 for the whole row including - * all columns or subitems - * @param rect : A pointer to an allocated wxRect object - * @param code : Specify the part of the subitem coordinates you need. Choices are - * wxLIST_RECT_BOUNDS, wxLIST_RECT_ICON, wxLIST_RECT_LABEL - * - * @return bool : True if successful. - */ bool wxListCtrl::GetSubItemRect(long item, long subItem, wxRect& rect, int code) const { // ListView_GetSubItemRect() doesn't do subItem error checking and returns @@ -1201,9 +1190,11 @@ bool wxListCtrl::GetSubItemRect(long item, long subItem, wxRect& rect, int code) wxCopyRECTToRect(rectWin, rect); - // 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); + // there is no way to retrieve the first sub item bounding rectangle using + // wxGetListCtrlSubItemRect() as 0 means the whole item, so we need to + // truncate it at first column ourselves + if ( subItem == 0 ) + rect.width = GetColumnWidth(0); return true; } diff --git a/tests/controls/listctrltest.cpp b/tests/controls/listctrltest.cpp index 501d547f65..e6bb463986 100644 --- a/tests/controls/listctrltest.cpp +++ b/tests/controls/listctrltest.cpp @@ -40,11 +40,13 @@ private: #ifdef wxHAS_LISTCTRL_COLUMN_ORDER CPPUNIT_TEST( ColumnsOrder ); #endif // wxHAS_LISTCTRL_COLUMN_ORDER + CPPUNIT_TEST( ItemRect ); CPPUNIT_TEST_SUITE_END(); #ifdef wxHAS_LISTCTRL_COLUMN_ORDER void ColumnsOrder(); #endif // wxHAS_LISTCTRL_COLUMN_ORDER + void ItemRect(); wxListCtrl *m_list; @@ -64,6 +66,7 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ListCtrlTestCase, "ListCtrlTestCase" ); void ListCtrlTestCase::setUp() { m_list = new wxListCtrl(wxTheApp->GetTopWindow()); + m_list->SetWindowStyle(wxLC_REPORT); } void ListCtrlTestCase::tearDown() @@ -141,4 +144,33 @@ void ListCtrlTestCase::ColumnsOrder() CPPUNIT_ASSERT_EQUAL( "second in second", li.GetText() ); } +void ListCtrlTestCase::ItemRect() +{ + // set up for the test + m_list->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT, 60); + m_list->InsertColumn(1, "Column 1", wxLIST_FORMAT_LEFT, 50); + m_list->InsertColumn(2, "Column 2", wxLIST_FORMAT_LEFT, 40); + + m_list->InsertItem(0, "Item 0"); + m_list->SetItem(0, 1, "first column"); + m_list->SetItem(0, 1, "second column"); + + // do test + wxRect r; + CPPUNIT_ASSERT( !m_list->GetItemRect(1, r) ); + CPPUNIT_ASSERT( m_list->GetItemRect(0, r) ); + CPPUNIT_ASSERT_EQUAL( 150, r.GetWidth() ); + + CPPUNIT_ASSERT( m_list->GetSubItemRect(0, 0, r) ); + CPPUNIT_ASSERT_EQUAL( 60, r.GetWidth() ); + + CPPUNIT_ASSERT( m_list->GetSubItemRect(0, 1, r) ); + CPPUNIT_ASSERT_EQUAL( 50, r.GetWidth() ); + + CPPUNIT_ASSERT( m_list->GetSubItemRect(0, 2, r) ); + CPPUNIT_ASSERT_EQUAL( 40, r.GetWidth() ); + + CPPUNIT_ASSERT( !m_list->GetSubItemRect(0, 3, r) ); +} + #endif // wxHAS_LISTCTRL_COLUMN_ORDER