From: <mie...@us...> - 2011-12-06 01:35:00
|
Revision: 7344 http://oorexx.svn.sourceforge.net/oorexx/?rev=7344&view=rev Author: miesfeld Date: 2011-12-06 01:34:53 +0000 (Tue, 06 Dec 2011) Log Message: ----------- ooDialog - allow the user to specify a system color by keyword in addition to using the numeric value when using setSysColor() and setControlSysColor() Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls main/trunk/extensions/platform/windows/oodialog/oodControl.cpp main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp Modified: main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2011-12-06 01:32:50 UTC (rev 7343) +++ main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2011-12-06 01:34:53 UTC (rev 7344) @@ -131,12 +131,6 @@ if sb == .nil then return -1 return sb~determinePosition -::method setListWidthPx unguarded - use strict arg id, pixels - listBox = self~newListBox(id) - if listBox == .nil then return -1 - return listBox~setWidthPx(pixels) - ::method getListWidthPx unguarded use strict arg id listBox = self~newListBox(id) @@ -157,6 +151,13 @@ listBox~listItemHeightPx = pixels return 0 +::method setListWidthPx unguarded + use strict arg id, pixels + listBox = self~newListBox(id) + if listBox == .nil then return -1 + listBox~setWidthPx(pixels) + return 0 + ::method getListItemHeightPx unguarded use strict arg id listBox = self~newListBox(id) Modified: main/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2011-12-06 01:32:50 UTC (rev 7343) +++ main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2011-12-06 01:34:53 UTC (rev 7344) @@ -1432,15 +1432,39 @@ /** DialogControl::setColor() * DialogControl::setSysColor */ -RexxMethod4(logical_t, dlgctrl_setColor, int32_t, bkColor, OPTIONAL_int32_t, fgColor, NAME, method, CSELF, pCSelf) +RexxMethod4(int32_t, dlgctrl_setColor, RexxObjectPtr, rxBG, OPTIONAL_RexxObjectPtr, rxFG, NAME, method, CSELF, pCSelf) { pCDialogControl pcdc = validateDCCSelf(context, pCSelf); if ( pcdc == NULL ) { return 0; } - return oodColorTable(context, dlgToCSelf(context, pcdc->oDlg), pcdc->id, bkColor, - argumentOmitted(2) ? -1 : fgColor, method[3] == 'S'); + + bool useSysColor = (method[10] == 'S'); + int32_t bkColor = 0; + int32_t fgColor = -1; + + if ( useSysColor ) + { + if ( ! getSystemColor(context, rxBG, &bkColor, 2) ) + { + return -1; + } + if ( argumentExists(3) && ! getSystemColor(context, rxFG, &fgColor, 3) ) + { + return -1; + } + } + else + { + if ( ! context->Int32(rxBG, &bkColor) || (argumentExists(3) && ! context->Int32(rxBG, &fgColor)) ) + { + return -1; + } + } + + return (int32_t)oodColorTable(context, dlgToCSelf(context, pcdc->oDlg), pcdc->id, bkColor, + argumentOmitted(2) ? -1 : fgColor, useSysColor); } /** DialogControl::data() Modified: main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2011-12-06 01:32:50 UTC (rev 7343) +++ main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2011-12-06 01:34:53 UTC (rev 7344) @@ -1469,6 +1469,79 @@ return false; } +/** + * Retrieves the system color index number from a Rexx object that may be the + * actual number or the color keyword. + * + * @param c Method context we are operating in. + * @param clr Rexx object, presumably the system color number or keyword. + * @param color The color index is returned here on success + * @param argPos The argument position of the Rexx object. + * + * @return True on success, othewise false. + * + * @remarks Currently this is only called when clr is an argument to a method. + * If called under other circumstances, the logic may need to be + * adjusted. + * + * Raises a syntax condition on failure to convert clr. + */ +bool getSystemColor(RexxMethodContext *c, RexxObjectPtr clr, int32_t *color, size_t argPos) +{ + if ( c->Int32(clr, color) ) + { + return true; + } + + CSTRING keyword = c->ObjectToStringValue(clr); + + if ( StrStrI(keyword, "3DDKSHADOW ") != NULL) *color =21; + else if ( StrStrI(keyword, "3DFACE ") != NULL) *color =15; + else if ( StrStrI(keyword, "3DHIGHLIGHT ") != NULL) *color =20; + else if ( StrStrI(keyword, "3DHILIGHT ") != NULL) *color =20; + else if ( StrStrI(keyword, "3DLIGHT ") != NULL) *color =22; + else if ( StrStrI(keyword, "3DSHADOW ") != NULL) *color =16; + else if ( StrStrI(keyword, "ACTIVEBORDER ") != NULL) *color =10; + else if ( StrStrI(keyword, "ACTIVECAPTION ") != NULL) *color = 2; + else if ( StrStrI(keyword, "APPWORKSPACE ") != NULL) *color =12; + else if ( StrStrI(keyword, "BACKGROUND ") != NULL) *color = 1; + else if ( StrStrI(keyword, "BTNFACE ") != NULL) *color =15; + else if ( StrStrI(keyword, "BTNHIGHLIGHT ") != NULL) *color =20; + else if ( StrStrI(keyword, "BTNHILIGHT ") != NULL) *color =20; + else if ( StrStrI(keyword, "BTNSHADOW ") != NULL) *color =16; + else if ( StrStrI(keyword, "BTNTEXT ") != NULL) *color =18; + else if ( StrStrI(keyword, "CAPTIONTEXT ") != NULL) *color = 9; + else if ( StrStrI(keyword, "DESKTOP ") != NULL) *color = 1; + else if ( StrStrI(keyword, "GRADIENTACTIVECAPTION ") != NULL) *color =27; + else if ( StrStrI(keyword, "GRADIENTINACTIVECAPTION") != NULL) *color =28; + else if ( StrStrI(keyword, "GRAYTEXT ") != NULL) *color =17; + else if ( StrStrI(keyword, "HIGHLIGHT ") != NULL) *color =13; + else if ( StrStrI(keyword, "HIGHLIGHTTEXT ") != NULL) *color =14; + else if ( StrStrI(keyword, "HOTLIGHT ") != NULL) *color =26; + else if ( StrStrI(keyword, "INACTIVEBORDER ") != NULL) *color =11; + else if ( StrStrI(keyword, "INACTIVECAPTION ") != NULL) *color = 3; + else if ( StrStrI(keyword, "INACTIVECAPTIONTEXT ") != NULL) *color =19; + else if ( StrStrI(keyword, "INFOBK ") != NULL) *color =24; + else if ( StrStrI(keyword, "INFOTEXT ") != NULL) *color =23; + else if ( StrStrI(keyword, "MENU ") != NULL) *color = 4; + else if ( StrStrI(keyword, "MENUHILIGHT ") != NULL) *color =29; + else if ( StrStrI(keyword, "MENUBAR ") != NULL) *color =30; + else if ( StrStrI(keyword, "MENUTEXT ") != NULL) *color = 7; + else if ( StrStrI(keyword, "SCROLLBAR ") != NULL) *color = 0; + else if ( StrStrI(keyword, "WINDOW ") != NULL) *color = 5; + else if ( StrStrI(keyword, "WINDOWFRAME ") != NULL) *color = 6; + else if ( StrStrI(keyword, "WINDOWTEXT ") != NULL) *color = 8; + else + { + TCHAR buffer[512]; + _snprintf(buffer, sizeof(buffer), "Argument %d is not a valid system color keyword; found %s", argPos, keyword); + userDefinedMsgException(c, buffer); + + return false; + } + return true; +} + void assignBitmap(pCPlainBaseDialog pcpbd, size_t index, CSTRING bmp, PUSHBUTTON_STATES type, bool isInMemory) { HBITMAP hBmp = NULL; @@ -3045,7 +3118,6 @@ return ((short)SendMessage(pcpbd->hDlg, WM_USER_GETKEYSTATE, mb, 0) & ISDOWN) ? TheTrueObj : TheFalseObj; } - /** DialogExtensions::setForegroundWindow() * * Brings the specified wind to the foreground. @@ -3089,8 +3161,15 @@ /** DialogExtensions::setControlColor() * DialogExtensions::setControlSysColor() + * + * @remarks For sys color we accept keyword IDs, but not for regular colors. + * At some point we might convert regular colors to accept keywords + * also. + * + * Since accepting keywords is a 4.2.0 or later feature, we raise a + * syntax error if an unsupported keyword is used. */ -RexxMethod5(int32_t, dlgext_setControlColor, RexxObjectPtr, rxID, int32_t, bkColor, OPTIONAL_int32_t, fgColor, +RexxMethod5(int32_t, dlgext_setControlColor, RexxObjectPtr, rxID, RexxObjectPtr, rxBG, OPTIONAL_RexxObjectPtr, rxFG, NAME, method, OSELF, self) { pCPlainBaseDialog pcpbd = dlgToCSelf(context, self); @@ -3106,8 +3185,31 @@ return -1; } - return (int32_t)oodColorTable(context, pcpbd, id, bkColor, (argumentOmitted(3) ? -1 : fgColor), - (method[10] == 'S')); + bool useSysColor = (method[10] == 'S'); + int32_t bkColor = 0; + int32_t fgColor = -1; + + RexxMethodContext *c = context; + if ( useSysColor ) + { + if ( ! getSystemColor(context, rxBG, &bkColor, 2) ) + { + return -1; + } + if ( argumentExists(3) && ! getSystemColor(context, rxFG, &fgColor, 3) ) + { + return -1; + } + } + else + { + if ( ! context->Int32(rxBG, &bkColor) || (argumentExists(3) && ! context->Int32(rxBG, &fgColor)) ) + { + return -1; + } + } + + return (int32_t)oodColorTable(context, pcpbd, id, bkColor, fgColor, useSysColor); } Modified: main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp 2011-12-06 01:32:50 UTC (rev 7343) +++ main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.hpp 2011-12-06 01:34:53 UTC (rev 7344) @@ -66,8 +66,8 @@ extern WORD numDIBColorEntries(LPBITMAPINFO lpBmpInfo); extern BOOL drawBackgroundBmp(pCPlainBaseDialog, HWND); extern BOOL drawBitmapButton(pCPlainBaseDialog, LPARAM, bool); +extern bool getSystemColor(RexxMethodContext *c, RexxObjectPtr clr, int32_t *color, size_t argPos); - extern bool parseFontStyleArg(CSTRING fontStyle, int *weight, BOOL *italic, BOOL *underline, BOOL *strikeout); extern bool getTextSize(RexxMethodContext *, CSTRING, CSTRING, uint32_t, HWND, RexxObjectPtr, PSIZE); extern bool textSizeIndirect(RexxMethodContext *, CSTRING, CSTRING, uint32_t, SIZE *, HWND); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |