]> git.saurik.com Git - wxWidgets.git/blob - src/gtk/scrolwin.cpp
set up scrollbars correctly when we don't need them (fixes the problems reported...
[wxWidgets.git] / 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
7 // Created: 01/02/97
8 // RCS-ID: $Id$
9 // Copyright: (c) Robert Roebling
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12
13 // ============================================================================
14 // declarations
15 // ============================================================================
16
17 // ----------------------------------------------------------------------------
18 // headers
19 // ----------------------------------------------------------------------------
20
21 // For compilers that support precompilation, includes "wx.h".
22 #include "wx/wxprec.h"
23
24 #ifdef __BORLANDC__
25 #pragma hdrstop
26 #endif
27
28 #include "wx/scrolwin.h"
29 #include "wx/gtk/private.h"
30
31 // ============================================================================
32 // implementation
33 // ============================================================================
34
35 // ----------------------------------------------------------------------------
36 // wxScrollHelper implementation
37 // ----------------------------------------------------------------------------
38
39 void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
40 int noUnitsX, int noUnitsY,
41 int xPos, int yPos,
42 bool noRefresh)
43 {
44 int xs, ys;
45 GetViewStart(& xs, & ys);
46
47 int old_x = m_xScrollPixelsPerLine * xs;
48 int old_y = m_yScrollPixelsPerLine * ys;
49
50 m_xScrollPixelsPerLine = pixelsPerUnitX;
51 m_yScrollPixelsPerLine = pixelsPerUnitY;
52
53 m_win->m_hAdjust->value = m_xScrollPosition = xPos;
54 m_win->m_vAdjust->value = m_yScrollPosition = yPos;
55
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 );
59
60 int w = noUnitsX * pixelsPerUnitX;
61 int h = noUnitsY * pixelsPerUnitY;
62 m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord,
63 h ? h : wxDefaultCoord);
64
65 if (!noRefresh)
66 {
67 int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
68 int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
69
70 m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
71 }
72
73 m_targetWindow->m_hasScrolling = pixelsPerUnitX || pixelsPerUnitY;
74 }
75
76 void wxScrollHelperNative::DoAdjustScrollbar(GtkAdjustment *adj,
77 int pixelsPerLine,
78 int winSize,
79 int virtSize,
80 int *pos,
81 int *lines,
82 int *linesPerPage)
83 {
84 if ( pixelsPerLine == 0 || winSize >= virtSize )
85 {
86 adj->upper = 1.0;
87 adj->page_increment = 1.0;
88 adj->page_size = 1.0;
89 }
90 else // we do have scrollbar
91 {
92 // round because we need to show all the items
93 adj->upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine;
94
95 // truncate here as we want to show visible lines entirely
96 adj->page_size =
97 adj->page_increment = winSize / pixelsPerLine;
98
99 // If the scrollbar hits the right side, move the window
100 // right to keep it from over extending.
101 if ( !wxIsNullDouble(adj->value) &&
102 (adj->value + adj->page_size > adj->upper) )
103 {
104 adj->value = adj->upper - adj->page_size;
105 if (adj->value < 0.0)
106 adj->value = 0.0;
107
108 if ( m_win->GetChildren().empty() )
109 {
110 // This is enough without child windows
111 *pos = (int)adj->value;
112 }
113 else
114 {
115 // We need to actually scroll window
116 g_signal_emit_by_name (adj, "value_changed");
117 }
118 }
119 }
120
121 *lines = (int)(adj->upper + 0.5);
122 *linesPerPage = (int)(adj->page_increment + 0.5);
123 g_signal_emit_by_name (adj, "changed");
124 }
125
126 void wxScrollHelperNative::AdjustScrollbars()
127 {
128 int w, h;
129 int vw, vh;
130
131 m_targetWindow->GetClientSize( &w, &h );
132 m_targetWindow->GetVirtualSize( &vw, &vh );
133
134 DoAdjustScrollbar(m_win->m_hAdjust, m_xScrollPixelsPerLine, w, vw,
135 &m_xScrollPosition, &m_xScrollLines, &m_xScrollLinesPerPage);
136 DoAdjustScrollbar(m_win->m_vAdjust, m_yScrollPixelsPerLine, h, vh,
137 &m_yScrollPosition, &m_yScrollLines, &m_yScrollLinesPerPage);
138 }
139
140 void wxScrollHelperNative::DoScroll(int orient,
141 GtkAdjustment *adj,
142 int pos,
143 int pixelsPerLine,
144 int *posOld)
145 {
146 if ( pos != -1 && pos != *posOld && pixelsPerLine )
147 {
148 int max = (int)(adj->upper - adj->page_size + 0.5);
149 if (max < 0)
150 max = 0;
151 if (pos > max)
152 pos = max;
153 if (pos < 0)
154 pos = 0;
155
156 adj->value = pos;
157
158 int diff = (*posOld - pos)*pixelsPerLine;
159 m_targetWindow->ScrollWindow(orient == wxHORIZONTAL ? diff : 0,
160 orient == wxHORIZONTAL ? 0 : diff);
161
162 *posOld = pos;
163
164 m_win->GtkUpdateScrollbar(orient);
165 }
166 }
167
168 void wxScrollHelperNative::Scroll( int x_pos, int y_pos )
169 {
170 wxCHECK_RET( m_targetWindow != 0, _T("No target window") );
171
172 DoScroll(wxHORIZONTAL, m_win->m_hAdjust, x_pos, m_xScrollPixelsPerLine,
173 &m_xScrollPosition);
174 DoScroll(wxVERTICAL, m_win->m_vAdjust, y_pos, m_yScrollPixelsPerLine,
175 &m_yScrollPosition);
176 }
177