From: Robert Roebling Date: Fri, 11 Dec 1998 19:28:38 +0000 (+0000) Subject: Redid parts of wxScroledWindow X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/139adb6a281e8c1a94519e24a1e7be319b50155e Redid parts of wxScroledWindow Corrected scrollling (speed) in wxListCtrl git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1175 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 98cedb189b..7b63d0044a 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -415,114 +415,118 @@ void wxListLineData::SetColumnPosition( int index, int x ) void wxListLineData::GetSize( int &width, int &height ) { - width = m_bound_all.width; - height = m_bound_all.height; + width = m_bound_all.width; + height = m_bound_all.height; } void wxListLineData::GetExtent( int &x, int &y, int &width, int &height ) { - x = m_bound_all.x; - y = m_bound_all.y; - width = m_bound_all.width; - height = m_bound_all.height; + x = m_bound_all.x; + y = m_bound_all.y; + width = m_bound_all.width; + height = m_bound_all.height; } void wxListLineData::GetLabelExtent( int &x, int &y, int &width, int &height ) { - x = m_bound_label.x; - y = m_bound_label.y; - width = m_bound_label.width; - height = m_bound_label.height; + x = m_bound_label.x; + y = m_bound_label.y; + width = m_bound_label.width; + height = m_bound_label.height; } void wxListLineData::GetRect( wxRectangle &rect ) { - AssignRect( rect, m_bound_all ); + AssignRect( rect, m_bound_all ); } long wxListLineData::IsHit( int x, int y ) { - wxNode *node = m_items.First(); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - if (item->HasImage() && IsInRect( x, y, m_bound_icon )) return wxLIST_HITTEST_ONITEMICON; - if (item->HasText() && IsInRect( x, y, m_bound_label )) return wxLIST_HITTEST_ONITEMLABEL; -// if (!(item->HasImage() || item->HasText())) return 0; - } - // if there is no icon or text = empty - if (IsInRect( x, y, m_bound_all )) return wxLIST_HITTEST_ONITEMICON; - return 0; + wxNode *node = m_items.First(); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + if (item->HasImage() && IsInRect( x, y, m_bound_icon )) return wxLIST_HITTEST_ONITEMICON; + if (item->HasText() && IsInRect( x, y, m_bound_label )) return wxLIST_HITTEST_ONITEMLABEL; +// if (!(item->HasImage() || item->HasText())) return 0; + } + // if there is no icon or text = empty + if (IsInRect( x, y, m_bound_all )) return wxLIST_HITTEST_ONITEMICON; + return 0; } void wxListLineData::InitItems( int num ) { - for (int i = 0; i < num; i++) m_items.Append( new wxListItemData() ); + for (int i = 0; i < num; i++) m_items.Append( new wxListItemData() ); } void wxListLineData::SetItem( int index, const wxListItem &info ) { - wxNode *node = m_items.Nth( index ); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - item->SetItem( info ); - } + wxNode *node = m_items.Nth( index ); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + item->SetItem( info ); + } } void wxListLineData::GetItem( int const index, wxListItem &info ) { - int i = index; - wxNode *node = m_items.Nth( i ); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - item->GetItem( info ); - } + int i = index; + wxNode *node = m_items.Nth( i ); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + item->GetItem( info ); + } } void wxListLineData::GetText( int index, wxString &s ) { - int i = index; - wxNode *node = m_items.Nth( i ); - s = ""; - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - item->GetText( s ); - } + int i = index; + wxNode *node = m_items.Nth( i ); + s = ""; + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + item->GetText( s ); + } } void wxListLineData::SetText( int index, const wxString s ) { - int i = index; - wxNode *node = m_items.Nth( i ); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - item->SetText( s ); - } + int i = index; + wxNode *node = m_items.Nth( i ); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + item->SetText( s ); + } } int wxListLineData::GetImage( int index ) { - int i = index; - wxNode *node = m_items.Nth( i ); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - return item->GetImage(); - } - return -1; + int i = index; + wxNode *node = m_items.Nth( i ); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + return item->GetImage(); + } + return -1; } void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG ) { - long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 ); - long dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 ); - long dev_w = dc->LogicalToDeviceXRel( m_bound_all.width+4 ); - long dev_h = dc->LogicalToDeviceYRel( m_bound_all.height+4 ); - if (!m_owner->IsExposed( dev_x, dev_y, dev_w, dev_h ) ) return; + long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 ); + long dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 ); + long dev_w = dc->LogicalToDeviceXRel( m_bound_all.width+4 ); + long dev_h = dc->LogicalToDeviceYRel( m_bound_all.height+4 ); + + if (!m_owner->IsExposed( dev_x, dev_y, dev_w, dev_h )) + { + return; + } if (paintBG) { @@ -932,25 +936,25 @@ END_EVENT_TABLE() wxListMainWindow::wxListMainWindow( void ) { - m_mode = 0; - m_lines.DeleteContents( TRUE ); - m_columns.DeleteContents( TRUE ); - m_current = (wxListLineData *) NULL; - m_visibleLines = 0; - m_hilightBrush = (wxBrush *) NULL; - m_xScroll = 0; - m_yScroll = 0; - m_dirty = TRUE; - m_small_image_list = (wxImageList *) NULL; - m_normal_image_list = (wxImageList *) NULL; - m_small_spacing = 30; - m_normal_spacing = 40; - m_hasFocus = FALSE; - m_usedKeys = TRUE; - m_lastOnSame = FALSE; - m_renameTimer = new wxListRenameTimer( this ); - m_isCreated = FALSE; - m_dragCount = 0; + m_mode = 0; + m_lines.DeleteContents( TRUE ); + m_columns.DeleteContents( TRUE ); + m_current = (wxListLineData *) NULL; + m_visibleLines = 0; + m_hilightBrush = (wxBrush *) NULL; + m_xScroll = 0; + m_yScroll = 0; + m_dirty = TRUE; + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; + m_small_spacing = 30; + m_normal_spacing = 40; + m_hasFocus = FALSE; + m_usedKeys = TRUE; + m_lastOnSame = FALSE; + m_renameTimer = new wxListRenameTimer( this ); + m_isCreated = FALSE; + m_dragCount = 0; } wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, @@ -958,119 +962,141 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent, wxWindowID id, long style, const wxString &name ) : wxScrolledWindow( parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name ) { - m_mode = style; - m_lines.DeleteContents( TRUE ); - m_columns.DeleteContents( TRUE ); - m_current = (wxListLineData *) NULL; - m_dirty = TRUE; - m_visibleLines = 0; - m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); - m_small_image_list = (wxImageList *) NULL; - m_normal_image_list = (wxImageList *) NULL; - m_small_spacing = 30; - m_normal_spacing = 40; -// AllowDoubleClick( TRUE ); - m_hasFocus = FALSE; - m_dragCount = 0; - m_isCreated = FALSE; - wxSize sz = size; - sz.y = 25; + m_mode = style; + m_lines.DeleteContents( TRUE ); + m_columns.DeleteContents( TRUE ); + m_current = (wxListLineData *) NULL; + m_dirty = TRUE; + m_visibleLines = 0; + m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); + m_small_image_list = (wxImageList *) NULL; + m_normal_image_list = (wxImageList *) NULL; + m_small_spacing = 30; + m_normal_spacing = 40; + m_hasFocus = FALSE; + m_dragCount = 0; + m_isCreated = FALSE; + wxSize sz = size; + sz.y = 25; - if (m_mode & wxLC_REPORT) - { - m_xScroll = 0; - m_yScroll = 15; - } - else - { - m_xScroll = 15; - m_yScroll = 0; - } - SetScrollbars( m_xScroll, m_yScroll, 0, 0, 0, 0 ); + if (m_mode & wxLC_REPORT) + { + m_xScroll = 0; + m_yScroll = 15; + } + else + { + m_xScroll = 15; + m_yScroll = 0; + } + SetScrollbars( m_xScroll, m_yScroll, 0, 0, 0, 0 ); - m_usedKeys = TRUE; - m_lastOnSame = FALSE; - m_renameTimer = new wxListRenameTimer( this ); - m_renameAccept = FALSE; -// m_text = new wxRawListTextCtrl( GetParent(), "", &m_renameAccept, &m_renameRes, this, 10, 10, 40, 10 ); -// m_text->Show( FALSE ); + m_usedKeys = TRUE; + m_lastOnSame = FALSE; + m_renameTimer = new wxListRenameTimer( this ); + m_renameAccept = FALSE; - SetBackgroundColour( *wxWHITE ); + SetBackgroundColour( *wxWHITE ); } wxListMainWindow::~wxListMainWindow( void ) { - if (m_hilightBrush) delete m_hilightBrush; - delete m_renameTimer; -// if (m_hilightColour) delete m_hilightColour; -// delete m_text; + if (m_hilightBrush) delete m_hilightBrush; + + delete m_renameTimer; } void wxListMainWindow::RefreshLine( wxListLineData *line ) { - int x = 0; - int y = 0; - int w = 0; - int h = 0; - if (line) - { - wxClientDC dc(this); - PrepareDC( dc ); - line->GetExtent( x, y, w, h ); - wxRectangle rect( - dc.LogicalToDeviceX(x-3), - dc.LogicalToDeviceY(y-3), - dc.LogicalToDeviceXRel(w+6), - dc.LogicalToDeviceXRel(h+6) ); - Refresh( TRUE, &rect ); - } + int x = 0; + int y = 0; + int w = 0; + int h = 0; + if (line) + { + wxClientDC dc(this); + PrepareDC( dc ); + line->GetExtent( x, y, w, h ); + wxRectangle rect( + dc.LogicalToDeviceX(x-3), + dc.LogicalToDeviceY(y-3), + dc.LogicalToDeviceXRel(w+6), + dc.LogicalToDeviceXRel(h+6) ); + Refresh( TRUE, &rect ); + } } void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { - if (m_dirty) return; - - wxPaintDC dc( this ); - PrepareDC( dc ); + if (m_dirty) return; + + if (m_lines.GetCount() == 0) return; - dc.BeginDrawing(); + wxPaintDC dc( this ); + PrepareDC( dc ); - dc.SetFont( GetFont() ); + dc.BeginDrawing(); - wxNode *node = m_lines.First(); - while (node) - { - wxListLineData *line = (wxListLineData*)node->Data(); - line->Draw( &dc ); - node = node->Next(); - } - if (m_current) m_current->DrawRubberBand( &dc, m_hasFocus ); + dc.SetFont( GetFont() ); + + if (m_mode & wxLC_REPORT) + { + int lineSpacing = 0; + wxListLineData *line = (wxListLineData*)m_lines.First()->Data(); + int dummy = 0; + line->GetSize( dummy, lineSpacing ); + lineSpacing += 1; + + int y_s = m_yScroll*GetScrollPos( wxVERTICAL ); + + wxNode *node = m_lines.Nth( y_s / lineSpacing ); + for (int i = 0; i < m_visibleLines+2; i++) + { + if (!node) break; + + line = (wxListLineData*)node->Data(); + line->Draw( &dc ); + node = node->Next(); + } + } + else + { + wxNode *node = m_lines.First(); + while (node) + { + wxListLineData *line = (wxListLineData*)node->Data(); + line->Draw( &dc ); + node = node->Next(); + } + } + + if (m_current) m_current->DrawRubberBand( &dc, m_hasFocus ); - dc.EndDrawing(); + dc.EndDrawing(); } void wxListMainWindow::HilightAll( bool on ) { - wxNode *node = m_lines.First(); - while (node) - { - wxListLineData *line = (wxListLineData *)node->Data(); - if (line->IsHilighted() != on) + wxNode *node = m_lines.First(); + while (node) { - line->Hilight( on ); - RefreshLine( line ); + wxListLineData *line = (wxListLineData *)node->Data(); + if (line->IsHilighted() != on) + { + line->Hilight( on ); + RefreshLine( line ); + } + node = node->Next(); } - node = node->Next(); - } } void wxListMainWindow::SendNotify( wxListLineData *line, wxEventType command ) { - wxListEvent le( command, GetParent()->GetId() ); - le.SetEventObject( GetParent() ); - le.m_itemIndex = GetIndexOfLine( line ); - line->GetItem( 0, le.m_item ); - GetParent()->GetEventHandler()->ProcessEvent( le ); + wxListEvent le( command, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = GetIndexOfLine( line ); + line->GetItem( 0, le.m_item ); + GetParent()->GetEventHandler()->ProcessEvent( le ); } void wxListMainWindow::FocusLine( wxListLineData *WXUNUSED(line) ) @@ -1085,32 +1111,32 @@ void wxListMainWindow::UnfocusLine( wxListLineData *WXUNUSED(line) ) void wxListMainWindow::SelectLine( wxListLineData *line ) { - SendNotify( line, wxEVT_COMMAND_LIST_ITEM_SELECTED ); + SendNotify( line, wxEVT_COMMAND_LIST_ITEM_SELECTED ); } void wxListMainWindow::DeselectLine( wxListLineData *line ) { - SendNotify( line, wxEVT_COMMAND_LIST_ITEM_DESELECTED ); + SendNotify( line, wxEVT_COMMAND_LIST_ITEM_DESELECTED ); } void wxListMainWindow::DeleteLine( wxListLineData *line ) { - SendNotify( line, wxEVT_COMMAND_LIST_DELETE_ITEM ); + SendNotify( line, wxEVT_COMMAND_LIST_DELETE_ITEM ); } void wxListMainWindow::StartLabelEdit( wxListLineData *line ) { - SendNotify( line, wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT ); + SendNotify( line, wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT ); } void wxListMainWindow::RenameLine( wxListLineData *line, const wxString &newName ) { - wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); - le.SetEventObject( GetParent() ); - le.m_itemIndex = GetIndexOfLine( line ); - line->GetItem( 0, le.m_item ); - le.m_item.m_text = newName; - GetParent()->GetEventHandler()->ProcessEvent( le ); + wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() ); + le.SetEventObject( GetParent() ); + le.m_itemIndex = GetIndexOfLine( line ); + line->GetItem( 0, le.m_item ); + le.m_item.m_text = newName; + GetParent()->GetEventHandler()->ProcessEvent( le ); } void wxListMainWindow::OnRenameTimer() @@ -1307,26 +1333,24 @@ void wxListMainWindow::MoveToFocus( void ) int w = 0; int h = 0; m_current->GetExtent( x, y, w, h ); + int w_p = 0; int h_p = 0; GetClientSize( &w_p, &h_p ); + if (m_mode & wxLC_REPORT) { - if (GetScrollPos( wxHORIZONTAL ) != 0) SetScrollPos( wxHORIZONTAL, 0); int y_s = m_yScroll*GetScrollPos( wxVERTICAL ); if ((y > y_s) && (y+h < y_s+h_p)) return; - if (y-y_s < 5) SetScrollPos( wxVERTICAL, (y-5-h_p/2)/m_yScroll ); - if (y+h+5 > y_s+h_p) SetScrollPos( wxVERTICAL, (y+h-h_p/2+h+15)/m_yScroll ); - m_dirty = TRUE; + 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 ); } else { - if (GetScrollPos( wxVERTICAL ) != 0) SetScrollPos( wxVERTICAL, 0); int x_s = m_xScroll*GetScrollPos( wxHORIZONTAL ); if ((x > x_s) && (x+w < x_s+w_p)) return; - if (x-x_s < 5) SetScrollPos( wxHORIZONTAL, (x-5)/m_xScroll ); - if (x+w-5 > x_s+w_p) SetScrollPos( wxHORIZONTAL, (x+w-w_p+15)/m_xScroll ); - m_dirty = TRUE; + 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 ); } } @@ -1545,49 +1569,49 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height ) int wxListMainWindow::GetTextLength( wxString &s ) { - wxPaintDC dc( this ); - long lw = 0; - long lh = 0; - dc.GetTextExtent( s, &lw, &lh ); - return lw + 6; + wxPaintDC dc( this ); + long lw = 0; + long lh = 0; + dc.GetTextExtent( s, &lw, &lh ); + return lw + 6; } int wxListMainWindow::GetIndexOfLine( const wxListLineData *line ) { - int i = 0; - wxNode *node = m_lines.First(); - while (node) - { - if (line == (wxListLineData*)node->Data()) return i; - i++; - node = node->Next(); - } - return -1; + int i = 0; + wxNode *node = m_lines.First(); + while (node) + { + if (line == (wxListLineData*)node->Data()) return i; + i++; + node = node->Next(); + } + return -1; } void wxListMainWindow::SetImageList( wxImageList *imageList, int which ) { - m_dirty = TRUE; - if (which == wxIMAGE_LIST_NORMAL) m_normal_image_list = imageList; - if (which == wxIMAGE_LIST_SMALL) m_small_image_list = imageList; + m_dirty = TRUE; + if (which == wxIMAGE_LIST_NORMAL) m_normal_image_list = imageList; + if (which == wxIMAGE_LIST_SMALL) m_small_image_list = imageList; } void wxListMainWindow::SetItemSpacing( int spacing, bool isSmall ) { - m_dirty = TRUE; - if (isSmall) - { - m_small_spacing = spacing; - } - else - { - m_normal_spacing = spacing; - } + m_dirty = TRUE; + if (isSmall) + { + m_small_spacing = spacing; + } + else + { + m_normal_spacing = spacing; + } } int wxListMainWindow::GetItemSpacing( bool isSmall ) { - if (isSmall) return m_small_spacing; else return m_normal_spacing; + if (isSmall) return m_small_spacing; else return m_normal_spacing; } void wxListMainWindow::SetColumn( int col, wxListItem &item ) @@ -1727,8 +1751,11 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask ) RefreshLine( oldCurrent ); } bool on = state & wxLIST_STATE_SELECTED; - line->Hilight( on ); - RefreshLine( line ); + if (on != line->IsHilighted()) + { + line->Hilight( on ); + RefreshLine( line ); + } } } } @@ -1904,7 +1931,7 @@ void wxListMainWindow::CalculatePositions( void ) y += lineSpacing; // one pixel blank line between items node = node->Next(); } - m_visibleLines = m_lines.GetCount(); + m_visibleLines = clientHeight / lineSpacing; } else { diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp index 7468a3194c..4b99809f81 100644 --- a/src/generic/scrolwin.cpp +++ b/src/generic/scrolwin.cpp @@ -32,9 +32,9 @@ #if !USE_SHARED_LIBRARY BEGIN_EVENT_TABLE(wxScrolledWindow, wxWindow) - EVT_SCROLL(wxScrolledWindow::OnScroll) - EVT_SIZE(wxScrolledWindow::OnSize) - EVT_PAINT(wxScrolledWindow::OnPaint) + EVT_SCROLL(wxScrolledWindow::OnScroll) + EVT_SIZE(wxScrolledWindow::OnSize) + EVT_PAINT(wxScrolledWindow::OnPaint) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow) @@ -42,18 +42,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow) wxScrolledWindow::wxScrolledWindow(void) { - m_xScrollPixelsPerLine = 0; - m_yScrollPixelsPerLine = 0; - m_xScrollingEnabled = TRUE; - m_yScrollingEnabled = TRUE; - m_xScrollPosition = 0; - m_yScrollPosition = 0; - m_xScrollLines = 0; - m_yScrollLines = 0; - m_xScrollLinesPerPage = 0; - m_yScrollLinesPerPage = 0; - m_scaleX = 1.0; - m_scaleY = 1.0; + m_xScrollPixelsPerLine = 0; + m_yScrollPixelsPerLine = 0; + m_xScrollingEnabled = TRUE; + m_yScrollingEnabled = TRUE; + m_xScrollPosition = 0; + m_yScrollPosition = 0; + m_xScrollLines = 0; + m_yScrollLines = 0; + m_xScrollLinesPerPage = 0; + m_yScrollLinesPerPage = 0; + m_scaleX = 1.0; + m_scaleY = 1.0; } bool wxScrolledWindow::Create(wxWindow *parent, wxWindowID id, @@ -62,20 +62,20 @@ bool wxScrolledWindow::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { - m_xScrollPixelsPerLine = 0; - m_yScrollPixelsPerLine = 0; - m_xScrollingEnabled = TRUE; - m_yScrollingEnabled = TRUE; - m_xScrollPosition = 0; - m_yScrollPosition = 0; - m_xScrollLines = 0; - m_yScrollLines = 0; - m_xScrollLinesPerPage = 0; - m_yScrollLinesPerPage = 0; - m_scaleX = 1.0; - m_scaleY = 1.0; - - return wxWindow::Create(parent, id, pos, size, style, name); + m_xScrollPixelsPerLine = 0; + m_yScrollPixelsPerLine = 0; + m_xScrollingEnabled = TRUE; + m_yScrollingEnabled = TRUE; + m_xScrollPosition = 0; + m_yScrollPosition = 0; + m_xScrollLines = 0; + m_yScrollLines = 0; + m_xScrollLinesPerPage = 0; + m_yScrollLinesPerPage = 0; + m_scaleX = 1.0; + m_scaleY = 1.0; + + return wxWindow::Create(parent, id, pos, size, style, name); } /* @@ -86,8 +86,8 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, int noUnitsY, int xPos, int yPos, bool noRefresh ) { - bool do_refresh = - ( + bool do_refresh = + ( (noUnitsX != 0 && m_xScrollLines == 0) || (noUnitsX < m_xScrollPosition) || (noUnitsY != 0 && m_yScrollLines == 0) || @@ -96,16 +96,16 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, (yPos != m_yScrollPosition) || (pixelsPerUnitX != m_xScrollPixelsPerLine) || (pixelsPerUnitY != m_yScrollPixelsPerLine) - ); + ); - m_xScrollPixelsPerLine = pixelsPerUnitX; - m_yScrollPixelsPerLine = pixelsPerUnitY; - m_xScrollPosition = xPos; - m_yScrollPosition = yPos; - m_xScrollLines = noUnitsX; - m_yScrollLines = noUnitsY; + m_xScrollPixelsPerLine = pixelsPerUnitX; + m_yScrollPixelsPerLine = pixelsPerUnitY; + m_xScrollPosition = xPos; + m_yScrollPosition = yPos; + m_xScrollLines = noUnitsX; + m_yScrollLines = noUnitsY; - AdjustScrollbars(); + AdjustScrollbars(); if (do_refresh && !noRefresh) Refresh(); @@ -116,23 +116,22 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, void wxScrolledWindow::OnScroll(wxScrollEvent& event) { - int orient = event.GetOrientation(); + int orient = event.GetOrientation(); - int nScrollInc = CalcScrollInc(event); - if (nScrollInc == 0) - return; + int nScrollInc = CalcScrollInc(event); + if (nScrollInc == 0) return; // TODO: should we store the scroll position here as well as in wxWindow? - if (orient == wxHORIZONTAL) - { - int newPos = m_xScrollPosition + nScrollInc; - SetScrollPos(wxHORIZONTAL, newPos, TRUE ); - } - else - { - int newPos = m_yScrollPosition + nScrollInc; - SetScrollPos(wxVERTICAL, newPos, TRUE ); - } + if (orient == wxHORIZONTAL) + { + int newPos = m_xScrollPosition + nScrollInc; + SetScrollPos(wxHORIZONTAL, newPos, TRUE ); + } + else + { + int newPos = m_yScrollPosition + nScrollInc; + SetScrollPos(wxVERTICAL, newPos, TRUE ); + } /* // TODO We need to multiply the ScrollWindow amount by the scaling @@ -147,30 +146,29 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event) } */ - if (orient == wxHORIZONTAL) - { - m_xScrollPosition += nScrollInc; - } - else - { - m_yScrollPosition += nScrollInc; - } - - if (orient == wxHORIZONTAL) - { - if (m_xScrollingEnabled) - ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL); + if (orient == wxHORIZONTAL) + { + m_xScrollPosition += nScrollInc; + } else - Refresh(); - } - else - { - if (m_yScrollingEnabled) - ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL); + { + m_yScrollPosition += nScrollInc; + } + + if (orient == wxHORIZONTAL) + { + if (m_xScrollingEnabled) + ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL); + else + Refresh(); + } else - Refresh(); + { + if (m_yScrollingEnabled) + ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL); + else + Refresh(); } - } int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) @@ -281,88 +279,79 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event) // Adjust the scrollbars - new version. void wxScrolledWindow::AdjustScrollbars(void) { - int w, h; - GetClientSize(&w, &h); - - // Recalculate scroll bar range and position - if (m_xScrollLines > 0) - { - int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine; - int newRange = (int) ( ((nMaxWidth)/(float)m_xScrollPixelsPerLine) + 0.5 ); - if (newRange < 0) - newRange = 0; - - m_xScrollPosition = wxMin(newRange, m_xScrollPosition); + int w, h; + GetClientSize(&w, &h); + if (m_xScrollLines > 0) + { // Calculate page size i.e. number of scroll units you get on the // current client window - int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 ); - if (noPagePositions < 1) - noPagePositions = 1; + int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 ); + if (noPagePositions < 1) noPagePositions = 1; - SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, newRange); - SetScrollPageSize(wxHORIZONTAL, noPagePositions); - } - // Robert Roebling - else - { - m_xScrollPosition = 0; - SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE); - } - - if (m_yScrollLines > 0) - { - int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine; - int newRange = (int) ( ((nMaxHeight)/(float)m_yScrollPixelsPerLine) + 0.5 ); - if (newRange < 0) - newRange = 0; - - m_yScrollPosition = wxMin(newRange, m_yScrollPosition); + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition); + m_xScrollPosition = wxMax( 0, m_xScrollPosition ); + SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines); +// SetScrollPageSize(wxHORIZONTAL, noPagePositions); + } + else + { + m_xScrollPosition = 0; + SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE); + } + + if (m_yScrollLines > 0) + { // Calculate page size i.e. number of scroll units you get on the // current client window - int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 ); - if (noPagePositions < 1) - noPagePositions = 1; + int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 ); + if (noPagePositions < 1) noPagePositions = 1; - SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, newRange); - SetScrollPageSize(wxVERTICAL, noPagePositions); - } - else - { - m_yScrollPosition = 0; - SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); // Robert Roebling - } - + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition ); + m_yScrollPosition = wxMax( 0, m_yScrollPosition ); + + SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines); +// SetScrollPageSize(wxVERTICAL, noPagePositions); + } + else + { + m_yScrollPosition = 0; + SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE); + } } // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { #if wxUSE_CONSTRAINTS - if (GetAutoLayout()) - Layout(); + if (GetAutoLayout()) Layout(); #endif - AdjustScrollbars(); + AdjustScrollbars(); } // This calls OnDraw, having adjusted the origin according to the current // scroll position void wxScrolledWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { - wxPaintDC dc(this); - PrepareDC(dc); + wxPaintDC dc(this); + PrepareDC(dc); - OnDraw(dc); + OnDraw(dc); } // Override this function if you don't want to have wxScrolledWindow // automatically change the origin according to the scroll position. void wxScrolledWindow::PrepareDC(wxDC& dc) { - dc.SetDeviceOrigin(- m_xScrollPosition * m_xScrollPixelsPerLine, - m_yScrollPosition * m_yScrollPixelsPerLine); - dc.SetUserScale(m_scaleX, m_scaleY); + dc.SetDeviceOrigin( -m_xScrollPosition * m_xScrollPixelsPerLine, + -m_yScrollPosition * m_yScrollPixelsPerLine ); + dc.SetUserScale( m_scaleX, m_scaleY ); } #if WXWIN_COMPATIBILITY @@ -398,58 +387,83 @@ void wxScrolledWindow::SetScrollPageSize(int orient, int pageSize) /* * Scroll to given position (scroll position, not pixel position) */ -void wxScrolledWindow::Scroll (int x_pos, int y_pos) +void wxScrolledWindow::Scroll( int x_pos, int y_pos ) { - int old_x, old_y; - ViewStart (&old_x, &old_y); - if (((x_pos == -1) || (x_pos == old_x)) && ((y_pos == -1) || (y_pos == old_y))) - return; + if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && + ((y_pos == -1) || (y_pos == m_yScrollPosition))) return; + + int w, h; + GetClientSize(&w, &h); - if (x_pos > -1) + if (x_pos != -1) { - m_xScrollPosition = x_pos; - SetScrollPos (wxHORIZONTAL, x_pos, TRUE); + m_xScrollPosition = x_pos; + + // Calculate page size i.e. number of scroll units you get on the + // current client window + int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 ); + if (noPagePositions < 1) noPagePositions = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition ); + m_xScrollPosition = wxMax( 0, m_xScrollPosition ); + + SetScrollPos( wxHORIZONTAL, m_xScrollPosition, TRUE ); } - if (y_pos > -1) + if (y_pos != -1) { - m_yScrollPosition = y_pos; - SetScrollPos (wxVERTICAL, y_pos, TRUE); + m_yScrollPosition = y_pos; + + // Calculate page size i.e. number of scroll units you get on the + // current client window + int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 ); + if (noPagePositions < 1) noPagePositions = 1; + + // Correct position if greater than extent of canvas minus + // the visible portion of it or if below zero + m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition ); + m_yScrollPosition = wxMax( 0, m_yScrollPosition ); + + SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE ); } - Refresh(); + + Refresh(); + #ifdef __WXMSW__ - ::UpdateWindow ((HWND) GetHWND()); + ::UpdateWindow ((HWND) GetHWND()); #endif } void wxScrolledWindow::EnableScrolling (bool x_scroll, bool y_scroll) { - m_xScrollingEnabled = x_scroll; - m_yScrollingEnabled = y_scroll; + m_xScrollingEnabled = x_scroll; + m_yScrollingEnabled = y_scroll; } void wxScrolledWindow::GetVirtualSize (int *x, int *y) const { - *x = m_xScrollPixelsPerLine * m_xScrollLines; - *y = m_yScrollPixelsPerLine * m_yScrollLines; + *x = m_xScrollPixelsPerLine * m_xScrollLines; + *y = m_yScrollPixelsPerLine * m_yScrollLines; } // Where the current view starts from void wxScrolledWindow::ViewStart (int *x, int *y) const { - *x = m_xScrollPosition; - *y = m_yScrollPosition; + *x = m_xScrollPosition; + *y = m_yScrollPosition; } void wxScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const { - *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; - *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; + *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; + *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; } void wxScrolledWindow::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const { - *xx = (float)(x + m_xScrollPosition * m_xScrollPixelsPerLine); - *yy = (float)(y + m_yScrollPosition * m_yScrollPixelsPerLine); + *xx = (float)(x + m_xScrollPosition * m_xScrollPixelsPerLine); + *yy = (float)(y + m_yScrollPosition * m_yScrollPixelsPerLine); } diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 13c4c1d7b5..a8d974d210 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -2001,48 +2001,43 @@ void wxWindow::SetCursor( const wxCursor &cursor ) void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_RET( (m_widget != NULL), "invalid window" ); - if (eraseBackground && m_wxwindow && m_wxwindow->window) - { - if (rect) - gdk_window_clear_area( m_wxwindow->window, - rect->x, - rect->y, - rect->width, - rect->height ); - else - Clear(); - } - if (!rect) - { - if (m_wxwindow) + if (eraseBackground && m_wxwindow && m_wxwindow->window) { - int w = 0; - int h = 0; - GetClientSize( &w, &h ); - - GdkRectangle gdk_rect; - gdk_rect.x = 0; - gdk_rect.y = 0; - gdk_rect.width = w; - gdk_rect.height = h; - gtk_widget_draw( m_wxwindow, &gdk_rect ); + if (rect) + { + gdk_window_clear_area( m_wxwindow->window, + rect->x, rect->y, + rect->width, + rect->height ); + } + else + { + Clear(); + } + } + + if (!rect) + { + if (m_wxwindow) + gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL ); + else + gtk_widget_draw( m_widget, (GdkRectangle*) NULL ); } - } - else - { - GdkRectangle gdk_rect; - gdk_rect.x = rect->x; - gdk_rect.y = rect->y; - gdk_rect.width = rect->width; - gdk_rect.height = rect->height; - - if (m_wxwindow) - gtk_widget_draw( m_wxwindow, &gdk_rect ); else - gtk_widget_draw( m_widget, &gdk_rect ); - } + { + GdkRectangle gdk_rect; + gdk_rect.x = rect->x; + gdk_rect.y = rect->y; + gdk_rect.width = rect->width; + gdk_rect.height = rect->height; + + if (m_wxwindow) + gtk_widget_draw( m_wxwindow, &gdk_rect ); + else + gtk_widget_draw( m_widget, &gdk_rect ); + } } wxRegion wxWindow::GetUpdateRegion() const diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 13c4c1d7b5..a8d974d210 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -2001,48 +2001,43 @@ void wxWindow::SetCursor( const wxCursor &cursor ) void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_RET( (m_widget != NULL), "invalid window" ); - if (eraseBackground && m_wxwindow && m_wxwindow->window) - { - if (rect) - gdk_window_clear_area( m_wxwindow->window, - rect->x, - rect->y, - rect->width, - rect->height ); - else - Clear(); - } - if (!rect) - { - if (m_wxwindow) + if (eraseBackground && m_wxwindow && m_wxwindow->window) { - int w = 0; - int h = 0; - GetClientSize( &w, &h ); - - GdkRectangle gdk_rect; - gdk_rect.x = 0; - gdk_rect.y = 0; - gdk_rect.width = w; - gdk_rect.height = h; - gtk_widget_draw( m_wxwindow, &gdk_rect ); + if (rect) + { + gdk_window_clear_area( m_wxwindow->window, + rect->x, rect->y, + rect->width, + rect->height ); + } + else + { + Clear(); + } + } + + if (!rect) + { + if (m_wxwindow) + gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL ); + else + gtk_widget_draw( m_widget, (GdkRectangle*) NULL ); } - } - else - { - GdkRectangle gdk_rect; - gdk_rect.x = rect->x; - gdk_rect.y = rect->y; - gdk_rect.width = rect->width; - gdk_rect.height = rect->height; - - if (m_wxwindow) - gtk_widget_draw( m_wxwindow, &gdk_rect ); else - gtk_widget_draw( m_widget, &gdk_rect ); - } + { + GdkRectangle gdk_rect; + gdk_rect.x = rect->x; + gdk_rect.y = rect->y; + gdk_rect.width = rect->width; + gdk_rect.height = rect->height; + + if (m_wxwindow) + gtk_widget_draw( m_wxwindow, &gdk_rect ); + else + gtk_widget_draw( m_widget, &gdk_rect ); + } } wxRegion wxWindow::GetUpdateRegion() const