X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec64d5ca7bbafd4f803b7a1cfbddb85a16c45d6e..3cdd564fb9d9a982528131689e8f56e5ea946f13:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index a3419d15c7..613d65a38e 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -50,7 +50,7 @@ #include "wx/renderer.h" #ifdef __WXMAC__ - #include "wx/mac/private.h" + #include "wx/osx/private.h" #endif @@ -432,7 +432,6 @@ private: // it wasn't vetoed, i.e. if we should proceed bool SendListEvent(wxEventType type, const wxPoint& pos); - DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) DECLARE_EVENT_TABLE() }; @@ -492,7 +491,7 @@ WX_DECLARE_LIST(wxListHeaderData, wxListHeaderDataList); #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListHeaderDataList) -class wxListMainWindow : public wxScrolledWindow +class wxListMainWindow : public wxScrolledCanvas { public: wxListMainWindow(); @@ -640,7 +639,11 @@ public: void SetItemState( long item, long state, long stateMask ); void SetItemStateAll( long state, long stateMask ); int GetItemState( long item, long stateMask ) const; - void GetItemRect( long index, wxRect &rect ) const; + bool GetItemRect( long item, wxRect &rect ) const + { + return GetSubItemRect(item, wxLIST_GETSUBITEMRECT_WHOLEITEM, rect); + } + bool GetSubItemRect( long item, long subItem, wxRect& rect ) const; wxRect GetViewRect() const; bool GetItemPosition( long item, wxPoint& pos ) const; int GetSelectedItemCount() const; @@ -701,7 +704,7 @@ public: // override base class virtual to reset m_lineHeight when the font changes virtual bool SetFont(const wxFont& font) { - if ( !wxScrolledWindow::SetFont(font) ) + if ( !wxScrolledCanvas::SetFont(font) ) return false; m_lineHeight = 0; @@ -849,7 +852,6 @@ private: wxListTextCtrlWrapper *m_textctrlWrapper; - DECLARE_DYNAMIC_CLASS(wxListMainWindow) DECLARE_EVENT_TABLE() friend class wxGenericListCtrl; @@ -1686,8 +1688,6 @@ void wxListLineData::ReverseHighlight( void ) // wxListHeaderWindow //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow) - BEGIN_EVENT_TABLE(wxListHeaderWindow,wxWindow) EVT_PAINT (wxListHeaderWindow::OnPaint) EVT_MOUSE_EVENTS (wxListHeaderWindow::OnMouse) @@ -2160,7 +2160,7 @@ void wxListTextCtrlWrapper::Finish( bool setfocus ) wxPendingDelete.Append( this ); if (setfocus) - m_owner->SetFocusIgnoringChildren(); + m_owner->SetFocus(); } bool wxListTextCtrlWrapper::AcceptChanges() @@ -2237,9 +2237,7 @@ void wxListTextCtrlWrapper::OnKillFocus( wxFocusEvent &event ) // wxListMainWindow //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow) - -BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow) +BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledCanvas) EVT_PAINT (wxListMainWindow::OnPaint) EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse) EVT_CHAR (wxListMainWindow::OnChar) @@ -2295,7 +2293,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, const wxSize& size, long style, const wxString &name ) - : wxScrolledWindow( parent, id, pos, size, + : wxScrolledCanvas( parent, id, pos, size, style | wxHSCROLL | wxVSCROLL, name ) { Init(); @@ -2994,7 +2992,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) #endif // __WXMAC__ if ( event.LeftDown() ) - SetFocusIgnoringChildren(); + SetFocus(); event.SetEventObject( GetParent() ); if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) @@ -4116,8 +4114,7 @@ int wxListMainWindow::GetSelectedItemCount() const wxRect wxListMainWindow::GetViewRect() const { - wxASSERT_MSG( !HasFlag(wxLC_REPORT | wxLC_LIST), - _T("wxListCtrl::GetViewRect() only works in icon mode") ); + wxASSERT_MSG( !HasFlag(wxLC_LIST), "not implemented for list view" ); // we need to find the longest/tallest label wxCoord xMax = 0, yMax = 0; @@ -4153,10 +4150,13 @@ wxRect wxListMainWindow::GetViewRect() const return wxRect(0, 0, xMax, yMax); } -void wxListMainWindow::GetItemRect( long index, wxRect &rect ) const +bool +wxListMainWindow::GetSubItemRect(long item, long subItem, wxRect& rect) const { - wxCHECK_RET( index >= 0 && (size_t)index < GetItemCount(), - _T("invalid index in GetItemRect") ); + wxCHECK_MSG( InReportView(), false, + _T("GetSubItemRect only meaningful in report view") ); + wxCHECK_MSG( item >= 0 && (size_t)item < GetItemCount(), false, + _T("invalid item in GetSubItemRect") ); // ensure that we're laid out, otherwise we could return nonsense if ( m_dirty ) @@ -4165,9 +4165,24 @@ void wxListMainWindow::GetItemRect( long index, wxRect &rect ) const RecalculatePositions(true /* no refresh */); } - rect = GetLineRect((size_t)index); + rect = GetLineRect((size_t)item); + + // Adjust rect to specified column + if ( subItem != wxLIST_GETSUBITEMRECT_WHOLEITEM ) + { + wxCHECK_MSG( subItem >= 0 && subItem < GetColumnCount(), false, + _T("invalid subItem in GetSubItemRect") ); + + for (int i = 0; i < subItem; i++) + { + rect.x += GetColumnWidth(i); + } + rect.width = GetColumnWidth(subItem); + } CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y); + + return true; } bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos) const @@ -4195,9 +4210,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) const size_t count = GetItemCount(); int iconSpacing; - if ( HasFlag(wxLC_ICON) ) + if ( HasFlag(wxLC_ICON) && m_normal_image_list ) iconSpacing = m_normal_spacing; - else if ( HasFlag(wxLC_SMALL_ICON) ) + else if ( HasFlag(wxLC_SMALL_ICON) && m_small_image_list ) iconSpacing = m_small_spacing; else iconSpacing = 0; @@ -4860,7 +4875,7 @@ void wxListMainWindow::OnScroll(wxScrollWinEvent& event) { // FIXME #if ( defined(__WXGTK__) || defined(__WXMAC__) ) && !defined(__WXUNIVERSAL__) - wxScrolledWindow::OnScroll(event); + wxScrolledCanvas::OnScroll(event); #else HandleOnScroll( event ); #endif @@ -5094,7 +5109,17 @@ void wxGenericListCtrl::SetSingleStyle( long style, bool add ) else flag &= ~style; - SetWindowStyleFlag( flag ); + // some styles can be set without recreating everything (as happens in + // SetWindowStyleFlag() which calls wxListMainWindow::DeleteEverything()) + if ( !(style & ~(wxLC_HRULES | wxLC_VRULES)) ) + { + Refresh(); + wxWindow::SetWindowStyleFlag(flag); + } + else + { + SetWindowStyleFlag( flag ); + } } void wxGenericListCtrl::SetWindowStyleFlag( long flag ) @@ -5258,11 +5283,22 @@ wxRect wxGenericListCtrl::GetViewRect() const return m_mainWin->GetViewRect(); } -bool wxGenericListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const +bool wxGenericListCtrl::GetItemRect(long item, wxRect& rect, int code) const +{ + return GetSubItemRect(item, wxLIST_GETSUBITEMRECT_WHOLEITEM, rect, code); +} + +bool wxGenericListCtrl::GetSubItemRect(long item, + long subItem, + wxRect& rect, + int WXUNUSED(code)) const { - m_mainWin->GetItemRect( item, rect ); + if ( !m_mainWin->GetSubItemRect( item, subItem, rect ) ) + return false; + if ( m_mainWin->HasHeader() ) rect.y += m_headerHeight + 1; + return true; } @@ -5274,7 +5310,7 @@ bool wxGenericListCtrl::GetItemPosition( long item, wxPoint& pos ) const bool wxGenericListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) ) { - return 0; + return false; } int wxGenericListCtrl::GetItemCount() const