/*
* ScrollBar.h
* Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL++2000
// 2000.02.18
#pragma once
#include <sol\Primitive.h>
namespace SOL {
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
class ScrollBar :public Primitive {
private:
int pageIncrement;
int lineIncrement;
public:
static const int ScrollBar::HORIZONTAL = (int)SB_HORZ;
static const int ScrollBar::VERTICAL = (int)SB_VERT;
protected:
LRESULT ScrollBar::defaultProc(Event& event)
{
return discardInput(event);
}
public:
ScrollBar():Primitive() { }
public:
ScrollBar(View* parent, const TCHAR* name, Args& args)
:Primitive(parent, name,
args.set(XmNpredefined, TRUE)
.set(XmNclassName, _T("ScrollBar")))
{
pageIncrement = 4;
lineIncrement = 1;
setValues(args);
}
public:
virtual Boolean create(View* parent, const TCHAR* name, Args& args)
{
Boolean rc = Primitive::create(parent, name,
args.set(XmNpredefined, TRUE)
.set(XmNclassName, _T("ScrollBar")));
pageIncrement = 4;
lineIncrement = 1;
setValues(args);
return rc;
}
public:
int moveThumb(Event& event)
{
int pos = getPos();
int prev = pos;
SCROLLINFO scInfo;
int min, max;
getScrollRange(&min, &max);
int range = max - min;
int request = LOWORD(event.getWParam());
switch(request) {
case SB_PAGEDOWN: pos += pageIncrement;
case SB_LINEDOWN: pos = Min(range, pos + lineIncrement);
break;
case SB_PAGEUP: pos -= pageIncrement;
case SB_LINEUP: pos = Max(0, pos - lineIncrement);
break;
case SB_TOP: pos = 0;
break;
case SB_BOTTOM: pos = range;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
scInfo.fMask = SIF_ALL;
getScrollInfo(&scInfo);
pos = scInfo.nTrackPos;
break;
default:
break;
}
setPos(pos);
return prev - pos;
}
public:
void ScrollBar::getValues(Args& args)
{
Primitive::getValues(args);
int num = args.getCount();
Arg* arg = args.getArgList();
int max, min;
for (int i = 0; i<num; i++) {
const TCHAR* name = arg[i].name;
ulong* val = (ulong*)arg[i].value;
if (name == XmNpageIncrement) {
*val = pageIncrement; // 08/02 '94
continue;
}
if (name == XmNlineIncrement) {
*val = lineIncrement;
continue;
}
if (name == XmNmaximum) {
getScrollRange(&min, &max);
*val = max;
continue;
}
if (name == XmNminimum) {
getScrollRange(&min, &max);
*val = min;
continue;
}
if (name == XmNthumbPosition) {
*val = (ulong)getPos();
continue;
}
}
}
public:
void setValues(Args& args)
{
Primitive::setValues(args);
ulong val;
if (args.get(XmNpageIncrement, &val))
pageIncrement = (int)val;
if (args.get(XmNlineIncrement, &val))
lineIncrement = (int)val;
int max, min;
getScrollRange(&min, &max);
if (args.get(XmNmaximum, &val))
setScrollRange(min, (int)val);
getScrollRange(&min, &max);
if (args.get(XmNminimum, &val))
setScrollRange((int)val, max);
if (args.get(XmNthumbPosition, &val))
setPos((int)val);
}
public:
void disable()
{
if(isEditable()) {
if(!getNewProc())
replaceWindowProc();
}
else {
View::disable();
}
}
public:
void enable()
{
if(isEditable()) {
restoreWindowProc();
}
else {
View::enable();
}
}
public:
BOOL getScrollInfo(SCROLLINFO* scInfo)
{
BOOL rc = FALSE;
if(scInfo) {
scInfo->cbSize = sizeof(SCROLLINFO);
rc = ::GetScrollInfo(getWindow(), SB_CTL, scInfo);
}
return rc;
}
public:
int setScrollInfo(SCROLLINFO* scInfo)
{
int pos = 0;
if(scInfo) {
scInfo->cbSize = sizeof(SCROLLINFO);
pos = ::SetScrollInfo(getWindow(), SB_CTL, scInfo, TRUE);
}
return pos;
}
int getPos() {
return ::GetScrollPos(getWindow(), SB_CTL);
}
void getScrollRange(int* min, int* max) {
::GetScrollRange(getWindow(), SB_CTL, min, max);
}
void setPos(int pos) {
::SetScrollPos(getWindow(), SB_CTL, pos, TRUE);
}
int getPageIncrement() { return pageIncrement; }
int getLineIncrement() { return lineIncrement; }
void setScrollRange(int min, int max) {
::SetScrollRange(getWindow(), SB_CTL, min, max, TRUE);
}
void setPageIncrement(int val) { pageIncrement = val; }
void setLineIncrement(int val) { lineIncrement = val; }
void enableArrows(int arrows) {
send(SBM_ENABLE_ARROWS, (WPARAM)arrows, 0L);
}
void getRange(int* min, int* max) {
send(SBM_GETRANGE, (WPARAM)min, (LPARAM)max);
}
void setRange(int min, int max) {
send(SBM_SETRANGE, (WPARAM)min, (LPARAM)max);
}
void setRangeRedraw(int min, int max) {
send(SBM_SETRANGEREDRAW, (WPARAM)min, (LPARAM)max);
}
};
}
|