]>
git.saurik.com Git - wxWidgets.git/blob - src/motif/scrolbar.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxScrollBar
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "scrolbar.h"
16 #include "wx/scrolbar.h"
18 #include <X11/IntrinsicP.h>
20 #include <Xm/RowColumn.h>
21 #include <Xm/ScrollBar.h>
23 #include <wx/motif/private.h>
25 void wxScrollBarCallback(Widget widget
, XtPointer clientData
,
26 XmScaleCallbackStruct
*cbs
);
28 #if !USE_SHARED_LIBRARY
29 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar
, wxControl
)
33 bool wxScrollBar::Create(wxWindow
*parent
, wxWindowID id
,
35 const wxSize
& size
, long style
,
36 const wxValidator
& validator
,
41 parent
->AddChild(this);
43 SetValidator(validator
);
45 m_windowStyle
= style
;
48 m_windowId
= (int)NewControlId();
59 if (style
& wxHORIZONTAL
)
66 if (style
& wxVERTICAL
)
72 Widget parentWidget
= (Widget
) parent
->GetClientWidget();
73 int direction
= (style
& wxHORIZONTAL
) ? XmHORIZONTAL
: XmVERTICAL
;
75 Widget scrollBarWidget
= XtVaCreateManagedWidget("scrollBarWidget",
76 xmScrollBarWidgetClass
, parentWidget
,
77 XmNorientation
, direction
,
80 m_mainWidget
= (Widget
) scrollBarWidget
;
82 // This will duplicate other events
83 // XtAddCallback(scrollBarWidget, XmNvalueChangedCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this);
84 XtAddCallback(scrollBarWidget
, XmNdragCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
85 XtAddCallback(scrollBarWidget
, XmNdecrementCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
86 XtAddCallback(scrollBarWidget
, XmNincrementCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
87 XtAddCallback(scrollBarWidget
, XmNpageDecrementCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
88 XtAddCallback(scrollBarWidget
, XmNpageIncrementCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
89 XtAddCallback(scrollBarWidget
, XmNtoTopCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
90 XtAddCallback(scrollBarWidget
, XmNtoBottomCallback
, (XtCallbackProc
)wxScrollBarCallback
, (XtPointer
)this);
92 SetCanAddEventHandler(TRUE
);
93 AttachWidget (parent
, m_mainWidget
, (WXWidget
) NULL
, x
, y
, width
, height
);
94 ChangeColour(m_mainWidget
);
99 wxScrollBar::~wxScrollBar()
103 void wxScrollBar::SetPosition(int pos
)
107 XtVaSetValues ((Widget
) m_mainWidget
,
113 int wxScrollBar::GetPosition() const
118 XtVaGetValues((Widget
) m_mainWidget
,
119 XmNvalue
, &pos
, NULL
);
126 void wxScrollBar::SetScrollbar(int position
, int thumbSize
, int range
, int pageSize
,
129 m_viewSize
= pageSize
;
130 m_pageSize
= thumbSize
;
131 m_objectSize
= range
;
138 XtVaSetValues((Widget
) m_mainWidget
,
142 XmNsliderSize
, thumbSize
,
143 XmNpageIncrement
, pageSize
,
147 void wxScrollBar::Command(wxCommandEvent
& event
)
149 SetPosition(event
.m_commandInt
);
150 ProcessCommand(event
);
153 void wxScrollBarCallback(Widget widget
, XtPointer clientData
,
154 XmScaleCallbackStruct
*cbs
)
156 wxScrollBar
*scrollBar
= (wxScrollBar
*)clientData
;
158 wxEventType eventType
= wxEVT_NULL
;
163 eventType
= wxEVT_SCROLL_LINEDOWN
;
168 eventType
= wxEVT_SCROLL_LINEUP
;
173 eventType
= wxEVT_SCROLL_THUMBTRACK
;
176 case XmCR_VALUE_CHANGED
:
178 // TODO: Should this be intercepted too, or will it cause
180 eventType
= wxEVT_SCROLL_THUMBTRACK
;
183 case XmCR_PAGE_INCREMENT
:
185 eventType
= wxEVT_SCROLL_PAGEDOWN
;
188 case XmCR_PAGE_DECREMENT
:
190 eventType
= wxEVT_SCROLL_PAGEUP
;
195 eventType
= wxEVT_SCROLL_TOP
;
200 eventType
= wxEVT_SCROLL_BOTTOM
;
205 // Should never get here
206 wxFAIL_MSG("Unknown scroll event.");
211 wxScrollEvent
event(eventType
, scrollBar
->GetId());
212 event
.SetEventObject(scrollBar
);
213 event
.SetPosition(cbs
->value
);
214 scrollBar
->GetEventHandler()->ProcessEvent(event
);
216 if (!scrollBar->inSetValue)
217 scrollBar->ProcessCommand(event);