]> git.saurik.com Git - wxWidgets.git/commitdiff
Redid parts of wxScroledWindow
authorRobert Roebling <robert@roebling.de>
Fri, 11 Dec 1998 19:28:38 +0000 (19:28 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 11 Dec 1998 19:28:38 +0000 (19:28 +0000)
  Corrected scrollling (speed) in wxListCtrl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1175 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/listctrl.cpp
src/generic/scrolwin.cpp
src/gtk/window.cpp
src/gtk1/window.cpp

index 98cedb189b45b6d29ef93d9122af8514f206ae5e..7b63d0044a49becce1e6cf0350914977a228c3d8 100644 (file)
@@ -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
     {
index 7468a3194ca0bac5aa9c5a589acaf19d85638b54..4b99809f81ba11584b9e0ebe79025c357e936d8a 100644 (file)
@@ -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);
 }
 
 
index 13c4c1d7b555521b5ef596a66c82c9ef7a269fea..a8d974d2101fba8451eeaa792dab65b9da6172c0 100644 (file)
@@ -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
index 13c4c1d7b555521b5ef596a66c82c9ef7a269fea..a8d974d2101fba8451eeaa792dab65b9da6172c0 100644 (file)
@@ -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