X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ac7c5092401be067f7c727ad8e2bf7274c05866..16d865f756b8bc251467139b3b75752219ab97bd:/src/generic/listctrl.cpp?ds=inline diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index d5e1cb9e8e..850879e1ce 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -626,6 +626,8 @@ public: // suspend/resume redrawing the control void Freeze(); void Thaw(); + + void SetFocus(); void OnRenameTimer(); void OnRenameAccept(); @@ -2158,7 +2160,7 @@ void wxListTextCtrl::OnChar( wxKeyEvent &event ) m_owner->OnRenameAccept(); m_finished = TRUE; - m_owner->SetFocus(); // This doesn't work. TODO. + m_owner->SetFocus(); return; } @@ -2171,7 +2173,7 @@ void wxListTextCtrl::OnChar( wxKeyEvent &event ) wxPendingDelete.Append(this); m_finished = TRUE; - m_owner->SetFocus(); // This doesn't work. TODO. + m_owner->SetFocus(); return; } @@ -2192,7 +2194,7 @@ void wxListTextCtrl::OnKeyUp( wxKeyEvent &event ) wxPoint myPos = GetPosition(); wxSize mySize = GetSize(); int sx, sy; - GetTextExtent(GetValue() + _T("M"), &sx, &sy); // FIXME: MM?? + GetTextExtent(GetValue() + _T("MM"), &sx, &sy); if (myPos.x + sx > parentSize.x) sx = parentSize.x - myPos.x; if (mySize.x > sx) @@ -2660,14 +2662,6 @@ void wxListMainWindow::RefreshSelected() to = GetItemCount() - 1; } - // VZ: this code would work fine if wxGTK wxWindow::Refresh() were - // reasonable, i.e. if it only generated one expose event for - // several calls to it - as it is, each Refresh() results in a - // repaint which provokes flicker too horrible to be seen - // - // when/if wxGTK is fixed, this code should be restored as normally it - // should generate _less_ flicker than the version below -#ifndef __WXGTK__ if ( HasCurrent() && m_current >= from && m_current <= to ) { RefreshLine(m_current); @@ -2681,26 +2675,6 @@ void wxListMainWindow::RefreshSelected() RefreshLine(line); } } -#else // __WXGTK__ - size_t selMin = (size_t)-1, - selMax = 0; - - for ( size_t line = from; line <= to; line++ ) - { - if ( IsHighlighted(line) || (line == m_current) ) - { - if ( line < selMin ) - selMin = line; - if ( line > selMax ) - selMax = line; - } - } - - if ( selMin != (size_t)-1 ) - { - RefreshLines(selMin, selMax); - } -#endif // !__WXGTK__/__WXGTK__ } void wxListMainWindow::Freeze() @@ -3074,7 +3048,15 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) m_renameTimer->Stop(); m_lastOnSame = FALSE; +#ifdef __WXGTK__ + // FIXME: wxGTK generates bad sequence of events prior to doubleclick + // ("down, up, down, double, up" while other ports + // do "down, up, double, up"). We have to have this hack + // in place till somebody fixes wxGTK... if ( current == m_lineBeforeLastClicked ) +#else + if ( current == m_lineLastClicked ) +#endif { SendNotify( current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED ); @@ -3424,9 +3406,25 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) // focus handling // ---------------------------------------------------------------------------- -#ifdef __WXGTK__ -extern wxWindow *g_focusWindow; -#endif +void wxListMainWindow::SetFocus() +{ + // VS: wxListMainWindow derives from wxPanel (via wxScrolledWindow) and wxPanel + // overrides SetFocus in such way that it does never change focus from + // panel's child to the panel itself. Unfortunately, we must be able to change + // focus to the panel from wxListTextCtrl because the text control should + // disappear when the user clicks outside it. + + wxWindow *oldFocus = FindFocus(); + + if ( oldFocus && oldFocus->GetParent() == this ) + { + wxWindow::SetFocus(); + } + else + { + wxScrolledWindow::SetFocus(); + } +} void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) { @@ -3444,10 +3442,6 @@ void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) if ( !GetParent() ) return; -#ifdef __WXGTK__ - g_focusWindow = GetParent(); -#endif - wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() ); event.SetEventObject( GetParent() ); GetParent()->GetEventHandler()->ProcessEvent( event ); @@ -4415,10 +4409,8 @@ void wxListMainWindow::OnScroll(wxScrollWinEvent& event) wxListCtrl* lc = GetListCtrl(); wxCHECK_RET( lc, _T("no listctrl window?") ); - lc->m_headerWin->Refresh() ; -#ifdef __WXMAC__ - lc->m_headerWin->MacUpdateImmediately() ; -#endif + lc->m_headerWin->Refresh(); + lc->m_headerWin->Update(); } } @@ -4581,7 +4573,7 @@ bool wxListCtrl::Create(wxWindow *parent, style = style | wxLC_LIST; } - if ( !wxControl::Create( parent, id, pos, size, style, validator, "listctrl" ) ) + if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) return FALSE; // don't create the inner window with the border