home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
vos2-121.zip
/
v
/
srcos2
/
vsliderc.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-31
|
9KB
|
284 lines
//===============================================================
// vsliderc.cxx - SliderCmd - Windows
//
// Copyright (C) 1995,1996,1997,1998 Bruce E. Wampler
//
// This file is part of the V C++ GUI Framework, and is covered
// under the terms of the GNU Library General Public License,
// Version 2. This library has NO WARRANTY. See the source file
// vapp.cxx for more complete information about license terms.
//===============================================================
#include <v/vos2.h> // for OS/2 stuff
#include <v/vsliderc.h> // our definitions
#include <v/vcmdprnt.h> // a command parent
#include <v/vapp.h>
// the windows slider code requires that when it is set, the
// value it is to be set to must be in the range 0-100 regardless
// of the minval/maxval range it was originally given by the contructor. It
// will however respond with the value in the correct range. This
// heinously broken behavior is emulated in the OS/2 port by setting
// the following variable (and needs to be set to get the *&%^* V icon
// editor to work correctly...)
#define EMULATE_BROKEN_WINDOZE_CODE
//=================>>> vSliderCmd::vSliderCmd <<<=======================
vSliderCmd::vSliderCmd(vCmdParent* dp, CommandObject* dc) :
vCmd(dp, dc)
{
initialize(); // and initialize
}
//=======================>>> vSliderCmd::~vSliderCmd <<<=======================
vSliderCmd::~vSliderCmd()
{
SysDebug(Constructor,"vSliderCmd::~vSliderCmd() Destructor\n")
}
//=====================>>> vSliderCmd::initialize <<<=======================
void vSliderCmd::initialize()
{
SysDebug(Constructor,"vSliderCmd::vSliderCmd() constructor\n")
_initialPosnSet=0; // initial slider position not set yet
long style = SLS_PRIMARYSCALE1 |
SLS_SNAPTOINCREMENT | SLS_RIBBONSTRIP;
if (_parentWin->_dialogType != aCmdBar)
style |= WS_TABSTOP | WS_GROUP; // default for a button
else
style |= WS_GROUP;
CopyToLocal(); // Make local copies of CmdObject
if (!(dlgCmd->attrs & CA_Hidden)) // Check for Hidden
style |= WS_VISIBLE;
// Set the size of the slider
if (dlgCmd->attrs & CA_Vertical)
{
style |= SLS_VERTICAL | SLS_HOMEBOTTOM | SLS_BUTTONSBOTTOM | SLS_LEFT;
_w = 18; // set my width
_h = 76; // regular size
// the normal slider has a 0-100 range
_scd.usScale1Increments = 101;
_scd.usScale1Spacing = 1;
if (dlgCmd->attrs & CA_Large)
{
_h = 124;
_scd.usScale1Increments = 101;
_scd.usScale1Spacing = 2;
}
else if (dlgCmd->attrs & CA_Small)
{
_h = 50;
// the small slider has only a 0-50 range
_scd.usScale1Increments = 51;
_scd.usScale1Spacing = 1;
}
// user override
if (dlgCmd->size > 0 && dlgCmd->size < 2048)
{
_h = 25 + (dlgCmd->size/2);
// the user defined slider has a used defined range
_scd.usScale1Increments = dlgCmd->size;
_scd.usScale1Spacing = 1;
}
}
// else its a horizontal slider
else
{
style |= SLS_HORIZONTAL | SLS_HOMELEFT | SLS_BUTTONSLEFT | SLS_BOTTOM;
_h = 13; // default height
_w = 100;
// the normal slider has a 0-100 range
_scd.usScale1Increments = 101;
_scd.usScale1Spacing = 1;
if (dlgCmd->attrs & CA_Large)
{
_w = 166;
_scd.usScale1Increments = 101;
_scd.usScale1Spacing = 2;
}
else if (dlgCmd->attrs & CA_Small)
{
_w = 67;
// the small slider has only a 0-50 range
_scd.usScale1Increments = 51;
_scd.usScale1Spacing = 1;
}
// user override
if (dlgCmd->size > 0 && dlgCmd->size < 2048)
{
_w = 35 + ((dlgCmd->size*65)/100);
// the user defined slider has a used defined range
_scd.usScale1Increments = dlgCmd->size;
_scd.usScale1Spacing = 1;
}
}
int* minMax = (int *)_itemList; // giving range?
_minVal = 0; _maxVal = 100; // default min/max
if (minMax != 0) // They gave a range list
{
_minVal = minMax[0];
_maxVal = minMax[1];
}
if (_minVal > _maxVal)
{
SysDebug2(BadVals,"vSliderCmd:vSliderCmd - bad range %d to %d\n",_minVal,_maxVal)
_minVal = 0; _maxVal = 100; // make some sense!
}
if (_retVal < _minVal) // set a legal value for the top
_curVal = _minVal;
else if (_retVal > _maxVal)
_curVal = _maxVal;
else
_curVal = _retVal;
_scd.cbSize = sizeof(SLDCDATA);
_scd.usScale2Increments = 101;
_scd.usScale2Spacing = 1;
// SetPosition will compute the _x and _y position of the control based
// upon _w and _h and also its relationship to any frames and adjacent
// controls. In addition, the frame size will be adjusted to make sure
// it can hold the new control
_parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf,
dlgCmd->cBelow);
if (dlgCmd->attrs & CA_Vertical)
{
_y += 2;
_h -= 2; // we play this game to get better positioning in a frame
}
else if (dlgCmd->attrs & CA_Horizontal)
{
// _x += 1;
_y += 2;
_h -= 2; // we play this game to get better positioning in a frame
}
// AddDlgControl will create the control in the dialog template using
// the supplied x, y, w, h parameters.
_CtrlOffset = _parentWin->AddDlgControl(_x, _y, _w, _h, _cmdId,
style, WC_SLIDER, _title, NULL, _scd.cbSize, &_scd);
}
//==================>>> vSliderCmd::GetCmdValue <<<=========================
int vSliderCmd::GetCmdValue(ItemVal id) VCONST
{
if (id != _cmdId)
return -1;
return _curVal;
}
//=====================>>> vSliderCmd::SetCmdVal <<<=========================
void vSliderCmd::SetCmdVal(ItemVal val, ItemSetType st)
{
SysDebug2(Misc,"vSliderCmd::SetCmdVal(val:%d, type:%d)\n",val,st)
HWND myHwnd = GetMyHwnd(_cmdId);
switch (st)
{
case Sensitive:
_Sensitive = val; // set
WinEnableWindow (myHwnd, val);
break;
case Hidden:
if (val)
WinShowWindow (myHwnd, FALSE);
else
WinShowWindow (myHwnd, TRUE);
break;
case Value:
if (val < _minVal || val > _maxVal )
return;
_curVal = val;
#ifdef EMULATE_BROKEN_WINDOZE_CODE
// we assume the input range is always 0-100 to emulate the
// broken windoze port of V
// the max slider position is given by _scd.usScale1Increments-1
// we take care to minimize rounding errors here
int percent = (_scd.usScale1Increments - 1)*val + 50;
percent /= 100;
#else
// otherwise, we do this logically...
double frac = val - _minVal;
frac = frac/(_maxVal - _minVal);
// the max slider position is given by _scd.usScale1Increments-1
int percent = frac * (_scd.usScale1Increments - 1);
#endif
// Now set appropriate _curVal, scroll
WinSendMsg (myHwnd, SLM_SETSLIDERINFO,
MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE), (MPARAM) percent);
// MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_INCREMENTVALUE), (MPARAM) percent);
// set a few tick marks
SHORT ticksize=4;
SHORT tickposn[3] = {0, 50, 100};
tickposn[1] = (_scd.usScale1Increments - 1)/2;
tickposn[2] = (_scd.usScale1Increments - 1);
/*
if (dlgCmd->attrs & CA_Small)
{
tickposn[0] = 0;
tickposn[1] = 25;
tickposn[2] = 50;
}
*/
for (int i=0; i<3; i++)
{
WinSendMsg (myHwnd, SLM_SETTICKSIZE,
MPFROM2SHORT(tickposn[i], ticksize), (MPARAM) NULL);
}
break;
}
}
//===================>>> vSliderCmd::vCmdCallback <<<=======================
void vSliderCmd::CmdCallback(UINT uMsg, MPARAM mp1, MPARAM mp2)
{
// See if we are getting a message we care about
if (uMsg == WM_CONTROL)
{
// SysDebug1(OS2Dev,"vSliderCmd::CmdCallBack \n")
switch (SHORT2FROMMP(mp1))
{
case SLN_CHANGE: // arm moved
case SLN_SLIDERTRACK: // arm dragged by mouse
int val = LONGFROMMP(mp2);
// scale by slider length to get percent
double percent = val*100./(_scd.usScale1Increments - 1);
_curVal = (int)( (percent * (_maxVal-_minVal) / 100) + _minVal );
// SysDebug2(OS2Dev,"vSliderCmd::CmdCallBack val=%u _curVal=%u\n", val, _curVal)
// WorkAround... I'm getting traps because the inital slider position is
// set during WM_INITDLG which causes the slider to respond with a command
// message with the updated value and often the code isn't ready
// to handle that command this early on. A good example of this is the
// vopengl shapes program which will trap because the slider command handler
// needs the timer object which is instantiated after the slider in the
// commandpane is built and initialized.
if (_initialPosnSet)
_parentWin->ProcessCmd(_cmdId, _curVal, dlgCmd->cmdType);
else
_initialPosnSet=1;
}
}
}