From: <mie...@us...> - 2010-01-27 01:44:36
|
Revision: 5517 http://oorexx.svn.sourceforge.net/oorexx/?rev=5517&view=rev Author: miesfeld Date: 2010-01-27 01:44:28 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Continue with ooDialog work Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/APICommon.cpp main/trunk/extensions/platform/windows/oodialog/APICommon.hpp main/trunk/extensions/platform/windows/oodialog/DialogControls.cls main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls main/trunk/extensions/platform/windows/oodialog/oodControl.hpp main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp Modified: main/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -551,6 +551,38 @@ } /** + * Converts a Rexx object to a logical value, 0 or 1. Returns -1 if the object + * can not be converted. + * + * @param c Thread context we are operating in. + * @param obj The object to convert. + * + * @return On success return 0 or 1 depending on what obj is. Otherwise return + * -1 to signal failure. + */ +int32_t getLogical(RexxThreadContext *c, RexxObjectPtr obj) +{ + if ( obj != NULLOBJECT ) + { + if ( obj == TheTrueObj ) + { + return 1; + } + if ( obj == TheFalseObj ) + { + return 0; + } + + logical_t val; + if ( c->Logical(obj, &val) ) + { + return (val == 0 ? 0 : 1); + } + } + return -1; +} + +/** * Return the number of existing arguments in an ooRexx method invocation. In * others words, it is intended to count neither the omitted args in the ooRexx * method, nor the pseudo-arguments to the native API function, like OSELF, @@ -675,7 +707,7 @@ } -RexxObjectPtr rxNewBuiltinObject(RexxMethodContext *c, CSTRING className) +RexxObjectPtr rxNewBuiltinObject(RexxThreadContext *c, CSTRING className) { // This should never fail, provided the caller sends the right class name, // do we need an exception if it does? @@ -683,7 +715,12 @@ return c->SendMessage0(classObj, "NEW"); } +RexxObjectPtr rxNewBuiltinObject(RexxMethodContext *c, CSTRING className) +{ + return rxNewBuiltinObject(c->threadContext, className); +} + /** * Outputs the typical condition message. For example: * Modified: main/trunk/extensions/platform/windows/oodialog/APICommon.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -92,12 +92,14 @@ extern bool rxGetUInt32Attribute(RexxMethodContext *context, RexxObjectPtr obj, CSTRING name, uint32_t *pNumber); extern bool requiredClass(RexxThreadContext *c, RexxObjectPtr obj, const char *name, int pos); +extern int32_t getLogical(RexxThreadContext *c, RexxObjectPtr obj); extern size_t rxArgCount(RexxMethodContext * context); extern bool rxStr2Number(RexxMethodContext *c, CSTRING str, uint64_t *number, size_t pos); extern bool rxStr2Number32(RexxMethodContext *c, CSTRING str, uint32_t *number, size_t pos); extern RexxClassObject rxGetContextClass(RexxMethodContext *c, CSTRING name); extern RexxObjectPtr rxSetObjVar(RexxMethodContext *c, CSTRING varName, RexxObjectPtr val); extern RexxObjectPtr rxNewBuiltinObject(RexxMethodContext *c, CSTRING className); +extern RexxObjectPtr rxNewBuiltinObject(RexxThreadContext *c, CSTRING className); extern bool checkForCondition(RexxThreadContext *c); extern void standardConditionMsg(RexxThreadContext *c, RexxDirectoryObject condObj, RexxCondition *condition); extern bool isInt(int, RexxObjectPtr, RexxMethodContext *); Modified: main/trunk/extensions/platform/windows/oodialog/DialogControls.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2010-01-27 01:44:28 UTC (rev 5517) @@ -1329,7 +1329,10 @@ ::attribute dateTime external "LIBRARY oodialog _dtp_dateTime" ::method getMonthCal external "LIBRARY oodialog dtp_getMonthCal" +::method setFormat external "LIBRARY oodialog dtp_setFormat" +::method setRange external "LIBRARY oodialog dtp_setRange" + ::class 'MonthCalendar' subclass DialogControl public ::constant MCM_GETMAXSELCOUNT "0x1003" Modified: main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/DynamicDialog.cls 2010-01-27 01:44:28 UTC (rev 5517) @@ -932,9 +932,9 @@ end else if kind = "DTP" then do if style~wordpos("DTS_APPCANPARSE") > 0 then ret = ret || " PARSE" - if style~wordpos("DTS_RIGHTALIGN;") > 0 then ret = ret || " RIGHT" - if style~wordpos("DTS_SHOWNONE; ") > 0 then ret = ret || " NONE" - if style~wordpos("DTS_UPDOWN; ") > 0 then ret = ret || " UPDOWN" + if style~wordpos("DTS_RIGHTALIGN") > 0 then ret = ret || " RIGHT" + if style~wordpos("DTS_SHOWNONE ") > 0 then ret = ret || " NONE" + if style~wordpos("DTS_UPDOWN ") > 0 then ret = ret || " UPDOWN" if style~wordpos("DTS_LONGDATEFORMAT") > 0 then ret = ret || " LONG" if style~wordpos("DTS_SHORTDATEFORMAT") > 0 then ret = ret || " SHORT" if style~wordpos("DTS_SHORTDATECENTURYFORMAT") > 0 then ret = ret || " CENTURY" Modified: main/trunk/extensions/platform/windows/oodialog/oodControl.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -67,6 +67,7 @@ extern RexxStringObject cbLbGetText(RexxMethodContext *c, HWND hCtrl, uint32_t index, oodControl_t ctrl); extern DIALOGADMIN *getDCDlgAdm(RexxMethodContext *c, pCDialogControl pcdc); extern void sysTime2dt(RexxThreadContext *c, SYSTEMTIME *sysTime, RexxObjectPtr *dateTime, DateTimePart part); +extern bool dt2sysTime(RexxThreadContext *c, RexxObjectPtr dateTime, SYSTEMTIME *sysTime, DateTimePart part); extern RexxObjectPtr createRexxControl(RexxMethodContext *, HWND, HWND, uint32_t, oodControl_t, RexxObjectPtr, bool, bool); @@ -101,6 +102,12 @@ return isSingleSelectionListBox(GetDlgItem(hDlg, id)); } +/* Determine if a date time picker (DTP) control is a show none control. */ +inline bool isShowNoneDTP(HWND hDTP) +{ + return ((GetWindowLong(hDTP, GWL_STYLE) & DTS_SHOWNONE) == DTS_SHOWNONE); +} + /* Retrieve specific fields / information from the CDialogControl struct. */ inline HWND getDChCtrl(void *pCSelf) { Modified: main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -663,7 +663,8 @@ { if ( ((wParam & m[i].wpFilter) == m[i].wParam) && ((lParam & m[i].lpfilter) == (uint32_t)m[i].lParam) ) { - return genericAddDialogMessage(pcpbd->dlgAdm->pMessageQueue, m[i].rexxMethod, wParam, lParam, NULL, NULL, OOD_INVALID_ITEM_ID); + // return genericAddDialogMessage(pcpbd->dlgAdm->pMessageQueue, m[i].rexxMethod, wParam, lParam, NULL, NULL, OOD_INVALID_ITEM_ID); + return genericCommandInvoke(pcpbd->dlgProcContext, pcpbd, m[i].rexxMethod, wParam, lParam); } } return ContinueProcessing; @@ -953,9 +954,9 @@ RexxArrayObject args = c->ArrayOfFour(dt, valid, idFrom, hwndFrom); rexxReply = c->SendMessage(pcpbd->rexxSelf, m[i].rexxMethod, args); + checkForCondition(c); - setWindowPtr(GetParent(pChange->nmhdr.hwndFrom), DWLP_MSGRESULT, 0); - return ReplyTrue; + return ReplyFalse; } else if ( code == DTN_DROPDOWN ) { @@ -975,9 +976,56 @@ } else if ( code == DTN_USERSTRING ) { - LPNMDATETIMESTRING pStr = (LPNMDATETIMESTRING)lParam; + LPNMDATETIMESTRING pdts = (LPNMDATETIMESTRING)lParam; - return genericNotifyInvoke(c, pcpbd, m[i].rexxMethod, idFrom, hwndFrom); + RexxDirectoryObject d = (RexxDirectoryObject)rxNewBuiltinObject(c, "DIRECTORY"); + c->DirectoryPut(d, c->String(pdts->pszUserString), "USERSTRING"); + c->DirectoryPut(d, TheNilObj, "DATETIME"); + c->DirectoryPut(d, TheFalseObj, "VALID"); + + // Fill in the date time string struct with error values. + dt2sysTime(c, NULLOBJECT, &(pdts->st), dtNow); + pdts->dwFlags = GDT_ERROR; + + rexxReply = c->SendMessage(pcpbd->rexxSelf, m[i].rexxMethod, c->ArrayOfThree(d, idFrom, hwndFrom)); + + if ( checkForCondition(c) ) + { + return ReplyFalse; + } + + RexxObjectPtr dt = c->DirectoryAt(d, "DATETIME"); + if ( ! c->IsOfType(dt, "DATETIME") ) + { + wrongObjInDirectoryException(c, 1, "DATETIME", "a DateTime object", dt); + checkForCondition(c); + return ReplyFalse; + } + + if ( ! dt2sysTime(c, dt, &(pdts->st), dtFull) ) + { + checkForCondition(c); + return ReplyFalse; + } + + if ( isShowNoneDTP(pdts->nmhdr.hwndFrom) ) + { + RexxObjectPtr _valid = c->DirectoryAt(d, "VALID"); + int32_t val = getLogical(c, _valid); + + if ( val == -1 ) + { + wrongObjInDirectoryException(c, 1, "VALID", "Logical", _valid); + checkForCondition(c); + return ReplyFalse; + } + pdts->dwFlags = (val == 1 ? GDT_VALID : GDT_NONE); + } + else + { + pdts->dwFlags = GDT_VALID; + } + return ReplyFalse; } else if ( code == DTN_WMKEYDOWN ) { Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -592,6 +592,8 @@ REXX_METHOD_PROTOTYPE(get_dtp_dateTime); REXX_METHOD_PROTOTYPE(set_dtp_dateTime); REXX_METHOD_PROTOTYPE(dtp_getMonthCal); +REXX_METHOD_PROTOTYPE(dtp_setFormat); +REXX_METHOD_PROTOTYPE(dtp_setRange); // MonthCalendar REXX_METHOD_PROTOTYPE(get_mc_date); @@ -1170,6 +1172,8 @@ REXX_METHOD(get_dtp_dateTime, get_dtp_dateTime), REXX_METHOD(set_dtp_dateTime, set_dtp_dateTime), REXX_METHOD(dtp_getMonthCal, dtp_getMonthCal), + REXX_METHOD(dtp_setFormat, dtp_setFormat), + REXX_METHOD(dtp_setRange, dtp_setRange), // MonthCalendar REXX_METHOD(get_mc_date, get_mc_date), Modified: main/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp 2010-01-26 20:31:11 UTC (rev 5516) +++ main/trunk/extensions/platform/windows/oodialog/oodViewControls.cpp 2010-01-27 01:44:28 UTC (rev 5517) @@ -123,6 +123,7 @@ // This is used for MonthCalendar also #define SYSTEMTIME_MIN_YEAR 1601 +#define SYSTEMTIME_RANGE_EXCEPTION_MSG "indexes 1 and 2 of argument 1, the array object, can not both be missing" /** @@ -145,7 +146,7 @@ * object is 9999 and of a SYSTEMTIME 30827, so we only check the lower * range. An exception is raised if out of range. */ -static bool dt2sysTime(RexxMethodContext *c, RexxObjectPtr dateTime, SYSTEMTIME *sysTime, DateTimePart part) +bool dt2sysTime(RexxThreadContext *c, RexxObjectPtr dateTime, SYSTEMTIME *sysTime, DateTimePart part) { if ( part == dtNow ) { @@ -166,7 +167,7 @@ if ( st.wYear < SYSTEMTIME_MIN_YEAR ) { - userDefinedMsgException(c->threadContext, "The DateTime object can not represent a year prior to 1601"); + userDefinedMsgException(c, "The DateTime object can not represent a year prior to 1601"); goto failed_out; } @@ -202,7 +203,91 @@ return false; } + /** + * Given an array of DateTime objects, converts them to an an array of + * SYSTEMTIME structs. + * + * The array is assumed to be argument 1 of a method and only the first two + * indexes are converted. + * + * @param c The method context we are operating in. + * @param dateTimes The Rexx array of DateTime objects. + * @param sysTimes [IN/OUT] On entry an array of 2 SYSTEMTIMEs, on return the + * SYSTEMTIME structs will be filled in according to the other + * arguments. + * @param part Should the conversion be just the time portion, just the + * date portion, or both. + * @param needBoth Are both index 1 and index 2 in the Rexx array required. + * @param gdtr [IN/OUT] Pointer to a variable to receive the GDTR_xxx + * flags for the conversion. This is ignored if NULL. + * + * @return True on success, false otherwise. If false, an exceptions has been + * raised. + */ +bool dt2sysTimeRange(RexxMethodContext *c, RexxArrayObject dateTimes, SYSTEMTIME *sysTimes, + DateTimePart part, bool needBoth, uint32_t *gdtr) +{ + memset(sysTimes, 0, 2 * sizeof(SYSTEMTIME)); + + RexxObjectPtr startDate = c->ArrayAt(dateTimes, 1); + RexxObjectPtr endDate = c->ArrayAt(dateTimes, 2); + + if ( needBoth && (startDate == NULLOBJECT || endDate == NULLOBJECT) ) + { + sparseArrayException(c->threadContext, 1, (startDate == NULLOBJECT ? 1 : 2)); + goto err_out; + } + + uint32_t gdtrVal = 0; + + if ( startDate != NULLOBJECT ) + { + if ( ! c->IsOfType(startDate, "DATETIME") ) + { + wrongObjInArrayException(c->threadContext, 1, 1, "DateTime"); + goto err_out; + } + + if ( ! dt2sysTime(c->threadContext, startDate, sysTimes, part) ) + { + goto err_out; + } + gdtrVal |= GDTR_MIN; + } + + if ( endDate != NULLOBJECT ) + { + if ( ! c->IsOfType(endDate, "DATETIME") ) + { + wrongObjInArrayException(c->threadContext, 1, 2, "DateTime"); + goto err_out; + } + + if ( ! dt2sysTime(c->threadContext, endDate, sysTimes + 1, part) ) + { + goto err_out; + } + gdtrVal |= GDTR_MAX; + } + + if ( gdtrVal == 0 ) + { + userDefinedMsgException(c->threadContext, SYSTEMTIME_RANGE_EXCEPTION_MSG); + } + + if ( gdtr != NULL ) + { + *gdtr = gdtrVal; + } + return true; + +err_out: + return false; +} + + +/** * Creates a DateTime object that represents the time set in a SYSTEMTIME * struct. * @@ -244,17 +329,17 @@ } } -/** DateTimePicker::dateTime (attribute) +/** DateTimePicker::dateTime [Attribute Get] * * Retrieves the current selected system time of the date time picker and * returns it as a DateTime object. * * If the date time picker has the DTS_SHOWNONE style, it can also be set to * "no date" when the user has unchecked the check box. If the control is in - * this state, the .NullHandle object is returned to the user. + * this state, the .nil object is returned to the user. * * @returns A DateTime object representing the current selected system time of - * the control, or the .NullHandle object if the control is in the + * the control, or the .nil object if the control is in the * 'no date' state. */ RexxMethod1(RexxObjectPtr, get_dtp_dateTime, CSELF, pCSelf) @@ -272,7 +357,7 @@ // This is valid. It means the DTP is using the DTS_SHOWNONE style // and that the user has the check box is not checked. We return a // null pointer object. - dateTime = context->NewPointer(NULL); + dateTime = TheNilObj; break; case GDT_ERROR: @@ -284,12 +369,12 @@ return dateTime; } -/** DateTimePicker::dateTime= (attribute) +/** DateTimePicker::dateTime= [Attribute Set] * * Sets the system time for the date time picker to the time represented by the * DateTime object. If, and only if, the date time picker has the DTS_SHOWNONE * style, it can also be set to "no date." The Rexx user can set this state by - * passing in the .NullHandle object. + * passing in the .nil object. * * @param dateTime The date and time to set the control to. * @@ -305,7 +390,7 @@ SYSTEMTIME sysTime = {0}; HWND hwnd = getDChCtrl(pCSelf); - if ( context->IsOfType(dateTime, "POINTER") ) + if ( isShowNoneDTP(hwnd) && dateTime == TheNilObj ) { DateTime_SetSystemtime(hwnd, GDT_NONE, &sysTime); } @@ -313,7 +398,7 @@ { if ( requiredClass(context->threadContext, dateTime, "DATETIME", 1) ) { - if ( dt2sysTime(context, dateTime, &sysTime, dtFull) ) + if ( dt2sysTime(context->threadContext, dateTime, &sysTime, dtFull) ) { if ( DateTime_SetSystemtime(hwnd, GDT_VALID, &sysTime) == 0 ) { @@ -379,6 +464,64 @@ } +/** DateTimePicker::setFormat() + * + * Sets the display of the date and time picker (DTP) control based on the + * given format string. + * + * @param format The format string that the DTP should use. + * + * @return Returns true on success, otherwise false. + * + * @note It is acceptable to include extra characters within the format string + * to produce a more rich display. However, any nonformat characters + * must be enclosed within single quotes. For example, the format string + * "'Today is: 'hh':'m':'s ddddMMMdd', 'yyy" would produce output like + * "Today is: 04:22:31 Tuesday Mar 23, 1996". + * + * A DTP control tracks locale changes when it is using the default + * format string. If you set a custom format string, it will not be + * updated in response to locale changes. + * + * <for docs @see point reader to section on format strings> + */ +RexxMethod2(logical_t, dtp_setFormat, CSTRING, format, CSELF, pCSelf) +{ + return DateTime_SetFormat(getDChCtrl(pCSelf), format); +} + + +/** DateTimePicker::setRange() + * + * Sets the minimum and maximum allowable dates / times for the date time + * picker control. + * + * @param dateTimes An array of DateTime objects used to set the minimum and + * maximum dates. The DateTime object at index 1 sets the + * minimum date and the DateTime object at index 2 sets the + * maximum date. + * + * @return True on success, otherwise false. + * + * @note The array must contain at least one of the indexes. If it contains + * neither, an exception is raised. If one of the array indexes is + * empty, then the corresponding date is not set. + * + * Exceptions are raised for invalid arguments. + */ +RexxMethod2(RexxObjectPtr, dtp_setRange, RexxArrayObject, dateTimes, CSELF, pCSelf) +{ + SYSTEMTIME sysTime[2]; + uint32_t which = 0; + + if ( dt2sysTimeRange(context, dateTimes, (SYSTEMTIME *)&sysTime, dtDate, false, &which) ) + { + return (DateTime_SetRange(getDChCtrl(pCSelf), which, &sysTime) == 0 ? TheFalseObj : TheTrueObj); + } + return TheFalseObj; +} + + /** * Methods for the MonthCalendar class. * @@ -637,7 +780,7 @@ } -/** MonthCalendar::date [Attribute Get] +/** MonthCalendar::date [Attribute Get] * * Returns the currently selected date for the month calendar. * @@ -681,7 +824,7 @@ return dateTime; } -/** MonthCalendar::date [Attribute Set] +/** MonthCalendar::date= [Attribute Set] * * Sets the currently selected date for the month calendar. * @@ -709,7 +852,7 @@ if ( requiredClass(context->threadContext, dateTime, "DATETIME", 1) ) { - if ( dt2sysTime(context, dateTime, (SYSTEMTIME *)&sysTime, dtDate) ) + if ( dt2sysTime(context->threadContext, dateTime, (SYSTEMTIME *)&sysTime, dtDate) ) { if ( isMultiSelectionMonthCalendar(hMC) ) { @@ -1531,82 +1674,71 @@ return result; } +/** MonthCalendar::setRange() + * + * Sets the minimum and maximum allowable dates for the month calendar control. + * + * @param dateTimes An array of DateTime objects used to set the minimum and + * maximum dates. The DateTime object at index 1 sets the + * minimum date and the DateTime object at index 2 sets the + * maximum date. + * + * @return True on success, otherwise false. + * + * @note The array must contain at least one of the indexes. If it contains + * neither, and exceptions is raised. If one of the array indexes is + * empty, then the corresponding date is not set. The time portion of + * the DateTime object(s) is ignored. + * + * Exceptions are raised for invalid arguments. + */ RexxMethod2(RexxObjectPtr, mc_setRange, RexxArrayObject, dateTimes, CSELF, pCSelf) { HWND hMC = getMonthCalendar(context, pCSelf); - if ( hMC == NULL ) + if ( hMC != NULL ) { - return NULLOBJECT; - } + SYSTEMTIME sysTime[2]; + uint32_t which = 0; - SYSTEMTIME sysTime[2]; - BOOL success = FALSE; - memset(&sysTime, 0, 2 * sizeof(SYSTEMTIME)); - - uint32_t which = 0; - - RexxObjectPtr minDate = context->ArrayAt(dateTimes, 1); - RexxObjectPtr maxDate = context->ArrayAt(dateTimes, 2); - - if ( minDate != NULLOBJECT && context->IsOfType(minDate, "DATETIME") ) - { - which = GDTR_MIN; - dt2sysTime(context, minDate, (SYSTEMTIME *)&sysTime, dtDate); + if ( dt2sysTimeRange(context, dateTimes, (SYSTEMTIME *)&sysTime, dtDate, false, &which) ) + { + return (MonthCal_SetRange(hMC, which, &sysTime) == 0 ? TheFalseObj : TheTrueObj); + } } - - if ( maxDate != NULLOBJECT && context->IsOfType(maxDate, "DATETIME") ) - { - which |= GDTR_MAX; - dt2sysTime(context, maxDate, (SYSTEMTIME *)&sysTime + 1, dtDate); - } - - if ( which == 0 ) - { - return TheFalseObj; - } - - return (MonthCal_SetRange(hMC, which, &sysTime) == 0 ? TheFalseObj : TheTrueObj); + return TheFalseObj; } +/** MonthCalendar::setSelectionRange() + * + * Sets the selection for a month calendar control to a given date range. + * + * @param dateTimes An array of DateTime objects used to set the minimum and + * maximum dates. The DateTime oject at index 1 must be the + * first date in the selection, and the DateTime object at + * index 2 must be the last date in the selection. Both + * indexes are required. + * + * @return True on success, otherwise false. + * + * @note The time portion of the DateTime object(s) is ignored. Exceptions + * are raised for invalid arguments. + * + * This method will fail if applied to a month calendar control that + * does not have the MULTI (MCS_MULTISELECT) style. + */ RexxMethod2(RexxObjectPtr, mc_setSelectionRange, RexxArrayObject, dateTimes, CSELF, pCSelf) { HWND hMC = getMonthCalendar(context, pCSelf); - if ( hMC == NULL ) + if ( hMC != NULL ) { - return NULLOBJECT; - } + SYSTEMTIME sysTime[2]; - SYSTEMTIME sysTime[2]; - BOOL success = FALSE; - memset(&sysTime, 0, 2 * sizeof(SYSTEMTIME)); - - RexxObjectPtr startDate = context->ArrayAt(dateTimes, 1); - RexxObjectPtr endDate = context->ArrayAt(dateTimes, 2); - if ( startDate == NULLOBJECT || endDate == NULLOBJECT ) - { - sparseArrayException(context->threadContext, 1, (startDate == NULLOBJECT ? 1 : 2)); - goto err_out; + if ( dt2sysTimeRange(context, dateTimes, (SYSTEMTIME *)&sysTime, dtDate, true, NULL) ) + { + return (MonthCal_SetSelRange(hMC, &sysTime) == 0 ? TheFalseObj : TheTrueObj); + } } - - if ( ! context->IsOfType(startDate, "DATETIME") ) - { - wrongObjInArrayException(context->threadContext, 1, 1, "DateTime"); - goto err_out; - } - if ( ! context->IsOfType(endDate, "DATETIME") ) - { - wrongObjInArrayException(context->threadContext, 1, 2, "DateTime"); - goto err_out; - } - - if ( dt2sysTime(context, startDate, (SYSTEMTIME *)&sysTime, dtDate) && - dt2sysTime(context, endDate, (SYSTEMTIME *)&sysTime + 1, dtDate) ) - { - return (MonthCal_SetSelRange(hMC, &sysTime) == 0 ? TheFalseObj : TheTrueObj); - } - -err_out: return TheFalseObj; } @@ -1639,7 +1771,7 @@ wrongClassException(context->threadContext, 1, "DateTime"); goto done_out; } - dt2sysTime(context, date, &sysTime, dtDate); + dt2sysTime(context->threadContext, date, &sysTime, dtDate); } MonthCal_SetToday(hMC, &sysTime); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |