7520f3da33
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38791 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
186 lines
4.7 KiB
C++
186 lines
4.7 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/motif/scrolbar.cpp
|
|
// Purpose: wxScrollBar
|
|
// Author: Julian Smart
|
|
// Modified by:
|
|
// Created: 17/09/98
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#include "wx/scrolbar.h"
|
|
|
|
#ifdef __VMS__
|
|
#pragma message disable nosimpint
|
|
#define XtDisplay XTDISPLAY
|
|
#endif
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/ScrollBar.h>
|
|
#ifdef __VMS__
|
|
#pragma message enable nosimpint
|
|
#endif
|
|
|
|
#include "wx/motif/private.h"
|
|
|
|
static void wxScrollBarCallback(Widget widget, XtPointer clientData,
|
|
XmScaleCallbackStruct *cbs);
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
|
|
|
|
// Scrollbar
|
|
bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
|
|
const wxPoint& pos,
|
|
const wxSize& size, long style,
|
|
const wxValidator& validator,
|
|
const wxString& name)
|
|
{
|
|
if( !CreateControl( parent, id, pos, size, style, validator, name ) )
|
|
return false;
|
|
|
|
wxSize newSize =
|
|
( style & wxHORIZONTAL ) ? wxSize( 140, 16 ) : wxSize( 16, 140 );
|
|
if( size.x != -1 ) newSize.x = size.x;
|
|
if( size.y != -1 ) newSize.y = size.y;
|
|
|
|
Widget parentWidget = (Widget) parent->GetClientWidget();
|
|
|
|
m_mainWidget =
|
|
DoCreateScrollBar( (WXWidget)parentWidget,
|
|
(wxOrientation)(style & (wxHORIZONTAL|wxVERTICAL)),
|
|
(void (*)())wxScrollBarCallback );
|
|
|
|
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
|
|
pos.x, pos.y, newSize.x, newSize.y);
|
|
ChangeBackgroundColour();
|
|
|
|
return true;
|
|
}
|
|
|
|
wxScrollBar::~wxScrollBar()
|
|
{
|
|
}
|
|
|
|
void wxScrollBar::SetThumbPosition(int pos)
|
|
{
|
|
XtVaSetValues ((Widget) m_mainWidget,
|
|
XmNvalue, pos,
|
|
NULL);
|
|
}
|
|
|
|
int wxScrollBar::GetThumbPosition() const
|
|
{
|
|
int pos;
|
|
XtVaGetValues((Widget) m_mainWidget,
|
|
XmNvalue, &pos, NULL);
|
|
return pos;
|
|
}
|
|
|
|
void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
|
|
bool WXUNUSED(refresh))
|
|
{
|
|
m_viewSize = pageSize;
|
|
m_pageSize = thumbSize;
|
|
m_objectSize = range;
|
|
|
|
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)
|
|
{
|
|
SetThumbPosition(event.GetInt());
|
|
ProcessCommand(event);
|
|
}
|
|
|
|
void wxScrollBar::ChangeFont(bool WXUNUSED(keepOriginalSize))
|
|
{
|
|
// TODO
|
|
// Do anything for a scrollbar? A font will never be seen.
|
|
}
|
|
|
|
void wxScrollBar::ChangeBackgroundColour()
|
|
{
|
|
wxWindow::ChangeBackgroundColour();
|
|
|
|
XtVaSetValues ((Widget) GetMainWidget(),
|
|
XmNtroughColor, m_backgroundColour.AllocColour(XtDisplay((Widget) GetMainWidget())),
|
|
NULL);
|
|
}
|
|
|
|
static void wxScrollBarCallback(Widget widget, XtPointer clientData,
|
|
XmScaleCallbackStruct *cbs)
|
|
{
|
|
wxScrollBar *scrollBar = (wxScrollBar*)wxGetWindowFromTable(widget);
|
|
wxOrientation orientation = (wxOrientation)wxPtrToUInt(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:
|
|
{
|
|
eventType = wxEVT_SCROLL_THUMBRELEASE;
|
|
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(),
|
|
cbs->value, orientation);
|
|
event.SetEventObject(scrollBar);
|
|
scrollBar->GetEventHandler()->ProcessEvent(event);
|
|
}
|