1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "slider.h"
16 #include "wx/slider.h"
20 #pragma message disable nosimpint
24 #include <Xm/LabelG.h>
25 #include <Xm/RowColumn.h>
28 #pragma message enable nosimpint
31 #include "wx/motif/private.h"
33 void wxSliderCallback (Widget widget
, XtPointer clientData
, XmScaleCallbackStruct
* cbs
);
35 IMPLEMENT_DYNAMIC_CLASS(wxSlider
, wxControl
)
37 BEGIN_EVENT_TABLE(wxSlider
, wxControl
)
51 bool wxSlider::Create(wxWindow
*parent
, wxWindowID id
,
52 int value
, int minValue
, int maxValue
,
54 const wxSize
& size
, long style
,
55 const wxValidator
& validator
,
58 if ( !((style
& wxSL_HORIZONTAL
) || (style
& wxSL_VERTICAL
)) )
59 style
|= wxSL_HORIZONTAL
;
61 if( !CreateControl( parent
, id
, pos
, size
, style
, validator
, name
) )
65 m_windowStyle
= style
;
67 m_rangeMax
= maxValue
;
68 m_rangeMin
= minValue
;
70 // Not used in Motif, I think
71 m_pageSize
= (int)((maxValue
-minValue
)/10);
73 Widget parentWidget
= (Widget
) parent
->GetClientWidget();
75 Widget sliderWidget
= XtVaCreateManagedWidget ("sliderWidget",
76 xmScaleWidgetClass
, parentWidget
,
78 (((m_windowStyle
& wxSL_VERTICAL
) == wxSL_VERTICAL
) ? XmVERTICAL
: XmHORIZONTAL
),
79 XmNprocessingDirection
,
80 (((m_windowStyle
& wxSL_VERTICAL
) == wxSL_VERTICAL
) ? XmMAX_ON_TOP
: XmMAX_ON_RIGHT
),
87 m_mainWidget
= (WXWidget
) sliderWidget
;
90 #pragma message disable codcauunr
91 // VMS gives here the compiler warning :
92 // statement either is unreachable or causes unreachable code
94 if(style
& wxSL_NOTIFY_DRAG
)
95 XtAddCallback (sliderWidget
, XmNdragCallback
,
96 (XtCallbackProc
) wxSliderCallback
, (XtPointer
) this);
98 XtAddCallback (sliderWidget
, XmNvalueChangedCallback
,
99 (XtCallbackProc
) wxSliderCallback
, (XtPointer
) this);
101 #pragma message enable codcauunr
104 XtAddCallback (sliderWidget
, XmNdragCallback
, (XtCallbackProc
) wxSliderCallback
, (XtPointer
) this);
107 SetCanAddEventHandler(TRUE
);
108 AttachWidget (parent
, m_mainWidget
, (WXWidget
) NULL
, pos
.x
, pos
.y
, size
.x
, size
.y
);
110 ChangeBackgroundColour();
115 wxSlider::~wxSlider()
119 int wxSlider::GetValue() const
122 XtVaGetValues ((Widget
) m_mainWidget
, XmNvalue
, &val
, NULL
);
126 void wxSlider::SetValue(int value
)
128 XtVaSetValues ((Widget
) m_mainWidget
, XmNvalue
, value
, NULL
);
131 void wxSlider::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
133 Widget widget
= (Widget
) m_mainWidget
;
135 bool managed
= XtIsManaged(widget
);
138 XtUnmanageChild (widget
);
140 if (((m_windowStyle
& wxHORIZONTAL
) == wxHORIZONTAL
) && (width
> -1))
142 XtVaSetValues (widget
, XmNscaleWidth
, wxMax (width
, 10), NULL
);
145 if (((m_windowStyle
& wxVERTICAL
) == wxVERTICAL
) && (height
> -1))
147 XtVaSetValues (widget
, XmNscaleHeight
, wxMax (height
, 10), NULL
);
150 int xx
= x
; int yy
= y
;
151 AdjustForParentClientOrigin(xx
, yy
, sizeFlags
);
153 if (x
> -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
154 XtVaSetValues (widget
, XmNx
, xx
, NULL
);
155 if (y
> -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
156 XtVaSetValues (widget
, XmNy
, yy
, NULL
);
159 XtManageChild (widget
);
162 void wxSlider::SetRange(int minValue
, int maxValue
)
164 m_rangeMin
= minValue
;
165 m_rangeMax
= maxValue
;
167 XtVaSetValues ((Widget
) m_mainWidget
, XmNminimum
, minValue
, XmNmaximum
, maxValue
, NULL
);
170 // For trackbars only
171 void wxSlider::SetPageSize(int pageSize
)
173 // Not implemented in Motif
174 m_pageSize
= pageSize
;
177 int wxSlider::GetPageSize() const
182 void wxSlider::SetLineSize(int lineSize
)
184 // Not implemented in Motif
185 m_lineSize
= lineSize
;
188 int wxSlider::GetLineSize() const
190 // Not implemented in Motif
194 void wxSlider::SetThumbLength(int WXUNUSED(len
))
196 // Not implemented in Motif (?)
199 int wxSlider::GetThumbLength() const
201 // Not implemented in Motif (?)
205 void wxSlider::Command (wxCommandEvent
& event
)
207 SetValue (event
.GetInt());
208 ProcessCommand (event
);
211 void wxSliderCallback (Widget widget
, XtPointer clientData
,
212 XmScaleCallbackStruct
* cbs
)
214 wxSlider
*slider
= (wxSlider
*) clientData
;
215 wxEventType scrollEvent
;
219 case XmCR_VALUE_CHANGED
:
220 scrollEvent
= wxEVT_SCROLL_THUMBRELEASE
;
224 scrollEvent
= wxEVT_SCROLL_THUMBTRACK
;
231 wxScrollEvent
event(scrollEvent
, slider
->GetId());
232 XtVaGetValues (widget
, XmNvalue
, &event
.m_commandInt
, NULL
);
233 event
.SetEventObject(slider
);
234 slider
->GetEventHandler()->ProcessEvent(event
);
236 // Also send a wxCommandEvent for compatibility.
237 wxCommandEvent
event2(wxEVT_COMMAND_SLIDER_UPDATED
, slider
->GetId());
238 event2
.SetEventObject(slider
);
239 event2
.SetInt( event
.GetInt() );
240 slider
->GetEventHandler()->ProcessEvent(event2
);