X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c8e5c51f8a0a547a5183b1443d3ba059b65ce69..44d0f703f9cba47009e33cd248f78bef941ba99b:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index bf34d03800..60540ba6b7 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -25,7 +25,7 @@ #include "wx/listctrl.h" -#if (!defined(__WXMSW__) || defined(__WXUNIVERSAL__)) && !defined(__WXMAC__) +#if ((!defined(__WXMSW__) && !defined(__WXMAC__)) || defined(__WXUNIVERSAL__)) // if we have a native version, its implementation file does all this IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) @@ -50,7 +50,7 @@ #include "wx/renderer.h" #ifdef __WXMAC__ - #include "wx/mac/private.h" + #include "wx/osx/private.h" #endif @@ -243,7 +243,7 @@ private: // wxListLineData (internal) //----------------------------------------------------------------------------- -WX_DECLARE_EXPORTED_LIST(wxListItemData, wxListItemDataList); +WX_DECLARE_LIST(wxListItemData, wxListItemDataList); #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListItemDataList) @@ -375,7 +375,7 @@ private: int width); }; -WX_DECLARE_EXPORTED_OBJARRAY(wxListLineData, wxListLineDataArray); +WX_DECLARE_OBJARRAY(wxListLineData, wxListLineDataArray); #include "wx/arrimpl.cpp" WX_DEFINE_OBJARRAY(wxListLineDataArray) @@ -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() }; @@ -488,11 +487,11 @@ private: // wxListMainWindow (internal) //----------------------------------------------------------------------------- -WX_DECLARE_EXPORTED_LIST(wxListHeaderData, wxListHeaderDataList); +WX_DECLARE_LIST(wxListHeaderData, wxListHeaderDataList); #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListHeaderDataList) -class wxListMainWindow : public wxScrolledWindow +class wxListMainWindow : public wxScrolledCanvas { public: wxListMainWindow(); @@ -598,10 +597,6 @@ public: m_textctrlWrapper = NULL; } - // we don't draw anything while we're frozen so we must refresh ourselves - // when we're thawed to make sure the changes are displayed correctly - virtual void DoThaw() { Refresh(); } - void OnRenameTimer(); bool OnRenameAccept(size_t itemEdit, const wxString& value); void OnRenameCancelled(size_t itemEdit); @@ -644,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; @@ -705,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; @@ -853,7 +852,6 @@ private: wxListTextCtrlWrapper *m_textctrlWrapper; - DECLARE_DYNAMIC_CLASS(wxListMainWindow) DECLARE_EVENT_TABLE() friend class wxGenericListCtrl; @@ -1446,7 +1444,7 @@ bool wxListLineData::SetAttributes(wxDC *dc, if ( highlighted ) dc->SetBrush( *m_owner->GetHighlightBrush() ); else - dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); + dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxBRUSHSTYLE_SOLID)); dc->SetPen( *wxTRANSPARENT_PEN ); @@ -1690,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) @@ -1794,7 +1790,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) GetClientSize( &w, &h ); m_owner->CalcUnscrolledPosition(w, 0, &w, NULL); - dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); dc.SetTextForeground(GetForegroundColour()); int x = HEADER_OFFSET_X; @@ -2139,11 +2135,11 @@ wxListTextCtrlWrapper::wxListTextCtrlWrapper(wxListMainWindow *owner, void wxListTextCtrlWrapper::EndEdit(bool discardChanges) { m_aboutToFinish = true; - + if ( discardChanges ) { m_owner->OnRenameCancelled(m_itemEdited); - + Finish( true ); } else @@ -2162,9 +2158,9 @@ void wxListTextCtrlWrapper::Finish( bool setfocus ) m_owner->ResetTextControl( m_text ); wxPendingDelete.Append( this ); - + if (setfocus) - m_owner->SetFocusIgnoringChildren(); + m_owner->SetFocus(); } bool wxListTextCtrlWrapper::AcceptChanges() @@ -2219,7 +2215,7 @@ void wxListTextCtrlWrapper::OnKeyUp( wxKeyEvent &event ) sx = mySize.x; m_text->SetSize(sx, wxDefaultCoord); } - + event.Skip(); } @@ -2241,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) @@ -2299,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(); @@ -2310,7 +2304,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, ( wxSYS_COLOUR_HIGHLIGHT ), - wxSOLID + wxBRUSHSTYLE_SOLID ); m_highlightUnfocusedBrush = new wxBrush @@ -2319,7 +2313,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, ( wxSYS_COLOUR_BTNSHADOW ), - wxSOLID + wxBRUSHSTYLE_SOLID ); SetScrollbars( 0, 0, 0, 0, 0, 0 ); @@ -2707,7 +2701,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // done (a Windows requirement). wxPaintDC dc( this ); - if ( IsEmpty() || IsFrozen() ) + if ( IsEmpty() ) { // nothing to draw or not the moment to draw it return; @@ -2768,7 +2762,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) if ( HasFlag(wxLC_HRULES) ) { - wxPen pen(GetRuleColour(), 1, wxSOLID); + wxPen pen(GetRuleColour(), 1, wxPENSTYLE_SOLID); wxSize clientSize = GetClientSize(); size_t i = visibleFrom; @@ -2794,7 +2788,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // Draw vertical rules if required if ( HasFlag(wxLC_VRULES) && !IsEmpty() ) { - wxPen pen(GetRuleColour(), 1, wxSOLID); + wxPen pen(GetRuleColour(), 1, wxPENSTYLE_SOLID); wxRect firstItemRect, lastItemRect; GetItemRect(visibleFrom, firstItemRect); @@ -2998,7 +2992,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) #endif // __WXMAC__ if ( event.LeftDown() ) - SetFocusIgnoringChildren(); + SetFocus(); event.SetEventObject( GetParent() ); if ( GetParent()->GetEventHandler()->ProcessEvent( event) ) @@ -3399,16 +3393,10 @@ void wxListMainWindow::OnKeyDown( wxKeyEvent &event ) wxWindow *parent = GetParent(); // propagate the key event upwards - wxKeyEvent ke( wxEVT_KEY_DOWN ); - ke.m_shiftDown = event.m_shiftDown; - ke.m_controlDown = event.m_controlDown; - ke.m_altDown = event.m_altDown; - ke.m_metaDown = event.m_metaDown; - ke.m_keyCode = event.m_keyCode; - ke.m_x = event.m_x; - ke.m_y = event.m_y; + wxKeyEvent ke(event); ke.SetEventObject( parent ); - if (parent->GetEventHandler()->ProcessEvent( ke )) return; + if (parent->GetEventHandler()->ProcessEvent( ke )) + return; event.Skip(); } @@ -3418,16 +3406,9 @@ void wxListMainWindow::OnKeyUp( wxKeyEvent &event ) wxWindow *parent = GetParent(); // propagate the key event upwards - wxKeyEvent ke( wxEVT_KEY_UP ); - ke.m_shiftDown = event.m_shiftDown; - ke.m_controlDown = event.m_controlDown; - ke.m_altDown = event.m_altDown; - ke.m_metaDown = event.m_metaDown; - ke.m_keyCode = event.m_keyCode; - ke.m_x = event.m_x; - ke.m_y = event.m_y; - ke.SetEventObject( parent ); - if (parent->GetEventHandler()->ProcessEvent( ke )) return; + wxKeyEvent ke(event); + if (parent->GetEventHandler()->ProcessEvent( ke )) + return; event.Skip(); } @@ -3448,16 +3429,10 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) } // propagate the char event upwards - wxKeyEvent ke( wxEVT_CHAR ); - ke.m_shiftDown = event.m_shiftDown; - ke.m_controlDown = event.m_controlDown; - ke.m_altDown = event.m_altDown; - ke.m_metaDown = event.m_metaDown; - ke.m_keyCode = event.m_keyCode; - ke.m_x = event.m_x; - ke.m_y = event.m_y; + wxKeyEvent ke(event); ke.SetEventObject( parent ); - if (parent->GetEventHandler()->ProcessEvent( ke )) return; + if (parent->GetEventHandler()->ProcessEvent( ke )) + return; if ( HandleAsNavigationKey(event) ) return; @@ -4120,8 +4095,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; @@ -4157,10 +4131,14 @@ 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( subItem == wxLIST_GETSUBITEMRECT_WHOLEITEM || 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 ) @@ -4169,9 +4147,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 @@ -4199,9 +4192,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; @@ -4864,7 +4857,7 @@ void wxListMainWindow::OnScroll(wxScrollWinEvent& event) { // FIXME #if ( defined(__WXGTK__) || defined(__WXMAC__) ) && !defined(__WXUNIVERSAL__) - wxScrolledWindow::OnScroll(event); + wxScrolledCanvas::OnScroll(event); #else HandleOnScroll( event ); #endif @@ -4971,7 +4964,7 @@ void wxGenericListCtrl::CalculateAndSetHeaderHeight() { if ( m_headerWin ) { -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON SInt32 h; GetThemeMetric( kThemeMetricListHeaderHeight, &h ); #else @@ -5042,7 +5035,7 @@ bool wxGenericListCtrl::Create(wxWindow *parent, m_mainWin = new wxListMainWindow( this, wxID_ANY, wxPoint(0, 0), size, style ); -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON // Human Interface Guidelines ask us for a special font in this case if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL ) { @@ -5056,7 +5049,7 @@ bool wxGenericListCtrl::Create(wxWindow *parent, { CreateHeaderWindow(); -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON if (m_headerWin) { wxFont font; @@ -5098,7 +5091,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 ) @@ -5262,11 +5265,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; } @@ -5278,7 +5292,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