X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf3da716f65a419cddc25bdb70ccd7cbe4a3afa7..b51b78a9c7b50053cdcf4a22d2222500a20eb8ee:/src/generic/listctrl.cpp?ds=inline diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 43b025202c..fa4ced72aa 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -8,7 +8,8 @@ ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "listctrl.h" + #pragma implementation "listctrl.h" + #pragma implementation "listctrlbase.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -314,8 +315,13 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) m_bound_all.height = lh; if (item->HasImage()) { +#ifdef __WIN16__ + int w = 0; + int h = 0; +#else wxCoord w = 0; wxCoord h = 0; +#endif m_owner->GetImageSize( item->GetImage(), w, h ); m_bound_all.width += 4 + w; if (h > m_bound_all.height) m_bound_all.height = h; @@ -946,11 +952,11 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) m_minX = 0; bool hit_border = FALSE; int xpos = 0; - for (int j = 0; j < m_owner->GetColumnCount()-1; j++) + for (int j = 0; j < m_owner->GetColumnCount(); j++) { xpos += m_owner->GetColumnWidth( j ); m_column = j; - if ((abs(x-xpos) < 3) && (y < 22)) + if ((abs(x-xpos) < 3) && (y < 22) && (m_column < m_owner->GetColumnCount()-1)) { hit_border = TRUE; break; @@ -1054,24 +1060,33 @@ void wxListTextCtrl::OnChar( wxKeyEvent &event ) { (*m_accept) = TRUE; (*m_res) = GetValue(); - m_owner->SetFocus(); + + if (!wxPendingDelete.Member(this)) + wxPendingDelete.Append(this); + + if ((*m_accept) && ((*m_res) != m_startValue)) + m_owner->OnRenameAccept(); + return; } if (event.m_keyCode == WXK_ESCAPE) { (*m_accept) = FALSE; (*m_res) = ""; - m_owner->SetFocus(); + + if (!wxPendingDelete.Member(this)) + wxPendingDelete.Append(this); + return; } + event.Skip(); } void wxListTextCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) { - if (wxPendingDelete.Member(this)) return; - - wxPendingDelete.Append(this); + if (!wxPendingDelete.Member(this)) + wxPendingDelete.Append(this); if ((*m_accept) && ((*m_res) != m_startValue)) m_owner->OnRenameAccept(); @@ -1091,7 +1106,7 @@ BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow) EVT_KEY_DOWN (wxListMainWindow::OnKeyDown) EVT_SET_FOCUS (wxListMainWindow::OnSetFocus) EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus) - EVT_SCROLLWIN (wxListMainWindow::OnScroll) + EVT_SCROLLWIN (wxListMainWindow::OnScroll) END_EVENT_TABLE() wxListMainWindow::wxListMainWindow() @@ -1160,11 +1175,13 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, m_renameTimer = new wxListRenameTimer( this ); m_renameAccept = FALSE; - SetBackgroundColour( *wxWHITE ); + SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) ); } wxListMainWindow::~wxListMainWindow() { + DeleteEverything(); + if (m_hilightBrush) delete m_hilightBrush; delete m_renameTimer; @@ -1461,13 +1478,13 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) } else { - if (event.ShiftDown()) + if (event.ControlDown()) { m_current = line; m_current->ReverseHilight(); RefreshLine( m_current ); } - else if (event.ControlDown()) + else if (event.ShiftDown()) { m_current = line; @@ -1617,8 +1634,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) { wxNavigationKeyEvent nevent; nevent.SetDirection( !event.ShiftDown() ); + nevent.SetEventObject( GetParent()->GetParent() ); nevent.SetCurrentFocus( m_parent ); - if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return; + if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) return; } /* no item -> nothing to do */ @@ -2324,21 +2342,41 @@ void wxListMainWindow::RealizeChanges( void ) } } -long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state ) +long wxListMainWindow::GetNextItem( long item, + int WXUNUSED(geometry), + int state ) { - long ret = 0; - if (item > 0) ret = item; - if(ret >= GetItemCount()) return -1; + long ret = item, + max = GetItemCount(); + wxCHECK_MSG( (ret == -1) || (ret < max), -1, + _T("invalid listctrl index in GetNextItem()") ); + + // notice that we start with the next item (or the first one if item == -1) + // and this is intentional to allow writing a simple loop to iterate over + // all selected items + ret++; + if ( ret == max ) + { + // this is not an error because the index was ok initially, just no + // such item + return -1; + } + wxNode *node = m_lines.Nth( (size_t)ret ); while (node) { wxListLineData *line = (wxListLineData*)node->Data(); - if ((state & wxLIST_STATE_FOCUSED) && (line == m_current)) return ret; - if ((state & wxLIST_STATE_SELECTED) && (line->IsHilighted())) return ret; - if (!state) return ret; + if ((state & wxLIST_STATE_FOCUSED) && (line == m_current)) + return ret; + if ((state & wxLIST_STATE_SELECTED) && (line->IsHilighted())) + return ret; + if (!state) + return ret; ret++; + node = node->Next(); } + return -1; } @@ -2365,7 +2403,7 @@ void wxListMainWindow::DeleteColumn( int col ) if (node) m_columns.DeleteNode( node ); } -void wxListMainWindow::DeleteAllItems( void ) +void wxListMainWindow::DeleteAllItems() { m_dirty = TRUE; m_current = (wxListLineData *) NULL; @@ -2373,34 +2411,18 @@ void wxListMainWindow::DeleteAllItems( void ) // to make the deletion of all items faster, we don't send the // notifications in this case: this is compatible with wxMSW and // documented in DeleteAllItems() description -#if 0 - wxNode *node = m_lines.First(); - while (node) - { - wxListLineData *line = (wxListLineData*)node->Data(); - - DeleteLine( line ); - node = node->Next(); - } -#endif // 0 + wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS, GetParent()->GetId() ); + event.SetEventObject( GetParent() ); + GetParent()->GetEventHandler()->ProcessEvent( event ); m_lines.Clear(); } -void wxListMainWindow::DeleteEverything( void ) +void wxListMainWindow::DeleteEverything() { - m_dirty = TRUE; - m_current = (wxListLineData *) NULL; - wxNode *node = m_lines.First(); - while (node) - { - wxListLineData *line = (wxListLineData*)node->Data(); - DeleteLine( line ); - node = node->Next(); - } - m_lines.Clear(); - m_current = (wxListLineData *) NULL; + DeleteAllItems(); + m_columns.Clear(); } @@ -2546,6 +2568,7 @@ void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data ) list_ctrl_compare_func_2 = fn; list_ctrl_compare_data = data; m_lines.Sort( list_ctrl_compare_func_1 ); + m_dirty = TRUE; } void wxListMainWindow::OnScroll(wxScrollWinEvent& event) @@ -2710,11 +2733,17 @@ bool wxListCtrl::Create(wxWindow *parent, m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style ); if (HasFlag(wxLC_REPORT)) + { m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL ); + if (HasFlag(wxLC_NO_HEADER)) + m_headerWin->Show( FALSE ); + } else + { m_headerWin = (wxListHeaderWindow *) NULL; + } - SetBackgroundColour( *wxWHITE ); + SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) ); return ret; }