X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..5b6ec9803a058368a1b240a22d444c7301c5715a:/src/motif/scrolbar.cpp diff --git a/src/motif/scrolbar.cpp b/src/motif/scrolbar.cpp index 99e5316beb..10b670d400 100644 --- a/src/motif/scrolbar.cpp +++ b/src/motif/scrolbar.cpp @@ -15,9 +15,18 @@ #include "wx/scrolbar.h" +#include +#include +#include +#include + +#include + +static void wxScrollBarCallback(Widget widget, XtPointer clientData, + XmScaleCallbackStruct *cbs); + #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl) - #endif // Scrollbar @@ -31,7 +40,9 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, return FALSE; parent->AddChild(this); SetName(name); - SetValidator(validator); + m_backgroundColour = parent->GetBackgroundColour(); + m_foregroundColour = parent->GetForegroundColour(); + SetValidator(validator); m_windowStyle = style; @@ -40,7 +51,50 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id, else m_windowId = id; - // TODO create scrollbar + int x = pos.x; + int y = pos.y; + int width = size.x; + int height = size.y; + + if (width == -1) + { + if (style & wxHORIZONTAL) + width = 140; + else + width = 12; + } + if (height == -1) + { + if (style & wxVERTICAL) + height = 140; + else + height = 12; + } + + Widget parentWidget = (Widget) parent->GetClientWidget(); + int direction = (style & wxHORIZONTAL) ? XmHORIZONTAL: XmVERTICAL; + + Widget scrollBarWidget = XtVaCreateManagedWidget("scrollBarWidget", + xmScrollBarWidgetClass, parentWidget, + XmNorientation, direction, + NULL); + + m_mainWidget = (Widget) scrollBarWidget; + + // This will duplicate other events + // XtAddCallback(scrollBarWidget, XmNvalueChangedCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNdragCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNdecrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNincrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNpageDecrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNpageIncrementCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNtoTopCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + XtAddCallback(scrollBarWidget, XmNtoBottomCallback, (XtCallbackProc)wxScrollBarCallback, (XtPointer)this); + + SetCanAddEventHandler(TRUE); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, x, y, width, height); + ChangeBackgroundColour(); + return TRUE; } @@ -48,15 +102,27 @@ wxScrollBar::~wxScrollBar() { } -void wxScrollBar::SetPosition(int viewStart) +void wxScrollBar::SetThumbPosition(int pos) { - // TODO + if (m_mainWidget) + { + XtVaSetValues ((Widget) m_mainWidget, + XmNvalue, pos, + NULL); + } } -int wxScrollBar::GetPosition() const +int wxScrollBar::GetThumbPosition() const { - // TODO - return 0; + if (m_mainWidget) + { + int pos; + XtVaGetValues((Widget) m_mainWidget, + XmNvalue, &pos, NULL); + return pos; + } + else + return 0; } void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize, @@ -66,9 +132,19 @@ void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageS m_pageSize = thumbSize; m_objectSize = range; - // TODO -} + if (range == 0) + range = 1; + if (thumbSize == 0) + thumbSize = 1; + XtVaSetValues((Widget) m_mainWidget, + XmNvalue, position, + XmNminimum, 0, + XmNmaximum, range, + XmNsliderSize, thumbSize, + XmNpageIncrement, pageSize, + NULL); +} void wxScrollBar::Command(wxCommandEvent& event) { @@ -76,3 +152,86 @@ void wxScrollBar::Command(wxCommandEvent& event) ProcessCommand(event); } +void wxScrollBar::ChangeFont(bool keepOriginalSize) +{ + // TODO +} + +void wxScrollBar::ChangeBackgroundColour() +{ + // TODO +} + +void wxScrollBar::ChangeForegroundColour() +{ + // TODO +} + +static void wxScrollBarCallback(Widget widget, XtPointer clientData, + XmScaleCallbackStruct *cbs) +{ + wxScrollBar *scrollBar = (wxScrollBar *)clientData; + + wxEventType eventType = wxEVT_NULL; + switch (cbs->reason) + { + case XmCR_INCREMENT: + { + eventType = wxEVT_SCROLL_LINEDOWN; + break; + } + case XmCR_DECREMENT: + { + eventType = wxEVT_SCROLL_LINEUP; + break; + } + case XmCR_DRAG: + { + eventType = wxEVT_SCROLL_THUMBTRACK; + break; + } + case XmCR_VALUE_CHANGED: + { + // TODO: Should this be intercepted too, or will it cause + // duplicate events? + eventType = wxEVT_SCROLL_THUMBTRACK; + break; + } + case XmCR_PAGE_INCREMENT: + { + eventType = wxEVT_SCROLL_PAGEDOWN; + break; + } + case XmCR_PAGE_DECREMENT: + { + eventType = wxEVT_SCROLL_PAGEUP; + break; + } + case XmCR_TO_TOP: + { + eventType = wxEVT_SCROLL_TOP; + break; + } + case XmCR_TO_BOTTOM: + { + eventType = wxEVT_SCROLL_BOTTOM; + break; + } + default: + { + // Should never get here + wxFAIL_MSG("Unknown scroll event."); + break; + } + } + + wxScrollEvent event(eventType, scrollBar->GetId()); + event.SetEventObject(scrollBar); + event.SetPosition(cbs->value); + scrollBar->GetEventHandler()->ProcessEvent(event); +/* + if (!scrollBar->inSetValue) + scrollBar->ProcessCommand(event); +*/ +} +