]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/motif/scrolbar.cpp
* Apply patch #735595. Add miminumAcceptable{Height,Width}
[wxWidgets.git] / src / motif / scrolbar.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: scrolbar.cpp
3// Purpose: wxScrollBar
4// Author: Julian Smart
5// Modified by:
6// Created: 17/09/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "scrolbar.h"
14#endif
15
16#include "wx/defs.h"
17
18#include "wx/scrolbar.h"
19
20#ifdef __VMS__
21#pragma message disable nosimpint
22#endif
23#include <X11/IntrinsicP.h>
24#include <Xm/Xm.h>
25#include <Xm/RowColumn.h>
26#include <Xm/ScrollBar.h>
27#ifdef __VMS__
28#pragma message enable nosimpint
29#endif
30
31#include "wx/motif/private.h"
32
33static void wxScrollBarCallback(Widget widget, XtPointer clientData,
34 XmScaleCallbackStruct *cbs);
35
36IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
37
38// Scrollbar
39bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
40 const wxPoint& pos,
41 const wxSize& size, long style,
42 const wxValidator& validator,
43 const wxString& name)
44{
45 if (!parent)
46 return FALSE;
47 parent->AddChild(this);
48 SetName(name);
49 m_backgroundColour = parent->GetBackgroundColour();
50 m_foregroundColour = parent->GetForegroundColour();
51 SetValidator(validator);
52
53 m_windowStyle = style;
54
55 if ( id == -1 )
56 m_windowId = (int)NewControlId();
57 else
58 m_windowId = id;
59
60 int x = pos.x;
61 int y = pos.y;
62 int width = size.x;
63 int height = size.y;
64
65 if (width == -1)
66 {
67 if (style & wxHORIZONTAL)
68 width = 140;
69 else
70 width = 12;
71 }
72 if (height == -1)
73 {
74 if (style & wxVERTICAL)
75 height = 140;
76 else
77 height = 12;
78 }
79
80 Widget parentWidget = (Widget) parent->GetClientWidget();
81 int direction = (style & wxHORIZONTAL) ? XmHORIZONTAL: XmVERTICAL;
82
83 Widget scrollBarWidget = XtVaCreateManagedWidget("scrollBarWidget",
84 xmScrollBarWidgetClass, parentWidget,
85 XmNorientation, direction,
86 NULL);
87
88 m_mainWidget = (Widget) scrollBarWidget;
89
90 XtAddCallback(scrollBarWidget, XmNvalueChangedCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
91 XtAddCallback(scrollBarWidget, XmNdragCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
92 XtAddCallback(scrollBarWidget, XmNdecrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
93 XtAddCallback(scrollBarWidget, XmNincrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
94 XtAddCallback(scrollBarWidget, XmNpageDecrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
95 XtAddCallback(scrollBarWidget, XmNpageIncrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
96 XtAddCallback(scrollBarWidget, XmNtoTopCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
97 XtAddCallback(scrollBarWidget, XmNtoBottomCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
98
99 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, x, y, width, height);
100 ChangeBackgroundColour();
101
102 return TRUE;
103}
104
105wxScrollBar::~wxScrollBar()
106{
107}
108
109void wxScrollBar::SetThumbPosition(int pos)
110{
111 if (m_mainWidget)
112 {
113 XtVaSetValues ((Widget) m_mainWidget,
114 XmNvalue, pos,
115 NULL);
116 }
117}
118
119int wxScrollBar::GetThumbPosition() const
120{
121 if (m_mainWidget)
122 {
123 int pos;
124 XtVaGetValues((Widget) m_mainWidget,
125 XmNvalue, &pos, NULL);
126 return pos;
127 }
128 else
129 return 0;
130}
131
132void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
133 bool WXUNUSED(refresh))
134{
135 m_viewSize = pageSize;
136 m_pageSize = thumbSize;
137 m_objectSize = range;
138
139 if (range == 0)
140 range = 1;
141 if (thumbSize == 0)
142 thumbSize = 1;
143
144 XtVaSetValues((Widget) m_mainWidget,
145 XmNvalue, position,
146 XmNminimum, 0,
147 XmNmaximum, range,
148 XmNsliderSize, thumbSize,
149 XmNpageIncrement, pageSize,
150 NULL);
151}
152
153void wxScrollBar::Command(wxCommandEvent& event)
154{
155 SetThumbPosition(event.m_commandInt);
156 ProcessCommand(event);
157}
158
159void wxScrollBar::ChangeFont(bool WXUNUSED(keepOriginalSize))
160{
161 // TODO
162 // Do anything for a scrollbar? A font will never be seen.
163}
164
165void wxScrollBar::ChangeBackgroundColour()
166{
167 wxWindow::ChangeBackgroundColour();
168
169 XtVaSetValues ((Widget) GetMainWidget(),
170 XmNtroughColor, m_backgroundColour.AllocColour(XtDisplay((Widget) GetMainWidget())),
171 NULL);
172}
173
174void wxScrollBar::ChangeForegroundColour()
175{
176 wxWindow::ChangeForegroundColour();
177}
178
179static void wxScrollBarCallback(Widget WXUNUSED(widget), XtPointer clientData,
180 XmScaleCallbackStruct *cbs)
181{
182 wxScrollBar *scrollBar = (wxScrollBar *)clientData;
183 wxEventType eventType = wxEVT_NULL;
184
185 switch (cbs->reason)
186 {
187 case XmCR_INCREMENT:
188 {
189 eventType = wxEVT_SCROLL_LINEDOWN;
190 break;
191 }
192 case XmCR_DECREMENT:
193 {
194 eventType = wxEVT_SCROLL_LINEUP;
195 break;
196 }
197 case XmCR_DRAG:
198 {
199 eventType = wxEVT_SCROLL_THUMBTRACK;
200 break;
201 }
202 case XmCR_VALUE_CHANGED:
203 {
204 eventType = wxEVT_SCROLL_THUMBRELEASE;
205 break;
206 }
207 case XmCR_PAGE_INCREMENT:
208 {
209 eventType = wxEVT_SCROLL_PAGEDOWN;
210 break;
211 }
212 case XmCR_PAGE_DECREMENT:
213 {
214 eventType = wxEVT_SCROLL_PAGEUP;
215 break;
216 }
217 case XmCR_TO_TOP:
218 {
219 eventType = wxEVT_SCROLL_TOP;
220 break;
221 }
222 case XmCR_TO_BOTTOM:
223 {
224 eventType = wxEVT_SCROLL_BOTTOM;
225 break;
226 }
227 default:
228 {
229 // Should never get here
230 wxFAIL_MSG("Unknown scroll event.");
231 break;
232 }
233 }
234
235 wxScrollEvent event(eventType, scrollBar->GetId());
236 event.SetEventObject(scrollBar);
237 event.SetPosition(cbs->value);
238 scrollBar->GetEventHandler()->ProcessEvent(event);
239/*
240 if (!scrollBar->inSetValue)
241 scrollBar->ProcessCommand(event);
242*/
243}
244