diff options
author | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:56:41 -0800 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2009-11-04 11:59:33 -0800 |
commit | d577d991b97ae2b5ee1af23641bcffc3f83af5b2 (patch) | |
tree | 590639d50205d1bcfaff2a7d2dc6ebf3f373c7ed /iup/src/win/iupwin_val.c |
Initial import. Contains the im, cd and iup librairies, and a "working" Makefile for them under linux.
Diffstat (limited to 'iup/src/win/iupwin_val.c')
-rwxr-xr-x | iup/src/win/iupwin_val.c | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/iup/src/win/iupwin_val.c b/iup/src/win/iupwin_val.c new file mode 100755 index 0000000..706c612 --- /dev/null +++ b/iup/src/win/iupwin_val.c @@ -0,0 +1,315 @@ +/** \file + * \brief Valuator Control + * + * See Copyright Notice in "iup.h" + */ + +#include <windows.h> +#include <commctrl.h> + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include <memory.h> +#include <stdarg.h> + +#include "iup.h" +#include "iupcbs.h" + +#include "iup_object.h" +#include "iup_attrib.h" +#include "iup_str.h" +#include "iup_val.h" +#include "iup_drv.h" + +#include "iupwin_drv.h" +#include "iupwin_handle.h" +#include "iupwin_draw.h" + + +#ifndef SHRT_MAX +#define SHRT_MAX 32767 +#endif + +void iupdrvValGetMinSize(Ihandle* ih, int *w, int *h) +{ + int ticks_size = 0; + if (iupAttribGetInt(ih, "SHOWTICKS")) + { + char* tickspos = iupAttribGetStr(ih, "TICKSPOS"); + if(iupStrEqualNoCase(tickspos, "BOTH")) + ticks_size = 2*8; + else + ticks_size = 8; + } + + if (ih->data->type == IVAL_HORIZONTAL) + { + *w = 35; + *h = 30+ticks_size; + } + else + { + *w = 30+ticks_size; + *h = 35; + } +} + +static int winValSetStepAttrib(Ihandle* ih, const char* value) +{ + int linesize; + ih->data->step = atof(value); + linesize = (int)(ih->data->step*SHRT_MAX); + SendMessage(ih->handle, TBM_SETLINESIZE, 0, linesize); + return 0; /* do not store value in hash table */ +} + +static int winValSetPageStepAttrib(Ihandle* ih, const char* value) +{ + int pagesize; + ih->data->pagestep = atof(value); + pagesize = (int)(ih->data->pagestep*SHRT_MAX); + SendMessage(ih->handle, TBM_SETPAGESIZE, 0, pagesize); + return 0; /* do not store value in hash table */ +} + +static int winValSetShowTicksAttrib(Ihandle* ih, const char* value) +{ + int tick_freq, show_ticks; + + if (!ih->data->show_ticks) /* can only set if already not zero */ + return 0; + + show_ticks = atoi(value); + if (show_ticks<2) show_ticks=2; + ih->data->show_ticks = show_ticks; + + /* Defines the interval frequency for tick marks */ + tick_freq = SHRT_MAX/(show_ticks-1); + SendMessage(ih->handle, TBM_SETTICFREQ, tick_freq, 0); + return 0; +} + +static int winValSetValueAttrib(Ihandle* ih, const char* value) +{ + int ival; + + ih->data->val = atof(value); + iupValCropValue(ih); + + ival = (int)(((ih->data->val-ih->data->vmin)/(ih->data->vmax - ih->data->vmin))*SHRT_MAX); + if (ih->data->inverted) + ival = SHRT_MAX-ival; + + SendMessage(ih->handle, TBM_SETPOS, TRUE, ival); + return 0; /* do not store value in hash table */ +} + + +/*********************************************************************************************/ + + +static int winValCtlColor(Ihandle* ih, HDC hdc, LRESULT *result) +{ + COLORREF cr; + if (iupwinGetParentBgColor(ih, &cr)) + { + SetDCBrushColor(hdc, cr); + *result = (LRESULT)GetStockObject(DC_BRUSH); + return 1; + } + return 0; +} + +static int winValCustomScroll(Ihandle* ih, int msg) +{ + double old_val = ih->data->val; + int ival; + IFn cb; + + ival = (int)SendMessage(ih->handle, TBM_GETPOS, 0, 0); + if (ih->data->inverted) + ival = SHRT_MAX-ival; + + ih->data->val = (((double)ival/(double)SHRT_MAX)*(ih->data->vmax - ih->data->vmin)) + ih->data->vmin; + iupValCropValue(ih); + + cb = (IFn)IupGetCallback(ih, "VALUECHANGED_CB"); + if (cb) + { + if (ih->data->val == old_val) + return 0; + + cb(ih); + } + else + { + IFnd cb_old = NULL; + switch (msg) + { + case TB_BOTTOM: + case TB_TOP: + case TB_LINEDOWN: + case TB_LINEUP: + case TB_PAGEDOWN: + case TB_PAGEUP: + { + cb_old = (IFnd) IupGetCallback(ih, "BUTTON_PRESS_CB"); + break; + } + case TB_THUMBPOSITION: + { + cb_old = (IFnd) IupGetCallback(ih, "BUTTON_RELEASE_CB"); + break; + } + case TB_THUMBTRACK: + { + cb_old = (IFnd) IupGetCallback(ih, "MOUSEMOVE_CB"); + break; + } + } + if (cb_old) + cb_old(ih, ih->data->val); + } + + return 0; /* not used */ +} + +static void winValIncPageValue(Ihandle *ih, int dir) +{ + int pagesize, ival; + pagesize = (int)(ih->data->pagestep*SHRT_MAX); + + ival = (int)SendMessage(ih->handle, TBM_GETPOS, 0, 0); + ival += dir*pagesize; + if (ival < 0) ival = 0; + if (ival > SHRT_MAX) ival = SHRT_MAX; + SendMessage(ih->handle, TBM_SETPOS, TRUE, ival); + + winValCustomScroll(ih, 0); +} + +static int winValProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) +{ + (void)lp; + + switch (msg) + { + case WM_ERASEBKGND: + { + RECT rect; + HDC hDC = (HDC)wp; + GetClientRect(ih->handle, &rect); + iupwinDrawParentBackground(ih, hDC, &rect); + /* return non zero value */ + *result = 1; + return 1; + } + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + { + if (iupwinBaseProc(ih, msg, wp, lp, result)==1) + return 1; + + if (GetKeyState(VK_CONTROL) & 0x8000) /* handle Ctrl+Arrows */ + { + if (wp == VK_UP || wp == VK_LEFT) + { + winValIncPageValue(ih, -1); + *result = 0; + return 1; + } + if (wp == VK_RIGHT || wp == VK_DOWN) + { + winValIncPageValue(ih, 1); + *result = 0; + return 1; + } + } + return 0; + } + } + + return iupwinBaseProc(ih, msg, wp, lp, result); +} + + +/*********************************************************************************************/ + + +static int winValMapMethod(Ihandle* ih) +{ + DWORD dwStyle = WS_CHILD | TBS_AUTOTICKS; + int show_ticks; + + if (!ih->parent) + return IUP_ERROR; + + /* Track bar Orientation */ + if (ih->data->type == IVAL_HORIZONTAL) + dwStyle |= TBS_HORZ; + else + dwStyle |= TBS_VERT; + + if (iupAttribGetBoolean(ih, "CANFOCUS")) + dwStyle |= WS_TABSTOP; + + /* Track bar Ticks */ + show_ticks = iupAttribGetInt(ih, "SHOWTICKS"); + if (!show_ticks) + { + dwStyle |= TBS_NOTICKS; /* No show_ticks */ + } + else + { + char* tickspos; + + if (show_ticks<2) show_ticks=2; + ih->data->show_ticks = show_ticks; /* non zero value, can be changed later, but not to zero */ + + /* Defines the position of tick marks */ + tickspos = iupAttribGetStr(ih, "TICKSPOS"); + if(iupStrEqualNoCase(tickspos, "BOTH")) + dwStyle |= TBS_BOTH; + else if(iupStrEqualNoCase(tickspos, "REVERSE")) + dwStyle |= TBS_BOTTOM; /* same as TBS_RIGHT */ + else /* NORMAL */ + dwStyle |= TBS_TOP; /* same as TBS_LEFT */ + } + + if (!iupwinCreateWindowEx(ih, TRACKBAR_CLASS, 0, dwStyle)) + return IUP_ERROR; + + /* Process Keyboard */ + IupSetCallback(ih, "_IUPWIN_CTRLPROC_CB", (Icallback)winValProc); + + /* Process Val Scroll commands */ + IupSetCallback(ih, "_IUPWIN_CUSTOMSCROLL_CB", (Icallback)winValCustomScroll); + + /* Process background color */ + IupSetCallback(ih, "_IUPWIN_CTLCOLOR_CB", (Icallback)winValCtlColor); + + /* configure the native range */ + SendMessage(ih->handle, TBM_SETRANGEMIN, FALSE, 0); + SendMessage(ih->handle, TBM_SETRANGEMAX, FALSE, SHRT_MAX); + + if (ih->data->inverted) + SendMessage(ih->handle, TBM_SETPOS, FALSE, SHRT_MAX); /* default initial position is at MIN */ + + return IUP_NOERROR; +} + +void iupdrvValInitClass(Iclass* ic) +{ + /* Driver Dependent Class functions */ + ic->Map = winValMapMethod; + + /* IupVal only */ + iupClassRegisterAttribute(ic, "VALUE", iupValGetValueAttrib, winValSetValueAttrib, NULL, NULL, IUPAF_NO_DEFAULTVALUE|IUPAF_NO_INHERIT); + iupClassRegisterAttribute(ic, "SHOWTICKS", iupValGetShowTicksAttrib, winValSetShowTicksAttrib, IUPAF_SAMEASSYSTEM, "0", IUPAF_DEFAULT); + iupClassRegisterAttribute(ic, "PAGESTEP", iupValGetPageStepAttrib, winValSetPageStepAttrib, "0.1", NULL, IUPAF_NO_INHERIT); /* force new default value */ + iupClassRegisterAttribute(ic, "STEP", iupValGetStepAttrib, winValSetStepAttrib, "0.01", NULL, IUPAF_NO_INHERIT); /* force new default value */ + + iupClassRegisterAttribute(ic, "TICKSPOS", NULL, NULL, "NORMAL", NULL, IUPAF_NOT_MAPPED); +} |