X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fc3463cc7e63df36366dc3b2503b635f9b209097..55dfa8d3eadbcad32bb7a779f10286dd49b60ce1:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 83858c0e9d..f5afd68151 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; @@ -1530,29 +1536,32 @@ void wxListMainWindow::MoveToFocus() { if (!m_current) return; - int x = 0; - int y = 0; - int w = 0; - int h = 0; - m_current->GetExtent( x, y, w, h ); + int item_x = 0; + int item_y = 0; + int item_w = 0; + int item_h = 0; + m_current->GetExtent( item_x, item_y, item_w, item_h ); - int w_p = 0; - int h_p = 0; - GetClientSize( &w_p, &h_p ); + int client_w = 0; + int client_h = 0; + GetClientSize( &client_w, &client_h ); + + int view_x = m_xScroll*GetScrollPos( wxHORIZONTAL ); + int view_y = m_yScroll*GetScrollPos( wxVERTICAL ); if (m_mode & wxLC_REPORT) { - int y_s = m_yScroll*GetScrollPos( wxVERTICAL ); - if ((y > y_s) && (y+h < y_s+h_p)) return; - if (y-y_s < 5) { Scroll( -1, (y-5-h_p/2)/m_yScroll ); } - if (y+h+5 > y_s+h_p) { Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll); } + if (item_y-5 < view_y ) + Scroll( -1, (item_y-5)/m_yScroll ); + if (item_y+item_h+5 > view_y+client_h) + Scroll( -1, (item_y+item_h-client_h+15)/m_yScroll ); } else { - int x_s = m_xScroll*GetScrollPos( wxHORIZONTAL ); - if ((x > x_s) && (x+w < x_s+w_p)) return; - if (x-x_s < 5) { Scroll( (x-5)/m_xScroll, -1 ); } - if (x+w-5 > x_s+w_p) { Scroll( (x+w-w_p+15)/m_xScroll, -1 ); } + if (item_x-view_x < 5) + Scroll( (item_x-5)/m_xScroll, -1 ); + if (item_x+item_w-5 > view_x+client_w) + Scroll( (item_x+item_w-client_w+15)/m_xScroll, -1 ); } } @@ -1561,12 +1570,12 @@ void wxListMainWindow::OnArrowChar( wxListLineData *newCurrent, bool shiftDown ) if ((m_mode & wxLC_SINGLE_SEL) || (m_usedKeys == FALSE)) m_current->Hilight( FALSE ); wxListLineData *oldCurrent = m_current; m_current = newCurrent; - MoveToFocus(); if (shiftDown || (m_mode & wxLC_SINGLE_SEL)) m_current->Hilight( TRUE ); RefreshLine( m_current ); RefreshLine( oldCurrent ); FocusLine( m_current ); UnfocusLine( oldCurrent ); + MoveToFocus(); } void wxListMainWindow::OnKeyDown( wxKeyEvent &event ) @@ -1614,8 +1623,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 */ @@ -1722,11 +1732,11 @@ void wxListMainWindow::OnChar( wxKeyEvent &event ) m_current->ReverseHilight(); wxNode *node = m_lines.Member( m_current )->Next(); if (node) m_current = (wxListLineData*)node->Data(); - MoveToFocus(); RefreshLine( oldCurrent ); RefreshLine( m_current ); UnfocusLine( oldCurrent ); FocusLine( m_current ); + MoveToFocus(); } break; } @@ -2326,7 +2336,7 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state long ret = 0; if (item > 0) ret = item; if(ret >= GetItemCount()) return -1; - wxNode *node = m_lines.Nth( (size_t)ret ); + wxNode *node = m_lines.Nth( (size_t)++ret ); while (node) { wxListLineData *line = (wxListLineData*)node->Data(); @@ -2697,11 +2707,9 @@ bool wxListCtrl::Create(wxWindow *parent, { style = style | wxLC_LIST; } - - // - // FIXME BJ: as wxControl derives from wxWindow, a validator cannot be passed as parameter - // bool ret = wxControl::Create( parent, id, pos, size, style, validator, name ); - bool ret = wxControl::Create( parent, id, pos, size, style, name ); + + bool ret = wxControl::Create( parent, id, pos, size, style, validator, name ); + if (style & wxSUNKEN_BORDER) style -= wxSUNKEN_BORDER; @@ -2709,9 +2717,15 @@ 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 );