X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e974c5d258bbb398b0eed38397749d1d071dbbf8..f2c94e8af58f85d60197de8245d987a602451323:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 613d65a38e..bf9e05c417 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__) && wxOSX_USE_CARBON)) || defined(__WXUNIVERSAL__)) // if we have a native version, its implementation file does all this IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) @@ -51,6 +51,8 @@ #ifdef __WXMAC__ #include "wx/osx/private.h" + // for themeing support + #include #endif @@ -615,6 +617,8 @@ public: void OnPaint( wxPaintEvent &event ); + void OnChildFocus(wxChildFocusEvent& event); + void DrawImage( int index, wxDC *dc, int x, int y ); void GetImageSize( int index, int &width, int &height ) const; int GetTextLength( const wxString &s ) const; @@ -1410,7 +1414,7 @@ bool wxListLineData::SetAttributes(wxDC *dc, #ifdef __WXMAC__ { if (m_owner->HasFocus() -#if !defined(__WXUNIVERSAL__) +#if !defined(__WXUNIVERSAL__) && wxOSX_USE_CARBON && IsControlActive( (ControlRef)m_owner->GetHandle() ) #endif ) @@ -1474,7 +1478,7 @@ void wxListLineData::Draw( wxDC *dc ) { int flags = wxCONTROL_SELECTED; if (m_owner->HasFocus() -#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__) +#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__) && wxOSX_USE_CARBON && IsControlActive( (ControlRef)m_owner->GetHandle() ) #endif ) @@ -1895,6 +1899,19 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) x += wCol; } + + // Fill in what's missing to the right of the columns, otherwise we will + // leave an unpainted area when columns are removed (and it looks better) + if ( x < w ) + { + wxRendererNative::Get().DrawHeaderButton + ( + this, + dc, + wxRect(x, HEADER_OFFSET_Y, w - x, h), + 0 + ); + } } void wxListHeaderWindow::DrawCurrent() @@ -2246,6 +2263,7 @@ BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledCanvas) EVT_SET_FOCUS (wxListMainWindow::OnSetFocus) EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus) EVT_SCROLLWIN (wxListMainWindow::OnScroll) + EVT_CHILD_FOCUS (wxListMainWindow::OnChildFocus) END_EVENT_TABLE() void wxListMainWindow::Init() @@ -2857,6 +2875,13 @@ void wxListMainWindow::HighlightAll( bool on ) } } +void wxListMainWindow::OnChildFocus(wxChildFocusEvent& WXUNUSED(event)) +{ + // Do nothing here. This prevents the default handler in wxScrolledWindow + // from needlessly scrolling the window when the edit control is + // dismissed. See ticket #9563. +} + void wxListMainWindow::SendNotify( size_t line, wxEventType command, const wxPoint& point ) @@ -3393,16 +3418,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(); } @@ -3412,16 +3431,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(); } @@ -3442,16 +3454,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; @@ -4123,8 +4129,9 @@ wxRect wxListMainWindow::GetViewRect() const { for ( int i = 0; i < count; i++ ) { - wxRect r; - GetItemRect(i, r); + // we need logical, not physical, coordinates here, so use + // GetLineRect() instead of GetItemRect() + wxRect r = GetLineRect(i); wxCoord x = r.GetRight(), y = r.GetBottom(); @@ -4153,7 +4160,8 @@ wxRect wxListMainWindow::GetViewRect() const bool wxListMainWindow::GetSubItemRect(long item, long subItem, wxRect& rect) const { - wxCHECK_MSG( InReportView(), false, + 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") ); @@ -4873,12 +4881,7 @@ void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data ) void wxListMainWindow::OnScroll(wxScrollWinEvent& event) { - // FIXME -#if ( defined(__WXGTK__) || defined(__WXMAC__) ) && !defined(__WXUNIVERSAL__) - wxScrolledCanvas::OnScroll(event); -#else HandleOnScroll( event ); -#endif // update our idea of which lines are shown when we redraw the window the // next time @@ -4982,7 +4985,7 @@ void wxGenericListCtrl::CalculateAndSetHeaderHeight() { if ( m_headerWin ) { -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON SInt32 h; GetThemeMetric( kThemeMetricListHeaderHeight, &h ); #else @@ -5037,10 +5040,9 @@ bool wxGenericListCtrl::Create(wxWindow *parent, m_headerHeight = 0; - if ( !(style & wxLC_MASK_TYPE) ) - { - style = style | wxLC_LIST; - } + // just like in other ports, an assert will fail if the user doesn't give any type style: + wxASSERT_MSG( (style & wxLC_MASK_TYPE), + _T("wxListCtrl style should have exactly one mode bit set") ); if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) return false; @@ -5053,12 +5055,16 @@ 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 ) { wxFont font; +#if wxOSX_USE_CARBON font.MacCreateFromThemeFont( kThemeViewsFont ); +#else + font.MacCreateFromUIFont( kCTFontViewsFontType ); +#endif SetFont( font ); } #endif @@ -5067,11 +5073,15 @@ bool wxGenericListCtrl::Create(wxWindow *parent, { CreateHeaderWindow(); -#ifdef __WXMAC__ +#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON if (m_headerWin) { wxFont font; +#if wxOSX_USE_CARBON font.MacCreateFromThemeFont( kThemeSmallSystemFont ); +#else + font.MacCreateFromUIFont( kCTFontSystemFontType ); +#endif m_headerWin->SetFont( font ); CalculateAndSetHeaderHeight(); } @@ -5753,7 +5763,7 @@ wxGenericListCtrl::GetClassDefaultAttributes(wxWindowVariant variant) #else wxUnusedVar(variant); wxVisualAttributes attr; - attr.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + attr.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOXTEXT); attr.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX); attr.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); return attr;