// return the hit code for the corresponding position (in this line)
long HitTestLine(size_t line, int x, int y) const;
+ // bring the selected item into view, scrolling to it if necessary
+ void MoveToItem(size_t item);
+
+ // bring the current item into view
+ void MoveToFocus() { MoveToItem(m_current); }
+
void EditLabel( long item );
void OnRenameTimer();
void OnRenameAccept();
void OnMouse( wxMouseEvent &event );
- void MoveToFocus();
// called to switch the selection from the current item to newCurrent,
void OnArrowChar( size_t newCurrent, const wxKeyEvent& event );
int GetSelectedItemCount();
// set the scrollbars and update the positions of the items
- void RecalculatePositions();
+ void RecalculatePositions(bool noRefresh = FALSE);
// refresh the window and the header
void RefreshAll();
rect.x = 0;
rect.y = GetLineY(lineFrom);
rect.width = GetClientSize().x;
- rect.height = GetLineY(lineTo) - rect.y;
+ rect.height = GetLineY(lineTo) - rect.y + GetLineHeight();
CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
RefreshRect( rect );
CalcUnscrolledPosition(0, 0, &xOrig, &yOrig);
// tell the caller cache to cache the data
- wxListEvent evCache(wxEVT_COMMAND_LIST_CACHE_HINT, GetParent()->GetId());
- evCache.SetEventObject( GetParent() );
- evCache.m_oldItemIndex = visibleFrom;
- evCache.m_itemIndex = visibleTo;
- GetParent()->GetEventHandler()->ProcessEvent( evCache );
+ if ( IsVirtual() )
+ {
+ wxListEvent evCache(wxEVT_COMMAND_LIST_CACHE_HINT,
+ GetParent()->GetId());
+ evCache.SetEventObject( GetParent() );
+ evCache.m_oldItemIndex = visibleFrom;
+ evCache.m_itemIndex = visibleTo;
+ GetParent()->GetEventHandler()->ProcessEvent( evCache );
+ }
for ( size_t line = visibleFrom; line <= visibleTo; line++ )
{
if ( point != wxDefaultPosition )
le.m_pointDrag = point;
- GetLine(line)->GetItem( 0, le.m_item );
+ if ( command != wxEVT_COMMAND_LIST_DELETE_ITEM )
+ {
+ GetLine(line)->GetItem( 0, le.m_item );
+ }
+ //else: there may be no more such item
+
GetParent()->GetEventHandler()->ProcessEvent( le );
}
}
}
-void wxListMainWindow::MoveToFocus()
+void wxListMainWindow::MoveToItem(size_t item)
{
- if ( !HasCurrent() )
+ if ( item == (size_t)-1 )
return;
- wxRect rect = GetLineRect(m_current);
+ wxRect rect = GetLineRect(item);
int client_w, client_h;
GetClientSize( &client_w, &client_h );
// geometry calculation
// ----------------------------------------------------------------------------
-void wxListMainWindow::RecalculatePositions()
+void wxListMainWindow::RecalculatePositions(bool noRefresh)
{
wxClientDC dc( this );
dc.SetFont( GetFont() );
SetScrollbars( m_xScroll, m_yScroll, (entireWidth+SCROLL_UNIT_X) / m_xScroll, 0, scroll_pos, 0, TRUE );
}
- // FIXME: why should we call it from here?
- UpdateCurrent();
+ if ( !noRefresh )
+ {
+ // FIXME: why should we call it from here?
+ UpdateCurrent();
- RefreshAll();
+ RefreshAll();
+ }
}
void wxListMainWindow::RefreshAll()
size_t index = (size_t)lindex;
- m_dirty = TRUE;
-
// select the next item when the selected one is deleted
- if ( m_current == index )
+ if ( m_current >= index )
{
- // the last valid index after deleting the item will be count-2
- if ( m_current == count - 1 )
- {
- m_current--;
- }
+ m_current--;
}
- SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM );
-
if ( InReportView() )
{
ResetVisibleLinesRange();
}
m_dirty = TRUE;
+
+ SendNotify( index, wxEVT_COMMAND_LIST_DELETE_ITEM );
+
RefreshAfter(index);
}
_T("invalid index in EnsureVisible") );
// We have to call this here because the label in question might just have
- // been added and no screen update taken place.
- if (m_dirty)
- wxSafeYield();
+ // been added and its position is not known yet
+ if ( m_dirty )
+ {
+ m_dirty = FALSE;
- size_t oldCurrent = m_current;
- m_current = (size_t)index;
- MoveToFocus();
- m_current = oldCurrent;
+ RecalculatePositions(TRUE /* no refresh */);
+ }
+
+ MoveToItem((size_t)index);
}
long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(partial) )