]>
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
[0]->adjustment
->value 
= 
  54     m_xScrollPosition 
= xPos
; 
  55     m_win
->m_scrollBar
[1]->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
, 
  91     // GtkRange won't allow upper == lower, so for disabled state use [0,1] 
  92     //   with a page size of 1. This will also clamp position to 0. 
  95     if (pixelsPerLine 
> 0 && winSize 
> 0 && winSize 
< virtSize
) 
  97         upper 
= (virtSize 
+ pixelsPerLine 
- 1) / pixelsPerLine
; 
  98         page_size 
= winSize 
/ pixelsPerLine
; 
 102     *linesPerPage 
= page_size
; 
 104     GtkAdjustment
* adj 
= range
->adjustment
; 
 105     adj
->step_increment 
= 1; 
 106     adj
->page_increment 
= 
 107     adj
->page_size 
= page_size
; 
 108     gtk_range_set_range(range
, 0, upper
); 
 111 void wxScrollHelperNative::AdjustScrollbars() 
 116     m_targetWindow
->m_hasScrolling 
= m_xScrollPixelsPerLine 
!= 0 || m_yScrollPixelsPerLine 
!= 0; 
 118     m_targetWindow
->GetClientSize( &w
, &h 
); 
 119     m_targetWindow
->GetVirtualSize( &vw
, &vh 
); 
 121     DoAdjustScrollbar(m_win
->m_scrollBar
[0], m_xScrollPixelsPerLine
, w
, vw
, 
 122                       &m_xScrollLines
, &m_xScrollLinesPerPage
); 
 123     DoAdjustScrollbar(m_win
->m_scrollBar
[1], m_yScrollPixelsPerLine
, h
, vh
, 
 124                       &m_yScrollLines
, &m_yScrollLinesPerPage
); 
 127 void wxScrollHelperNative::DoScroll(int orient
, 
 132     if ( pos 
!= -1 && pos 
!= *posOld 
&& pixelsPerLine 
) 
 134         m_win
->SetScrollPos(orient
, pos
); 
 135         pos 
= m_win
->GetScrollPos(orient
); 
 137         int diff 
= (*posOld 
- pos
)*pixelsPerLine
; 
 138         m_targetWindow
->ScrollWindow(orient 
== wxHORIZONTAL 
? diff 
: 0, 
 139                                      orient 
== wxHORIZONTAL 
? 0 : diff
); 
 145 void wxScrollHelperNative::Scroll( int x_pos
, int y_pos 
) 
 147     wxCHECK_RET( m_targetWindow 
!= 0, _T("No target window") ); 
 149     DoScroll(wxHORIZONTAL
, x_pos
, m_xScrollPixelsPerLine
, &m_xScrollPosition
); 
 150     DoScroll(wxVERTICAL
, y_pos
, m_yScrollPixelsPerLine
, &m_yScrollPosition
);