+void wxListMainWindow::RefreshAfter( size_t lineFrom )
+{
+ if ( HasFlag(wxLC_REPORT) )
+ {
+ size_t visibleFrom;
+ GetVisibleLinesRange(&visibleFrom, NULL);
+
+ if ( lineFrom < visibleFrom )
+ lineFrom = visibleFrom;
+
+ wxRect rect;
+ rect.x = 0;
+ rect.y = GetLineY(lineFrom);
+
+ wxSize size = GetClientSize();
+ rect.width = size.x;
+ // refresh till the bottom of the window
+ rect.height = size.y - rect.y;
+
+ CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
+ RefreshRect( rect );
+ }
+ else // !report
+ {
+ // TODO: how to do it more efficiently?
+ m_dirty = TRUE;
+ }
+}
+
+void wxListMainWindow::RefreshSelected()
+{
+ if ( IsEmpty() )
+ return;
+
+ size_t from, to;
+ if ( InReportView() )
+ {
+ GetVisibleLinesRange(&from, &to);
+ }
+ else // !virtual
+ {
+ from = 0;
+ 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);
+ }
+
+ for ( size_t line = from; line <= to; line++ )
+ {
+ // NB: the test works as expected even if m_current == -1
+ if ( line != m_current && IsHighlighted(line) )
+ {
+ 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__
+}
+