]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/gtk/scrolwin.cpp
Missing header.
[wxWidgets.git] / src / gtk / scrolwin.cpp
... / ...
CommitLineData
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
39void 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_scrollBar[0]->adjustment->value =
54 m_xScrollPosition = xPos;
55 m_win->m_scrollBar[1]->adjustment->value =
56 m_yScrollPosition = yPos;
57
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 );
61
62 int w = noUnitsX * pixelsPerUnitX;
63 int h = noUnitsY * pixelsPerUnitY;
64 m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord,
65 h ? h : wxDefaultCoord);
66
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
75 if (!noRefresh)
76 {
77 int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
78 int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
79
80 m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
81 }
82}
83
84void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range,
85 int pixelsPerLine,
86 int winSize,
87 int virtSize,
88 int *lines,
89 int *linesPerPage)
90{
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.
93 int upper = 1;
94 int page_size = 1;
95 if (pixelsPerLine > 0 && winSize < virtSize)
96 {
97 upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine;
98 page_size = winSize / pixelsPerLine;
99 }
100
101 *lines = upper;
102 *linesPerPage = page_size;
103
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);
109}
110
111void wxScrollHelperNative::AdjustScrollbars()
112{
113 int w, h;
114 int vw, vh;
115
116 m_targetWindow->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0;
117
118 m_targetWindow->GetClientSize( &w, &h );
119 m_targetWindow->GetVirtualSize( &vw, &vh );
120
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);
125}
126
127void wxScrollHelperNative::DoScroll(int orient,
128 int pos,
129 int pixelsPerLine,
130 int *posOld)
131{
132 if ( pos != -1 && pos != *posOld && pixelsPerLine )
133 {
134 m_win->SetScrollPos(orient, pos);
135 pos = m_win->GetScrollPos(orient);
136
137 int diff = (*posOld - pos)*pixelsPerLine;
138 m_targetWindow->ScrollWindow(orient == wxHORIZONTAL ? diff : 0,
139 orient == wxHORIZONTAL ? 0 : diff);
140
141 *posOld = pos;
142 }
143}
144
145void wxScrollHelperNative::Scroll( int x_pos, int y_pos )
146{
147 wxCHECK_RET( m_targetWindow != 0, _T("No target window") );
148
149 DoScroll(wxHORIZONTAL, x_pos, m_xScrollPixelsPerLine, &m_xScrollPosition);
150 DoScroll(wxVERTICAL, y_pos, m_yScrollPixelsPerLine, &m_yScrollPosition);
151}