]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/scrolwin.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        gtk/scrolwin.cpp 
   3 // Purpose:     wxScrolledWindow implementation 
   4 // Author:      Robert Roebling 
   5 // Modified by: Ron Lee 
   6 //              Vadim Zeitlin: removed 90% of duplicated common code 
   9 // Copyright:   (c) Robert Roebling 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  13 // ============================================================================ 
  15 // ============================================================================ 
  17 // ---------------------------------------------------------------------------- 
  19 // ---------------------------------------------------------------------------- 
  21 // For compilers that support precompilation, includes "wx.h". 
  22 #include "wx/wxprec.h" 
  28 #include "wx/scrolwin.h" 
  29 #include "wx/gtk/private.h" 
  31 // ============================================================================ 
  33 // ============================================================================ 
  35 // ---------------------------------------------------------------------------- 
  36 // wxScrollHelper implementation 
  37 // ---------------------------------------------------------------------------- 
  39 void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX
, int pixelsPerUnitY
, 
  40                                          int noUnitsX
, int noUnitsY
, 
  45     GetViewStart(& xs
, & ys
); 
  47     int old_x 
= m_xScrollPixelsPerLine 
* xs
; 
  48     int old_y 
= m_yScrollPixelsPerLine 
* ys
; 
  50     m_xScrollPixelsPerLine 
= pixelsPerUnitX
; 
  51     m_yScrollPixelsPerLine 
= pixelsPerUnitY
; 
  53     m_win
->m_scrollBar
[wxWindow::ScrollDir_Horz
]->adjustment
->value 
= 
  54     m_xScrollPosition 
= xPos
; 
  55     m_win
->m_scrollBar
[wxWindow::ScrollDir_Vert
]->adjustment
->value 
= 
  56     m_yScrollPosition 
= yPos
; 
  58     // Setting hints here should arguably be deprecated, but without it 
  59     // a sizer might override this manual scrollbar setting in old code. 
  60     // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY ); 
  62     int w 
= noUnitsX 
* pixelsPerUnitX
; 
  63     int h 
= noUnitsY 
* pixelsPerUnitY
; 
  64     m_targetWindow
->SetVirtualSize( w 
? w 
: wxDefaultCoord
, 
  65                                     h 
? h 
: wxDefaultCoord
); 
  67     // If the target is not the same as the window with the scrollbars, 
  68     // then we need to update the scrollbars here, since they won't have 
  69     // been updated by SetVirtualSize(). 
  70     if (m_targetWindow 
!= m_win
) 
  77         int new_x 
= m_xScrollPixelsPerLine 
* m_xScrollPosition
; 
  78         int new_y 
= m_yScrollPixelsPerLine 
* m_yScrollPosition
; 
  80         m_targetWindow
->ScrollWindow( old_x 
- new_x
, old_y 
- new_y 
); 
  84 void wxScrollHelperNative::DoAdjustScrollbar(GtkRange
* range
, 
  94     if (pixelsPerLine 
> 0 && winSize 
> 0 && winSize 
< virtSize
) 
  96         upper 
= (virtSize 
+ pixelsPerLine 
- 1) / pixelsPerLine
; 
  97         page_size 
= winSize 
/ pixelsPerLine
; 
  99         *linesPerPage 
= page_size
; 
 103         // GtkRange won't allow upper == lower, so for disabled state use [0,1] 
 104         //   with a page size of 1. This will also clamp position to 0. 
 111     // ensure that the scroll position is always in valid range 
 115     GtkAdjustment
* adj 
= range
->adjustment
; 
 116     adj
->step_increment 
= 1; 
 117     adj
->page_increment 
= 
 118     adj
->page_size 
= page_size
; 
 119     gtk_range_set_range(range
, 0, upper
); 
 122 void wxScrollHelperNative::AdjustScrollbars() 
 124     // this flag indicates which window has the scrollbars 
 125     m_win
->m_hasScrolling 
= m_xScrollPixelsPerLine 
!= 0 || 
 126                                 m_yScrollPixelsPerLine 
!= 0; 
 129     m_targetWindow
->GetVirtualSize( &vw
, &vh 
); 
 132     m_targetWindow
->GetClientSize(&w
, NULL
); 
 133     DoAdjustHScrollbar(w
, vw
); 
 136     m_targetWindow
->GetClientSize(NULL
, &h
); 
 137     DoAdjustVScrollbar(h
, vh
); 
 140     m_targetWindow
->GetClientSize(&w
, NULL
); 
 143         // It is necessary to repeat the calculations in this case to avoid an 
 144         // observed infinite series of size events, involving alternating 
 145         // changes in visibility of the scrollbars. 
 146         // At this point, GTK+ has already queued a resize, which will cause 
 147         // AdjustScrollbars() to be called again. If the scrollbar visibility 
 148         // is not correct before then, yet another resize will occur, possibly 
 149         // leading to an unending series if the sizes are just right. 
 150         DoAdjustHScrollbar(w
, vw
); 
 152         m_targetWindow
->GetClientSize(NULL
, &h
); 
 153         DoAdjustVScrollbar(h
, vh
); 
 157 void wxScrollHelperNative::DoScroll(int orient
, 
 162     if ( pos 
!= -1 && pos 
!= *posOld 
&& pixelsPerLine 
) 
 164         m_win
->SetScrollPos(orient
, pos
); 
 165         pos 
= m_win
->GetScrollPos(orient
); 
 167         int diff 
= (*posOld 
- pos
)*pixelsPerLine
; 
 168         m_targetWindow
->ScrollWindow(orient 
== wxHORIZONTAL 
? diff 
: 0, 
 169                                      orient 
== wxHORIZONTAL 
? 0 : diff
); 
 175 void wxScrollHelperNative::Scroll( int x_pos
, int y_pos 
) 
 177     wxCHECK_RET( m_targetWindow 
!= 0, _T("No target window") ); 
 179     DoScroll(wxHORIZONTAL
, x_pos
, m_xScrollPixelsPerLine
, &m_xScrollPosition
); 
 180     DoScroll(wxVERTICAL
, y_pos
, m_yScrollPixelsPerLine
, &m_yScrollPosition
);