]> git.saurik.com Git - wxWidgets.git/blame - src/gtk/scrolwin.cpp
free old resources in DoLoad(), apparently fixes memory leaks with gstreamer 0.10...
[wxWidgets.git] / src / gtk / scrolwin.cpp
CommitLineData
30954328 1/////////////////////////////////////////////////////////////////////////////
e1437456 2// Name: gtk/scrolwin.cpp
30954328 3// Purpose: wxScrolledWindow implementation
47a3ff38 4// Author: Robert Roebling
566d84a7 5// Modified by: Ron Lee
d32e78bd 6// Vadim Zeitlin: removed 90% of duplicated common code
30954328
RR
7// Created: 01/02/97
8// RCS-ID: $Id$
47a3ff38 9// Copyright: (c) Robert Roebling
65571936 10// Licence: wxWindows licence
30954328
RR
11/////////////////////////////////////////////////////////////////////////////
12
13// ============================================================================
14// declarations
15// ============================================================================
16
17// ----------------------------------------------------------------------------
18// headers
19// ----------------------------------------------------------------------------
20
30954328
RR
21// For compilers that support precompilation, includes "wx.h".
22#include "wx/wxprec.h"
23
24#ifdef __BORLANDC__
25 #pragma hdrstop
26#endif
27
e1bf3ad3 28#include "wx/scrolwin.h"
9e691f46 29#include "wx/gtk/private.h"
30954328
RR
30
31// ============================================================================
32// implementation
33// ============================================================================
34
30954328 35// ----------------------------------------------------------------------------
d32e78bd 36// wxScrollHelper implementation
30954328
RR
37// ----------------------------------------------------------------------------
38
d32e78bd
VZ
39void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
40 int noUnitsX, int noUnitsY,
41 int xPos, int yPos,
42 bool noRefresh)
30954328 43{
1adff2f5 44 int xs, ys;
d32e78bd 45 GetViewStart(& xs, & ys);
4e115ed2 46
1adff2f5
JS
47 int old_x = m_xScrollPixelsPerLine * xs;
48 int old_y = m_yScrollPixelsPerLine * ys;
30486297 49
30954328
RR
50 m_xScrollPixelsPerLine = pixelsPerUnitX;
51 m_yScrollPixelsPerLine = pixelsPerUnitY;
39c869a6 52
cd38dd5b 53 m_win->m_scrollBar[wxWindow::ScrollDir_Horz]->adjustment->value =
add7cadd 54 m_xScrollPosition = xPos;
cd38dd5b 55 m_win->m_scrollBar[wxWindow::ScrollDir_Vert]->adjustment->value =
add7cadd 56 m_yScrollPosition = yPos;
30954328 57
2b5f62a0
VZ
58 // Setting hints here should arguably be deprecated, but without it
59 // a sizer might override this manual scrollbar setting in old code.
878ddad5 60 // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
30486297 61
f18f464c
VZ
62 int w = noUnitsX * pixelsPerUnitX;
63 int h = noUnitsY * pixelsPerUnitY;
64 m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord,
65 h ? h : wxDefaultCoord);
2b5f62a0 66
add7cadd
PC
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)
71 {
72 AdjustScrollbars();
73 }
74
ec7482df
RR
75 if (!noRefresh)
76 {
77 int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
78 int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
30486297 79
566d84a7 80 m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
ec7482df 81 }
30954328
RR
82}
83
add7cadd 84void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range,
d32e78bd
VZ
85 int pixelsPerLine,
86 int winSize,
87 int virtSize,
d32e78bd
VZ
88 int *lines,
89 int *linesPerPage)
30954328 90{
f6814d01
PC
91 int upper;
92 int page_size;
fb18afdd 93 if (pixelsPerLine > 0 && winSize > 0 && winSize < virtSize)
4ca24f18 94 {
f6814d01
PC
95 upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine;
96 page_size = winSize / pixelsPerLine;
5713b349
RR
97 *lines = upper;
98 *linesPerPage = page_size;
5713b349
RR
99 }
100 else
101 {
102 // GtkRange won't allow upper == lower, so for disabled state use [0,1]
103 // with a page size of 1. This will also clamp position to 0.
f6814d01
PC
104 upper = 1;
105 page_size = 1;
5713b349
RR
106 *lines = 0;
107 *linesPerPage = 0;
4ca24f18 108 }
f6814d01
PC
109 GtkAdjustment* adj = range->adjustment;
110 adj->step_increment = 1;
111 adj->page_increment =
112 adj->page_size = page_size;
113 gtk_range_set_range(range, 0, upper);
30954328
RR
114}
115
d32e78bd 116void wxScrollHelperNative::AdjustScrollbars()
566d84a7 117{
d32e78bd
VZ
118 int w, h;
119 int vw, vh;
830ed6d9 120
bf6c0db6
RR
121 // this flag indicates which window has the scrollbars
122 m_win->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0;
0f4f26bd 123
d32e78bd 124 m_targetWindow->GetVirtualSize( &vw, &vh );
830ed6d9 125
cd38dd5b
PC
126 m_targetWindow->GetClientSize(&w, NULL);
127 DoAdjustScrollbar(
128 m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine,
129 w, vw, &m_xScrollLines, &m_xScrollLinesPerPage);
130 m_targetWindow->GetClientSize(NULL, &h);
131 DoAdjustScrollbar(
132 m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine,
133 h, vh, &m_yScrollLines, &m_yScrollLinesPerPage);
134
135 const int w_old = w;
136 m_targetWindow->GetClientSize(&w, NULL);
137 if (w != w_old)
138 {
139 // It is necessary to repeat the calculations in this case to avoid an
140 // observed infinite series of size events, involving alternating
141 // changes in visibility of the scrollbars.
142 // At this point, GTK+ has already queued a resize, which will cause
143 // AdjustScrollbars() to be called again. If the scrollbar visibility
144 // is not correct before then, yet another resize will occur, possibly
145 // leading to an unending series if the sizes are just right.
146 DoAdjustScrollbar(
147 m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine,
148 w, vw, &m_xScrollLines, &m_xScrollLinesPerPage);
149 m_targetWindow->GetClientSize(NULL, &h);
150 DoAdjustScrollbar(
151 m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine,
152 h, vh, &m_yScrollLines, &m_yScrollLinesPerPage);
153 }
830ed6d9
RR
154}
155
d32e78bd 156void wxScrollHelperNative::DoScroll(int orient,
d32e78bd
VZ
157 int pos,
158 int pixelsPerLine,
159 int *posOld)
30486297 160{
d32e78bd 161 if ( pos != -1 && pos != *posOld && pixelsPerLine )
30486297 162 {
add7cadd
PC
163 m_win->SetScrollPos(orient, pos);
164 pos = m_win->GetScrollPos(orient);
30486297 165
d32e78bd
VZ
166 int diff = (*posOld - pos)*pixelsPerLine;
167 m_targetWindow->ScrollWindow(orient == wxHORIZONTAL ? diff : 0,
168 orient == wxHORIZONTAL ? 0 : diff);
30954328 169
d32e78bd 170 *posOld = pos;
2b5f62a0 171 }
30954328
RR
172}
173
d32e78bd 174void wxScrollHelperNative::Scroll( int x_pos, int y_pos )
30954328 175{
d32e78bd 176 wxCHECK_RET( m_targetWindow != 0, _T("No target window") );
30954328 177
add7cadd
PC
178 DoScroll(wxHORIZONTAL, x_pos, m_xScrollPixelsPerLine, &m_xScrollPosition);
179 DoScroll(wxVERTICAL, y_pos, m_yScrollPixelsPerLine, &m_yScrollPosition);
30954328 180}