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_tabs.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_tabs.c')
-rwxr-xr-x | iup/src/win/iupwin_tabs.c | 680 |
1 files changed, 680 insertions, 0 deletions
diff --git a/iup/src/win/iupwin_tabs.c b/iup/src/win/iupwin_tabs.c new file mode 100755 index 0000000..682f451 --- /dev/null +++ b/iup/src/win/iupwin_tabs.c @@ -0,0 +1,680 @@ +/** \file +* \brief Tabs Control +* +* See Copyright Notice in "iup.h" +*/ + +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#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_drv.h" +#include "iup_stdcontrols.h" +#include "iup_tabs.h" +#include "iup_image.h" +#include "iup_array.h" + +#include "iupwin_drv.h" +#include "iupwin_handle.h" +#include "iupwin_draw.h" +#include "iupwin_info.h" + + +int iupdrvTabsExtraDecor(Ihandle* ih) +{ + (void)ih; + return 0; +} + +int iupdrvTabsGetLineCountAttrib(Ihandle* ih) +{ + return (int)SendMessage(ih->handle, TCM_GETROWCOUNT, 0, 0); +} + +static HWND winTabsGetPageWindow(Ihandle* ih, int pos) +{ + TCITEM tie; + tie.mask = TCIF_PARAM; + SendMessage(ih->handle, TCM_GETITEM, pos, (LPARAM)&tie); + return (HWND)tie.lParam; +} + +void iupdrvTabsSetCurrentTab(Ihandle* ih, int pos) +{ + int prev_pos = SendMessage(ih->handle, TCM_GETCURSEL, 0, 0); + HWND tab_page = winTabsGetPageWindow(ih, prev_pos); + ShowWindow(tab_page, SW_HIDE); + + SendMessage(ih->handle, TCM_SETCURSEL, pos, 0); + + tab_page = winTabsGetPageWindow(ih, pos); + ShowWindow(tab_page, SW_SHOW); +} + +int iupdrvTabsGetCurrentTab(Ihandle* ih) +{ + return (int)SendMessage(ih->handle, TCM_GETCURSEL, 0, 0); +} + +static int winTabsGetImageIndex(Ihandle* ih, const char* name) +{ + HIMAGELIST image_list; + int count, i, bpp, ret; + Iarray* bmp_array; + HBITMAP *bmp_array_data, hMask=NULL; + HBITMAP bmp = iupImageGetImage(name, ih, 0); + if (!bmp) + return -1; + + /* the array is used to avoi adding the same bitmap twice */ + bmp_array = (Iarray*)iupAttribGet(ih, "_IUPWIN_BMPARRAY"); + if (!bmp_array) + { + /* create the array if does not exist */ + bmp_array = iupArrayCreate(50, sizeof(HBITMAP)); + iupAttribSetStr(ih, "_IUPWIN_BMPARRAY", (char*)bmp_array); + } + + bmp_array_data = iupArrayGetData(bmp_array); + + image_list = (HIMAGELIST)SendMessage(ih->handle, TCM_GETIMAGELIST, 0, 0); + if (!image_list) + { + int width, height; + UINT flags = ILC_COLOR32|ILC_MASK; + + /* must use this info, since image can be a driver image loaded from resources */ + iupdrvImageGetInfo(bmp, &width, &height, &bpp); + + /* create the image list if does not exist */ + image_list = ImageList_Create(width, height, flags, 0, 50); + SendMessage(ih->handle, TCM_SETIMAGELIST, 0, (LPARAM)image_list); + } + else + iupdrvImageGetInfo(bmp, NULL, NULL, &bpp); + + /* check if that bitmap is already added to the list, + but we can not compare with the actual bitmap at the list since it is a copy */ + count = ImageList_GetImageCount(image_list); + for (i=0; i<count; i++) + { + if (bmp_array_data[i] == bmp) + return i; + } + + if (bpp == 8) + { + Ihandle* image = IupGetHandle(name); + if (image) + { + iupAttribSetStr(image, "_IUPIMG_NO_INVERT", "1"); + hMask = iupdrvImageCreateMask(image); + iupAttribSetStr(image, "_IUPIMG_NO_INVERT", NULL); + } + } + + bmp_array_data = iupArrayInc(bmp_array); + bmp_array_data[i] = bmp; + ret = ImageList_Add(image_list, bmp, hMask); /* the bmp is duplicated at the list */ + DeleteObject(hMask); + return ret; +} + +static int winTabsGetPageWindowPos(Ihandle* ih, HWND tab_page) +{ + TCITEM tie; + int pos, num_tabs; + + num_tabs = (int)SendMessage(ih->handle, TCM_GETITEMCOUNT, 0, 0); + tie.mask = TCIF_PARAM; + + for (pos=0; pos<num_tabs; pos++) + { + SendMessage(ih->handle, TCM_GETITEM, pos, (LPARAM)&tie); + if (tab_page == (HWND)tie.lParam) + return pos; + } + + return -1; +} + +static void winTabsPlacePageWindows(Ihandle* ih, int w, int h) +{ + TCITEM tie; + int pos, num_tabs; + RECT rect; + + num_tabs = (int)SendMessage(ih->handle, TCM_GETITEMCOUNT, 0, 0); + tie.mask = TCIF_PARAM; + + /* Calculate the display rectangle, assuming the + tab control is the size of the client area. */ + SetRect(&rect, 0, 0, w, h); + SendMessage(ih->handle, TCM_ADJUSTRECT, FALSE, (LPARAM)&rect); + + for (pos=0; pos<num_tabs; pos++) + { + SendMessage(ih->handle, TCM_GETITEM, pos, (LPARAM)&tie); + + SetWindowPos((HWND)tie.lParam, NULL, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_NOACTIVATE|SWP_NOZORDER); + } +} + +static int winTabsUsingXPStyles(Ihandle* ih) +{ + return iupwin_comctl32ver6 && ih->data->type == ITABS_TOP; +} + +static void winTabsDrawPageBackground(Ihandle* ih, HDC hDC, RECT* rect) +{ + unsigned char r=0, g=0, b=0; + char* color = iupAttribGetInheritNativeParent(ih, "BGCOLOR"); + if (!color) color = iupAttribGetInheritNativeParent(ih, "BACKGROUND"); + if (!color) color = iupAttribGet(ih, "BACKGROUND"); + if (!color) color = IupGetGlobal("DLGBGCOLOR"); + iupStrToRGB(color, &r, &g, &b); + SetDCBrushColor(hDC, RGB(r,g,b)); + FillRect(hDC, rect, (HBRUSH)GetStockObject(DC_BRUSH)); +} + +static LRESULT CALLBACK winTabsPageWinProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) +{ + switch (msg) + { + case WM_ERASEBKGND: + { + RECT rect; + HDC hDC = (HDC)wp; + Ihandle* ih = iupwinHandleGet(hWnd); + GetClientRect(ih->handle, &rect); + winTabsDrawPageBackground(ih, hDC, &rect); + + /* return non zero value */ + return 1; + } + case WM_COMMAND: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORBTN: + case WM_CTLCOLOREDIT: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORSTATIC: + case WM_DRAWITEM: + case WM_HSCROLL: + case WM_NOTIFY: + case WM_VSCROLL: + /* Forward the container messages to its parent. */ + return SendMessage(GetParent(hWnd), msg, wp, lp); + } + + return DefWindowProc(hWnd, msg, wp, lp); +} + +static HWND winTabCreatePageWindow(Ihandle* ih) +{ + HWND hWnd; + DWORD dwStyle = WS_CHILD|WS_CLIPSIBLINGS, + dwExStyle = 0; + + if (iupAttribGetBoolean(IupGetDialog(ih), "COMPOSITED")) + dwExStyle |= WS_EX_COMPOSITED; + else + dwStyle |= WS_CLIPCHILDREN; + + hWnd = CreateWindowEx(dwExStyle, "IupTabsPage", NULL, dwStyle, + 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, + ih->handle, NULL, iupwin_hinstance, NULL); + + iupwinHandleAdd(ih, hWnd); + + return hWnd; +} + +/* ------------------------------------------------------------------------- */ +/* winTabs - Sets and Gets accessors */ +/* ------------------------------------------------------------------------- */ + +static int winTabsSetPaddingAttrib(Ihandle* ih, const char* value) +{ + iupStrToIntInt(value, &ih->data->horiz_padding, &ih->data->vert_padding, 'x'); + + if (ih->handle) + SendMessage(ih->handle, TCM_SETPADDING, 0, MAKELPARAM(ih->data->horiz_padding, ih->data->vert_padding)); + + return 0; +} + +static int winTabsSetMultilineAttrib(Ihandle* ih, const char* value) +{ + if (ih->handle) /* allow to set only before mapping */ + return 0; + + if (iupStrBoolean(value)) + ih->data->is_multiline = 1; + else + { + if (ih->data->type == ITABS_BOTTOM || ih->data->type == ITABS_TOP) + ih->data->is_multiline = 0; + else + ih->data->is_multiline = 1; /* always true if left/right */ + } + + return 0; +} + +static char* winTabsGetMultilineAttrib(Ihandle* ih) +{ + if (ih->data->is_multiline) + return "YES"; + else + return "NO"; +} + +static int winTabsSetTabTypeAttrib(Ihandle* ih, const char* value) +{ + if (ih->handle) /* allow to set only before mapping */ + return 0; + + if(iupStrEqualNoCase(value, "BOTTOM")) + { + ih->data->is_multiline = 0; + ih->data->type = ITABS_BOTTOM; + ih->data->orientation = ITABS_HORIZONTAL; + } + else if(iupStrEqualNoCase(value, "LEFT")) + { + ih->data->type = ITABS_LEFT; + ih->data->orientation = ITABS_VERTICAL; + ih->data->is_multiline = 1; /* VERTICAL works only with MULTILINE */ + } + else if(iupStrEqualNoCase(value, "RIGHT")) + { + ih->data->is_multiline = 1; /* VERTICAL works only with MULTILINE */ + ih->data->type = ITABS_RIGHT; + ih->data->orientation = ITABS_VERTICAL; + } + else /* "TOP" */ + { + ih->data->is_multiline = 0; + ih->data->type = ITABS_TOP; + ih->data->orientation = ITABS_HORIZONTAL; + } + + return 0; +} + +static int winTabsSetTabTitleAttrib(Ihandle* ih, const char* name_id, const char* value) +{ + int pos; + if (value && iupStrToInt(name_id, &pos)==1) + { + TCITEM tie; + + tie.mask = TCIF_TEXT; + tie.pszText = (char*)value; + tie.cchTextMax = strlen(value); + + SendMessage(ih->handle, TCM_SETITEM, pos, (LPARAM)&tie); + } + return 1; +} + +static int winTabsSetTabImageAttrib(Ihandle* ih, const char* name_id, const char* value) +{ + int pos; + if (value && iupStrToInt(name_id, &pos)==1) + { + TCITEM tie; + + tie.mask = TCIF_IMAGE; + tie.iImage = winTabsGetImageIndex(ih, value); + + SendMessage(ih->handle, TCM_SETITEM, pos, (LPARAM)&tie); + } + return 1; +} + +static char* winTabsGetBgColorAttrib(Ihandle* ih) +{ + /* the most important use of this is to provide + the correct background for images */ + if (iupwin_comctl32ver6) + { + COLORREF cr; + if (iupwinDrawGetThemeTabsBgColor(ih->handle, &cr)) + { + char* str = iupStrGetMemory(20); + sprintf(str, "%d %d %d", (int)GetRValue(cr), (int)GetGValue(cr), (int)GetBValue(cr)); + return str; + } + } + + return IupGetGlobal("DLGBGCOLOR"); +} + + +/* ------------------------------------------------------------------------- */ +/* winTabs - Calls the user callback to change of tab */ +/* ------------------------------------------------------------------------- */ + +static int winTabsCtlColor(Ihandle* ih, HDC hdc, LRESULT *result) +{ + /* works only when NOT winTabsUsingXPStyles */ + unsigned char r, g, b; + char* color = iupBaseNativeParentGetBgColorAttrib(ih); + if (iupStrToRGB(color, &r, &g, &b)) + { + SetDCBrushColor(hdc, RGB(r,g,b)); + *result = (LRESULT)GetStockObject(DC_BRUSH); + return 1; + } + return 0; +} + +static int winTabsWmNotify(Ihandle* ih, NMHDR* msg_info, int *result) +{ + (void)result; + + if (msg_info->code == TCN_SELCHANGING) + { + IFnnn cb = (IFnnn)IupGetCallback(ih, "TABCHANGE_CB"); + int prev_pos = SendMessage(ih->handle, TCM_GETCURSEL, 0, 0); + iupAttribSetInt(ih, "_IUPTABS_PREV_CHILD_POS", prev_pos); + + if (cb) + { + Ihandle* prev_child = IupGetChild(ih, prev_pos); + iupAttribSetStr(ih, "_IUPTABS_PREV_CHILD", (char*)prev_child); + } + } + + if (msg_info->code == TCN_SELCHANGE) + { + IFnnn cb = (IFnnn)IupGetCallback(ih, "TABCHANGE_CB"); + int pos = SendMessage(ih->handle, TCM_GETCURSEL, 0, 0); + int prev_pos = iupAttribGetInt(ih, "_IUPTABS_PREV_CHILD_POS"); + HWND tab_page = winTabsGetPageWindow(ih, pos); + ShowWindow(tab_page, SW_SHOW); + tab_page = winTabsGetPageWindow(ih, prev_pos); + ShowWindow(tab_page, SW_HIDE); + + if (cb) + { + Ihandle* child = IupGetChild(ih, pos); + Ihandle* prev_child = (Ihandle*)iupAttribGet(ih, "_IUPTABS_PREV_CHILD"); + iupAttribSetStr(ih, "_IUPTABS_PREV_CHILD", NULL); + + cb(ih, child, prev_child); + } + } + + return 0; /* result not used */ +} + +static int winTabsProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) +{ + switch(msg) + { + case WM_SIZE: + { + WNDPROC oldProc = (WNDPROC)IupGetCallback(ih, "_IUPWIN_OLDPROC_CB"); + CallWindowProc(oldProc, ih->handle, msg, wp, lp); + + winTabsPlacePageWindows(ih, LOWORD(lp), HIWORD(lp)); + + *result = 0; + return 1; + } + } + + return iupwinBaseContainerProc(ih, msg, wp, lp, result); +} + +/* ------------------------------------------------------------------------- */ +/* winTabs - Methods and Init Class */ +/* ------------------------------------------------------------------------- */ + +static void winTabsChildAddedMethod(Ihandle* ih, Ihandle* child) +{ + if (IupGetName(child) == NULL) + iupAttribSetHandleName(child); + + if (ih->handle) + { + TCITEM tie; + HWND tab_page; + char *tabtitle, *tabimage; + int pos, old_rowcount; + RECT rect; + + pos = IupGetChildPos(ih, child); + + tab_page = winTabCreatePageWindow(ih); + + if (pos == 0) + ShowWindow(tab_page, SW_SHOW); + + tabtitle = iupAttribGet(child, "TABTITLE"); + if (!tabtitle) tabtitle = iupTabsAttribGetStrId(ih, "TABTITLE", pos); + tabimage = iupAttribGet(child, "TABIMAGE"); + if (!tabimage) tabimage = iupTabsAttribGetStrId(ih, "TABIMAGE", pos); + if (!tabtitle && !tabimage) + tabtitle = " "; + + old_rowcount = (int)SendMessage(ih->handle, TCM_GETROWCOUNT, 0, 0); + + tie.mask = TCIF_PARAM; + + if (tabtitle) + { + tie.mask |= TCIF_TEXT; + tie.pszText = tabtitle; + tie.cchTextMax = strlen(tabtitle); + } + + if (tabimage) + { + tie.mask |= TCIF_IMAGE; + tie.iImage = winTabsGetImageIndex(ih, tabimage); + } + + /* create tabs and label them */ + tie.lParam = (LPARAM)tab_page; + SendMessage(ih->handle, TCM_INSERTITEM, pos, (LPARAM)&tie); + + /* Calculate the display rectangle, assuming the + tab control is the size of the client area. */ + GetClientRect(ih->handle, &rect); + SendMessage(ih->handle, TCM_ADJUSTRECT, FALSE, (LPARAM)&rect); + + SetWindowPos(tab_page, NULL, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + SWP_NOACTIVATE|SWP_NOZORDER); + + iupAttribSetStr(child, "_IUPTAB_CONTAINER", (char*)tab_page); + + if (ih->data->is_multiline) + { + if (ih->data->type == ITABS_LEFT || ih->data->type == ITABS_RIGHT) + { + int rowcount = (int)SendMessage(ih->handle, TCM_GETROWCOUNT, 0, 0); + if (rowcount != old_rowcount) + { + GetClientRect(ih->handle, &rect); + winTabsPlacePageWindows(ih, rect.right - rect.left, rect.bottom - rect.top); + } + } + + iupdrvDisplayRedraw(ih); + } + } +} + +static void winTabsChildRemovedMethod(Ihandle* ih, Ihandle* child) +{ + if (ih->handle) + { + HWND tab_page = (HWND)iupAttribGet(child, "_IUPTAB_CONTAINER"); + if (tab_page) + { + int pos = winTabsGetPageWindowPos(ih, tab_page); + SendMessage(ih->handle, TCM_DELETEITEM, pos, 0); + DestroyWindow(tab_page); + + if (pos==0) pos++; + iupdrvTabsSetCurrentTab(ih, pos-1); + + iupAttribSetStr(child, "_IUPTAB_CONTAINER", NULL); + } + } +} + +static int winTabsMapMethod(Ihandle* ih) +{ + DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS | TCS_HOTTRACK | WS_TABSTOP, + dwExStyle = 0; + + if (!ih->parent) + return IUP_ERROR; + + if (ih->data->type == ITABS_BOTTOM) + dwStyle |= TCS_BOTTOM; + else if (ih->data->type == ITABS_RIGHT) + dwStyle |= TCS_VERTICAL|TCS_RIGHT; + else if (ih->data->type == ITABS_LEFT) + dwStyle |= TCS_VERTICAL; + + if (ih->data->is_multiline) + dwStyle |= TCS_MULTILINE; + + if (iupAttribGetBoolean(IupGetDialog(ih), "COMPOSITED")) + { + dwExStyle |= WS_EX_COMPOSITED; + + if (!ih->data->is_multiline && iupwinIsVista()) + { + /* workaround for composite bug in Vista */ + ih->data->is_multiline = 1; + dwStyle |= TCS_MULTILINE; + } + } + else + dwStyle |= WS_CLIPCHILDREN; + + if (!iupwinCreateWindowEx(ih, WC_TABCONTROL, dwExStyle, dwStyle)) + return IUP_ERROR; + + /* replace the WinProc to handle other messages */ + IupSetCallback(ih, "_IUPWIN_CTRLPROC_CB", (Icallback)winTabsProc); + + /* Process WM_NOTIFY */ + IupSetCallback(ih, "_IUPWIN_NOTIFY_CB", (Icallback)winTabsWmNotify); + + /* Process background color */ + IupSetCallback(ih, "_IUPWIN_CTLCOLOR_CB", (Icallback)winTabsCtlColor); + + if (iupwin_comctl32ver6 && ih->data->type != ITABS_TOP) + { + /* XP Styles support only TABTYPE=TOP */ + iupwinDrawRemoveTheme(ih->handle); + } + + /* Change children background */ + if (winTabsUsingXPStyles(ih)) + { + char* color = iupAttribGetInheritNativeParent(ih, "BGCOLOR"); + if (!color) + color = iupAttribGetInheritNativeParent(ih, "BACKGROUND"); + if (!color) + { + COLORREF cr; + if (iupwinDrawGetThemeTabsBgColor(ih->handle, &cr)) + iupAttribSetStrf(ih, "BACKGROUND", "%d %d %d", (int)GetRValue(cr), (int)GetGValue(cr), (int)GetBValue(cr)); + } + } + + /* Create pages and tabs */ + if (ih->firstchild) + { + Ihandle* child; + for (child = ih->firstchild; child; child = child->brother) + winTabsChildAddedMethod(ih, child); + } + + return IUP_NOERROR; +} + +static void winTabsUnMapMethod(Ihandle* ih) +{ + Iarray* bmp_array; + + HIMAGELIST image_list = (HIMAGELIST)SendMessage(ih->handle, TCM_GETIMAGELIST, 0, 0); + if (image_list) + ImageList_Destroy(image_list); + + bmp_array = (Iarray*)iupAttribGet(ih, "_IUPWIN_BMPARRAY"); + if (bmp_array) + iupArrayDestroy(bmp_array); + + iupdrvBaseUnMapMethod(ih); +} + +static void winTabsRegisterClass(void) +{ + WNDCLASS wndclass; + ZeroMemory(&wndclass, sizeof(WNDCLASS)); + + wndclass.hInstance = iupwin_hinstance; + wndclass.lpszClassName = "IupTabsPage"; + wndclass.lpfnWndProc = (WNDPROC)winTabsPageWinProc; + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.style = CS_PARENTDC; + wndclass.hbrBackground = NULL; /* remove the background to optimize redraw */ + + RegisterClass(&wndclass); +} + +void iupdrvTabsInitClass(Iclass* ic) +{ + if (!iupwinClassExist("IupTabsPage")) + winTabsRegisterClass(); + + /* Driver Dependent Class functions */ + ic->Map = winTabsMapMethod; + ic->UnMap = winTabsUnMapMethod; + ic->ChildAdded = winTabsChildAddedMethod; + ic->ChildRemoved = winTabsChildRemovedMethod; + + /* Driver Dependent Attribute functions */ + + /* Visual */ + iupClassRegisterAttribute(ic, "BGCOLOR", winTabsGetBgColorAttrib, NULL, IUPAF_SAMEASSYSTEM, "DLGBGCOLOR", IUPAF_DEFAULT); + + /* Special */ + iupClassRegisterAttribute(ic, "FGCOLOR", NULL, NULL, IUPAF_SAMEASSYSTEM, "DLGFGCOLOR", IUPAF_NOT_MAPPED); + + /* IupTabs only */ + iupClassRegisterAttribute(ic, "TABTYPE", iupTabsGetTabTypeAttrib, winTabsSetTabTypeAttrib, IUPAF_SAMEASSYSTEM, "TOP", IUPAF_NOT_MAPPED|IUPAF_NO_INHERIT); + iupClassRegisterAttribute(ic, "TABORIENTATION", iupTabsGetTabOrientationAttrib, NULL, IUPAF_SAMEASSYSTEM, "HORIZONTAL", IUPAF_READONLY|IUPAF_NOT_MAPPED|IUPAF_NO_INHERIT); /* can not be set, depends on TABTYPE in Windows */ + iupClassRegisterAttribute(ic, "MULTILINE", winTabsGetMultilineAttrib, winTabsSetMultilineAttrib, NULL, NULL, IUPAF_NOT_MAPPED|IUPAF_NO_INHERIT); + iupClassRegisterAttributeId(ic, "TABTITLE", NULL, winTabsSetTabTitleAttrib, IUPAF_NO_DEFAULTVALUE|IUPAF_NO_INHERIT); + iupClassRegisterAttributeId(ic, "TABIMAGE", NULL, winTabsSetTabImageAttrib, IUPAF_NO_DEFAULTVALUE|IUPAF_NO_INHERIT); + iupClassRegisterAttribute(ic, "PADDING", iupTabsGetPaddingAttrib, winTabsSetPaddingAttrib, IUPAF_SAMEASSYSTEM, "0x0", IUPAF_NOT_MAPPED); +} |