]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk1/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_hAdjust
->value
= m_xScrollPosition
= xPos
;
54 m_win
->m_vAdjust
->value
= m_yScrollPosition
= yPos
;
56 // Setting hints here should arguably be deprecated, but without it
57 // a sizer might override this manual scrollbar setting in old code.
58 // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
60 int w
= noUnitsX
* pixelsPerUnitX
;
61 int h
= noUnitsY
* pixelsPerUnitY
;
62 m_targetWindow
->SetVirtualSize( w
? w
: wxDefaultCoord
,
63 h
? h
: wxDefaultCoord
);
67 int new_x
= m_xScrollPixelsPerLine
* m_xScrollPosition
;
68 int new_y
= m_yScrollPixelsPerLine
* m_yScrollPosition
;
70 m_targetWindow
->ScrollWindow( old_x
- new_x
, old_y
- new_y
);
73 m_targetWindow
->m_hasScrolling
= pixelsPerUnitX
|| pixelsPerUnitY
;
76 void wxScrollHelperNative::DoAdjustScrollbar(GtkAdjustment
*adj
,
84 if ( pixelsPerLine
== 0 )
87 adj
->page_increment
= 1.0;
90 else // we do have scrollbar
92 adj
->upper
= (virtSize
+ pixelsPerLine
- 1) / pixelsPerLine
;
93 adj
->page_size
= winSize
/ pixelsPerLine
;
94 adj
->page_increment
= winSize
/ pixelsPerLine
;
96 // Special case. When client and virtual size are very close but
97 // the client is big enough, kill scrollbar.
99 if ((adj
->page_size
< adj
->upper
) && (winSize
>= virtSize
))
100 adj
->page_size
+= 1.0;
102 // If the scrollbar hits the right side, move the window
103 // right to keep it from over extending.
105 if ( !wxIsNullDouble(adj
->value
) &&
106 (adj
->value
+ adj
->page_size
> adj
->upper
) )
108 adj
->value
= adj
->upper
- adj
->page_size
;
109 if (adj
->value
< 0.0)
112 if ( m_win
->GetChildren().empty() )
114 // This is enough without child windows
115 *pos
= (int)adj
->value
;
119 // We need to actually scroll window
120 gtk_signal_emit_by_name( GTK_OBJECT(adj
), "value_changed" );
125 *lines
= (int)(adj
->upper
+ 0.5);
126 *linesPerPage
= (int)(adj
->page_increment
+ 0.5);
127 gtk_signal_emit_by_name( GTK_OBJECT(adj
), "changed" );
130 void wxScrollHelperNative::AdjustScrollbars()
135 m_targetWindow
->GetClientSize( &w
, &h
);
136 m_targetWindow
->GetVirtualSize( &vw
, &vh
);
138 DoAdjustScrollbar(m_win
->m_hAdjust
, m_xScrollPixelsPerLine
, w
, vw
,
139 &m_xScrollPosition
, &m_xScrollLines
, &m_xScrollLinesPerPage
);
140 DoAdjustScrollbar(m_win
->m_vAdjust
, m_yScrollPixelsPerLine
, h
, vh
,
141 &m_yScrollPosition
, &m_yScrollLines
, &m_yScrollLinesPerPage
);
144 void wxScrollHelperNative::DoScroll(int orient
,
150 if ( pos
!= -1 && pos
!= *posOld
&& pixelsPerLine
)
152 int max
= (int)(adj
->upper
- adj
->page_size
+ 0.5);
162 int diff
= (*posOld
- pos
)*pixelsPerLine
;
163 m_targetWindow
->ScrollWindow(orient
== wxHORIZONTAL
? diff
: 0,
164 orient
== wxHORIZONTAL
? 0 : diff
);
168 m_win
->GtkUpdateScrollbar(orient
);
172 void wxScrollHelperNative::Scroll( int x_pos
, int y_pos
)
174 wxCHECK_RET( m_targetWindow
!= 0, _T("No target window") );
176 DoScroll(wxHORIZONTAL
, m_win
->m_hAdjust
, x_pos
, m_xScrollPixelsPerLine
,
178 DoScroll(wxVERTICAL
, m_win
->m_vAdjust
, y_pos
, m_yScrollPixelsPerLine
,