]>
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
);