/[pcsx2_0.9.7]/branch/r3113_0.9.7_beta/3rdparty/wxWidgets/src/msw/scrolbar.cpp
ViewVC logotype

Annotation of /branch/r3113_0.9.7_beta/3rdparty/wxWidgets/src/msw/scrolbar.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 32 - (hide annotations) (download)
Tue Sep 7 03:29:01 2010 UTC (10 years ago) by william
File size: 9691 byte(s)
branching from upstream revision (http://pcsx2.googlecode.com/svn/trunk
): r3113 to
https://svn.netsolutions.dnsalias.com/websvn/ps2/pcsx2/pcsx2_0.9.7/branch/r3113_0.9.7_beta
1 william 31 /////////////////////////////////////////////////////////////////////////////
2     // Name: src/msw/scrolbar.cpp
3     // Purpose: wxScrollBar
4     // Author: Julian Smart
5     // Modified by:
6     // Created: 04/01/98
7     // RCS-ID: $Id: scrolbar.cpp 39476 2006-05-30 13:43:18Z ABX $
8     // Copyright: (c) Julian Smart
9     // Licence: wxWindows licence
10     /////////////////////////////////////////////////////////////////////////////
11    
12     // For compilers that support precompilation, includes "wx.h".
13     #include "wx/wxprec.h"
14    
15     #ifdef __BORLANDC__
16     #pragma hdrstop
17     #endif
18    
19     #if wxUSE_SCROLLBAR
20    
21     #include "wx/scrolbar.h"
22    
23     #ifndef WX_PRECOMP
24     #include "wx/utils.h"
25     #include "wx/settings.h"
26     #endif
27    
28     #include "wx/msw/private.h"
29    
30     #if wxUSE_EXTENDED_RTTI
31     WX_DEFINE_FLAGS( wxScrollBarStyle )
32    
33     wxBEGIN_FLAGS( wxScrollBarStyle )
34     // new style border flags, we put them first to
35     // use them for streaming out
36     wxFLAGS_MEMBER(wxBORDER_SIMPLE)
37     wxFLAGS_MEMBER(wxBORDER_SUNKEN)
38     wxFLAGS_MEMBER(wxBORDER_DOUBLE)
39     wxFLAGS_MEMBER(wxBORDER_RAISED)
40     wxFLAGS_MEMBER(wxBORDER_STATIC)
41     wxFLAGS_MEMBER(wxBORDER_NONE)
42    
43     // old style border flags
44     wxFLAGS_MEMBER(wxSIMPLE_BORDER)
45     wxFLAGS_MEMBER(wxSUNKEN_BORDER)
46     wxFLAGS_MEMBER(wxDOUBLE_BORDER)
47     wxFLAGS_MEMBER(wxRAISED_BORDER)
48     wxFLAGS_MEMBER(wxSTATIC_BORDER)
49     wxFLAGS_MEMBER(wxBORDER)
50    
51     // standard window styles
52     wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
53     wxFLAGS_MEMBER(wxCLIP_CHILDREN)
54     wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
55     wxFLAGS_MEMBER(wxWANTS_CHARS)
56     wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
57     wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
58     wxFLAGS_MEMBER(wxVSCROLL)
59     wxFLAGS_MEMBER(wxHSCROLL)
60    
61     wxFLAGS_MEMBER(wxSB_HORIZONTAL)
62     wxFLAGS_MEMBER(wxSB_VERTICAL)
63    
64     wxEND_FLAGS( wxScrollBarStyle )
65    
66     IMPLEMENT_DYNAMIC_CLASS_XTI(wxScrollBar, wxControl,"wx/scrolbar.h")
67    
68     wxBEGIN_PROPERTIES_TABLE(wxScrollBar)
69     wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_CHANGED , wxScrollEvent )
70    
71     wxPROPERTY( ThumbPosition , int , SetThumbPosition, GetThumbPosition, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
72     wxPROPERTY( Range , int , SetRange, GetRange, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
73     wxPROPERTY( ThumbSize , int , SetThumbSize, GetThumbSize, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
74     wxPROPERTY( PageSize , int , SetPageSize, GetPageSize, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
75     wxPROPERTY_FLAGS( WindowStyle , wxScrollBarStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
76     wxEND_PROPERTIES_TABLE()
77    
78     wxBEGIN_HANDLERS_TABLE(wxScrollBar)
79     wxEND_HANDLERS_TABLE()
80    
81     wxCONSTRUCTOR_5( wxScrollBar , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle )
82     #else
83     IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
84     #endif
85    
86     // Scrollbar
87     bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
88     const wxPoint& pos,
89     const wxSize& size, long style,
90     const wxValidator& validator,
91     const wxString& name)
92     {
93     if ( !CreateControl(parent, id, pos, size, style, validator, name) )
94     return false;
95    
96     if (!MSWCreateControl(wxT("ScrollBar"), wxEmptyString, pos, size))
97     return false;
98    
99     SetScrollbar(0, 1, 2, 1, false);
100    
101     return true;
102     }
103    
104     wxScrollBar::~wxScrollBar(void)
105     {
106     }
107    
108     bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam,
109     WXWORD pos, WXHWND WXUNUSED(control))
110     {
111     // current and max positions
112     int position,
113     maxPos, trackPos = pos;
114    
115     wxUnusedVar(trackPos);
116    
117     // when we're dragging the scrollbar we can't use pos parameter because it
118     // is limited to 16 bits
119     // JACS: now always using GetScrollInfo, since there's no reason
120     // not to
121     // if ( wParam == SB_THUMBPOSITION || wParam == SB_THUMBTRACK )
122     {
123     SCROLLINFO scrollInfo;
124     wxZeroMemory(scrollInfo);
125     scrollInfo.cbSize = sizeof(SCROLLINFO);
126    
127     // also get the range if we call GetScrollInfo() anyhow -- this is less
128     // expensive than call it once here and then call GetScrollRange()
129     // below
130     scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_TRACKPOS;
131    
132     if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) )
133     {
134     wxLogLastError(_T("GetScrollInfo"));
135     }
136    
137     trackPos = scrollInfo.nTrackPos;
138     position = scrollInfo.nPos;
139     maxPos = scrollInfo.nMax;
140     }
141     #if 0
142     else
143     {
144     position = ::GetScrollPos((HWND) control, SB_CTL);
145     int minPos;
146     ::GetScrollRange((HWND) control, SB_CTL, &minPos, &maxPos);
147     }
148     #endif
149    
150     // A page size greater than one has the effect of reducing the effective
151     // range, therefore the range has already been boosted artificially - so
152     // reduce it again.
153     if ( m_pageSize > 1 )
154     maxPos -= (m_pageSize - 1);
155    
156     wxEventType scrollEvent = wxEVT_NULL;
157    
158     int nScrollInc;
159     switch ( wParam )
160     {
161     case SB_TOP:
162     nScrollInc = maxPos - position;
163     scrollEvent = wxEVT_SCROLL_TOP;
164     break;
165    
166     case SB_BOTTOM:
167     nScrollInc = -position;
168     scrollEvent = wxEVT_SCROLL_BOTTOM;
169     break;
170    
171     case SB_LINEUP:
172     nScrollInc = -1;
173     scrollEvent = wxEVT_SCROLL_LINEUP;
174     break;
175    
176     case SB_LINEDOWN:
177     nScrollInc = 1;
178     scrollEvent = wxEVT_SCROLL_LINEDOWN;
179     break;
180    
181     case SB_PAGEUP:
182     nScrollInc = -GetPageSize();
183     scrollEvent = wxEVT_SCROLL_PAGEUP;
184     break;
185    
186     case SB_PAGEDOWN:
187     nScrollInc = GetPageSize();
188     scrollEvent = wxEVT_SCROLL_PAGEDOWN;
189     break;
190    
191     case SB_THUMBPOSITION:
192     nScrollInc = trackPos - position;
193     scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
194     break;
195    
196     case SB_THUMBTRACK:
197     nScrollInc = trackPos - position;
198     scrollEvent = wxEVT_SCROLL_THUMBTRACK;
199     break;
200    
201     case SB_ENDSCROLL:
202     nScrollInc = 0;
203     scrollEvent = wxEVT_SCROLL_CHANGED;
204     break;
205    
206     default:
207     nScrollInc = 0;
208     }
209    
210     if ( nScrollInc )
211     {
212     position += nScrollInc;
213    
214     if ( position < 0 )
215     position = 0;
216     if ( position > maxPos )
217     position = maxPos;
218    
219     SetThumbPosition(position);
220     }
221     else if ( scrollEvent != wxEVT_SCROLL_THUMBRELEASE &&
222     scrollEvent != wxEVT_SCROLL_CHANGED )
223     {
224     // don't process the event if there is no displacement,
225     // unless this is a thumb release or end scroll event.
226     return false;
227     }
228    
229     wxScrollEvent event(scrollEvent, m_windowId);
230     event.SetOrientation(IsVertical() ? wxVERTICAL : wxHORIZONTAL);
231     event.SetPosition(position);
232     event.SetEventObject( this );
233    
234     return GetEventHandler()->ProcessEvent(event);
235     }
236    
237     void wxScrollBar::SetThumbPosition(int viewStart)
238     {
239     SCROLLINFO info;
240     info.cbSize = sizeof(SCROLLINFO);
241     info.nPage = 0;
242     info.nMin = 0;
243     info.nPos = viewStart;
244     info.fMask = SIF_POS ;
245    
246     ::SetScrollInfo((HWND) GetHWND(), SB_CTL, &info, TRUE);
247     }
248    
249     int wxScrollBar::GetThumbPosition(void) const
250     {
251     SCROLLINFO scrollInfo;
252     wxZeroMemory(scrollInfo);
253     scrollInfo.cbSize = sizeof(SCROLLINFO);
254     scrollInfo.fMask = SIF_POS;
255    
256     if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) )
257     {
258     wxLogLastError(_T("GetScrollInfo"));
259     }
260     return scrollInfo.nPos;
261     // return ::GetScrollPos((HWND)m_hWnd, SB_CTL);
262     }
263    
264     void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
265     bool refresh)
266     {
267     m_viewSize = pageSize;
268     m_pageSize = thumbSize;
269     m_objectSize = range;
270    
271     // The range (number of scroll steps) is the
272     // object length minus the page size.
273     int range1 = wxMax((m_objectSize - m_pageSize), 0) ;
274    
275     // Try to adjust the range to cope with page size > 1
276     // (see comment for SetPageLength)
277     if ( m_pageSize > 1 )
278     {
279     range1 += (m_pageSize - 1);
280     }
281    
282     SCROLLINFO info;
283     info.cbSize = sizeof(SCROLLINFO);
284     info.nPage = m_pageSize;
285     info.nMin = 0;
286     info.nMax = range1;
287     info.nPos = position;
288    
289     info.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
290    
291     ::SetScrollInfo((HWND) GetHWND(), SB_CTL, &info, refresh);
292     }
293    
294     void wxScrollBar::Command(wxCommandEvent& event)
295     {
296     SetThumbPosition(event.GetInt());
297     ProcessCommand(event);
298     }
299    
300     wxSize wxScrollBar::DoGetBestSize() const
301     {
302     int w = 100;
303     int h = 100;
304    
305     if ( IsVertical() )
306     {
307     w = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
308     }
309     else
310     {
311     h = wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y);
312     }
313    
314     wxSize best(w, h);
315     CacheBestSize(best);
316     return best;
317     }
318    
319     WXDWORD wxScrollBar::MSWGetStyle(long style, WXDWORD *exstyle) const
320     {
321     // we never have an external border
322     WXDWORD msStyle = wxControl::MSWGetStyle
323     (
324     (style & ~wxBORDER_MASK) | wxBORDER_NONE, exstyle
325     );
326    
327     // SBS_HORZ is 0 anyhow, but do mention it explicitly for clarity
328     msStyle |= style & wxSB_HORIZONTAL ? SBS_HORZ : SBS_VERT;
329    
330     return msStyle;
331     }
332    
333     WXHBRUSH wxScrollBar::MSWControlColor(WXHDC pDC, WXHWND hWnd)
334     {
335     // unless we have an explicitly set bg colour, use default (gradient under
336     // XP) brush instead of GetBackgroundColour() one as the base class would
337     //
338     // note that fg colour isn't used for a scrollbar
339     return UseBgCol() ? wxControl::MSWControlColor(pDC, hWnd) : NULL;
340     }
341    
342     #endif // wxUSE_SCROLLBAR

  ViewVC Help
Powered by ViewVC 1.1.22