]> git.saurik.com Git - wxWidgets.git/blob - src/motif/slider.cpp
attempt to work around SDK specific problems
[wxWidgets.git] / src / motif / slider.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: slider.cpp
3 // Purpose: wxSlider
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 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "slider.h"
14 #endif
15
16 #include "wx/slider.h"
17 #include "wx/utils.h"
18
19 #ifdef __VMS__
20 #pragma message disable nosimpint
21 #endif
22 #include <Xm/Xm.h>
23 #include <Xm/Label.h>
24 #include <Xm/LabelG.h>
25 #include <Xm/RowColumn.h>
26 #include <Xm/Scale.h>
27 #ifdef __VMS__
28 #pragma message enable nosimpint
29 #endif
30
31 #include "wx/motif/private.h"
32
33 void wxSliderCallback (Widget widget, XtPointer clientData, XmScaleCallbackStruct * cbs);
34
35 IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
36
37 BEGIN_EVENT_TABLE(wxSlider, wxControl)
38 END_EVENT_TABLE()
39
40
41
42 // Slider
43 wxSlider::wxSlider()
44 {
45 m_pageSize = 1;
46 m_lineSize = 1;
47 m_rangeMax = 0;
48 m_rangeMin = 0;
49 }
50
51 bool wxSlider::Create(wxWindow *parent, wxWindowID id,
52 int value, int minValue, int maxValue,
53 const wxPoint& pos,
54 const wxSize& size, long style,
55 const wxValidator& validator,
56 const wxString& name)
57 {
58 if ( !((style & wxSL_HORIZONTAL) || (style & wxSL_VERTICAL)) )
59 style |= wxSL_HORIZONTAL;
60
61 if( !CreateControl( parent, id, pos, size, style, validator, name ) )
62 return false;
63
64 m_lineSize = 1;
65 m_windowStyle = style;
66
67 m_rangeMax = maxValue;
68 m_rangeMin = minValue;
69
70 // Not used in Motif, I think
71 m_pageSize = (int)((maxValue-minValue)/10);
72
73 Widget parentWidget = (Widget) parent->GetClientWidget();
74
75 Widget sliderWidget = XtVaCreateManagedWidget ("sliderWidget",
76 xmScaleWidgetClass, parentWidget,
77 XmNorientation,
78 (((m_windowStyle & wxSL_VERTICAL) == wxSL_VERTICAL) ? XmVERTICAL : XmHORIZONTAL),
79 XmNprocessingDirection,
80 (((m_windowStyle & wxSL_VERTICAL) == wxSL_VERTICAL) ? XmMAX_ON_TOP : XmMAX_ON_RIGHT),
81 XmNmaximum, maxValue,
82 XmNminimum, minValue,
83 XmNvalue, value,
84 XmNshowValue, True,
85 NULL);
86
87 m_mainWidget = (WXWidget) sliderWidget;
88
89 #ifdef __VMS__
90 #pragma message disable codcauunr
91 // VMS gives here the compiler warning :
92 // statement either is unreachable or causes unreachable code
93 #endif
94 if(style & wxSL_NOTIFY_DRAG)
95 XtAddCallback (sliderWidget, XmNdragCallback,
96 (XtCallbackProc) wxSliderCallback, (XtPointer) this);
97 else
98 XtAddCallback (sliderWidget, XmNvalueChangedCallback,
99 (XtCallbackProc) wxSliderCallback, (XtPointer) this);
100 #ifdef __VMS__
101 #pragma message enable codcauunr
102 #endif
103
104 XtAddCallback (sliderWidget, XmNdragCallback, (XtCallbackProc) wxSliderCallback, (XtPointer) this);
105
106 ChangeFont(FALSE);
107 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
108
109 ChangeBackgroundColour();
110
111 return TRUE;
112 }
113
114 wxSlider::~wxSlider()
115 {
116 }
117
118 int wxSlider::GetValue() const
119 {
120 int val;
121 XtVaGetValues ((Widget) m_mainWidget, XmNvalue, &val, NULL);
122 return val;
123 }
124
125 void wxSlider::SetValue(int value)
126 {
127 XtVaSetValues ((Widget) m_mainWidget, XmNvalue, value, NULL);
128 }
129
130 void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags)
131 {
132 Widget widget = (Widget) m_mainWidget;
133
134 bool managed = XtIsManaged(widget);
135
136 if (managed)
137 XtUnmanageChild (widget);
138
139 if (((m_windowStyle & wxHORIZONTAL) == wxHORIZONTAL) && (width > -1))
140 {
141 XtVaSetValues (widget, XmNscaleWidth, wxMax (width, 10), NULL);
142 }
143
144 if (((m_windowStyle & wxVERTICAL) == wxVERTICAL) && (height > -1))
145 {
146 XtVaSetValues (widget, XmNscaleHeight, wxMax (height, 10), NULL);
147 }
148
149 int xx = x; int yy = y;
150 AdjustForParentClientOrigin(xx, yy, sizeFlags);
151
152 if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
153 XtVaSetValues (widget, XmNx, xx, NULL);
154 if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
155 XtVaSetValues (widget, XmNy, yy, NULL);
156
157 if (managed)
158 XtManageChild (widget);
159 }
160
161 void wxSlider::SetRange(int minValue, int maxValue)
162 {
163 m_rangeMin = minValue;
164 m_rangeMax = maxValue;
165
166 XtVaSetValues ((Widget) m_mainWidget, XmNminimum, minValue, XmNmaximum, maxValue, NULL);
167 }
168
169 // For trackbars only
170 void wxSlider::SetPageSize(int pageSize)
171 {
172 // Not implemented in Motif
173 m_pageSize = pageSize;
174 }
175
176 int wxSlider::GetPageSize() const
177 {
178 return m_pageSize;
179 }
180
181 void wxSlider::SetLineSize(int lineSize)
182 {
183 // Not implemented in Motif
184 m_lineSize = lineSize;
185 }
186
187 int wxSlider::GetLineSize() const
188 {
189 // Not implemented in Motif
190 return m_lineSize;
191 }
192
193 void wxSlider::SetThumbLength(int WXUNUSED(len))
194 {
195 // Not implemented in Motif (?)
196 }
197
198 int wxSlider::GetThumbLength() const
199 {
200 // Not implemented in Motif (?)
201 return 0;
202 }
203
204 void wxSlider::Command (wxCommandEvent & event)
205 {
206 SetValue (event.GetInt());
207 ProcessCommand (event);
208 }
209
210 void wxSliderCallback (Widget widget, XtPointer clientData,
211 XmScaleCallbackStruct * cbs)
212 {
213 wxSlider *slider = (wxSlider *) clientData;
214 wxEventType scrollEvent;
215
216 switch (cbs->reason)
217 {
218 case XmCR_VALUE_CHANGED:
219 scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
220 break;
221
222 case XmCR_DRAG:
223 scrollEvent = wxEVT_SCROLL_THUMBTRACK;
224 break;
225
226 default:
227 return;
228 }
229
230 wxScrollEvent event(scrollEvent, slider->GetId());
231 XtVaGetValues (widget, XmNvalue, &event.m_commandInt, NULL);
232 event.SetEventObject(slider);
233 slider->GetEventHandler()->ProcessEvent(event);
234
235 // Also send a wxCommandEvent for compatibility.
236 wxCommandEvent event2(wxEVT_COMMAND_SLIDER_UPDATED, slider->GetId());
237 event2.SetEventObject(slider);
238 event2.SetInt( event.GetInt() );
239 slider->GetEventHandler()->ProcessEvent(event2);
240 }
241