From: <mie...@us...> - 2012-04-09 23:53:10
|
Revision: 7744 http://oorexx.svn.sourceforge.net/oorexx/?rev=7744&view=rev Author: miesfeld Date: 2012-04-09 23:53:03 +0000 (Mon, 09 Apr 2012) Log Message: ----------- ooDialog - Invoke leaving() for the PropertySheetDialog Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-04-08 18:03:55 UTC (rev 7743) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-04-09 23:53:03 UTC (rev 7744) @@ -849,7 +849,7 @@ char *caption; uint32_t pageCount; uint32_t propSheetFlags; - int getResultValue; // Storage for the return from PSM_GETRESULT + intptr_t getResultValue; // Storage for the return from PSM_GETRESULT bool modeless; bool isNotWizard; bool isWiz97; Modified: main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-04-08 18:03:55 UTC (rev 7743) +++ main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-04-09 23:53:03 UTC (rev 7744) @@ -630,6 +630,7 @@ pcpbd->hDlg = hPropSheet; // Not sure about using the whole top dialog thing for property sheets. + // There is no pcpbd->previous set. installNecessaryStuff(pcpbd, NULL); pcpbd->hDlg = hPropSheet; @@ -642,7 +643,8 @@ pcpbd->onTheTop = true; pcpbd->dlgProcThreadID = GetCurrentThreadId(); - // Do we have a modal dialog? TODO need to check this for modeless property sheet. + // Do we have a modal dialog? TODO this check is worthless because + // there is no pcpbd->previous set. checkModal((pCPlainBaseDialog)pcpbd->previous, pcpsd->modeless); c->SendMessage0(pcpsd->rexxSelf, "INITDIALOG"); @@ -1185,7 +1187,7 @@ } if ( PropSheet_GetCurrentPageHwnd(hPropSheet) == NULL ) { - pcpsd->getResultValue = (int)PropSheet_GetResult(hPropSheet); + pcpsd->getResultValue = PropSheet_GetResult(hPropSheet); break; } } @@ -1199,6 +1201,8 @@ { ret = delDialog(pcpbd, pcpbd->dlgProcContext); pcpbd->hDlgProcThread = NULL; + + c->SendMessage0(pcpbd->rexxSelf, "LEAVING"); } LeaveCriticalSection(&crit_sec); @@ -2495,6 +2499,9 @@ RexxObjectPtr result = TheNegativeOneObj; HWND hParent = NULL; + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + pcpsd->getResultValue = -1; + PROPSHEETPAGE *psp = NULL; PROPSHEETHEADER *psh = NULL; @@ -2507,8 +2514,6 @@ } } - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - psp = initPropSheetPages(context, pcpsd); if ( psp == NULL ) { @@ -2523,7 +2528,7 @@ goto done_out; } - INT_PTR ret; + intptr_t ret; if ( hParent == NULL ) { assignPSDThreadContext(pcpsd, context->threadContext, GetCurrentThreadId()); @@ -2539,9 +2544,15 @@ } else { - ret = (INT_PTR)SendMessage(hParent, WM_USER_CREATEPROPSHEET_DLG, (WPARAM)psh, (LPARAM)pcpsd); + ret = (intptr_t)SendMessage(hParent, WM_USER_CREATEPROPSHEET_DLG, (WPARAM)psh, (LPARAM)pcpsd); } + pcpsd->getResultValue = ret; + + // Call leaving now, but note that the underlying Windows property sheet + // dialog is now destroyed + context->SendMessage0(pcpsd->rexxSelf, "LEAVING"); + result = context->WholeNumber(ret); done_out: @@ -3141,34 +3152,44 @@ /** PropertySheetDialog::getResult() * - * Used by modeless property sheets to retrieve the same information returned - * to modal property sheets. + * Returns the result of executing the PropertySheetDialog. * + * Originally this was intended to be used by modeless property sheets to + * retrieve the same information returned to modal property sheets. Now howver, + * the getResultValue is set for modeless on modal dialogs. + * */ RexxMethod1(RexxObjectPtr, psdlg_getResult, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - RexxObjectPtr result; + char *result; + switch ( pcpsd->getResultValue ) { + case OOD_NO_VALUE : + result = "NOTFINISHED"; + break; case -1 : - result = TheNegativeOneObj; + result = "EXECUTIONERR"; break; case ID_PSRESTARTWINDOWS : - result = context->String("RESTARTWINDOWS"); + result = "RESTARTWINDOWS"; break; case ID_PSREBOOTSYSTEM : - result = context->String("REBOOTSYSTEM"); + result = "REBOOTSYSTEM"; break; case 0 : - result = TheZeroObj; + result = "CLOSEDCANCEL"; break; + case 1 : + result = "CLOSEDOK"; + break; default : - result = TheNilObj; + result = "UNKNOWN"; break; } - return result; + return context->String(result); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-05-30 16:14:06
|
Revision: 7814 http://oorexx.svn.sourceforge.net/oorexx/?rev=7814&view=rev Author: miesfeld Date: 2012-05-30 16:13:54 +0000 (Wed, 30 May 2012) Log Message: ----------- The APICommon module was meant to be useful when building any native API lbirary, but I let too many Windows only things creep in. Fix that. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/APICommon.cpp main/trunk/extensions/platform/windows/oodialog/APICommon.hpp main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp Modified: main/trunk/extensions/platform/windows/oodialog/APICommon.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2012-05-30 15:48:52 UTC (rev 7813) +++ main/trunk/extensions/platform/windows/oodialog/APICommon.cpp 2012-05-30 16:13:54 UTC (rev 7814) @@ -40,13 +40,13 @@ * APICommon.cpp * * This module contains generic convenience functions that might be useful in - * any code that uses the native API. Include APICommon.hpp to use them. + * any code that uses the ooRexx native API. Include APICommon.hpp to use them. */ -#include "ooDialog.hpp" // Must be first, includes windows.h, commctrl.h, and oorexxapi.h - #include <stdio.h> +#include <string.h> #include <errno.h> +#include "oorexxapi.h" #include "APICommon.hpp" @@ -60,22 +60,22 @@ * @param c * @param msg */ -void severeErrorException(RexxThreadContext *c, char *msg) +void severeErrorException(RexxThreadContext *c, const char *msg) { c->RaiseException1(Rexx_Error_Interpretation_user_defined, c->String(msg)); } -void systemServiceException(RexxThreadContext *c, char *msg) +void systemServiceException(RexxThreadContext *c, const char *msg) { c->RaiseException1(Rexx_Error_System_service_user_defined, c->String(msg)); } -void systemServiceException(RexxThreadContext *context, char *msg, const char *sub) +void systemServiceException(RexxThreadContext *context, const char *msg, const char *sub) { if ( sub != NULL ) { - TCHAR buffer[128]; - _snprintf(buffer, sizeof(buffer), msg, sub); + char buffer[128]; + snprintf(buffer, sizeof(buffer), msg, sub); systemServiceException(context, buffer); } else @@ -84,25 +84,13 @@ } } -void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc) +void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, uint32_t rc) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), msg, arg1, rc); + char buffer[256]; + snprintf(buffer, sizeof(buffer), msg, arg1, rc); systemServiceException(context, buffer); } -void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1) -{ - systemServiceExceptionCode(context, msg, arg1, GetLastError()); -} - -void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr) -{ - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), msg, arg1, hr); - systemServiceException(context, buffer); -} - void outOfMemoryException(RexxThreadContext *c) { systemServiceException(c, NO_MEMORY_MSG); @@ -127,9 +115,66 @@ } /** + * Error 98.900 + * + * 98 The language processor detected a specific error during execution. The + * associated error gives the reason for the error. + * + * 900 User message. + * + * The base class has not been initialized correctly + * + * @param c The method context we are operating under. + * + * @return Returns a null pointer. This allows this type of code: + * + * if ( pCSelf == NULL ) + * { + * return baseClassIntializationException(c); + * } + * + * @remarks This error is intended to be used when the CSelf pointer is null. + * It can only happen (I believe) when the user inovkes a method on + * self in init() before the super class init() has run. + */ +void *baseClassIntializationException(RexxMethodContext *c) +{ + return executionErrorException(c->threadContext, "The base class has not been initialized correctly"); +} + +/** + * Error 98.900 + * + * 98 The language processor detected a specific error during execution. The + * associated error gives the reason for the error. + * + * 900 User message. + * + * The ooSQLiteDB base class has not been initialized correctly + * + * @param c The method context we are operating under. + * @param clsName The name of the base class. + * + * @return A null pointer to void + * + * @remarks This error is intended to be used when a CSelf pointer, is null. It + * can only happen (I believe) when the user inovkes a method on self + * in init() before the super class init() has run. + * + * Identifying the actual base class may make it easier for the user to + * understand what the problem is. + */ +void *baseClassIntializationException(RexxMethodContext *c, CSTRING clsName) +{ + char buffer[256]; + snprintf(buffer, sizeof(buffer), "The %s base class has not been initialized correctly", clsName); + return executionErrorException(c->threadContext, buffer); +} + +/** * Message * - * The number of active dialogs has reached the maximum (20) allowed + * Argument 1, the database connection object, can not be null * * Raises 88.900 * @@ -155,8 +200,8 @@ */ void userDefinedMsgException(RexxThreadContext *c, CSTRING formatStr, int number) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), formatStr, number); + char buffer[256]; + snprintf(buffer, sizeof(buffer), formatStr, number); userDefinedMsgException(c, buffer); } @@ -173,8 +218,8 @@ */ void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d %s", pos, msg); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d %s", pos, msg); userDefinedMsgException(c, buffer); } @@ -205,8 +250,8 @@ */ void userDefinedMsgException(RexxMethodContext *c, size_t pos, CSTRING msg) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Method argument %d %s", pos, msg); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Method argument %d %s", pos, msg); userDefinedMsgException(c, buffer); } @@ -231,8 +276,48 @@ } /** - * Argument 'argument' is not a valid'msg' + * Argument 'argument' must be of the 'class' class; found 'actual' * + * Argument 4 must be of the Directory class; found a Stem + * + * Similar to 88.914 + * Raises 88.900 + * + * @param c The thread context we are operating under. + * @param pos The 'argument' position. + * @param n The name of the class expected. + * @param actual Some Rexx object. + * + * @return Pointer to void, could be used in the return statement of a method + * to return NULLOBJECT after the exeception is raised. + * + * @remarks If _actual is a stem object without an assigned name, then + * ObjectToStringValue() will return the empty string, which is + * confusing in the error message. Hence the work around. What would + * be better is to use the real class name for _actual, but currently + * I get Stem, rather than 'a Stem' or Array rather than 'an Array'. + * Need to figure out how to get an Array. + */ +RexxObjectPtr wrongClassException(RexxThreadContext *c, size_t pos, const char *n, RexxObjectPtr _actual) +{ + char buffer[256]; + + CSTRING actual = c->ObjectToStringValue(_actual); + if ( strlen(actual) == 0 ) + { + actual = strPrintClassID(c, _actual); + } + + snprintf(buffer, sizeof(buffer), "Argument %d must be of the %s class; found %s", + pos, n, actual); + + userDefinedMsgException(c, buffer); + return NULLOBJECT; +} + +/** + * Argument 'argument' is not a valid 'msg' + * * Argument 3 is not a valid menu handle * * Raises 88.900 @@ -243,16 +328,16 @@ */ RexxObjectPtr invalidTypeException(RexxThreadContext *c, size_t pos, const char *type) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d is not a valid %s", pos, type); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d is not a valid %s", pos, type); userDefinedMsgException(c, buffer); return NULLOBJECT; } void invalidImageException(RexxThreadContext *c, size_t pos, CSTRING type, CSTRING actual) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a %s image; found %s", pos, type, actual); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be a %s image; found %s", pos, type, actual); userDefinedMsgException(c, buffer); } @@ -271,8 +356,8 @@ */ void stringTooLongException(RexxThreadContext *c, size_t pos, size_t len, size_t realLen) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be less than %d characters in length; length is %d", + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be less than %d characters in length; length is %d", pos, len, realLen); userDefinedMsgException(c, buffer); } @@ -291,8 +376,8 @@ */ void numberTooSmallException(RexxThreadContext *c, int pos, int min, RexxObjectPtr actual) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a whole number greater than %d; actual %s", + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be a whole number greater than %d; actual %s", pos, min, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); } @@ -315,8 +400,8 @@ */ RexxObjectPtr notBooleanException(RexxThreadContext *c, size_t pos, RexxObjectPtr actual) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be true or false; found \"%s\"", + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be true or false; found \"%s\"", pos, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); return NULLOBJECT; @@ -324,23 +409,23 @@ void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj, RexxObjectPtr actual) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Index %d of the array, argument %d, must be %s; found \"%s\"", + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Index %d of the array, argument %d, must be %s; found \"%s\"", index, argPos, obj, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); } void wrongObjInArrayException(RexxThreadContext *c, size_t argPos, size_t index, CSTRING obj) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Index %d of the array, argument %d, must be %s", index, argPos, obj); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Index %d of the array, argument %d, must be %s", index, argPos, obj); userDefinedMsgException(c, buffer); } void wrongObjInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index, CSTRING needed, RexxObjectPtr actual) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, must be %s; found \"%s\"", index, argPos, needed, c->ObjectToStringValue(actual)); userDefinedMsgException(c, buffer); @@ -348,8 +433,8 @@ void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d, is required", index, argPos); userDefinedMsgException(c, buffer); @@ -368,8 +453,8 @@ */ void missingIndexesInDirectoryException(RexxThreadContext *c, int argPos, CSTRING indexes) { - TCHAR buffer[512]; - _snprintf(buffer, sizeof(buffer), + char buffer[512]; + snprintf(buffer, sizeof(buffer), "The directory object, argument %d, most contain at least one of the indexes, %s", argPos, indexes); userDefinedMsgException(c, buffer); @@ -391,8 +476,8 @@ */ void directoryIndexExceptionList(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING list, CSTRING actual) { - TCHAR buffer[512]; - _snprintf(buffer, sizeof(buffer), + char buffer[512]; + snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d must be one of %s; found \"%s\"", index, pos, list, actual); userDefinedMsgException(c, buffer); } @@ -413,30 +498,30 @@ */ void directoryIndexExceptionMsg(RexxThreadContext *c, size_t pos, CSTRING index, CSTRING msg, CSTRING actual) { - TCHAR buffer[512]; - _snprintf(buffer, sizeof(buffer), + char buffer[512]; + snprintf(buffer, sizeof(buffer), "Index, %s, of argument %d %s; found \"%s\"", index, pos, msg, actual); userDefinedMsgException(c, buffer); } void emptyArrayException(RexxThreadContext *c, int argPos) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-empty array", argPos); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be a non-empty array", argPos); userDefinedMsgException(c, buffer); } void arrayToLargeException(RexxThreadContext *c, uint32_t found, uint32_t max, int argPos) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d, array items (%d) exceeds maximum (%d) allowed", argPos, found, max); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d, array items (%d) exceeds maximum (%d) allowed", argPos, found, max); userDefinedMsgException(c, buffer); } void sparseArrayException(RexxThreadContext *c, size_t argPos, size_t index) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d must be a non-sparse array, index %d is missing", argPos, index); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d must be a non-sparse array, index %d is missing", argPos, index); userDefinedMsgException(c, buffer); } @@ -476,10 +561,10 @@ */ void failedToRetrieveException(RexxThreadContext *c, CSTRING item, RexxObjectPtr source) { - TCHAR buf[128]; + char buf[128]; RexxObjectPtr name = c->SendMessage0(source, "OBJECTNAME"); - _snprintf(buf, sizeof(buf), "Could not retrieve the %s information for %s", + snprintf(buf, sizeof(buf), "Could not retrieve the %s information for %s", item, c->ObjectToStringValue(name)); c->RaiseException1(Rexx_Error_Execution_user_defined, c->String(buf)); @@ -487,22 +572,22 @@ void nullObjectException(RexxThreadContext *c, CSTRING name, size_t pos) { - TCHAR buffer[256]; + char buffer[256]; if ( pos == 0 ) { - _snprintf(buffer, sizeof(buffer), "The %s object must not be null", name); + snprintf(buffer, sizeof(buffer), "The %s object must not be null", name); } else { - _snprintf(buffer, sizeof(buffer), "Argument %d, the %s object, must not be null", pos, name); + snprintf(buffer, sizeof(buffer), "Argument %d, the %s object, must not be null", pos, name); } userDefinedMsgException(c, buffer); } void nullStringMethodException(RexxMethodContext *c, size_t pos) { - TCHAR buffer[256]; - _snprintf(buffer, sizeof(buffer), "Argument %d, must not be the empty string", pos); + char buffer[256]; + snprintf(buffer, sizeof(buffer), "Argument %d, must not be the empty string", pos); c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buffer)); } @@ -578,8 +663,8 @@ RexxObjectPtr wrongArgKeywordsException(RexxThreadContext *c, size_t pos, CSTRING list, CSTRING actual) { - TCHAR buffer[512]; - _snprintf(buffer, sizeof(buffer), "Method argument %d, must contain one or more of %s; found \"%s\"", + char buffer[512]; + snprintf(buffer, sizeof(buffer), "Method argument %d, must contain one or more of %s; found \"%s\"", pos, list, actual); userDefinedMsgException(c, buffer); return NULLOBJECT; @@ -606,9 +691,8 @@ */ RexxObjectPtr wrongArgOptionException(RexxThreadContext *c, size_t pos, CSTRING list, CSTRING actual) { - - TCHAR buffer[512]; - _snprintf(buffer, sizeof(buffer), "Method argument %d, option must be one of %s; found \"%s\"", pos, list, actual); + char buffer[512]; + snprintf(buffer, sizeof(buffer), "Method argument %d, option must be one of %s; found \"%s\"", pos, list, actual); userDefinedMsgException(c, buffer); return NULLOBJECT; } @@ -618,6 +702,73 @@ return wrongArgOptionException(c, pos, list, c->ObjectToStringValue(actual)); } +/** + * Similar to error 43.001 Could not find routine <routine> + * + * Argument <pos>, (the <rtnName> routine,) could not be found + * + * Argument 2, (the "myCallback" routine,) could not be found + * + * @param c + * @param pos + * @param list + * @param actual + * + * @return RexxObjectPtr + */ +RexxObjectPtr noSuchRoutineException(RexxThreadContext *c, CSTRING rtnName, size_t pos) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "Argument %d, (the \"%s\" routine,) could not be found", pos, rtnName); + c->RaiseException1(Rexx_Error_Invalid_argument_user_defined, c->String(buf)); + return NULLOBJECT; +} + +/** + * Similar to error 93.963 Call to unsupported or unimplemented method + * + * Call to unsupported or unimplemented routine (<rtnName) + * + * Argument 2, (the "myCallback" routine,) could not be found + * + * @param c + * @param pos + * @param list + * @param actual + * + * @return RexxObjectPtr + */ +RexxObjectPtr unsupportedRoutineException(RexxCallContext *c, CSTRING rtnName) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "Call to unsupported or unimplemented routine (\"%s\")", rtnName); + c->RaiseException1(Rexx_Error_Incorrect_call_user_defined, c->String(buf)); + return NULLOBJECT; +} + +/** + * 98.900 + * Error 98 - Execution error + * The language processor detected a specific error during execution. + * + * The return from method "name"() must be a whole number; found "actual" + * or + * The return from routine "name"() must be a whole number; found "actual" + * + * The return from method commitHookCallBack() must be a whole number; found an + * array + * + */ +RexxObjectPtr invalidReturnWholeNumberException(RexxThreadContext *c, CSTRING name, RexxObjectPtr actual, bool isMethod) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "The return from %s %s() must be a whole number; found %s", + isMethod ? "method" : "routine", name, c->ObjectToStringValue(actual)); + + c->RaiseException1(Rexx_Error_Execution_user_defined, c->String(buf)); + return NULLOBJECT; +} + CSTRING rxGetStringAttribute(RexxMethodContext *context, RexxObjectPtr obj, CSTRING name) { CSTRING value = NULL; @@ -679,11 +830,16 @@ bool requiredClass(RexxThreadContext *c, RexxObjectPtr obj, const char *name, size_t pos) { - if ( obj == NULLOBJECT || ! c->IsOfType(obj, name) ) + if ( obj == NULLOBJECT ) { wrongClassException(c, pos, name); return false; } + else if ( ! c->IsOfType(obj, name) ) + { + wrongClassException(c, pos, name, obj); + return false; + } return true; } @@ -701,11 +857,11 @@ { if ( obj != NULLOBJECT ) { - if ( obj == TheTrueObj ) + if ( obj == c->True() ) { return 1; } - if ( obj == TheFalseObj ) + if ( obj == c->False() ) { return 0; } @@ -760,7 +916,12 @@ * @note There is no way to tell the difference between a valid _UI64_MAX * number and an error. The function simply assumes a return of * _UI64_MAX is an error signal. + * + * @note This function is using some things that work on Windows, but cause + * errors on Linux. Just comment out until it can be researched. + * TODO PLEASE fix this. */ +#ifdef _WIN32 bool rxStr2Number(RexxMethodContext *c, CSTRING str, uint64_t *number, size_t pos) { char *end; @@ -772,6 +933,7 @@ } return true; } +#endif /* * This function behaves exactly like rxStr2Number(), except it is for 32-bit @@ -879,7 +1041,7 @@ RexxObjectPtr result = c->GetObjectVariable(varName); if ( result == NULLOBJECT ) { - result = TheNilObj; + result = c->Nil(); } c->SetObjectVariable(varName, val); @@ -1046,13 +1208,16 @@ * @param classID The ID string of the class we are looking for. * * @return True if obj is a class object of the type specified, otherwise false. + * + * @note This is changed to be case sensitive because of stricmp problems. + * TODO PLEASE fix this. */ bool isOfClassType(RexxMethodContext *c, RexxObjectPtr obj, CSTRING classID) { if ( obj != NULLOBJECT && c->IsOfType(obj, "CLASS") ) { RexxStringObject clsID = (RexxStringObject)c->SendMessage0(obj, "ID"); - if ( clsID != NULLOBJECT && stricmp(c->StringData(clsID), classID) == 0 ) + if ( clsID != NULLOBJECT && strcmp(c->StringData(clsID), classID) == 0 ) { return true; } @@ -1088,7 +1253,51 @@ } +/** + * Returns the class ID of a Rexx object as a string, rather than printing it. + * + * Not that good of a function name, but meant to go hand in hand with + * dbgPrintClassID. + * + * Useful in exception messages to identify exactly what a Rexx object is. Will + * work with class objects or instance objects. + * + * @param c The thread context we are operating in. + * @param obj The object to identify. + */ +CSTRING strPrintClassID(RexxThreadContext *c, RexxObjectPtr obj) +{ + if ( ! c->IsOfType(obj, "CLASS") ) + { + obj = c->SendMessage0(obj, "CLASS"); + } + + if ( obj != NULLOBJECT ) + { + RexxStringObject id = (RexxStringObject)c->SendMessage0(obj, "ID"); + if ( id != NULLOBJECT ) + { + return c->CString(id); + } + else + { + return "<not known>"; + } + } + else + { + return "<not known>"; + } +} + + void dbgPrintClassID(RexxMethodContext *c, RexxObjectPtr obj) { dbgPrintClassID(c->threadContext, obj); } + + +CSTRING strPrintClassID(RexxMethodContext *c, RexxObjectPtr obj) +{ + return strPrintClassID(c->threadContext, obj); +} Modified: main/trunk/extensions/platform/windows/oodialog/APICommon.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2012-05-30 15:48:52 UTC (rev 7813) +++ main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2012-05-30 16:13:54 UTC (rev 7814) @@ -40,24 +40,21 @@ #define APICommon_Included -#define NO_HMODULE_MSG "failed to obtain %s module handle; OS error code %d" -#define NO_PROC_MSG "failed to get procedeure adddress for %s(); OS error code %d" -#define API_FAILED_MSG "system API %s() failed; OS error code %d" -#define COM_API_FAILED_MSG "system API %s() failed; COM code 0x%08x" +#ifdef _WIN32 + #define snprintf _snprintf +#endif + + #define NO_MEMORY_MSG "failed to allocate memory" -#define FUNC_WINCTRL_FAILED_MSG "the '%s'() function of the Windows '%s' control failed" -#define MSG_WINCTRL_FAILED_MSG "the '%s' message of the Windows '%s' control failed" -#define NO_LOCAL_ENVIRONMENT_MSG "the .local environment was not found" -#define NO_SIZE_CLASS_MSG "the .Size class was not found" -#define BAD_APPLICATION_MSG "the .Application object already exists" -extern void severeErrorException(RexxThreadContext *c, char *msg); -extern void systemServiceException(RexxThreadContext *context, char *msg); -extern void systemServiceException(RexxThreadContext *context, char *msg, const char *sub); -extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, DWORD rc); +extern void severeErrorException(RexxThreadContext *c, const char *msg); +extern void systemServiceException(RexxThreadContext *context, const char *msg); +extern void systemServiceException(RexxThreadContext *context, const char *msg, const char *sub); +extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1, uint32_t rc); extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1); -extern void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr); extern void outOfMemoryException(RexxThreadContext *c); +extern void *baseClassIntializationException(RexxMethodContext *c); +extern void *baseClassIntializationException(RexxMethodContext *c, CSTRING clsName); extern void userDefinedMsgException(RexxThreadContext *c, CSTRING msg); extern void userDefinedMsgException(RexxThreadContext *c, CSTRING formatStr, int number); extern void userDefinedMsgException(RexxThreadContext *c, int pos, CSTRING msg); @@ -87,6 +84,7 @@ extern void nullStringMethodException(RexxMethodContext *c, size_t pos); extern RexxObjectPtr wrongClassException(RexxThreadContext *c, size_t pos, const char *n); +extern RexxObjectPtr wrongClassException(RexxThreadContext *c, size_t pos, const char *n, RexxObjectPtr actual); extern RexxObjectPtr wrongArgValueException(RexxThreadContext *c, size_t pos, const char *list, RexxObjectPtr actual); extern RexxObjectPtr wrongArgValueException(RexxThreadContext *c, size_t pos, const char *list, const char *actual); extern RexxObjectPtr wrongArgKeywordsException(RexxThreadContext *c, size_t pos, CSTRING list, CSTRING actual); @@ -98,6 +96,9 @@ extern RexxObjectPtr wrongArgOptionException(RexxThreadContext *c, size_t pos, CSTRING list, RexxObjectPtr actual); extern RexxObjectPtr wrongArgOptionException(RexxThreadContext *c, size_t pos, CSTRING list, CSTRING actual); extern RexxObjectPtr invalidTypeException(RexxThreadContext *c, size_t pos, const char *type); +extern RexxObjectPtr noSuchRoutineException(RexxThreadContext *c, CSTRING rtnName, size_t pos); +extern RexxObjectPtr unsupportedRoutineException(RexxCallContext *c, CSTRING rtnName); +extern RexxObjectPtr invalidReturnWholeNumberException(RexxThreadContext *c, CSTRING name, RexxObjectPtr actual, bool isMethod); extern CSTRING rxGetStringAttribute(RexxMethodContext *context, RexxObjectPtr obj, CSTRING name); extern bool rxGetNumberAttribute(RexxMethodContext *context, RexxObjectPtr obj, CSTRING name, wholenumber_t *pNumber); @@ -115,13 +116,15 @@ extern RexxObjectPtr rxNewBuiltinObject(RexxMethodContext *c, CSTRING className); extern RexxObjectPtr rxNewBuiltinObject(RexxThreadContext *c, CSTRING className); -extern bool isOutOfMemoryException(RexxThreadContext *c); -extern bool checkForCondition(RexxThreadContext *c, bool clear); -extern void standardConditionMsg(RexxThreadContext *c, RexxDirectoryObject condObj, RexxCondition *condition); -extern bool isInt(int, RexxObjectPtr, RexxThreadContext *); -extern bool isOfClassType(RexxMethodContext *, RexxObjectPtr, CSTRING); -extern void dbgPrintClassID(RexxThreadContext *c, RexxObjectPtr obj); -extern void dbgPrintClassID(RexxMethodContext *c, RexxObjectPtr obj); +extern bool isOutOfMemoryException(RexxThreadContext *c); +extern bool checkForCondition(RexxThreadContext *c, bool clear); +extern void standardConditionMsg(RexxThreadContext *c, RexxDirectoryObject condObj, RexxCondition *condition); +extern bool isInt(int, RexxObjectPtr, RexxThreadContext *); +extern bool isOfClassType(RexxMethodContext *, RexxObjectPtr, CSTRING); +extern void dbgPrintClassID(RexxThreadContext *c, RexxObjectPtr obj); +extern void dbgPrintClassID(RexxMethodContext *c, RexxObjectPtr obj); +extern CSTRING strPrintClassID(RexxThreadContext *c, RexxObjectPtr obj); +extern CSTRING strPrintClassID(RexxMethodContext *c, RexxObjectPtr obj); /** @@ -147,6 +150,28 @@ } /** + * No data returned from function "function" + * + * No data returned from function "commitHookCallback" + * + * Raises 44.001 + * + * @param c The thread context we are operating under. + * @param msg The function name that did not return a value + * + * @return NULLOBJECT + */ +inline RexxObjectPtr noRoutineReturnException(RexxThreadContext *c, RexxStringObject rtnName) +{ + c->RaiseException1(Rexx_Error_Function_no_data_function, rtnName); + return NULLOBJECT; +} +inline RexxObjectPtr noRoutineReturnException(RexxThreadContext *c, CSTRING rtnName) +{ + return noRoutineReturnException(c, c->String(rtnName)); +} + +/** * Missing argument; argument 'argument' is required * * Missing argument; argument 2 is required Modified: main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2012-05-30 15:48:52 UTC (rev 7813) +++ main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2012-05-30 16:13:54 UTC (rev 7814) @@ -51,6 +51,19 @@ #include "APICommon.hpp" #include "oodCommon.hpp" + +void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1) +{ + systemServiceExceptionCode(context, msg, arg1, GetLastError()); +} + +void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), msg, arg1, hr); + systemServiceException(context, buffer); +} + /** * 49.900 * 49 -> A severe error was detected in the language processor or execution @@ -79,44 +92,6 @@ /** - * Error 98.900 - * - * 98 The language processor detected a specific error during execution. The - * associated error gives the reason for the error. - * - * 900 User message. - * - * The base class has not been initialized correctly - * - * @param c The method context we are operating under. - * - * @return Returns a null pointer. This allows this type of code: - * - * if ( pCSelf == NULL ) - * { - * return baseClassIntializationException(c); - * } - * - * @remarks This error should be used when the CSelf pointer is null. It can - * only happen (I believe) when the user inovkes a method on self in - * init() before the super class init() has run. For example: - * - * ::method init - * self~create(30, 30, 257, 123, "Simple Dialog", "CENTER") - * forward class (super) continue - * - * Unfortunately, I have sample ooDialog programs from users that do - * just this sort of thing. Prior to the conversion to the C++ APIs, - * the programs probably did not work as the user thought they were - * working, but it was not fatal. However, now a null CSelf pointer - * causes a crash if not checked for. - */ -void *baseClassIntializationException(RexxMethodContext *c) -{ - return executionErrorException(c->threadContext, "The base class has not been initialized correctly"); -} - -/** * 93.900 * Error 93 - Incorrect call to method * The specified method, built-in function, or external routine exists, Modified: main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2012-05-30 15:48:52 UTC (rev 7813) +++ main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2012-05-30 16:13:54 UTC (rev 7814) @@ -52,7 +52,18 @@ #define DLLGETVERSION_FUNCTION "DllGetVersion" #define COMMON_CONTROL_DLL "comctl32.dll" -#define NO_COMMCTRL_MSG "failed to initialize %s; OS error code %d" +#define NO_COMMCTRL_MSG "failed to initialize %s; OS error code %d" +#define NO_HMODULE_MSG "failed to obtain %s module handle; OS error code %d" +#define NO_PROC_MSG "failed to get procedeure adddress for %s(); OS error code %d" +#define API_FAILED_MSG "system API %s() failed; OS error code %d" +#define COM_API_FAILED_MSG "system API %s() failed; COM code 0x%08x" +#define FUNC_WINCTRL_FAILED_MSG "the '%s'() function of the Windows '%s' control failed" +#define MSG_WINCTRL_FAILED_MSG "the '%s' message of the Windows '%s' control failed" +#define NO_LOCAL_ENVIRONMENT_MSG "the .local environment was not found" +#define NO_SIZE_CLASS_MSG "the .Size class was not found" +#define BAD_APPLICATION_MSG "the .Application object already exists" + + #define COMCTL32_FULL_PART 0 #define COMCTL32_NUMBER_PART 1 #define COMCTL32_OS_PART 2 @@ -315,7 +326,8 @@ } extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); -extern void *baseClassIntializationException(RexxMethodContext *c); +extern void systemServiceExceptionCode(RexxThreadContext *context, const char *msg, const char *arg1); +extern void systemServiceExceptionComCode(RexxThreadContext *context, const char *msg, const char *arg1, HRESULT hr); extern RexxObjectPtr invalidCategoryPageException(RexxMethodContext *c, int, int); extern RexxObjectPtr noSuchPageException(RexxMethodContext *c, RexxObjectPtr page, size_t pos); extern RexxObjectPtr noWindowsPageException(RexxMethodContext *c, size_t pageID, size_t pos); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-06-25 23:42:59
|
Revision: 7966 http://oorexx.svn.sourceforge.net/oorexx/?rev=7966&view=rev Author: miesfeld Date: 2012-06-25 23:42:52 +0000 (Mon, 25 Jun 2012) Log Message: ----------- ooDialog - fix shortcomings in the PropertySheetDialog implementation that became apparent while doing the documentation Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-25 22:46:05 UTC (rev 7965) +++ main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-25 23:42:52 UTC (rev 7966) @@ -78,6 +78,8 @@ ::constant MAXPROPPAGES 100 +::constant ID_PSRESTARTWINDOWS 2 +::constant ID_PSREBOOTSYSTEM 3 -- (ID_PSRESTARTWINDOWS | 0x1) -- The application icon for the property sheet dialog ::attribute appIcon get unguarded Modified: main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2012-06-25 22:46:05 UTC (rev 7965) +++ main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2012-06-25 23:42:52 UTC (rev 7966) @@ -346,6 +346,7 @@ { SetLastError(0); INT_PTR ret = PropertySheet((PROPSHEETHEADER *)wParam); + oodSetSysErrCode(pcpbd->dlgProcContext); ReplyMessage((LRESULT)ret); } else Modified: main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-25 22:46:05 UTC (rev 7965) +++ main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-25 23:42:52 UTC (rev 7966) @@ -2109,6 +2109,92 @@ } +/** + * Checks the requirements, and allocates the PROPSHEETPAGE struct, for adding a + * single page to an existing property sheet page + * + * @param c + * @param pcpsd + * @param _page + * @param index + * @param abortDialog + * + * @return PROPSHEETPAGE* + */ +PROPSHEETPAGE *getPSPMemory(RexxMethodContext *c, pCPropertySheetDialog pcpsd, pCPropertySheetPage *ppcpsp, + RexxObjectPtr page, uint32_t index, bool *abortDialog) +{ + PROPSHEETPAGE *psp = NULL; + + *abortDialog = false; + + if ( pcpsd->pageCount > MAXPROPPAGES ) + { + userDefinedMsgException(c->threadContext, TOO_MANY_PROPSHEET_PAGES, MAXPROPPAGES); + goto done_out; + } + + if ( index < 1 || index > pcpsd->pageCount ) + { + wrongRangeException(c->threadContext, 1, 1, pcpsd->pageCount, index); + goto done_out; + } + + if ( ! requiredClass(c->threadContext, page, "PROPERTYSHEETPAGE", 1) ) + { + goto done_out; + } + + pCPropertySheetPage pcpsp = dlgToPSPCSelf(c, page); + *ppcpsp = pcpsp; + + if ( pcpsp->activated ) + { + userDefinedMsgException(c->threadContext, 1, PROPSHEET_PAGE_ALREADY_ACTIVATED); + goto done_out; + } + + psp = (PROPSHEETPAGE *)LocalAlloc(LPTR, sizeof(PROPSHEETPAGE)); + if ( psp == NULL ) + { + *abortDialog = true; + outOfMemoryException(c->threadContext); + } + +done_out: + return psp; +} + + +/** + * Updates some of the CSelf fields for a property sheet page that is to be + * added to a property sheet. + * + * + * @param pcpsd + * @param ppcpsp + * @param index Zero-based index of the page. + * + * @remarks The original property sheet pages have their dialog procedure + * thread context set when the property sheet is created. When pages + * are added or inserted we need to remember to set the thread + * context. This thread context is the same as the property sheet's + * context. (The thread context could also be copied from one of the + * other pages.) + */ +void updatePageCSelf(pCPropertySheetDialog pcpsd, pCPropertySheetPage pcpsp, uint32_t index) +{ + pcpsp->pageNumber = index; + pcpsp->rexxPropSheet = pcpsd->rexxSelf; + pcpsp->cppPropSheet = pcpsd; + pcpsp->isWizardPage = ! pcpsd->isNotWizard; + + pcpsp->dlgProcContext = pcpsd->dlgProcContext; + pcpsp->dlgProcThreadID = pcpsd->dlgProcThreadID; + pcpsp->pcpbd->dlgProcContext = pcpsd->dlgProcContext; +} + + /** PropertySheetDialog::appIcon() [Attribute set] * * Sets the icon for the appIcon attribute. The user can specify the icon as @@ -2354,6 +2440,9 @@ * The initialization of the property sheet dialog. * * + * @remarks Note that we need to make a copy of the pages array sent to us by + * the programmer so that the programmer can not inadvertently screw + * with the array. */ RexxMethod6(wholenumber_t, psdlg_init, RexxArrayObject, pages, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, caption, OPTIONAL_RexxStringObject, hFile, SUPER, super, OSELF, self) @@ -2401,8 +2490,10 @@ goto done_out; } - pCPropertySheetPage *pPage = cppPages; - RexxObjectPtr *pRexxPage = rexxPages; + RexxArrayObject pagesCopy = context->NewArray(count); + pCPropertySheetPage *pPage = cppPages; + RexxObjectPtr *pRexxPage = rexxPages; + for ( uint32_t i = 1; i <= count; i++, pPage++, pRexxPage++ ) { RexxObjectPtr dlg = context->ArrayAt(pages, i); @@ -2425,6 +2516,7 @@ *pPage = pcpsp; *pRexxPage = dlg; + context->ArrayPut(pagesCopy, dlg, i); } pcpsd->cppPages = cppPages; @@ -2455,7 +2547,7 @@ // and the rest: context->SetObjectVariable("HEADER", TheNilObj); context->SetObjectVariable("IMAGELIST", TheNilObj); - context->SetObjectVariable("PAGES", pages); + context->SetObjectVariable("PAGES", pagesCopy); context->SetObjectVariable("RESOURCES", TheNilObj); pcpsd->startPage = 1; @@ -2506,12 +2598,15 @@ * * Creates a modal property sheet dialog. * + * @note Sets the .systemErrorCode */ RexxMethod2(RexxObjectPtr, psdlg_execute, OPTIONAL_RexxObjectPtr, owner, CSELF, pCSelf) { RexxObjectPtr result = TheNegativeOneObj; HWND hParent = NULL; + oodSetSysErrCode(context->threadContext); + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; pcpsd->getResultValue = -1; @@ -2549,6 +2644,7 @@ if ( setPropSheetHook(pcpsd) ) { ret = PropertySheet(psh); + oodSetSysErrCode(context->threadContext); } else { @@ -2650,92 +2746,6 @@ } -/** - * Checks the requirements, and allocates the PROPSHEETPAGE struct, for adding a - * single page to an existing property sheet page - * - * @param c - * @param pcpsd - * @param _page - * @param index - * @param abortDialog - * - * @return PROPSHEETPAGE* - */ -PROPSHEETPAGE *getPSPMemory(RexxMethodContext *c, pCPropertySheetDialog pcpsd, pCPropertySheetPage *ppcpsp, - RexxObjectPtr page, uint32_t index, bool *abortDialog) -{ - PROPSHEETPAGE *psp = NULL; - - *abortDialog = false; - - if ( pcpsd->pageCount > MAXPROPPAGES ) - { - userDefinedMsgException(c->threadContext, TOO_MANY_PROPSHEET_PAGES, MAXPROPPAGES); - goto done_out; - } - - if ( index < 1 || index > pcpsd->pageCount ) - { - wrongRangeException(c->threadContext, 1, 1, pcpsd->pageCount, index); - goto done_out; - } - - if ( ! requiredClass(c->threadContext, page, "PROPERTYSHEETPAGE", 1) ) - { - goto done_out; - } - - pCPropertySheetPage pcpsp = dlgToPSPCSelf(c, page); - *ppcpsp = pcpsp; - - if ( pcpsp->activated ) - { - userDefinedMsgException(c->threadContext, 1, PROPSHEET_PAGE_ALREADY_ACTIVATED); - goto done_out; - } - - psp = (PROPSHEETPAGE *)LocalAlloc(LPTR, sizeof(PROPSHEETPAGE)); - if ( psp == NULL ) - { - *abortDialog = true; - outOfMemoryException(c->threadContext); - } - -done_out: - return psp; -} - - -/** - * Updates some of the CSelf fields for a property sheet page that is to be - * added to a property sheet. - * - * - * @param pcpsd - * @param ppcpsp - * @param index Zero-based index of the page. - * - * @remarks The original property sheet pages have their dialog procedure - * thread context set when the property sheet is created. When pages - * are added or inserted we need to remember to set the thread - * context. This thread context is the same as the property sheet's - * context. (The thread context could also be copied from one of the - * other pages.) - */ -void updatePageCSelf(pCPropertySheetDialog pcpsd, pCPropertySheetPage pcpsp, uint32_t index) -{ - pcpsp->pageNumber = index; - pcpsp->rexxPropSheet = pcpsd->rexxSelf; - pcpsp->cppPropSheet = pcpsd; - pcpsp->isWizardPage = ! pcpsd->isNotWizard; - - pcpsp->dlgProcContext = pcpsd->dlgProcContext; - pcpsp->dlgProcThreadID = pcpsd->dlgProcThreadID; - pcpsp->pcpbd->dlgProcContext = pcpsd->dlgProcContext; -} - - /** PropertySheetDialog::addPage() * * Adds a page to the property sheet at the end of the pages. @@ -2898,7 +2908,7 @@ if ( PropSheet_InsertPage(pcpsd->hDlg, index, pcpsp->hPropSheetPage) == 0 ) { - systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "PropSheet_RemovePage"); + systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "PropSheet_InsertPage"); goto err_out; } @@ -3181,25 +3191,25 @@ switch ( pcpsd->getResultValue ) { case OOD_NO_VALUE : - result = "NOTFINISHED"; + result = "NotFinished"; break; case -1 : - result = "EXECUTIONERR"; + result = "ExecutionErr"; break; case ID_PSRESTARTWINDOWS : - result = "RESTARTWINDOWS"; + result = "RestartWindows"; break; case ID_PSREBOOTSYSTEM : - result = "REBOOTSYSTEM"; + result = "RebootSystem"; break; case 0 : - result = "CLOSEDCANCEL"; + result = "ClosedCancel"; break; case 1 : - result = "CLOSEDOK"; + result = "ClosedOk"; break; default : - result = "UNKNOWN"; + result = "Unknown"; break; } return context->String(result); @@ -3368,7 +3378,7 @@ { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - int index = PropSheet_HwndToIndex(pcpsd->hDlg, hPage); + int index = PropSheet_PageToIndex(pcpsd->hDlg, hPage); return ++index; } @@ -5485,6 +5495,7 @@ { SetLastError(0); INT_PTR ret = PropertySheet((PROPSHEETHEADER *)wParam); + oodSetSysErrCode(pcpbd->dlgProcContext); ReplyMessage((LRESULT)ret); } else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-06-28 00:31:30
|
Revision: 7969 http://oorexx.svn.sourceforge.net/oorexx/?rev=7969&view=rev Author: miesfeld Date: 2012-06-28 00:31:23 +0000 (Thu, 28 Jun 2012) Log Message: ----------- ooDialog - fix up the property sheet dialog and page classes for the Aero Wizard Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-28 00:31:23 UTC (rev 7969) @@ -114,6 +114,7 @@ ::method apply unguarded external "LIBRARY oodialog psdlg_apply" ::method cancelToClose unguarded external "LIBRARY oodialog psdlg_cancelToClose" ::method changed unguarded external "LIBRARY oodialog psdlg_changed" +::method enableWizButtons external "LIBRARY oodialog psdlg_enableWizButtons" ::method execute external "LIBRARY oodialog psdlg_execute" ::method getCurrentPageHwnd unguarded external "LIBRARY oodialog psdlg_getCurrentPageHwnd" ::method getPage unguarded external "LIBRARY oodialog psdlg_getPage" @@ -148,10 +149,11 @@ ::method removePage unguarded external "LIBRARY oodialog psdlg_removePage" ::method setCurSel unguarded external "LIBRARY oodialog psdlg_setCurSel" ::method setCurSelByID unguarded external "LIBRARY oodialog psdlg_setCurSelByID" -::method setFinishText unguarded external "LIBRARY oodialog psdlg_setButtonText" +::method setButtonText unguarded external "LIBRARY oodialog psdlg_setButtonText" +::method setFinishText unguarded external "LIBRARY oodialog psdlg_setFinishText" ::method setHeaderSubTitle unguarded external "LIBRARY oodialog psdlg_resetPageText" ::method setHeaderTitle unguarded external "LIBRARY oodialog psdlg_resetPageText" -::method setNextText unguarded external "LIBRARY oodialog psdlg_setButtonText" +::method setNextText unguarded external "LIBRARY oodialog psdlg_setNextText" ::method setTitle unguarded external "LIBRARY oodialog psdlg_setTitle" ::method setWizButtons unguarded external "LIBRARY oodialog psdlg_setWizButtons" ::method showWizButtons unguarded external "LIBRARY oodialog psdlg_showWizButtons" Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2012-06-28 00:31:23 UTC (rev 7969) @@ -287,6 +287,11 @@ LocalFree(pcpsp->headerTitle); pcpsp->headerTitle = NULL; } + if ( pcpsp->headerTitleAero != NULL ) + { + LocalFree(pcpsp->headerTitleAero); + pcpsp->headerTitleAero = NULL; + } if ( pcpsp->headerSubTitle != NULL ) { LocalFree(pcpsp->headerSubTitle); Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-06-28 00:31:23 UTC (rev 7969) @@ -810,6 +810,7 @@ INT_PTR pageID; // Identifies the page to the Windows property sheet, resource ID or pointer char *pageTitle; char *headerTitle; + char *headerTitleAero; // Must be Unicode for Aero. char *headerSubTitle; oodClass_t pageType; uint32_t dlgProcThreadID; @@ -823,6 +824,7 @@ bool wantAccelerators; // User wants PSN_TRANSLATEACCELERATOR notifications bool wantGetObject; // User wants PSN_GETOBJECT notifications bool isWizardPage; + bool isAeroWizardPage; bool inRemovePage; // Signals running in PropertySheetDialg::removePage() } CPropertySheetPage; typedef CPropertySheetPage *pCPropertySheetPage; @@ -859,7 +861,7 @@ typedef CPropertySheetDialog *pCPropertySheetDialog; /* - * Struct for the page dialog information. This is used for initializin the + * Struct for the page dialog information. This is used for initializing the * dialog template pointer for either a property sheet page dialog or a managed * tab page dialog. (A managed tab page dialog is a ControlDialog in a * ManagedTab.) Modified: main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2012-06-28 00:31:23 UTC (rev 7969) @@ -2234,7 +2234,7 @@ LPWSTR ansi2unicode(LPCSTR str) { if ( str == NULL ) -{ + { return NULL; } Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2012-06-28 00:31:23 UTC (rev 7969) @@ -750,9 +750,12 @@ REXX_METHOD_PROTOTYPE(psdlg_resetPageText); REXX_METHOD_PROTOTYPE(psdlg_setTitle); REXX_METHOD_PROTOTYPE(psdlg_setWizButtons); +REXX_METHOD_PROTOTYPE(psdlg_enableWizButtons); REXX_METHOD_PROTOTYPE(psdlg_showWizButtons); REXX_METHOD_PROTOTYPE(psdlg_querySiblings); REXX_METHOD_PROTOTYPE(psdlg_setButtonText); +REXX_METHOD_PROTOTYPE(psdlg_setFinishText); +REXX_METHOD_PROTOTYPE(psdlg_setNextText); REXX_METHOD_PROTOTYPE(psdlg_unchanged); REXX_METHOD_PROTOTYPE(psdlg_test); @@ -1669,11 +1672,14 @@ REXX_METHOD(psdlg_setCurSel, psdlg_setCurSel), REXX_METHOD(psdlg_setCurSelByID, psdlg_setCurSelByID), REXX_METHOD(psdlg_setWizButtons, psdlg_setWizButtons), + REXX_METHOD(psdlg_enableWizButtons, psdlg_enableWizButtons), REXX_METHOD(psdlg_showWizButtons, psdlg_showWizButtons), REXX_METHOD(psdlg_querySiblings, psdlg_querySiblings), REXX_METHOD(psdlg_resetPageText, psdlg_resetPageText), REXX_METHOD(psdlg_setTitle, psdlg_setTitle), REXX_METHOD(psdlg_setButtonText, psdlg_setButtonText), + REXX_METHOD(psdlg_setFinishText, psdlg_setFinishText), + REXX_METHOD(psdlg_setNextText, psdlg_setNextText), REXX_METHOD(psdlg_unchanged, psdlg_unchanged), REXX_METHOD(psdlg_test, psdlg_test), Modified: main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-25 23:59:12 UTC (rev 7968) +++ main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-28 00:31:23 UTC (rev 7969) @@ -74,6 +74,7 @@ #define VALID_PSNRET_LIST "PSNRET_NOERROR, PSNRET_INVALID, or PSNRET_INVALID_NOCHANGEPAGE" #define VALID_PSNRET_MSG_LIST "PSNRET_NOERROR or PSNRET_MESSAGEHANDLED" #define VALID_PROPSHEET_BUTTONS "APPLYNOW, BACK, CANCEL, FINISH, HELP, NEXT, or OK" +#define VALID_AERO_BUTTONS "BACK, CANCEL, FINISH, or NEXT" /** * The following set of helper functions, some of which are named tcXXX (for @@ -494,7 +495,7 @@ /** - * A generic function used to set the title, or header titel, or header subtitle + * A generic function used to set the title, or header title, or header subtitle * text for a property sheet page. * * These text strings can be set before the property sheet is created. But they @@ -505,6 +506,13 @@ * When replacing already existing text, the old text needs to be freed. During * delDialog for a property sheet page, the existing text is freed. * + * This is further complicated by the fact that if the page is in an aero + * dialog, the header text has to be in Unicode, but the other page parts do not + * apply. What we do, is always set the ANSI text in the struct. Then, if we + * know now we are an Aero page, we also set the Unicode text in the struct. + * But, we won't always know here. So, when the PROPSHEETPAGE struct is filled + * in, it becomes necessary to, maybe, fix up the Unicode string. + * * @param c * @param pcpsp * @param text @@ -526,17 +534,34 @@ switch ( part ) { case headerSubtext : + { safeLocalFree(pcpsp->headerSubTitle); pcpsp->headerSubTitle = t; break; + } case headerText : + { safeLocalFree(pcpsp->headerTitle); pcpsp->headerTitle = t; + + if ( pcpsp->isAeroWizardPage ) + { + LPWSTR newText = ansi2unicode(text); + if ( newText != NULL ) + { + safeLocalFree(pcpsp->headerTitleAero); + pcpsp->headerTitleAero = (char *)newText; + } + } + break; + } case pageText : + { safeLocalFree(pcpsp->pageTitle); pcpsp->pageTitle = t; break; + } } return true; @@ -1850,6 +1875,18 @@ * * @remarks On error, it is the caller's repsonsibility to clean up psp memory. * + * @remarks If this is a page in an Aero wizard, then the header title, if + * used, has to be in Unicode. To manage this we create a second copy + * of the header title text as Unicode. It is possible to get here, + * with that second Unicode copy not yet made. So, if it is an Aero + * wizard page, if headerTitle is not null and headerTitleAero is + * null, then we make the copy here. + * + * Also, if this page is for an Aero Wizard, we do not automatically + * set the PSP_HIDEHEADER flag like we do for other wizards when it is + * an exterior page. The user will have to explicitly set the flag in + * the page opts. + * * @remarks For ResDialogs, the user has to include all other resources, header * bitmap, etc., in the resource dll for the dialog. But, for other * types of dialog pages the user can use a resource image for the @@ -1901,27 +1938,51 @@ flags |= maybeSetTabIcon(c, pcpsd, psp, i); - if ( (pcpsd->isWiz97 || pcpsd->isWizLite) ) + if ( pcpsd->isWiz97 || pcpsd->isWizLite || pcpsd->isAeroWiz ) { if ( pcpsp->headerTitle != NULL ) { - psp->pszHeaderTitle = pcpsp->headerTitle; - flags |= PSP_USEHEADERTITLE; + if ( pcpsp->isAeroWizardPage ) + { + if ( pcpsp->headerTitleAero == NULL ) + { + // This shouldn't fail, but if it does, we just won't have + // any header text. + pcpsp->headerTitleAero = (char *)ansi2unicode(pcpsp->headerTitle); + } + psp->pszHeaderTitle = pcpsp->headerTitleAero; + } + else + { + psp->pszHeaderTitle = pcpsp->headerTitle; + } + + if ( psp->pszHeaderTitle != NULL ) + { + flags |= PSP_USEHEADERTITLE; + } } if ( pcpsp->headerSubTitle != NULL ) { - psp->pszHeaderSubTitle = pcpsp->headerSubTitle; - flags |= PSP_USEHEADERSUBTITLE; + if ( ! pcpsd->isAeroWiz ) + { + psp->pszHeaderSubTitle = pcpsp->headerSubTitle; + flags |= PSP_USEHEADERSUBTITLE; + } } if ( pcpsp->headerTitle == NULL && pcpsp->headerSubTitle == NULL && isExteriorPage ) { - flags |= PSP_HIDEHEADER; + if ( ! pcpsd->isAeroWiz ) + { + flags |= PSP_HIDEHEADER; + } } } psp->dwFlags = flags; + success = true; done_out: @@ -2041,11 +2102,14 @@ { psh->hbmHeader = pcpsd->hHeaderBitmap; - flags |= PSH_USEHBMHEADER; if ( pcpsd->isWiz97 ) { - flags |= PSH_HEADER; + flags |= PSH_USEHBMHEADER | PSH_HEADER; } + else + { + flags |= PSH_USEHBMHEADER | PSH_HEADERBITMAP; + } } else if ( pcpsd->headerBitmapID != 0 && pcpsd->hInstance != NULL ) { @@ -2285,7 +2349,6 @@ wrongArgValueException(context->threadContext, 1, "Bitmap", getImageTypeName(type)); goto done_out; } - pcpsd->hHeaderBitmap = (HBITMAP)result; } else @@ -2490,6 +2553,13 @@ goto done_out; } + // We need to parse the options before we look at the pages so we know if we + // are a wizard or not. + if ( ! parsePropSheetOpts(context, pcpsd, opts) ) + { + goto done_out; + } + RexxArrayObject pagesCopy = context->NewArray(count); pCPropertySheetPage *pPage = cppPages; RexxObjectPtr *pRexxPage = rexxPages; @@ -2509,10 +2579,10 @@ } pCPropertySheetPage pcpsp = dlgToPSPCSelf(context, dlg); - pcpsp->pageNumber = i; - pcpsp->rexxPropSheet = pcpsd->rexxSelf; - pcpsp->cppPropSheet = pcpsd; - pcpsp->isWizardPage = ! pcpsd->isNotWizard; + pcpsp->pageNumber = i; + pcpsp->rexxPropSheet = pcpsd->rexxSelf; + pcpsp->cppPropSheet = pcpsd; + pcpsp->isWizardPage = ! pcpsd->isNotWizard; *pPage = pcpsp; *pRexxPage = dlg; @@ -2555,10 +2625,7 @@ context->SetObjectVariable("WATERMARK", TheNilObj); - if ( parsePropSheetOpts(context, pcpsd, opts) ) - { - result = 0; - } + result = 0; done_out: pcpbd->wndBase->initCode = result; @@ -3063,7 +3130,7 @@ * * The prop sheet marco does not return a value. */ -RexxMethod2(RexxObjectPtr, psdlg_setWizButtons, CSTRING, opts, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, psdlg_setWizButtons, OPTIONAL_CSTRING, opts, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; if ( pcpsd->isNotWizard ) @@ -3073,62 +3140,229 @@ uint32_t flags = 0; - if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; - if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; - if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; - if ( StrStrI(opts, "DISABLEDFINISH") != NULL ) flags |= PSWIZB_DISABLEDFINISH; + if ( argumentExists(1) ) + { + if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; + if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; + if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; + if ( StrStrI(opts, "DISABLEDFINISH") != NULL ) flags |= PSWIZB_DISABLEDFINISH; + } PropSheet_SetWizButtons(pcpsd->hDlg, flags); return TheTrueObj; } +/** PropertySheetDialog::setNextText() + * + * Sets the text of the Next button in an aero wizard. + * + * @param text The text for the Next button. + * + * @return True if an aero wizard, otherwise false + * + * @requires Vista or later. + * + * @remarks Testing has shown that all text in an aero wizard has to be + * Unicode. Not sure about freeing the text after the call to + * PropSheet_SetNextText(), but it seems okay. + */ +RexxMethod3(RexxObjectPtr, psdlg_setNextText, CSTRING, text, NAME, method, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "setNextText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + LPWSTR buttonText = ansi2unicode(text); + if ( buttonText != NULL ) + { + PropSheet_SetNextText(pcpsd->hDlg, buttonText); + LocalFree(buttonText); + } + return TheTrueObj; + } + + return TheFalseObj; +} + + +/** PropertySheetDialog::setButtonText() + * + * Sets the text of the specified button in an Aero wizard + * + * @param button A keyword specifying which button to set the text for, Back, + * Cancel, Finish, or Next. + * + * @param text The text for the Next button. + * + * @return True on success, false otherwise. + * + * @note Raises syntax conditions if not Vista and if keyword is incorrect. + * + */ +RexxMethod3(RexxObjectPtr, psdlg_setButtonText, CSTRING, button, CSTRING, text, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "setButtonText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + uint32_t flag = 0; + + if ( StrStrI(button, "BACK") != NULL ) flag = PSWIZB_BACK; + else if ( StrStrI(button, "CANCEL") != NULL ) flag = PSWIZB_CANCEL; + else if ( StrStrI(button, "FINISH") != NULL ) flag = PSWIZB_FINISH; + else if ( StrStrI(button, "NEXT") != NULL ) flag = PSWIZB_NEXT; + else + { + wrongArgValueException(context->threadContext, 1, VALID_AERO_BUTTONS, button); + return TheFalseObj; + } + + LPWSTR buttonText = ansi2unicode(text); + if ( buttonText != NULL ) + { + PropSheet_SetButtonText(pcpsd->hDlg, flag, buttonText); + LocalFree(buttonText); + return TheTrueObj; + } + } + + return TheFalseObj; +} + + +/** PropertySheetDialog::enableWizButtons() + * + * Enables or disables buttons in an Aero wizard. + * + * @param opts Zero or more of the keyword values that specify which + * property sheet buttons are to be enabled. If a button + * value is included in both this argument and the + * optsButtons argument, then the button is enabled. + * + * @param optsButtons Zero or more of the same keywords used in opts. Here, + * they specify which property sheet buttons are to be + * enablred or disabled. If a keyword appears in this + * argument but not in opts, it indicates that the button + * should be enabled. + * + * @param Returns true if this is an Aero Wizard property sheet on Vista on + * later, otherwise false. + * + * @notes Thise method only works for Aero Wizards. This method requires + * Vista or later, a condition is raised if the OS is not Vista or + * later. This method has no effect if the property sheet is not an + * Aero Wizard. + * DO NOT KNOW ABOUT BELOW + * The order of showWizButtons() and setWizButtons() is important. + * This works: + * + * propSheet~setWizButtons("NEXT") + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * + * This does not work: + * + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * propSheet~setWizButtons("NEXT") + */ +RexxMethod3(RexxObjectPtr, psdlg_enableWizButtons, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, optsButtons, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "enableWizButtons", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + uint32_t flags = 0; + uint32_t buttons = 0; + + if ( argumentExists(1) ) + { + if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; + if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; + if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; + if ( StrStrI(opts, "CANCEL") != NULL ) flags |= PSWIZB_CANCEL; + } + + if ( argumentExists(2) ) + { + if ( StrStrI(optsButtons, "BACK") != NULL ) buttons |= PSWIZB_BACK; + if ( StrStrI(optsButtons, "NEXT") != NULL ) buttons |= PSWIZB_NEXT; + if ( StrStrI(optsButtons, "FINISH") != NULL ) buttons |= PSWIZB_FINISH; + if ( StrStrI(optsButtons, "CANCEL") != NULL ) buttons |= PSWIZB_CANCEL; + } + + PropSheet_EnableWizButtons(pcpsd->hDlg, flags, buttons); + + return TheTrueObj; + } + + return TheFalseObj; +} + + /** PropertySheetDialog::showWizButtons() * - * Show or hide buttons in a wizard. + * Show or hide buttons in an Aero wizard. * - * @param opts One or more of the keyword values that specify which + * @param opts Zero or more of the keyword values that specify which * property sheet buttons are to be shown. If a button value * is included in both this argument and the optsButtons * argument, then the button is shown. * - * @param optsButtons One or more of the same keywords used in opts. Here, + * @param optsButtons Zero or more of the same keywords used in opts. Here, * they specify which property sheet buttons are to be shown * or hidden. If a keyword appears in this argument but not * in opts, it indicates that the button should be hidden. * - * @param Returns true if this is a Wizard property sheet on Vista on later, - * otherwise false. + * @param Returns true if this is an Aero Wizard property sheet on Vista on + * later, otherwise false. * - * @notes This method requires Vista or later, a condition is raised if the OS - * is not Vista or later. + * @notes Thise method only works for Aero Wizards. This method requires + * Vista or later, a condition is raised if the OS is not Vista or + * later. This method has no effect if the property sheet is not an + * Aero Wizard. * - * This method has no effect if the property sheet is not a Wizard. + * The order of showWizButtons() and setWizButtons() is important. + * This works: + * + * propSheet~setWizButtons("NEXT") + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * + * This does not work: + * + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * propSheet~setWizButtons("NEXT") */ -RexxMethod3(RexxObjectPtr, psdlg_showWizButtons, CSTRING, opts, CSTRING, optsButtons, CSELF, pCSelf) +RexxMethod3(RexxObjectPtr, psdlg_showWizButtons, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, optsButtons, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - if ( ! requiredOS(context, "showWizButtons", "Vista", Vista_OS) || pcpsd->isNotWizard ) + if ( requiredOS(context, "showWizButtons", "Vista", Vista_OS) && pcpsd->isAeroWiz ) { - return TheFalseObj; - } + uint32_t flags = 0; + uint32_t buttons = 0; - uint32_t flags = 0; - uint32_t buttons = 0; + if ( argumentExists(1) ) + { + if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; + if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; + if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; + if ( StrStrI(opts, "CANCEL") != NULL ) flags |= PSWIZB_CANCEL; + } - if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; - if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; - if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; - if ( StrStrI(opts, "CANCEL") != NULL ) flags |= PSWIZB_CANCEL; + if ( argumentExists(2) ) + { + if ( StrStrI(optsButtons, "BACK") != NULL ) buttons |= PSWIZB_BACK; + if ( StrStrI(optsButtons, "NEXT") != NULL ) buttons |= PSWIZB_NEXT; + if ( StrStrI(optsButtons, "FINISH") != NULL ) buttons |= PSWIZB_FINISH; + if ( StrStrI(optsButtons, "CANCEL") != NULL ) buttons |= PSWIZB_CANCEL; + } - if ( StrStrI(optsButtons, "BACK") != NULL ) buttons |= PSWIZB_BACK; - if ( StrStrI(optsButtons, "NEXT") != NULL ) buttons |= PSWIZB_NEXT; - if ( StrStrI(optsButtons, "FINISH") != NULL ) buttons |= PSWIZB_FINISH; - if ( StrStrI(optsButtons, "CANCEL") != NULL ) buttons |= PSWIZB_CANCEL; + PropSheet_ShowWizButtons(pcpsd->hDlg, flags, buttons); - PropSheet_ShowWizButtons(pcpsd->hDlg, flags, buttons); - return TheTrueObj; + return TheTrueObj; + } + + return TheFalseObj; } @@ -3506,38 +3740,26 @@ * * @return 0, always. * -/** PropertySheetDialog::setNextText() - * - * Sets the text of the Next button in a wizard. - * - * @param text The text for the Next button. - * - * @return 0, always. - * + * @note setFinishText() does not work for Aero Wizards. Use setButtonText() + * instead. */ -RexxMethod3(RexxObjectPtr, psdlg_setButtonText, CSTRING, text, NAME, method, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, psdlg_setFinishText, CSTRING, text, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - if ( *(method + 3) == 'F' ) - { - PropSheet_SetFinishText(pcpsd->hDlg, text); - } - else - { - PropSheet_SetNextText(pcpsd->hDlg, text); - } + PropSheet_SetFinishText(pcpsd->hDlg, text); + return TheZeroObj; } - #if 0 /** PropertySheetDialog::setHeaderBitmap() * * The property sheet PropSheet_SetHeaderBitmap and * PropSheet_SetHeaderBitmapResource macros are apparently not implemented. I - * wrote this code before discovering that. Going to save the code for future - * use. + * wrote this code before discovering that. The macros are not implemented + * because the underlying PSM messages are not implemented. Going to save the + * code for future use. */ RexxMethod3(RexxObjectPtr, psdlg_setHeaderBitmap, uint32_t, index, RexxObjectPtr, bitmap, CSELF, pCSelf) { @@ -3575,8 +3797,8 @@ /** PropertySheetDialog::setHeaderSubtitle() * PropertySheetDialog::setHeaderTitle() * - * Resets the text for a page in a property sheet wizard dialog. These methods - * are not available for Aero wizards + * Resets the text for a page in a property sheet wizard dialog. + * setHeaderSubTitle() is not available for Aero wizards * * The same native function handles the setHeaderTitle() and * setHeaderSubtitle() methods. @@ -3586,12 +3808,15 @@ * @param newText New text for the page. * * @return Zero, always. + * + * @note Neither function works for Aero wizards. Tested many times. Leaving + * Aero code for setHeaderTitle() in. */ RexxMethod4(RexxObjectPtr, psdlg_resetPageText, uint32_t, index, CSTRING, newText, NAME, method, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - if ( pcpsd->isAeroWiz || pcpsd->isNotWizard ) + if ( pcpsd->isNotWizard ) { goto done_out; } @@ -3611,15 +3836,20 @@ if ( setPageText(context, pcpsp, newText, headerSubtext) ) { PropSheet_SetHeaderSubTitle(pcpsd->hDlg, index, pcpsp->headerSubTitle); - } } else { if ( setPageText(context, pcpsp, newText, headerText) ) { - PropSheet_SetHeaderTitle(pcpsd->hDlg, index, pcpsp->headerTitle); - + if ( pcpsd->isAeroWiz ) + { + PropSheet_SetHeaderTitle(pcpsd->hDlg, index, pcpsp->headerTitleAero); + } + else + { + PropSheet_SetHeaderTitle(pcpsd->hDlg, index, pcpsp->headerTitle); + } } } @@ -3630,10 +3860,10 @@ /** PropertySheetDialog::setTitle() * - * Sets the title for a property sheet dialog. This method is not available - * for Aero wizards, and does nothing in other wizards + * Sets the title for a property sheet dialog. * * @param title The title for the property sheet. + * * @param addPropertiesFor [OPTIONAL] If true the text "Properties for" is * prefixed to the title. If omitted or false, there * is no text added. @@ -3642,7 +3872,13 @@ * * @remarks The MSDN documentation seems to indicate that this is valid for * wizards, but experimentation shows it does not work for any - * wizard. + * wizard. In addition, newe MSD documentation explicitly states + * that: In an Aero Wizard, this macro can be used to change the + * title of an interior page dynamically for example, when handling + * the PSN_SETACTIVE notification. + * + * However, it simply does not work. The code for an aero wizard is + * left in, but it does not seem to work. */ RexxMethod3(RexxObjectPtr, psdlg_setTitle, CSTRING, title, OPTIONAL_logical_t, addPropertiesFor, CSELF, pCSelf) { @@ -3650,12 +3886,18 @@ if ( pcpsd->isAeroWiz ) { - goto done_out; + LPWSTR newText = ansi2unicode(title); + if ( newText != NULL ) + { + PropSheet_SetTitle(pcpsd->hDlg, addPropertiesFor, newText); + LocalFree(newText); + } } + else + { + PropSheet_SetTitle(pcpsd->hDlg, addPropertiesFor, title); + } - PropSheet_SetTitle(pcpsd->hDlg, addPropertiesFor, title); - -done_out: return TheZeroObj; } @@ -3667,7 +3909,7 @@ RexxMethod1(RexxObjectPtr, psdlg_test, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - printf("PropertySheetDialog pcpsd-hDlg=%p pcpsd->pcpbd->hDlg=%p\n", pcpsd->hDlg, pcpsd->pcpbd->hDlg); + printf("PropertySheetDialog pcpsd->hDlg=%p pcpsd->pcpbd->hDlg=%p\n", pcpsd->hDlg, pcpsd->pcpbd->hDlg); printf("No test set up at this time\n"); printf("Make version for 6.1=%d\n", MAKEVERSION(6, 1)); printf("Make version for 6.01=%d\n", MAKEVERSION(6, 01)); @@ -3755,6 +3997,8 @@ if ( options != NULL ) { + if ( StrStrI(options, "AEROPAGE") != NULL ) pcpsp->isAeroWizardPage = true; + if ( StrStrI(options, "USETITLE") != NULL ) opts |= PSP_USETITLE; if ( StrStrI(options, "RTLREADING") != NULL ) opts |= PSP_RTLREADING; if ( StrStrI(options, "HASHELP") != NULL ) opts |= PSP_HASHELP; @@ -4065,6 +4309,7 @@ break; case 'I' : + printf("Setting header title attribute %s\n", text); setPageText(context, pcpsp, text, headerText); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-06-28 03:01:06
|
Revision: 7970 http://oorexx.svn.sourceforge.net/oorexx/?rev=7970&view=rev Author: miesfeld Date: 2012-06-28 03:00:58 +0000 (Thu, 28 Jun 2012) Log Message: ----------- ooDialog - purely reformatting Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-28 00:31:23 UTC (rev 7969) +++ main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-06-28 03:00:58 UTC (rev 7970) @@ -197,15 +197,15 @@ ::attribute tabIcon get unguarded ::attribute tabIcon set external "LIBRARY oodialog psp_setTabIcon_atr" -::attribute wasActivated get external "LIBRARY oodialog psp_wasActivated_atr" - ::attribute wantAccelerators get external "LIBRARY oodialog psp_getWantNotification" ::attribute wantAccelerators set external "LIBRARY oodialog psp_setWantNotification" ::attribute wantGetObject get external "LIBRARY oodialog psp_getWantNotification" ::attribute wantGetObject set external "LIBRARY oodialog psp_setWantNotification" +::attribute wasActivated get external "LIBRARY oodialog psp_wasActivated_atr" + ::method endExecute unguarded -- Not to be documented self~finished = .true self~stopIt Modified: main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-28 00:31:23 UTC (rev 7969) +++ main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-06-28 03:00:58 UTC (rev 7970) @@ -2633,186 +2633,6 @@ } -/** PropertySheetDialog::getPage() - * - * Gets the page dialog specified by index. - * - * @index The one-based index of the page whose dialog is desired. - * - * @return The Rexx dialog object for the page specified. - * - * @notes Raises an exception if index is not correct. - * - * @remarks This method is not an interface to a PSM_x message, it is a helper - * function for ooDialog programmers. - */ -RexxMethod2(RexxObjectPtr, psdlg_getPage, uint32_t, index, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - - uint32_t count = pcpsd->pageCount; - if ( index < 1 || index > count ) - { - wrongRangeException(context->threadContext, 1, 1, (int)count, index); - return NULLOBJECT; - } - - return pcpsd->rexxPages[index - 1]; -} - - -/** PropertySheetDialog::execute() - * - * Creates a modal property sheet dialog. - * - * @note Sets the .systemErrorCode - */ -RexxMethod2(RexxObjectPtr, psdlg_execute, OPTIONAL_RexxObjectPtr, owner, CSELF, pCSelf) -{ - RexxObjectPtr result = TheNegativeOneObj; - HWND hParent = NULL; - - oodSetSysErrCode(context->threadContext); - - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - pcpsd->getResultValue = -1; - - PROPSHEETPAGE *psp = NULL; - PROPSHEETHEADER *psh = NULL; - - if ( argumentExists(1) ) - { - hParent = checkPropSheetOwner(context, owner, 1); - if ( hParent == NULL ) - { - goto done_out; - } - } - - psp = initPropSheetPages(context, pcpsd); - if ( psp == NULL ) - { - goto done_out; - } - - // It is not necessary to set pcpsd->modeless to false, it is false by default. - - psh = initPropSheetHeader(context, pcpsd, psp, hParent); - if ( psh == NULL ) - { - goto done_out; - } - - intptr_t ret; - if ( hParent == NULL ) - { - assignPSDThreadContext(pcpsd, context->threadContext, GetCurrentThreadId()); - - if ( setPropSheetHook(pcpsd) ) - { - ret = PropertySheet(psh); - oodSetSysErrCode(context->threadContext); - } - else - { - ret = -1; - } - } - else - { - ret = (intptr_t)SendMessage(hParent, WM_USER_CREATEPROPSHEET_DLG, (WPARAM)psh, (LPARAM)pcpsd); - } - - pcpsd->getResultValue = ret; - - // Call leaving now, but note that the underlying Windows property sheet - // dialog is now destroyed - context->SendMessage0(pcpsd->rexxSelf, "LEAVING"); - - result = context->WholeNumber(ret); - -done_out: - safeLocalFree(psp); - safeLocalFree(psh); - stopDialog(pcpsd->pcpbd, context->threadContext); - return result; -} - - -/** PropertySheetDialog::popup() - * - * - * @notes AeroWizard dialogs do not support modeless - */ -RexxMethod2(RexxObjectPtr, psdlg_popup, NAME, methodName, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - pCPlainBaseDialog pcpbd = pcpsd->pcpbd; - - PROPSHEETPAGE *psp = NULL; - PROPSHEETHEADER *psh = NULL; - - if ( pcpsd->isAeroWiz ) - { - methodCanNotBeInvokedException(context, "popup", pcpsd->rexxSelf, "with the AeroWizard style"); - goto err_out; - } - - psp = initPropSheetPages(context, pcpsd); - if ( psp == NULL ) - { - goto err_out; - } - - pcpsd->modeless = true; - - psh = initPropSheetHeader(context, pcpsd, psp, NULL); - if ( psh == NULL ) - { - goto err_out; - } - - DWORD threadID; - bool Release = false; - - EnterCriticalSection(&crit_sec); - - PropSheetThreadArgs threadArgs; - threadArgs.pcpsd = pcpsd; - threadArgs.psh = psh; - threadArgs.release = &Release; - - pcpbd->hDlgProcThread = CreateThread(NULL, 2000, PropSheetLoopThread, &threadArgs, 0, &threadID); - - // Wait for thread to signal us to continue, don't wait if the thread was not created. - while ( ! Release && pcpbd->hDlgProcThread != NULL ) - { - Sleep(1); - } - LeaveCriticalSection(&crit_sec); - - // Note we do not need to set pcpbd->dlgProcThreadID here. It is set in - // PropSheetLoopThread because that function also sets dlgProcContext and - // dlgProcThreadID for all the property sheet page dialogs. - if ( pcpbd->hDlgProcThread != NULL ) - { - return TheTrueObj; - } - else - { - // Something failed in the the thread function. In that case, things - // are cleaned up in the thread function. - return TheFalseObj; - } - -err_out: - safeLocalFree(psp); - safeLocalFree(psh); - stopDialog(pcpsd->pcpbd, context->threadContext); - return TheFalseObj; -} - - /** PropertySheetDialog::addPage() * * Adds a page to the property sheet at the end of the pages. @@ -2920,154 +2740,31 @@ } -/** PropertySheetDialog::insertPage() +/** PropertySheetDialog::apply() * + * Simulates the selection of the Apply button, indicating that one or more + * pages have changed and the changes need to be validated and recorded. * */ -RexxMethod4(RexxObjectPtr, psdlg_insertPage, RexxObjectPtr, _page, uint32_t, index, OPTIONAL_logical_t, isExteriorPage, CSELF, pCSelf) +RexxMethod1(RexxObjectPtr, psdlg_apply, CSELF, pCSelf) { - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - bool abortDialog; - uint32_t max = pcpsd->pageCount; - - pCPropertySheetPage pcpsp = NULL; - - PROPSHEETPAGE *psp = getPSPMemory(context, pcpsd, &pcpsp, _page, max, &abortDialog); - if ( psp == NULL ) - { - goto err_out; - } - - pcpsp->psp = psp; - abortDialog = false; - - index--; - updatePageCSelf(pcpsd, pcpsp, index); - - if ( index + 1 < max ) - { - for ( uint32_t i = max - 1, j = max; i >= index; i--, j-- ) - { - pcpsd->rexxPages[j] = pcpsd->rexxPages[i]; - pcpsd->cppPages[j] = pcpsd->cppPages[i]; - pcpsd->cppPages[j]->pageNumber = j; - } - } - - pcpsd->cppPages[index] = pcpsp; - pcpsd->rexxPages[index] = _page; - pcpsd->pageCount++; - - if ( ! initPSP(context, pcpsd, psp, index, isExteriorPage ? true : false) ) - { - goto err_out; - } - - abortDialog = true; - - pcpsp->hPropSheetPage = CreatePropertySheetPage(psp); - if ( pcpsp->hPropSheetPage == NULL ) - { - systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "CreatePropertySheetPage"); - goto err_out; - } - - if ( PropSheet_InsertPage(pcpsd->hDlg, index, pcpsp->hPropSheetPage) == 0 ) - { - systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "PropSheet_InsertPage"); - goto err_out; - } - - PropSheet_RecalcPageSizes(pcpsd->hDlg); - - return TheTrueObj; - -err_out: - safeLocalFree(psp); - - if ( pcpsp != NULL ) - { - pcpsp->psp = NULL; - - if ( pcpsp->hPropSheetPage != NULL ) - { - DestroyPropertySheetPage(pcpsp->hPropSheetPage); - pcpsp->hPropSheetPage = NULL; - } - } - - if ( abortDialog ) - { - endDialogPremature(pcpsd->pcpbd, pcpsd->hDlg, RexxConditionRaised); - } - return TheFalseObj; + return PropSheet_Apply(pcpsd->hDlg) ? TheTrueObj : TheFalseObj; } -/** PropertySheetDialog::removePage() +/** PropertySheetDialog::cancelToClose() * - * Removes a page from the property sheet. + * Used when changes made since the most recent PSN_APPLY notification cannot + * be canceled. * - * @param index The one-based index of the page to be removed. - * - * @return Zero always. - * - * @remarks If the page being removed is not the last page we need to move the - * pointers in the arrays down 1. However, we also need to adjust - * the page numbers in the Rexx page object. So, rather than do a - * memmove for the pointers, we may as well just walk the arrays. */ -RexxMethod2(RexxObjectPtr, psdlg_removePage, OPTIONAL_uint32_t, index, CSELF, pCSelf) +RexxMethod1(RexxObjectPtr, psdlg_cancelToClose, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - uint32_t max = pcpsd->pageCount; - - if ( argumentOmitted(1) ) - { - index = max; - } - - if ( index < 1 || index > max ) - { - wrongRangeException(context->threadContext, 1, 1, max, index); - return TheZeroObj; - } - - index--; - pCPropertySheetPage pcpspRemove = pcpsd->cppPages[index]; - - if ( index + 1 < max ) - { - for ( uint32_t i = index, j = index + 1; i > max - 1; i++, j++ ) - { - pcpsd->rexxPages[i] = pcpsd->rexxPages[j]; - pcpsd->cppPages[i] = pcpsd->cppPages[j]; - pcpsd->cppPages[i]->pageNumber = i; - } - } - - pcpsd->rexxPages[max] = NULL; - pcpsd->cppPages[max] = NULL; - pcpsd->pageCount--; - - pcpspRemove->inRemovePage = true; - - PropSheet_RemovePage(pcpsd->hDlg, index, NULL); - PropSheet_RecalcPageSizes(pcpsd->hDlg); - - if ( pcpspRemove->hPropSheetPage != NULL ) - { - DestroyPropertySheetPage(pcpspRemove->hPropSheetPage); - pcpspRemove->hPropSheetPage = NULL; - - safeLocalFree(pcpspRemove->psp); - pcpspRemove->psp = NULL; - } - - pcpspRemove->inRemovePage = false; - + PropSheet_CancelToClose(pcpsd->hDlg); return TheZeroObj; } @@ -3088,149 +2785,6 @@ } -/** PropertySheetDialog::unchanged() - * - */ -RexxMethod2(RexxObjectPtr, psdlg_unchanged, RexxObjectPtr, _page, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - - HWND page = getValidPageHwnd(context, pcpsd, _page, 1); - if ( page != NULL ) - { - PropSheet_UnChanged(pcpsd->hDlg, page); - } - return TheZeroObj; -} - - -/** PropertySheetDialog::setWizButtons() - * - * Enables or disables the Back, Next, and Finish buttons in a wizard. - * - * @param opts Keyword(s) that control which buttons are enabled or disabled. - * - * @return True this property sheet is a wizard, otherwise false. - * - * @notes Wizards display either three or four buttons below each page. This - * method is used to specify which buttons are enabled. Wizards - * normally display Back, Cancel, and either a Next or Finish button. - * Typically, enable only the Next button for the welcome page, Next - * and Back for interior pages, and Back and Finish for the completion - * page. The Cancel button is always enabled. Normally, setting - * FINISH or DISABLEDFINISH replaces the Next button with a Finish - * button. To display Next and Finish buttons simultaneously, set the - * WIZARDHASFINISH keyword in the options when the PropertySheetDialog - * is instantiated. Every page will then display all four buttons. - * - * If this property sheet is not a Wizard, this method has no effect. - * - * @remarks We do not enforce that this is only called for a Wizard, although - * maybe we should. - * - * The prop sheet marco does not return a value. - */ -RexxMethod2(RexxObjectPtr, psdlg_setWizButtons, OPTIONAL_CSTRING, opts, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - if ( pcpsd->isNotWizard ) - { - return TheFalseObj; - } - - uint32_t flags = 0; - - if ( argumentExists(1) ) - { - if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; - if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; - if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; - if ( StrStrI(opts, "DISABLEDFINISH") != NULL ) flags |= PSWIZB_DISABLEDFINISH; - } - - PropSheet_SetWizButtons(pcpsd->hDlg, flags); - return TheTrueObj; -} - - -/** PropertySheetDialog::setNextText() - * - * Sets the text of the Next button in an aero wizard. - * - * @param text The text for the Next button. - * - * @return True if an aero wizard, otherwise false - * - * @requires Vista or later. - * - * @remarks Testing has shown that all text in an aero wizard has to be - * Unicode. Not sure about freeing the text after the call to - * PropSheet_SetNextText(), but it seems okay. - */ -RexxMethod3(RexxObjectPtr, psdlg_setNextText, CSTRING, text, NAME, method, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - - if ( requiredOS(context, "setNextText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) - { - LPWSTR buttonText = ansi2unicode(text); - if ( buttonText != NULL ) - { - PropSheet_SetNextText(pcpsd->hDlg, buttonText); - LocalFree(buttonText); - } - return TheTrueObj; - } - - return TheFalseObj; -} - - -/** PropertySheetDialog::setButtonText() - * - * Sets the text of the specified button in an Aero wizard - * - * @param button A keyword specifying which button to set the text for, Back, - * Cancel, Finish, or Next. - * - * @param text The text for the Next button. - * - * @return True on success, false otherwise. - * - * @note Raises syntax conditions if not Vista and if keyword is incorrect. - * - */ -RexxMethod3(RexxObjectPtr, psdlg_setButtonText, CSTRING, button, CSTRING, text, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - - if ( requiredOS(context, "setButtonText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) - { - uint32_t flag = 0; - - if ( StrStrI(button, "BACK") != NULL ) flag = PSWIZB_BACK; - else if ( StrStrI(button, "CANCEL") != NULL ) flag = PSWIZB_CANCEL; - else if ( StrStrI(button, "FINISH") != NULL ) flag = PSWIZB_FINISH; - else if ( StrStrI(button, "NEXT") != NULL ) flag = PSWIZB_NEXT; - else - { - wrongArgValueException(context->threadContext, 1, VALID_AERO_BUTTONS, button); - return TheFalseObj; - } - - LPWSTR buttonText = ansi2unicode(text); - if ( buttonText != NULL ) - { - PropSheet_SetButtonText(pcpsd->hDlg, flag, buttonText); - LocalFree(buttonText); - return TheTrueObj; - } - } - - return TheFalseObj; -} - - /** PropertySheetDialog::enableWizButtons() * * Enables or disables buttons in an Aero wizard. @@ -3299,111 +2853,121 @@ } -/** PropertySheetDialog::showWizButtons() +/** PropertySheetDialog::execute() * - * Show or hide buttons in an Aero wizard. + * Creates a modal property sheet dialog. * - * @param opts Zero or more of the keyword values that specify which - * property sheet buttons are to be shown. If a button value - * is included in both this argument and the optsButtons - * argument, then the button is shown. - * - * @param optsButtons Zero or more of the same keywords used in opts. Here, - * they specify which property sheet buttons are to be shown - * or hidden. If a keyword appears in this argument but not - * in opts, it indicates that the button should be hidden. - * - * @param Returns true if this is an Aero Wizard property sheet on Vista on - * later, otherwise false. - * - * @notes Thise method only works for Aero Wizards. This method requires - * Vista or later, a condition is raised if the OS is not Vista or - * later. This method has no effect if the property sheet is not an - * Aero Wizard. - * - * The order of showWizButtons() and setWizButtons() is important. - * This works: - * - * propSheet~setWizButtons("NEXT") - * propSheet~showWizButtons("NEXT", "BACK NEXT") - * - * This does not work: - * - * propSheet~showWizButtons("NEXT", "BACK NEXT") - * propSheet~setWizButtons("NEXT") + * @note Sets the .systemErrorCode */ -RexxMethod3(RexxObjectPtr, psdlg_showWizButtons, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, optsButtons, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, psdlg_execute, OPTIONAL_RexxObjectPtr, owner, CSELF, pCSelf) { + RexxObjectPtr result = TheNegativeOneObj; + HWND hParent = NULL; + + oodSetSysErrCode(context->threadContext); + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + pcpsd->getResultValue = -1; - if ( requiredOS(context, "showWizButtons", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + PROPSHEETPAGE *psp = NULL; + PROPSHEETHEADER *psh = NULL; + + if ( argumentExists(1) ) { - uint32_t flags = 0; - uint32_t buttons = 0; - - if ( argumentExists(1) ) + hParent = checkPropSheetOwner(context, owner, 1); + if ( hParent == NULL ) { - if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; - if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; - if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; - if ( StrStrI(opts, "CANCEL") != NULL ) flags |= PSWIZB_CANCEL; + goto done_out; } + } - if ( argumentExists(2) ) + psp = initPropSheetPages(context, pcpsd); + if ( psp == NULL ) + { + goto done_out; + } + + // It is not necessary to set pcpsd->modeless to false, it is false by default. + + psh = initPropSheetHeader(context, pcpsd, psp, hParent); + if ( psh == NULL ) + { + goto done_out; + } + + intptr_t ret; + if ( hParent == NULL ) + { + assignPSDThreadContext(pcpsd, context->threadContext, GetCurrentThreadId()); + + if ( setPropSheetHook(pcpsd) ) { - if ( StrStrI(optsButtons, "BACK") != NULL ) buttons |= PSWIZB_BACK; - if ( StrStrI(optsButtons, "NEXT") != NULL ) buttons |= PSWIZB_NEXT; - if ( StrStrI(optsButtons, "FINISH") != NULL ) buttons |= PSWIZB_FINISH; - if ( StrStrI(optsButtons, "CANCEL") != NULL ) buttons |= PSWIZB_CANCEL; + ret = PropertySheet(psh); + oodSetSysErrCode(context->threadContext); } + else + { + ret = -1; + } + } + else + { + ret = (intptr_t)SendMessage(hParent, WM_USER_CREATEPROPSHEET_DLG, (WPARAM)psh, (LPARAM)pcpsd); + } - PropSheet_ShowWizButtons(pcpsd->hDlg, flags, buttons); + pcpsd->getResultValue = ret; - return TheTrueObj; - } + // Call leaving now, but note that the underlying Windows property sheet + // dialog is now destroyed + context->SendMessage0(pcpsd->rexxSelf, "LEAVING"); - return TheFalseObj; + result = context->WholeNumber(ret); + +done_out: + safeLocalFree(psp); + safeLocalFree(psh); + stopDialog(pcpsd->pcpbd, context->threadContext); + return result; } -/** PropertySheetDialog::apply() +/** PropertySheetDialog::getCurrentPageHwnd() * - * Simulates the selection of the Apply button, indicating that one or more - * pages have changed and the changes need to be validated and recorded. + * Retrieves a handle to the window of the current page of a property sheet. * */ -RexxMethod1(RexxObjectPtr, psdlg_apply, CSELF, pCSelf) +RexxMethod1(RexxObjectPtr, psdlg_getCurrentPageHwnd, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - - return PropSheet_Apply(pcpsd->hDlg) ? TheTrueObj : TheFalseObj; + return pointer2string(context, PropSheet_GetCurrentPageHwnd(pcpsd->hDlg)); } -/** PropertySheetDialog::cancelToClose() +/** PropertySheetDialog::getPage() * - * Used when changes made since the most recent PSN_APPLY notification cannot - * be canceled. + * Gets the page dialog specified by index. * + * @index The one-based index of the page whose dialog is desired. + * + * @return The Rexx dialog object for the page specified. + * + * @notes Raises an exception if index is not correct. + * + * @remarks This method is not an interface to a PSM_x message, it is a helper + * function for ooDialog programmers. */ -RexxMethod1(RexxObjectPtr, psdlg_cancelToClose, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, psdlg_getPage, uint32_t, index, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - PropSheet_CancelToClose(pcpsd->hDlg); - return TheZeroObj; -} + uint32_t count = pcpsd->pageCount; + if ( index < 1 || index > count ) + { + wrongRangeException(context->threadContext, 1, 1, (int)count, index); + return NULLOBJECT; + } - -/** PropertySheetDialog::getCurrentPageHwnd() - * - * Retrieves a handle to the window of the current page of a property sheet. - * - */ -RexxMethod1(RexxObjectPtr, psdlg_getCurrentPageHwnd, CSELF, pCSelf) -{ - pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; - return pointer2string(context, PropSheet_GetCurrentPageHwnd(pcpsd->hDlg)); + return pcpsd->rexxPages[index - 1]; } @@ -3600,6 +3164,91 @@ } +/** PropertySheetDialog::insertPage() + * + * + */ +RexxMethod4(RexxObjectPtr, psdlg_insertPage, RexxObjectPtr, _page, uint32_t, index, OPTIONAL_logical_t, isExteriorPage, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + bool abortDialog; + uint32_t max = pcpsd->pageCount; + + pCPropertySheetPage pcpsp = NULL; + + PROPSHEETPAGE *psp = getPSPMemory(context, pcpsd, &pcpsp, _page, max, &abortDialog); + if ( psp == NULL ) + { + goto err_out; + } + + pcpsp->psp = psp; + abortDialog = false; + + index--; + updatePageCSelf(pcpsd, pcpsp, index); + + if ( index + 1 < max ) + { + for ( uint32_t i = max - 1, j = max; i >= index; i--, j-- ) + { + pcpsd->rexxPages[j] = pcpsd->rexxPages[i]; + pcpsd->cppPages[j] = pcpsd->cppPages[i]; + pcpsd->cppPages[j]->pageNumber = j; + } + } + + pcpsd->cppPages[index] = pcpsp; + pcpsd->rexxPages[index] = _page; + pcpsd->pageCount++; + + if ( ! initPSP(context, pcpsd, psp, index, isExteriorPage ? true : false) ) + { + goto err_out; + } + + abortDialog = true; + + pcpsp->hPropSheetPage = CreatePropertySheetPage(psp); + if ( pcpsp->hPropSheetPage == NULL ) + { + systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "CreatePropertySheetPage"); + goto err_out; + } + + if ( PropSheet_InsertPage(pcpsd->hDlg, index, pcpsp->hPropSheetPage) == 0 ) + { + systemServiceExceptionCode(context->threadContext, API_FAILED_MSG, "PropSheet_InsertPage"); + goto err_out; + } + + PropSheet_RecalcPageSizes(pcpsd->hDlg); + + return TheTrueObj; + +err_out: + safeLocalFree(psp); + + if ( pcpsp != NULL ) + { + pcpsp->psp = NULL; + + if ( pcpsp->hPropSheetPage != NULL ) + { + DestroyPropertySheetPage(pcpsp->hPropSheetPage); + pcpsp->hPropSheetPage = NULL; + } + } + + if ( abortDialog ) + { + endDialogPremature(pcpsd->pcpbd, pcpsd->hDlg, RexxConditionRaised); + } + return TheFalseObj; +} + + /** PropertySheetDialog::pageToIndex() * * Takes the handle of a property sheet page and returns its one-based index. @@ -3617,6 +3266,80 @@ } +/** PropertySheetDialog::popup() + * + * + * @notes AeroWizard dialogs do not support modeless + */ +RexxMethod2(RexxObjectPtr, psdlg_popup, NAME, methodName, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + pCPlainBaseDialog pcpbd = pcpsd->pcpbd; + + PROPSHEETPAGE *psp = NULL; + PROPSHEETHEADER *psh = NULL; + + if ( pcpsd->isAeroWiz ) + { + methodCanNotBeInvokedException(context, "popup", pcpsd->rexxSelf, "with the AeroWizard style"); + goto err_out; + } + + psp = initPropSheetPages(context, pcpsd); + if ( psp == NULL ) + { + goto err_out; + } + + pcpsd->modeless = true; + + psh = initPropSheetHeader(context, pcpsd, psp, NULL); + if ( psh == NULL ) + { + goto err_out; + } + + DWORD threadID; + bool Release = false; + + EnterCriticalSection(&crit_sec); + + PropSheetThreadArgs threadArgs; + threadArgs.pcpsd = pcpsd; + threadArgs.psh = psh; + threadArgs.release = &Release; + + pcpbd->hDlgProcThread = CreateThread(NULL, 2000, PropSheetLoopThread, &threadArgs, 0, &threadID); + + // Wait for thread to signal us to continue, don't wait if the thread was not created. + while ( ! Release && pcpbd->hDlgProcThread != NULL ) + { + Sleep(1); + } + LeaveCriticalSection(&crit_sec); + + // Note we do not need to set pcpbd->dlgProcThreadID here. It is set in + // PropSheetLoopThread because that function also sets dlgProcContext and + // dlgProcThreadID for all the property sheet page dialogs. + if ( pcpbd->hDlgProcThread != NULL ) + { + return TheTrueObj; + } + else + { + // Something failed in the the thread function. In that case, things + // are cleaned up in the thread function. + return TheFalseObj; + } + +err_out: + safeLocalFree(psp); + safeLocalFree(psh); + stopDialog(pcpsd->pcpbd, context->threadContext); + return TheFalseObj; +} + + /** PropertySheetDialog::pressButton() * * @@ -3656,6 +3379,118 @@ } +/** PropertySheetDialog::removePage() + * + * Removes a page from the property sheet. + * + * @param index The one-based index of the page to be removed. + * + * @return Zero always. + * + * @remarks If the page being removed is not the last page we need to move the + * pointers in the arrays down 1. However, we also need to adjust + * the page numbers in the Rexx page object. So, rather than do a + * memmove for the pointers, we may as well just walk the arrays. + */ +RexxMethod2(RexxObjectPtr, psdlg_removePage, OPTIONAL_uint32_t, index, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + uint32_t max = pcpsd->pageCount; + + if ( argumentOmitted(1) ) + { + index = max; + } + + if ( index < 1 || index > max ) + { + wrongRangeException(context->threadContext, 1, 1, max, index); + return TheZeroObj; + } + + index--; + pCPropertySheetPage pcpspRemove = pcpsd->cppPages[index]; + + if ( index + 1 < max ) + { + for ( uint32_t i = index, j = index + 1; i > max - 1; i++, j++ ) + { + pcpsd->rexxPages[i] = pcpsd->rexxPages[j]; + pcpsd->cppPages[i] = pcpsd->cppPages[j]; + pcpsd->cppPages[i]->pageNumber = i; + } + } + + pcpsd->rexxPages[max] = NULL; + pcpsd->cppPages[max] = NULL; + pcpsd->pageCount--; + + pcpspRemove->inRemovePage = true; + + PropSheet_RemovePage(pcpsd->hDlg, index, NULL); + PropSheet_RecalcPageSizes(pcpsd->hDlg); + + if ( pcpspRemove->hPropSheetPage != NULL ) + { + DestroyPropertySheetPage(pcpspRemove->hPropSheetPage); + pcpspRemove->hPropSheetPage = NULL; + + safeLocalFree(pcpspRemove->psp); + pcpspRemove->psp = NULL; + } + + pcpspRemove->inRemovePage = false; + + return TheZeroObj; +} + + +/** PropertySheetDialog::setButtonText() + * + * Sets the text of the specified button in an Aero wizard + * + * @param button A keyword specifying which button to set the text for, Back, + * Cancel, Finish, or Next. + * + * @param text The text for the Next button. + * + * @return True on success, false otherwise. + * + * @note Raises syntax conditions if not Vista and if keyword is incorrect. + * + */ +RexxMethod3(RexxObjectPtr, psdlg_setButtonText, CSTRING, button, CSTRING, text, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "setButtonText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + uint32_t flag = 0; + + if ( StrStrI(button, "BACK") != NULL ) flag = PSWIZB_BACK; + else if ( StrStrI(button, "CANCEL") != NULL ) flag = PSWIZB_CANCEL; + else if ( StrStrI(button, "FINISH") != NULL ) flag = PSWIZB_FINISH; + else if ( StrStrI(button, "NEXT") != NULL ) flag = PSWIZB_NEXT; + else + { + wrongArgValueException(context->threadContext, 1, VALID_AERO_BUTTONS, button); + return TheFalseObj; + } + + LPWSTR buttonText = ansi2unicode(text); + if ( buttonText != NULL ) + { + PropSheet_SetButtonText(pcpsd->hDlg, flag, buttonText); + LocalFree(buttonText); + return TheTrueObj; + } + } + + return TheFalseObj; +} + + /** PropertySheetDialog::setCurSel() * * Activates the specified page in a property sheet. @@ -3858,6 +3693,39 @@ } +/** PropertySheetDialog::setNextText() + * + * Sets the text of the Next button in an aero wizard. + * + * @param text The text for the Next button. + * + * @return True if an aero wizard, otherwise false + * + * @requires Vista or later. + * + * @remarks Testing has shown that all text in an aero wizard has to be + * Unicode. Not sure about freeing the text after the call to + * PropSheet_SetNextText(), but it seems okay. + */ +RexxMethod3(RexxObjectPtr, psdlg_setNextText, CSTRING, text, NAME, method, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "setNextText", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + LPWSTR buttonText = ansi2unicode(text); + if ( buttonText != NULL ) + { + PropSheet_SetNextText(pcpsd->hDlg, buttonText); + LocalFree(buttonText); + } + return TheTrueObj; + } + + return TheFalseObj; +} + + /** PropertySheetDialog::setTitle() * * Sets the title for a property sheet dialog. @@ -3902,6 +3770,138 @@ } +/** PropertySheetDialog::setWizButtons() + * + * Enables or disables the Back, Next, and Finish buttons in a wizard. + * + * @param opts Keyword(s) that control which buttons are enabled or disabled. + * + * @return True this property sheet is a wizard, otherwise false. + * + * @notes Wizards display either three or four buttons below each page. This + * method is used to specify which buttons are enabled. Wizards + * normally display Back, Cancel, and either a Next or Finish button. + * Typically, enable only the Next button for the welcome page, Next + * and Back for interior pages, and Back and Finish for the completion + * page. The Cancel button is always enabled. Normally, setting + * FINISH or DISABLEDFINISH replaces the Next button with a Finish + * button. To display Next and Finish buttons simultaneously, set the + * WIZARDHASFINISH keyword in the options when the PropertySheetDialog + * is instantiated. Every page will then display all four buttons. + * + * If this property sheet is not a Wizard, this method has no effect. + * + * @remarks We do not enforce that this is only called for a Wizard, although + * maybe we should. + * + * The prop sheet marco does not return a value. + */ +RexxMethod2(RexxObjectPtr, psdlg_setWizButtons, OPTIONAL_CSTRING, opts, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + if ( pcpsd->isNotWizard ) + { + return TheFalseObj; + } + + uint32_t flags = 0; + + if ( argumentExists(1) ) + { + if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; + if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; + if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; + if ( StrStrI(opts, "DISABLEDFINISH") != NULL ) flags |= PSWIZB_DISABLEDFINISH; + } + + PropSheet_SetWizButtons(pcpsd->hDlg, flags); + return TheTrueObj; +} + + +/** PropertySheetDialog::showWizButtons() + * + * Show or hide buttons in an Aero wizard. + * + * @param opts Zero or more of the keyword values that specify which + * property sheet buttons are to be shown. If a button value + * is included in both this argument and the optsButtons + * argument, then the button is shown. + * + * @param optsButtons Zero or more of the same keywords used in opts. Here, + * they specify which property sheet buttons are to be shown + * or hidden. If a keyword appears in this argument but not + * in opts, it indicates that the button should be hidden. + * + * @param Returns true if this is an Aero Wizard property sheet on Vista on + * later, otherwise false. + * + * @notes Thise method only works for Aero Wizards. This method requires + * Vista or later, a condition is raised if the OS is not Vista or + * later. This method has no effect if the property sheet is not an + * Aero Wizard. + * + * The order of showWizButtons() and setWizButtons() is important. + * This works: + * + * propSheet~setWizButtons("NEXT") + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * + * This does not work: + * + * propSheet~showWizButtons("NEXT", "BACK NEXT") + * propSheet~setWizButtons("NEXT") + */ +RexxMethod3(RexxObjectPtr, psdlg_showWizButtons, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, optsButtons, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + if ( requiredOS(context, "showWizButtons", "Vista", Vista_OS) && pcpsd->isAeroWiz ) + { + uint32_t flags = 0; + uint32_t buttons = 0; + + if ( argumentExists(1) ) + { + if ( StrStrI(opts, "BACK") != NULL ) flags |= PSWIZB_BACK; + if ( StrStrI(opts, "NEXT") != NULL ) flags |= PSWIZB_NEXT; + if ( StrStrI(opts, "FINISH") != NULL ) flags |= PSWIZB_FINISH; + if ( StrStrI(opts, "CANCEL") != NULL ) flags |= PSWIZB_CANCEL; + } + + if ( argumentExists(2) ) + { + if ( StrStrI(optsButtons, "BACK") != NULL ) buttons |= PSWIZB_BACK; + if ( StrStrI(optsButtons, "NEXT") != NULL ) buttons |= PSWIZB_NEXT; + if ( StrStrI(optsButtons, "FINISH") != NULL ) buttons |= PSWIZB_FINISH; + if ( StrStrI(optsButtons, "CANCEL") != NULL ) buttons |= PSWIZB_CANCEL; + } + + PropSheet_ShowWizButtons(pcpsd->hDlg, flags, buttons); + + return TheTrueObj; + } + + return TheFalseObj; +} + + +/** PropertySheetDialog::unchanged() + * + */ +RexxMethod2(RexxObjectPtr, psdlg_unchanged, RexxObjectPtr, _page, CSELF, pCSelf) +{ + pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; + + HWND page = getValidPageHwnd(context, pcpsd, _page, 1); + if ( page != NULL ) + { + PropSheet_UnChanged(pcpsd->hDlg, page); + } + return TheZeroObj; +} + + /** PropertySheetDialog::test() * * Testing method @@ -4195,7 +4195,7 @@ return TheFalseObj; } -/** PropertySheetPage::init() [Class method] +/** PropertySheetPage::init() [Class method] * * Used to capture the PropertySheetPage class object. This is used for scoped * look ups of the CSelf. @@ -4210,27 +4210,32 @@ } -/** PropertySheetPage::propSheet() [Attribute get] +/** PropertySheetPage::cx [Attribute get] + * PropertySheetPage::cy [Attribute get] * */ -RexxMethod1(RexxObjectPtr, psp_propSheet_atr, CSELF, pCSelf) +RexxMethod2(uint32_t, psp_getcx, NAME, name, CSELF, pCSelf) { pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - return pcpsp->rexxPropSheet; + + return *(name + 1) == 'X' ? pcpsp->cx : pcpsp->cy; } -/** PropertySheetPage::wasActivated() [Attribute get] +/** PropertySheetPage::cx [Attribute set] + * PropertySheetPage::cy [Attribute set] * */ -RexxMethod1(RexxObjectPtr, psp_wasActivated_atr, CSELF, pCSelf) +RexxMethod3(RexxObjectPtr, psp_setcx, uint32_t, dlgUnit, NAME, name, CSELF, pCSelf) { pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - return pcpsp->activated ? TheTrueObj : TheFalseObj; + + *(name + 1) == 'X' ? pcpsp->cx = dlgUnit : pcpsp->cy = dlgUnit; + return NULLOBJECT; } -/** PropertySheetPage::pageID() [Attribute get] +/** PropertySheetPage::pageID() [Attribute get] * */ RexxMethod1(POINTER, psp_pageID_atr, CSELF, pCSelf) @@ -4240,7 +4245,7 @@ } -/** PropertySheetPage::pageIndex() [Attribute get] +/** PropertySheetPage::pageIndex() [Attribute get] * */ RexxMethod1(uint32_t, psp_pageNumber_atr, CSELF, pCSelf) @@ -4250,32 +4255,7 @@ } -/** PropertySheetPage::cx [Attribute get] - * PropertySheetPage::cy - * - */ -RexxMethod2(uint32_t, psp_getcx, NAME, name, CSELF, pCSelf) -{ - pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - - return *(name + 1) == 'X' ? pcpsp->cx : pcpsp->cy; -} - - -/** PropertySheetPage::cx [Attribute set] - * PropertySheetPage::cy - * - */ -RexxMethod3(RexxObjectPtr, psp_setcx, uint32_t, dlgUnit, NAME, name, CSELF, pCSelf) -{ - pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - - *(name + 1) == 'X' ? pcpsp->cx = dlgUnit : pcpsp->cy = dlgUnit; - return NULLOBJECT; -} - - -/** PropertySheetPage::pageTitle() [Attribute get] +/** PropertySheetPage::pageTitle() [Attribute get] * PropertySheetPage::headerTitle() * PropertySheetPage::headerSubTitle() */ @@ -4294,9 +4274,9 @@ } -/** PropertySheetPage::pageTitle() [Attribute set] - * PropertySheetPage::headerTitle() - * PropertySheetPage::headerSubTitle() +/** PropertySheetPage::pageTitle() [Attribute set] + * PropertySheetPage::headerTitle() [Attribute set] + * PropertySheetPage::headerSubTitle() [Attribute set] */ RexxMethod3(RexxObjectPtr, psp_setPageTitle, CSTRING, text, NAME, name, CSELF, pCSelf) { @@ -4309,7 +4289,6 @@ break; case 'I' : - printf("Setting header title attribute %s\n", text); setPageText(context, pcpsp, text, headerText); break; @@ -4321,44 +4300,17 @@ } -/** PropertySheetPage::wantAccelerators() [Attribute] - * PropertySheetPage::wantGetObject() +/** PropertySheetPage::propSheet() [Attribute get] * */ -RexxMethod2(RexxObjectPtr, psp_getWantNotification, NAME, methName, CSELF, pCSelf) +RexxMethod1(RexxObjectPtr, psp_propSheet_atr, CSELF, pCSelf) { pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - RexxObjectPtr result = TheFalseObj; - - if ( *(methName + 4) == 'A' ) - { - result = pcpsp->wantAccelerators ? TheTrueObj : TheFalseObj; - } - else - { - result = pcpsp->wantGetObject ? TheTrueObj : TheFalseObj; - } - return result; + return pcpsp->rexxPropSheet; } -RexxMethod3(RexxObjectPtr, psp_setWantNotification, logical_t, want, NAME, methName, CSELF, pCSelf) -{ - pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - - if ( *(methName + 4) == 'A' ) - { - pcpsp->wantAccelerators = want ? true : false; - } - else - { - pcpsp->wantGetObject = want ? true : false; - } - return NULLOBJECT; -} - - -/** PropertySheetPage::resources() [Attribute set] +/** PropertySheetPage::resources() [Attribute set] * */ RexxMethod2(RexxObjectPtr, psp_setResources_atr, RexxObjectPtr, resourceImage, CSELF, pCSelf) @@ -4374,7 +4326,7 @@ return NULLOBJECT; } -/** PropertySheetPage::tabIcon() [Attribute set] +/** PropertySheetPage::tabIcon() [Attribute set] * * Sets the icon used for the tab. The user can specify the icon as either a * resource ID (numeric or symbolic) or as an .Image object. @@ -4416,6 +4368,57 @@ } +/** PropertySheetPage::wantAccelerators() [Attribute get] +/** PropertySheetPage::wantGetObject() [Attribute get] + * + */ +RexxMethod2(RexxObjectPtr, psp_getWantNotification, NAME, methName, CSELF, pCSelf) +{ + pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; + RexxObjectPtr result = TheFalseObj; + + if ( *(methName + 4) == 'A' ) + { + result = pcpsp->wantAccelerators ? TheTrueObj : TheFalseObj; + } + else + { + result = pcpsp->wantGetObject ? TheTrueObj : TheFalseObj; + } + return result; +} + + +/** PropertySheetPage::wantAccelerators() [Attribute set] +/** PropertySheetPage::wantGetObject() [Attribute set] + * + */ +RexxMethod3(RexxObjectPtr, psp_setWantNotification, logical_t, want, NAME, methName, CSELF, pCSelf) +{ + pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; + + if ( *(methName + 4) == 'A' ) + { + pcpsp->wantAccelerators = want ? true : false; + } + else + { + pcpsp->wantGetObject = want ? true : false; + } + return NULLOBJECT; +} + + +/** PropertySheetPage::wasActivated() [Attribute get] + * + */ +RexxMethod1(RexxObjectPtr, psp_wasActivated_atr, CSELF, pCSelf) +{ + pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; + return pcpsp->activated ? TheTrueObj : TheFalseObj; +} + + /** PropertySheetPage::init_propertySheetPage() * * The property sheet page initialization. This can only be done from native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-06-29 00:18:12
|
Revision: 7973 http://oorexx.svn.sourceforge.net/oorexx/?rev=7973&view=rev Author: miesfeld Date: 2012-06-29 00:18:06 +0000 (Fri, 29 Jun 2012) Log Message: ----------- ooDialog - * Sets WINVER to 0x0600 instead of 0x0501 * Adds 2 methods OS::settingChanged() and OS::shellChangeNotify() Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp Modified: main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2012-06-28 03:14:05 UTC (rev 7972) +++ main/trunk/extensions/platform/windows/oodialog/UtilityClasses.cls 2012-06-29 00:18:06 UTC (rev 7973) @@ -270,6 +270,8 @@ ::method isAtLeastW2K3 class external "LIBRARY oodialog os_isVersion" ::method isAtLeastVista class external "LIBRARY oodialog os_isVersion" ::method isAtLeastWindows7 class external "LIBRARY oodialog os_isVersion" +::method settingChanged class external "LIBRARY oodialog os_settingChanged" +::method shellChangeNotify class external "LIBRARY oodialog os_shellChangeNotify" ::class 'Rect' public Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-06-28 03:14:05 UTC (rev 7972) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-06-29 00:18:06 UTC (rev 7973) @@ -42,7 +42,7 @@ #define NTDDI_VERSION NTDDI_LONGHORN #define _WIN32_WINNT 0x0600 #define _WIN32_IE 0x0600 -#define WINVER 0x0501 +#define WINVER 0x0600 #define STRICT #define OEMRESOURCE Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2012-06-28 03:14:05 UTC (rev 7972) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2012-06-29 00:18:06 UTC (rev 7973) @@ -424,6 +424,8 @@ REXX_METHOD_PROTOTYPE(os_is64bit); REXX_METHOD_PROTOTYPE(os_is32on64bit); REXX_METHOD_PROTOTYPE(os_isVersion); +REXX_METHOD_PROTOTYPE(os_settingChanged); +REXX_METHOD_PROTOTYPE(os_shellChangeNotify); // SPI REXX_METHOD_PROTOTYPE(spi_init_cls); @@ -1338,6 +1340,8 @@ REXX_METHOD(os_is64bit, os_is64bit), REXX_METHOD(os_is32on64bit, os_is32on64bit), REXX_METHOD(os_isVersion, os_isVersion), + REXX_METHOD(os_settingChanged, os_settingChanged), + REXX_METHOD(os_shellChangeNotify, os_shellChangeNotify), // SPI REXX_METHOD(spi_init_cls, spi_init_cls), Modified: main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-06-28 03:14:05 UTC (rev 7972) +++ main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-06-29 00:18:06 UTC (rev 7973) @@ -44,6 +44,8 @@ #include "ooDialog.hpp" // Must be first, includes windows.h, commctrl.h, and oorexxapi.h #include <stdio.h> // For printf() +#include <shlwapi.h> // For StrStrI() +#include <shlobj.h> // For ShChangeNotify() #include "APICommon.hpp" #include "oodCommon.hpp" #include "oodDeviceGraphics.hpp" @@ -1126,7 +1128,9 @@ */ RexxMethod1(uint64_t, dlgutil_test_cls, int64_t, n) { - return (uint64_t)n; + printf("DlgUtil::test() No tests at this time.\n"); + + return 0; } /** @@ -1629,6 +1633,71 @@ } +/** OS::settingChanged() + * + * + * The use of ERRORONEXIT requires Vista or later. Sets the .systemErrorCode. + */ +RexxMethod3(logical_t, os_settingChanged, OPTIONAL_uint32_t, to, OPTIONAL_CSTRING, opts, OPTIONAL_CSTRING, area) +{ + DWORD_PTR result; + uint32_t timeout = 5000;; + uint32_t flags = SMTO_ABORTIFHUNG; + CSTRING paramArea = "Environment"; + + oodResetSysErrCode(context->threadContext); + + if ( argumentExists(1) ) + { + timeout = to; + } + if ( argumentExists(2) && strlen(opts) > 0 ) + { + flags = 0; + + if ( StrStrI(opts, "ABORTIFHUNG") != NULL ) flags |= SMTO_ABORTIFHUNG; + if ( StrStrI(opts, "BLOCK") != NULL ) flags |= SMTO_BLOCK; + if ( StrStrI(opts, "NORMAL") != NULL ) flags |= SMTO_NORMAL; + if ( StrStrI(opts, "NOTIMEOUTIFNOTHUNG") != NULL ) flags |= SMTO_NOTIMEOUTIFNOTHUNG; + if ( StrStrI(opts, "ERRORONEXIT") != NULL ) + { + if ( ! requiredOS(context, "setttingChanged", "Vista", Vista_OS) ) + { + return FALSE; + } + + flags |= SMTO_ERRORONEXIT; + } + } + if ( argumentExists(3) ) + { + paramArea = area; + } + + if ( SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)paramArea, flags, timeout, &result) == 0 ) + { + oodSetSysErrCode(context->threadContext); + return FALSE; + } + + return TRUE; +} + +/** OS::shellChangeNotify() + * + */ +RexxMethod4(logical_t, os_shellChangeNotify, OPTIONAL_CSTRING, id, OPTIONAL_CSTRING, opts, OPTIONAL_RexxObjectPtr, item1, + OPTIONAL_RexxObjectPtr, item2) +{ + if ( argumentExists(1) || argumentExists(2) || argumentExists(3) || argumentExists(4) ) + { + return FALSE; + } + + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); + return TRUE; +} + /** * Methods for the .ResourceUtils mixin class. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-07-06 00:37:07
|
Revision: 8002 http://oorexx.svn.sourceforge.net/oorexx/?rev=8002&view=rev Author: miesfeld Date: 2012-07-06 00:37:01 +0000 (Fri, 06 Jul 2012) Log Message: ----------- ooDialog - * Fix the isCancelButton arg sent to PropertySheetPage::reset(), its value was reversed. * Fix the order of args sent to PropertySheetDialog::setCurSel() which had the least used arg first. Makes more sense that the least used arg be last. * Allow the args to PropertySheetPage::setSize() be either a .Size object, or the individual width and height. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-07-06 00:29:53 UTC (rev 8001) +++ main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-07-06 00:37:01 UTC (rev 8002) @@ -259,7 +259,7 @@ return self~validatePage(psDlg) ::method pageCreate unguarded - use strict arg + use strict arg psDlg return .true ::method queryCancel unguarded Modified: main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-07-06 00:29:53 UTC (rev 8001) +++ main/trunk/extensions/platform/windows/oodialog/oodPropertySheetDialog.cpp 2012-07-06 00:37:01 UTC (rev 8002) @@ -1092,7 +1092,7 @@ case PSN_RESET : { LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam; - RexxObjectPtr isCancelButton = lppsn->lParam ? TheTrueObj : TheFalseObj; + RexxObjectPtr isCancelButton = lppsn->lParam ? TheFalseObj : TheTrueObj; RexxObjectPtr result = c->SendMessage2(pcpsp->rexxSelf, RESET_MSG, isCancelButton, pcpsd->rexxSelf); goodReply(c, pcpsd->pcpbd, result, RESET_MSG); @@ -1637,7 +1637,7 @@ { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pcpsp->cppPropSheet; - RexxObjectPtr result = c->SendMessage0(pcpsp->rexxSelf, PAGECREATE_MSG); + RexxObjectPtr result = c->SendMessage1(pcpsp->rexxSelf, PAGECREATE_MSG, pcpsd->rexxSelf); if ( goodReply(c, pcpsd->pcpbd, result, PAGECREATE_MSG) ) { @@ -3484,8 +3484,8 @@ * * Activates the specified page in a property sheet. * + * @param index [OPTIONAL] The one-based page index. * @param hPage [OPTIONAL] The property sheet page handle. - * @param index [OPTIONAL] The one-based page index. * * @return True on success, otherwise false. * @@ -3498,7 +3498,7 @@ * raised. In addition, if the index argument is used to specify the * page is not a valid index, a condition is raised. */ -RexxMethod3(RexxObjectPtr, psdlg_setCurSel, OPTIONAL_POINTER, hPage, OPTIONAL_int32_t, index, CSELF, pCSelf) +RexxMethod3(RexxObjectPtr, psdlg_setCurSel, OPTIONAL_int32_t, index, OPTIONAL_POINTER, hPage, CSELF, pCSelf) { pCPropertySheetDialog pcpsd = (pCPropertySheetDialog)pCSelf; @@ -3506,28 +3506,28 @@ if ( argumentExists(1) ) { - result = PropSheet_SetCurSel(pcpsd->hDlg, (HPROPSHEETPAGE)hPage, NULL) ? TheTrueObj : TheFalseObj; - } - else - { - if ( argumentOmitted(2) ) - { - missingArgException(context->threadContext, 2); - goto done_out; - } - int max = (int)pcpsd->pageCount; if ( index < 1 || index > max ) { - wrongRangeException(context->threadContext, 2, 1, max, index); + wrongRangeException(context->threadContext, 1, 1, max, index); goto done_out; } index--; result = PropSheet_SetCurSel(pcpsd->hDlg, NULL, index) ? TheTrueObj : TheFalseObj; } + else + { + if ( argumentOmitted(2) ) + { + missingArgException(context->threadContext, 2); + goto done_out; + } + result = PropSheet_SetCurSel(pcpsd->hDlg, (HPROPSHEETPAGE)hPage, NULL) ? TheTrueObj : TheFalseObj; + } + done_out: return result; } @@ -4494,18 +4494,22 @@ * * */ -RexxMethod2(RexxObjectPtr, psp_setSize, RexxObjectPtr, size, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, psp_setSize, ARGLIST, args, CSELF, pCSelf) { // TODO validate CSelf. pCPropertySheetPage pcpsp = (pCPropertySheetPage)pCSelf; - PSIZE s = rxGetSize(context, size, 1); - if ( s != NULL ) + size_t arraySize; + size_t argsUsed; + POINT point; + if ( ! getPointFromArglist(context, args, &point, 1, 2, &arraySize, &argsUsed) ) { - pcpsp->cx = s->cx; - pcpsp->cy = s->cy; + return TheOneObj; } + pcpsp->cx = point.x; + pcpsp->cy = point.y; + return TheZeroObj; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-07-07 05:42:49
|
Revision: 8007 http://oorexx.svn.sourceforge.net/oorexx/?rev=8007&view=rev Author: miesfeld Date: 2012-07-07 05:42:38 +0000 (Sat, 07 Jul 2012) Log Message: ----------- ooDialog - fix problem with page / control dialogs, when enter is typed, PlainBaseDialog::ok() is invoked Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp main/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp Modified: main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-07-07 05:40:11 UTC (rev 8006) +++ main/trunk/extensions/platform/windows/oodialog/ControlDialog.cls 2012-07-07 05:42:38 UTC (rev 8007) @@ -242,8 +242,10 @@ use strict arg psDlg self~initCode = 1 - if self~useStem then self~getDataStem(dlgData.) + + if self~useStem then self~getDataStem(self~dlgData) self~getData + psDlg~unchanged(self) return self~PSNRET_NOERROR Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2012-07-07 05:40:11 UTC (rev 8006) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2012-07-07 05:42:38 UTC (rev 8007) @@ -3073,6 +3073,13 @@ goto terminate_out; } + // We want to set the dialog type before initializing the event notification + // class. + if ( ! checkDlgType(context, self, pcpbd, ownerData) ) + { + goto terminate_out; + } + // Initialize the event notification mixin class. The only thing that could // fail is getting a buffer from the interpreter kernel. pCEventNotification pEN = NULL; @@ -3091,11 +3098,6 @@ strcpy(pcpbd->library, library); pcpbd->resourceID = resource; - if ( ! checkDlgType(context, self, pcpbd, ownerData) ) - { - goto terminate_out; - } - pcpbd->interpreter = context->threadContext->instance; pcpbd->autoDetect = (pcpbd->isPropSheetDlg ? FALSE : TRUE); pcpbd->rexxSelf = self; Modified: main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2012-07-07 05:40:11 UTC (rev 8006) +++ main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2012-07-07 05:42:38 UTC (rev 8007) @@ -2843,7 +2843,28 @@ } -bool initCommandMessagesTable(RexxMethodContext *c, pCEventNotification pcen) +/** + * The command message table is always initialized when a new dialog object is + * instantiated. The Ok, Cancel, and Help commands are always trapped and + * default event handlers are defined in the PlainBaseDialog class. + * + * However, this causes problems in property sheet page dialogs. When the user + * hits enter when a page has the focus, the default Ok event handler runs. The + * default Ok handler invokes validate() with the wrong arguments for + * PropertySheetPage::validate(). + * + * We don't want that, so for page and contol dialogs we don't automatically + * trap the command messages. There are other ways to fix this, but this seems + * best. The Ok, Cancel, and Help commands should not really be trapped for + * either page or control dialogs. + * + * @param c + * @param pcen + * @param pcpbd + * + * @return bool + */ +bool initCommandMessagesTable(RexxMethodContext *c, pCEventNotification pcen, pCPlainBaseDialog pcpbd) { pcen->commandMsgs = (MESSAGETABLEENTRY *)LocalAlloc(LPTR, sizeof(MESSAGETABLEENTRY) * DEF_MAX_COMMAND_MSGS); if ( ! pcen->commandMsgs ) @@ -2854,18 +2875,22 @@ pcen->cmSize = DEF_MAX_COMMAND_MSGS; pcen->cmNextIndex = 0; - if ( ! addCommandMessage(pcen, c, IDOK, UINTPTR_MAX, 0, 0, "OK", TAG_NOTHING) ) + // We do not want to trap these events for page or control dialogs. + if ( ! (pcpbd->isPageDlg || pcpbd->isControlDlg) ) { - return false; + if ( ! addCommandMessage(pcen, c, IDOK, UINTPTR_MAX, 0, 0, "OK", TAG_NOTHING) ) + { + return false; + } + if ( ! addCommandMessage(pcen, c, IDCANCEL, UINTPTR_MAX, 0, 0, "Cancel", TAG_NOTHING) ) + { + return false; + } + if ( ! addCommandMessage(pcen, c, IDHELP, UINTPTR_MAX, 0, 0, "Help", TAG_NOTHING) ) + { + return false; + } } - if ( ! addCommandMessage(pcen, c, IDCANCEL, UINTPTR_MAX, 0, 0, "Cancel", TAG_NOTHING) ) - { - return false; - } - if ( ! addCommandMessage(pcen, c, IDHELP, UINTPTR_MAX, 0, 0, "Help", TAG_NOTHING) ) - { - return false; - } return true; } @@ -2883,7 +2908,7 @@ pcen->rexxSelf = self; - if ( ! initCommandMessagesTable(c, pcen) ) + if ( ! initCommandMessagesTable(c, pcen, pcpbd) ) { return false; } Modified: main/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp 2012-07-07 05:40:11 UTC (rev 8006) +++ main/trunk/extensions/platform/windows/oodialog/oodMessaging.hpp 2012-07-07 05:42:38 UTC (rev 8007) @@ -62,7 +62,7 @@ extern LRESULT paletteMessage(pCPlainBaseDialog, HWND, UINT, WPARAM, LPARAM); extern MsgReplyType searchMessageTables(ULONG message, WPARAM param, LPARAM lparam, pCPlainBaseDialog); -extern bool initCommandMessagesTable(RexxMethodContext *c, pCEventNotification pcen); +extern bool initCommandMessagesTable(RexxMethodContext *c, pCEventNotification pcen, pCPlainBaseDialog pcpbd); extern bool initEventNotification(RexxMethodContext *, pCPlainBaseDialog, RexxObjectPtr, pCEventNotification *); extern bool addCommandMessage(pCEventNotification, RexxMethodContext *, WPARAM, ULONG_PTR, LPARAM, ULONG_PTR, CSTRING, uint32_t); extern bool addNotifyMessage(pCEventNotification, RexxMethodContext *, WPARAM, ULONG_PTR, LPARAM, ULONG_PTR, CSTRING, uint32_t); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-07-13 04:25:20
|
Revision: 8049 http://oorexx.svn.sourceforge.net/oorexx/?rev=8049&view=rev Author: miesfeld Date: 2012-07-13 04:25:13 +0000 (Fri, 13 Jul 2012) Log Message: ----------- Fix up the ooDialog extensions directory so it is easier to build outside of the interpreter Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp main/trunk/extensions/platform/windows/oodialog/oodialog.mak main/trunk/extensions/platform/windows/oodialog/oodialog.rc Added Paths: ----------- main/trunk/extensions/platform/windows/oodialog/generateVersionFile.bat main/trunk/extensions/platform/windows/oodialog/ooDialog.ver main/trunk/extensions/platform/windows/oodialog/rexx.ico main/trunk/extensions/platform/windows/oodialog/rexx32.exe.manifest main/trunk/extensions/platform/windows/oodialog/rexx64.exe.manifest Added: main/trunk/extensions/platform/windows/oodialog/generateVersionFile.bat =================================================================== --- main/trunk/extensions/platform/windows/oodialog/generateVersionFile.bat (rev 0) +++ main/trunk/extensions/platform/windows/oodialog/generateVersionFile.bat 2012-07-13 04:25:13 UTC (rev 8049) @@ -0,0 +1,118 @@ +@REM +@REM Copyright (c) 2012-2012 Rexx Language Association. All rights reserved. +@REM +@REM This program and the accompanying materials are made available under +@REM the terms of the Common Public License v1.0 which accompanies this +@REM distribution. A copy is also available at the following address: +@REM http://www.oorexx.org/license.html +@REM +@REM Redistribution and use in source and binary forms, with or +@REM without modification, are permitted provided that the following +@REM conditions are met: +@REM +@REM Redistributions of source code must retain the above copyright +@REM notice, this list of conditions and the following disclaimer. +@REM Redistributions in binary form must reproduce the above copyright +@REM notice, this list of conditions and the following disclaimer in +@REM the documentation and/or other materials provided with the distribution. +@REM +@REM Neither the name of Rexx Language Association nor the names +@REM of its contributors may be used to endorse or promote products +@REM derived from this software without specific prior written permission. +@REM +@REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +@REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +@REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +@REM FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +@REM OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +@REM SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +@REM TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +@REM OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +@REM OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +@REM NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +@REM SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +@REM +@ECHO OFF + +REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +REM generateVersionFile.bat +REM This batch file generates, (or uses an existing,) ooDialog.ver.incl file. +REM If executing in a svn 'working copy' directory, it determines the current +REM revision number and includes that information in the generated file. If +REM not a working directory, it checks for an existing ooDialog.ver.incl +REM file, which may have been included in a source file package when the +REM package was created. If not a svn directory, and no ooDialog.ver.incl +REM file, simply copy ooDialog.ver to ooDialog.ver.incl. +REM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +REM First parse ooDialog.ver to get the existing version numbers. +for /F "eol=# delims== tokens=1,2,3*" %%i in (ooDialog.ver) do ( + if %%i == OOD_MAJOR set MAJOR_NUM=%%j + if %%i == OOD_MINOR set MINOR_NUM=%%j + if %%i == OOD_MOD_LVL set LVL_NUM=%%j + if %%i == OOD_BLD_LVL set BLD_NUM=%%j +) + +set SVN_REV=NONE + +for /F "usebackq tokens=1,2,3,4*" %%i in (`svn info`) do if (%%i) == (Revision:) set SVN_REV=%%j + +if %SVN_REV% == "NONE" goto NOSVN + +REM Now write out ooDialog.ver.incl +if exist ooDialog.ver.incl del /F /Q ooDialog.ver.incl +for /F "delims== tokens=1,2,3*" %%i in (ooDialog.ver) do ( + if %%i == OOD_BLD_LVL ( + echo %%i=%SVN_REV%>> ooDialog.ver.incl + set BLD_NUM=%SVN_REV% + ) else ( + if %%i == OOD_VER_STR ( + echo %%i="%MAJOR_NUM%.%MINOR_NUM%.%LVL_NUM%.%SVN_REV%">> ooDialog.ver.incl + ) else ( + if %%jx == x ( + echo %%i>> ooDialog.ver.incl + ) else ( + echo %%i=%%j>> ooDialog.ver.incl + ) + ) + ) +) +echo SVN_REVSION=%SVN_REV%>> ooDialog.ver.incl +goto DONE_OK + +:NOSVN +echo In nosvn label +if exist ooDialog.ver.incl dir ooDialog.ver.incl +if exist ooDialog.ver.incl ( + echo In if exist part + for /F "eol=# delims== tokens=1,2,3*" %%i in (ooDialog.ver.incl) do ( + if %%i == OOD_BLD_LVL set BLD_NUM=%%j + if %%i == SVN_REVISION set SVN_REV=%%j + ) +) else ( + echo should be copying file + copy ooDialog.ver ooDialog.ver.incl 1>nul 2>&1 + set SVN_REV=%BLD_NUM% + echo SVN_REVSION=%SVN_REV%>> ooDialog.ver.incl +) + +goto DONE_OK + +:DONE_ERR +set MAJOR_NUM= +set MINOR_NUM= +set LVL_NUM= +set BLD_NUM= +set SVN_REV= + +exit /b 1 + +:DONE_OK +set MAJOR_NUM= +set MINOR_NUM= +set LVL_NUM= +set BLD_NUM= +set SVN_REV= +exit /b 0 + + Property changes on: main/trunk/extensions/platform/windows/oodialog/generateVersionFile.bat ___________________________________________________________________ Added: svn:eol-style + native Added: main/trunk/extensions/platform/windows/oodialog/ooDialog.ver =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.ver (rev 0) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.ver 2012-07-13 04:25:13 UTC (rev 8049) @@ -0,0 +1,8 @@ +# This defines the current version of ooDialog +OOD_MAJOR=4 +OOD_MINOR=2 +OOD_MOD_LVL=0 +OOD_BLD_LVL=0 +OOD_VER_STR="4.2.0" +OOD_COPY_YEAR="2005-2012" + Property changes on: main/trunk/extensions/platform/windows/oodialog/ooDialog.ver ___________________________________________________________________ Added: svn:eol-style + native Modified: main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-07-13 04:22:08 UTC (rev 8048) +++ main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-07-13 04:25:13 UTC (rev 8049) @@ -839,13 +839,13 @@ break; case 'S' : - _snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ORX_VER, ORX_REL, ORX_MOD, OOREXX_BLD); + _snprintf(buf, sizeof(buf), "%u.%u.%u.%u", OOD_VER, OOD_REL, OOD_MOD, OOD_BLD); break; case 'F' : default : _snprintf(buf, sizeof(buf), "ooDialog Version %u.%u.%u.%u (an ooRexx Windows Extension)", - ORX_VER, ORX_REL, ORX_MOD, OOREXX_BLD); + OOD_VER, OOD_REL, OOD_MOD, OOD_BLD); break; } Modified: main/trunk/extensions/platform/windows/oodialog/oodialog.mak =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodialog.mak 2012-07-13 04:22:08 UTC (rev 8048) +++ main/trunk/extensions/platform/windows/oodialog/oodialog.mak 2012-07-13 04:25:13 UTC (rev 8049) @@ -41,16 +41,44 @@ # NMAKE-compatible MAKE file for ooDialog +# If OOD_INDEPENDENT is defined we are operating outside of the interpreter +# build. In that case, OOD_OUTDIR, OOD_OODIALOGSRC, and OOD_INCLUDE_File are +# defined in the parent make file that calls us. When called in the interpreter +# build process, we set those macros using the OR_xx values set by the build +# batch files. + +!ifdef OOD_INDEPENDENT + +REXXAPI_LIBS = $(REXX_LIBS) + +!else + OOD_OUTDIR=$(OR_OUTDIR) OOD_OODIALOGSRC=$(OR_OODIALOGSRC) +REXXAPI_LIBS = $(OR_OUTDIR)\rexx.lib $(OR_OUTDIR)\rexxapi.lib +OOD_INCLUDE_FILE = "$(OR_LIBSRC)\ORXWIN32.MAK" -all: $(OOD_OUTDIR)\oodialog.dll +!endif -!include "$(OR_LIBSRC)\ORXWIN32.MAK" +# Generate the version information. Quit if there is an error. +!IF [generateVersionFile.bat] != 0 +! ERROR Build error: could not gerate version file, ooDialog.ver.incl +!ENDIF + +!include ooDialog.ver.incl +!include $(OOD_INCLUDE_FILE) + +# The ooDialog specific version definition +ood_ver_def = -DOOD_VER=$(OOD_MAJOR) -DOOD_REL=$(OOD_MINOR) -DOOD_MOD=$(OOD_MOD_LVL) -DOOD_BLD=$(OOD_BLD_LVL) -DOOD_COPY_YEAR=\"$(OOD_COPY_YEAR)\" + +# We use our own rc flags version. +rcflags_oodialog = rc /DWIN32 -dOODIALOG_VER=$(OOD_MAJOR) -dOODIALOG_REL=$(OOD_MINOR) -dOODIALOG_SUB=$(OOD_MOD_LVL) -dOODIALOG_BLD=$(OOD_BLD_LVL) -dOODIALOG_VER_STR=\"$(OOD_VER_STR)\" -dOODIALOG_COPY_YEAR=\"$(OOD_COPY_YEAR)\" -dMANIFEST_FILE=$(M_FILE) + C=cl -OPTIONS= $(cflags_common) $(cflags_dll) $(OR_ORYXINCL) -OR_LIB=$(OR_OUTDIR) +OPTIONS= $(cflags_common) $(ood_ver_def) $(cflags_dll) $(OR_ORYXINCL) +all: $(OOD_OUTDIR)\oodialog.dll + # All Source Files SOURCEF= $(OOD_OUTDIR)\APICommon.obj $(OOD_OUTDIR)\oodBarControls.obj $(OOD_OUTDIR)\oodBaseDialog.obj $(OOD_OUTDIR)\oodBasicControls.obj \ $(OOD_OUTDIR)\oodCommon.obj $(OOD_OUTDIR)\oodControl.obj $(OOD_OUTDIR)\oodData.obj $(OOD_OUTDIR)\oodDeviceGraphics.obj \ @@ -110,21 +138,20 @@ {$(OOD_OODIALOGSRC)}.cpp{$(OOD_OUTDIR)}.obj: @ECHO . @ECHO Compiling $(@B).cpp - $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OOD_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(OOD_OODIALOGSRC)\$(@B).cpp + $(OR_CC) $(cflags_common) $(ood_ver_def) $(cflags_dll) /Fo$(OOD_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(OOD_OODIALOGSRC)\$(@B).cpp {$(OOD_OODIALOGSRC)}.c{$(OOD_OUTDIR)}.obj: @ECHO . @ECHO Compiling $(@B).c - $(OR_CC) $(cflags_common) $(cflags_dll) /Fo$(OOD_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(OOD_OODIALOGSRC)\$(@B).c + $(OR_CC) $(cflags_common) $(ood_ver_def) $(cflags_dll) /Fo$(OOD_OUTDIR)\$(@B).obj $(OR_ORYXINCL) $(OOD_OODIALOGSRC)\$(@B).c -$(OOD_OUTDIR)\oodialog.dll: $(SOURCEF) +$(OOD_OUTDIR)\oodialog.dll: $(SOURCEF) $(OR_LINK) \ - $(SOURCEF) \ + $(SOURCEF) \ $(lflags_common) $(lflags_dll) \ - $(OR_LIB)\rexx.lib \ - $(OR_LIB)\rexxapi.lib \ + $(REXXAPI_LIBS) \ WINMM.LIB \ COMDLG32.LIB \ COMCTL32.LIB \ @@ -138,7 +165,7 @@ $(OOD_OUTDIR)\oodialog.res: $(OOD_OODIALOGSRC)\oodialog.rc @ECHO . @ECHO ResourceCompiling $(@B).res - $(rc) $(rcflags_common) /i $(OOD_OODIALOGSRC) /i $(OR_WINKERNELSRC) -r -fo$(OOD_OUTDIR)\$(@B).res $(OOD_OODIALOGSRC)\$(@B).rc + $(rc) $(rcflags_oodialog) /i $(OOD_OODIALOGSRC) /i $(OR_WINKERNELSRC) -r -fo$(OOD_OUTDIR)\$(@B).res $(OOD_OODIALOGSRC)\$(@B).rc # Recompile everything if the make file changes. $(SOURCEF) : oodialog.mak Modified: main/trunk/extensions/platform/windows/oodialog/oodialog.rc =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodialog.rc 2012-07-13 04:22:08 UTC (rev 8048) +++ main/trunk/extensions/platform/windows/oodialog/oodialog.rc 2012-07-13 04:25:13 UTC (rev 8049) @@ -44,8 +44,8 @@ IDI_DLG_OOREXX ICON "rexx.ico" 1 VERSIONINFO - FILEVERSION OOREXX_VER,OOREXX_REL,OOREXX_SUB,OOREXX_BLD - PRODUCTVERSION OOREXX_VER,OOREXX_REL,OOREXX_SUB,OOREXX_BLD + FILEVERSION OODIALOG_VER,OODIALOG_REL,OODIALOG_SUB,OODIALOG_BLD + PRODUCTVERSION OODIALOG_VER,OODIALOG_REL,OODIALOG_SUB,OODIALOG_BLD FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -61,13 +61,13 @@ BLOCK "040904b0" BEGIN VALUE "CompanyName", "Rexx Language Association\0" - VALUE "FileDescription", "Open Object Rexx OODIALOG\0" - VALUE "FileVersion", OOREXX_VER_STR "\0" - VALUE "InternalName", "OODIALOG GUI\0" - VALUE "LegalCopyright", "Copyright \xA9 RexxLA " OOREXX_COPY_YEAR ".\0" + VALUE "FileDescription", "ooDialog an Open Object Rexx extension\0" + VALUE "FileVersion", OODIALOG_VER_STR "\0" + VALUE "InternalName", "ooDialog GUI\0" + VALUE "LegalCopyright", "Copyright \xA9 RexxLA " OODIALOG_COPY_YEAR ".\0" VALUE "OriginalFilename", "oodialog.dll\0" VALUE "ProductName", "Open Object Rexx for Windows\0" - VALUE "ProductVersion", OOREXX_VER_STR "\0" + VALUE "ProductVersion", OODIALOG_VER_STR "\0" END END BLOCK "VarFileInfo" Added: main/trunk/extensions/platform/windows/oodialog/rexx.ico =================================================================== (Binary files differ) Property changes on: main/trunk/extensions/platform/windows/oodialog/rexx.ico ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: main/trunk/extensions/platform/windows/oodialog/rexx32.exe.manifest =================================================================== --- main/trunk/extensions/platform/windows/oodialog/rexx32.exe.manifest (rev 0) +++ main/trunk/extensions/platform/windows/oodialog/rexx32.exe.manifest 2012-07-13 04:25:13 UTC (rev 8049) @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="1.0.0.0" + processorArchitecture="X86" + name="RexxLA.ooRexx.rexx" + type="win32" +/> +<description>Open Object Rexx Interpreter.</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="X86" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> Added: main/trunk/extensions/platform/windows/oodialog/rexx64.exe.manifest =================================================================== --- main/trunk/extensions/platform/windows/oodialog/rexx64.exe.manifest (rev 0) +++ main/trunk/extensions/platform/windows/oodialog/rexx64.exe.manifest 2012-07-13 04:25:13 UTC (rev 8049) @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="1.0.0.0" + processorArchitecture="amd64" + name="RexxLA.ooRexx.rexx" + type="win32" +/> +<description>Open Object Rexx Interpreter.</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="amd64" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-07-16 01:40:04
|
Revision: 8081 http://oorexx.svn.sourceforge.net/oorexx/?rev=8081&view=rev Author: miesfeld Date: 2012-07-16 01:39:58 +0000 (Mon, 16 Jul 2012) Log Message: ----------- ooDialog - use defines from ooDialog.ver for version statement Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-07-16 01:36:36 UTC (rev 8080) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2012-07-16 01:39:58 UTC (rev 8081) @@ -97,9 +97,6 @@ #define MF_SHOWCURSOR 4 #define OODDLL "oodialog.dll" -#define OOD_LVL_MAJOR 4 -#define OOD_LVL_MINOR 2 -#define OOD_LVL_BIT 0 /* Flags for the get icon functions. Indicates the source of the icon. */ #define ICON_FILE 0x00000001 Modified: main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-07-16 01:36:36 UTC (rev 8080) +++ main/trunk/extensions/platform/windows/oodialog/oodUtilities.cpp 2012-07-16 01:39:58 UTC (rev 8081) @@ -835,7 +835,7 @@ switch ( toupper(*format) ) { case 'L' : - _snprintf(buf, sizeof(buf), "%u.%u.%u", OOD_LVL_MAJOR, OOD_LVL_MINOR, OOD_LVL_BIT); + _snprintf(buf, sizeof(buf), "%u.%u.%u", OOD_VER, OOD_REL, OOD_MOD); break; case 'S' : This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2012-08-11 14:51:35
|
Revision: 8185 http://oorexx.svn.sourceforge.net/oorexx/?rev=8185&view=rev Author: miesfeld Date: 2012-08-11 14:51:26 +0000 (Sat, 11 Aug 2012) Log Message: ----------- ooDialog - remove unused source files Removed Paths: ------------- main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls Deleted: main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls 2012-08-11 14:46:18 UTC (rev 8184) +++ main/trunk/extensions/platform/windows/oodialog/CategoryDialog.cls 2012-08-11 14:51:26 UTC (rev 8185) @@ -1,824 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2012 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ - -/** - * Windows Dialog Interface for Open Object Rexx (ooRexx.) - * - * The Category Dialog Class. - * - * This class creates and controls a dialog that has more than one panel. It is - * similar to the 'notebook' control available in OS/2 or the PropertySheet - * available in the Windows 95 user interface. You can switch among diferent - * pages by clicking radio buttons. Each page has its own window controls. You - * can setup a page out of a dialog resource script. - */ -::requires "UserDialog.cls" - -/* Deprecated */ -::class 'CategoryDialog' subclass UserDialog public - --- A directory that contains internal data. This should be private, but I'm not sure of the --- consequences to existing programs if it is changed. MM -::attribute catalog unguarded protected - -::attribute staticID private -::attribute catX private -::attribute catY private -::attribute catCX private -::attribute catStyle private -::attribute catLabel private -::attribute catMax private -::attribute wizard private - --- arg cdstyle=[ "DROPDOWN" | "TOPLINE" | "NOBORDER" | "WIZARD"] */ -::method init - use arg dlgData., cdx, cdy, cdcx, cdstyle, cdtable, cdlabel, cdmax, includeFile - - newArgs = .array~new(2) - if arg(1, 'E') then newArgs[1] = arg(1) - if arg(9, 'E') then newArgs[2] = arg(9) - forward class (super) arguments (newArgs) continue - if result <> 0 then return result - - self~catalog = .directory~new - self~catalog['count'] = 0 - self~catalog['page'] = .directory~new - self~catalog['page']['font'] = "" - self~catalog['page']['fsize'] = 0 - self~catalog['page']['style'] = "" - self~catalog['page']['btnwidth'] = 0 - self~catalog['page']['leftbtntext'] = "&Backward" - self~catalog['page']['rightbtntext'] = "&Forward" - self~catalog['page']['expected'] = 200 - - if arg(1,'o') = 1 then self~useStem = .false; else self~useStem = .true - if arg(2,'o') = 1 then self~catX = 10; else self~catX = cdx - if arg(3,'o') = 1 then self~catY = 4; else self~catY = cdy - if arg(4,'o') = 1 then self~catCX = 0; else self~catCX = cdcx - if arg(5,'o') = 1 then self~catStyle = ""; else self~catStyle = cdstyle~translate - if arg(6,'o') = 1 then cdtable = "" - if arg(7,"o") = 1 then self~catLabel = "Page:"; else self~catLabel = cdlabel - if arg(8,"o") = 1 then self~catMax = 0; else self~catMax = cdmax - - if cdtable \= '' then - do - self~catalog['names'] = .array~new(10) - parse var cdtable name ret - i = 0 - do while name \= "" - i = i + 1 - self~catalog['names'][i] = name - parse var ret name ret - end - self~catalog['count'] = i - end - - self~initCategories() /* user overwrite */ - - if cdtable = '' then - do - if self~catalog['count'] = 0 then - do - i = 0 - do ar over self~catalog['names'] - i = i +1 - end - self~catalog['count'] = i - end - end - - if self~catStyle~wordpos("WIZZARD") > 0 | self~catStyle~wordpos("WIZARD") > 0 then do - self~wizard = .true - self~catStyle = self~catStyle~changestr("WIZZARD", "") - end - else self~wizard = .false - --- Documented "internal use only" in 3.2.0 - Do not document. - self~catalog['id'] = .array~new(self~catalog['count'],100) - self~catalog['base'] = .array~new(self~catalog['count']) - self~catalog['handles'] = .array~new(self~catalog['count']) - - self~staticID = 9600 - - return 0 - - --- Documented "internal use only" in 3.2.0 - Do not document. -::method startIt /* don't call parent startIt */ - if self~dlgHandle = 0 then return 0 - self~initDialog - return self~dlgHandle - -::method defineDialog - if self~basePtr = 0 then return 0 - if self~catStyle~wordpos('DROPDOWN') = 0 then - do i = 9001 to (9000 + self~catalog['count']) - self~connectButtonEvent(i, "CLICKED", "CHANGEPAGE") - end - else self~connectListBoxEvent(9001, "SELCHANGE", "CHANGEPAGE") - - do i = 1 to self~catalog['count'] - catnames.i = self~catalog['names'][i] - end - - --- Documented "internal use only" in 3.2.0 - Do not document. - self~catalog['category'] = 0 - - n = self~catStyle~wordpos("TOPLINE") - if n > 0 then self~catMax = 1 - m = self~catStyle~wordpos("DROPDOWN") - - if (n > 0 | m > 0) & self~catStyle~wordpos('NOBORDER') = 0 then self~catStyle = self~catStyle||" NOBORDER" - - if self~catalog['page']['h'] = .nil then self~catalog['page']['h'] = self~sizeY - 40 - - size = self~getTextSizeDu("Hg") - textHeight = size~height - - if self~catCX = 0 & n = 0 then /* dropdown or none */ - do - do i = 1 to self~catalog['count'] - if self~catalog['page']['font'] <> "" then - size = self~getTextSizeDlg(catnames.i,self~catalog['page']['font'],self~catalog['page']['fsize']) - else - size = self~getTextSizeDu(catnames.i) - self~catCX = max(self~catCX,size~width) - end - if n = 0 then self~catCX = self~catCX + 20 - end - - if n > 0 | m > 0 then do /* topline or dropdown */ - if self~catalog['page']['x'] = .nil then self~catalog['page']['x'] = 1 - if m > 0 then do - if self~catalog['page']['y'] = .nil then self~catalog['page']['y'] = self~catY*2+textHeight+4 - end - else if self~catalog['page']['y'] = .nil then self~catalog['page']['y'] = self~catY+textHeight+5 - - if self~catalog['page']['w'] = .nil then self~catalog['page']['w'] = self~sizeX - 2 - end - else do - if self~catMax = 0 then do - if self~catalog['page']['x'] = .nil then self~catalog['page']['x'] = self~catX+10+self~catCX - end - else - if self~catalog['page']['x'] = .nil then self~catalog['page']['x'] = self~catX+10+self~catCX * ((self~catalog['count']-1)%self~catMax+1) - - if self~catalog['page']['y'] = .nil then self~catalog['page']['y'] = 5 - - if self~catalog['page']['w'] = .nil then self~catalog['page']['w'] = self~sizeX - (self~catX+self~catCX+20) - end - - self~categoryPage - - if m > 0 then do - if self~catMax = 0 then self~catMax = 5 - if self~catalog['count'] < self~catMax then self~catMax = self~catalog['count'] - if self~catMax < self~catalog['count'] then - if self~catLabel='' then - self~createComboBox(9001, self~catX, self~catY, self~catCX, (self~catMax+1)*(textHeight+4), - - self~catStyle~delword(m, 1) || " CAT VSCROLL") - else self~createComboBoxInput(9001, self~catX, self~catY, , self~catCX, self~catMax, - - self~catLabel, self~catStyle~delword(m, 1) || " CAT VSCROLL") - else if self~catLabel='' then - self~createComboBox(9001, self~catX,self~catY,self~catCX,(self~catMax+1)*(textHeight+4), - - self~catStyle~delword(m, 1) || " CAT") - else self~createComboBoxInput(9001, self~catX, self~catY, , self~catCX, self~catMax, - - self~catLabel, self~catStyle~delword(m, 1) || " CAT") - end - else do - if (n >0) then newstyle = self~catStyle~delword(n, 1) - else newstyle = self~catStyle - if self~catalog['page']['font'] <> "" then - self~createRadioButtonStem(9001, self~catX, self~catY, self~catCX, catnames., self~catMax,, - newstyle || " CAT",,self~catalog['page']['font'],self~catalog['page']['fsize']) - else - self~createRadioButtonStem(9001, self~catX, self~catY, self~catCX, catnames., self~catMax, newstyle || " CAT") - end - - if \ self~startParentDialog(0, .false) then return 0 - - do i = 1 to self~catalog['count'] - self~catalog['category'] = i - p = self~catalog['page'] - - -- Start the dialog template for this page. (Ignore an error, an exception will be raised) - self~CreateCategoryDialog(p['x'], p['y'], p['w'], p['h'],p['font'], p['fsize'], p['expected']) - - -- Invoke the user defined method with the same name as the page name. This is where the - -- dialog control items for this page are defined. - self~send(self~catalog['names'][i]~space(0)) - - -- Create the underlying Windows dialog. - hChildDlg = self~startChildDialog(self~catalog['base'][i], i) - self~catalog['base'][i] = 0 - self~catalog['handles'][i] = hChildDlg - end - --- This method returns the current page index -::method currentCategory unguarded - return self~catalog['category'] - --- This method adds controls to CategoryDialog dialog itself. The dialog that is the parent to --- the child dialogs that make up the pages of the CategoryDialog. -::method categoryPage protected - - size = self~getTextSizeDu("Hg") - textHeight = size~height - - if self~catStyle~wordpos("TOPLINE") > 0 then - self~createBlackFrame(-1, 0, 2, self~sizeX, textHeight + (self~catY+2)) - else if self~catStyle~wordpos("DROPDOWN") > 0 then - self~createBlackFrame(-1, 0, 2, self~sizeX, textHeight + (self~catY*2)+1) - - lbtext = self~catalog['page']['leftbtntext'] - rbtext = self~catalog['page']['rightbtntext'] - if lbtext~pos(" ") > 0 then lbtext = '"' || lbtext || '"' - if rbtext~pos(" ") > 0 then rbtext = '"' || rbtext || '"' - - wizardTextIdMsg = lbtext" 11 PreviousPage" rbtext" 12 NextPage" - y = self~sizeY - 15 - - if (self~catalog['page']['btnwidth'] > 0) then do - cx = self~catalog['page']['btnwidth'] - x = trunc(self~sizeX - self~catalog['page']['btnwidth'] * 2 - 15) - - self~createPushButtonGroup(x, y, cx, , "&Ok 1 OK &Cancel 2 CANCEL", 1, "DEFAULT") - if self~wizard then self~createPushButtonGroup(5, y, cx, , wizardTextIdMsg, 1, "") - end - else do - self~createOkCancelRightBottom - if self~wizard then self~createPushButtonGroup(5, y, , , wizardTextIdMsg, 1, "") - end - - self~createBlackFrame(-1, 0, self~sizeY - 20, self~sizeX, 1) - -::method createCategoryDialog private external "LIBRARY oodialog catdlg_createCategoryDialog" - -::method initDialog - /* set the mark to the first radio button */ - if self~catStyle~wordpos('DROPDOWN') > 0 then do - do i = 1 to self~catalog['count'] - self~addComboEntry(9001, self~catalog['names'][i]) - end - self~setComboBoxData(9001, self~catalog['names'][1]) - end - else self~sendMessageToItem(9001,"0x000000F1",1,0) - if self~wizard then self~disableItem(11) - - /* call InitXXX for each category if such a method exists */ - do i = 1 to self~catalog['count'] - self~catalog['category'] = i - msg = "init" || self~catalog['names'][i]~space(0) - -- Does user class provide the initXXX method? If so invoke it. - if self~hasMethod(msg) then self~send(msg) - end - - /* activate first page */ - self~catalog['category'] = 1 - self~showWindow(self~catalog['handles'][self~catalog['category']]) - - /* */ - -::method initCategories protected - return - - - /* This method returs the currently selected page. Return value 1 means */ - /* the first page is selected. */ - -::method GetSelectedPage unguarded - if self~catStyle~wordpos('DROPDOWN') = 0 then do - np = 9001 - do while self~getRadioButtonData(np) = 0 & np < (9001 + self~catalog['count']) - np = np + 1 - end - end - else do - cur = self~getComboBoxData(9001) - np = 1 - do while np <= ( self~catalog['count']) & cur \= self~catalog['names'][np] - np = np + 1 - end - if np > self~catalog['count'] then return 0 - np = np + 9000 - end - return np-9000 - - /* 'ChangePage' switch to the page 'NewPage' and shows it. */ - /* If 'NewPage is omitted the currently selected page will be activated - */ - /* (if not allready done). */ - - -::method ChangePage unguarded - use arg NewPage - - oldPage = self~catalog['category'] - /* if ChangePage is called automatically, 2 arg are passed (WParam and LParam) */ - if arg(2,'o') = 0 | NewPage > 9000 then NewPage = self~GetSelectedPage - else do - if self~catStyle~wordpos("DROPDOWN") = 0 then do - /* SetRadioButton only works for registered radio buttons */ - /* uncheck the old radio button and check the new one */ - self~SendMessageToItem(9000+OldPage,"0x000000F1",0,0) - self~SendMessageToItem(9000+NewPage,"0x000000F1",1,0) - end - else self~SetCurrentComboIndex(9001, NewPage) - end - if (NewPage = self~catalog['category']) | (NewPage < 1 | NewPage> self~catalog['count']) then return 0 - - self~HideWindowFast(self~catalog['handles'][self~catalog['category']]) - self~catalog['category'] = NewPage - if self~wizard then do - if NewPage = 1 then do - self~DisableItem(11) - self~EnableItem(12) - end - else if NewPage = self~catalog['count'] then do - self~EnableItem(11) - self~DisableItem(12) - end - else do - self~EnableItem(11) - self~EnableItem(12) - end - end - self~ShowWindow(self~catalog['handles'][self~catalog['category']]) - - self~PageHasChanged(oldPage, NewPage) - return NewPage - -::method PageHasChanged unguarded - use arg Oldpage, NewPage - return - -::method PreviousPage unguarded - oldPage = self~CurrentCategory - if oldPage > 1 then self~ChangePage(oldPage-1) - -::method NextPage unguarded - oldPage = self~CurrentCategory - if oldPage < self~catalog['count'] then self~ChangePage(oldPage+1) - - -::method sendMessageToCategoryControl unguarded external "LIBRARY oodialog catdlg_sendMessageToCategoryControl" -::method categoryComboBox unguarded private - use strict arg id, pageID - if pageID == -1 then pageID = self~catalog['category'] - return self~newComboBox(id, pageID) - -::method addCategoryComboEntry unguarded - use strict arg id, string, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - else return comboBox~add(string) - -::method insertCategoryComboEntry unguarded - use strict arg id, index = 0, string, pageID = (-1) - comboBox = self~categoyComboBox(id, pageID) - if comboBox == .nil then return -1 - if arg(2, 'O') then return comboBox~insert( , string) - else return comboBox~insert(index, string) - -::method getCategoryComboEntry unguarded - use strict arg id, index, pageID = (-1) - comboBox = self~categoyComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~getText(index) - -::method findCategoryComboEntry unguarded - use strict arg id, string, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~find(string) - -::method categoryComboAddDirectory unguarded - use strict arg id, drivepath, fileAttributes = "", pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~addDirectory(drivePath, fileAttibutes) - -::method deleteCategoryComboEntry unguarded - use strict arg id, index = (-2), pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - if index == -2 then index = self~getCurrentCategoryComboIndex(id, pageID) - if index <= 0 then return -1 - return comboBox~delete(index) - -::method getCurrentCategoryComboIndex unguarded - use strict arg id, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~selectedIndex - -::method setCurrentCategoryComboIndex unguarded - use strict arg id, ndx = 0, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~selectIndex(ndx) - -::method getCategoryComboItems unguarded - use strict arg id, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~items - -::method changeCategoryComboEntry unguarded - use strict arg id, item = (-2), newEntry, pageID = (-1) - if item == -2 then item = self~getCurrentCategoryComboIndex(id, pageID) - if item <= 0 then return -1 - ret = self~deleteCategoryComboEntry(id, item, pageID) - if ret <= 0 then return -1 - return self~insertCategoryComboEntry(id, item, newEntry, pageID) - -::method categoryComboDrop unguarded - use strict arg id, pageID = (-1) - comboBox = self~categoryComboBox(id, pageID) - if comboBox == .nil then return -1 - return comboBox~deleteAll - - --- Methods to manipulate a list box. - -::method categoryListBox unguarded private - use strict arg id, pageID - if pageID == -1 then pageID = self~catalog['category'] - return self~newListBox(id, pageID) - -::method setCategoryListTabulators unguarded external "LIBRARY oodialog generic_setListTabulators" - -::method addCategoryListEntry unguarded - use strict arg id, text, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - else return listBox~add(text) - -::method insertCategoryListEntry unguarded - use strict arg id, index = (-2), text, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - if arg(2, 'O') then return listBox~insert( , text) - else return listBox~insert(index, text) - -::method findCategoryListEntry unguarded - use strict arg id, text, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~find(text) - -::method getCategoryListEntry unguarded - use strict arg id, index, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~getText(index) - -::method categoryListAddDirectory unguarded - use strict arg id, drivePath, fileAttributes = "", pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~addDirectory(drivePath, fileAttributes) - -::method deleteCategoryListEntry unguarded - use strict arg id, index = (-2), pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - if index == -2 then index = self~getCurrentCategoryListIndex(id, pageID) - if index <= 0 then return -1 - return listBox~delete(index) - -::method getCurrentCategoryListIndex unguarded - use strict arg id, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~selectedIndex - -::method setCurrentCategoryListIndex unguarded - use strict arg id, ndx = 0, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~selectIndex(ndx) - -::method getCategoryListItems unguarded - use strict arg id, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~items - -::method changeCategoryListEntry unguarded - use strict arg id, item = (-2), newEntry, pageID = (-1) - if item == -2 then item = self~getCurrentCategoryListIndex(id, pageID) - if item <= 0 then return -1 - ret = self~deleteCategoryListEntry(id, item, pageID) - if ret <= 0 then return -1 - return self~insertCategoryListEntry(id, item, newEntry, pageID) - -::method categoryListDrop unguarded - use strict arg id, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~deleteAll - -::method setCategoryListWidthPx unguarded - use strict arg id, pixels, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~setWidthPx(pixels) - -::method getCategoryListWidthPx unguarded - use strict arg id, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~widthPx - -::method setCategoryListColumnWidthPx unguarded - use strict arg id, pixels, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - listBox~columnWidthPx = pixels - return 0 - -::method setCategoryListItemHeightPx unguarded - use strict arg id, pixels, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - listBox~listItemHeightPx = pixels - return 0 - -::method getCategoryListItemHeightPx unguarded - use strict arg id, pageID = (-1) - listBox = self~categoryListBox(id, pageID) - if listBox == .nil then return -1 - return listBox~itemHeightPx - --- The following methods are generic methods to work with a dialog control. - -::method getControlHandle unguarded - use arg id, hDlg - - forward class (super) continue - hwnd = result - - if hwnd = 0 & arg(2,'O') then do - if \ id~datatype("W") then id = self~resolveSymbolicId(id) - if id == -1 then return -1 - - -- Try current page. - hwnd = self~getControlHandle:super(id, self~catalog['handles'][self~catalog['category']]) - - -- If still no good, try all pages. - if hwnd = 0 then do i = 1 to self~catalog['count'] while hwnd = 0 - hwnd = self~getControlHandle:super(id, self~catalog['handles'][i]) - end - end - return hwnd - -::method enableCategoryControl unguarded - use strict arg id, category = "" - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return 1 - .Window~new(hwnd)~enable - -::method disableCategoryControl unguarded - use strict arg id, category = "" - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return 1 - .Window~new(hwnd)~disable - -::method hideCategoryControl unguarded - use strict arg id, category = "" - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return 1 - return .Window~new(hwnd)~hide - -::method showCategoryControl unguarded - use strict arg id, category = "" - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return 1 - .Window~new(hwnd)~show - -::method resizeCategoryControl unguarded - use strict arg id, width, height, showOptions = "", category = "" - if arg(5,'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return -1 - size = .Size~new(width, height) - return .Window~new(hwnd)~resizeTo(size, showOptions) - -::method moveCategoryControl unguarded - use strict arg id, xPos, yPos, showOptions = "", category = "" - if arg(5,'O') | \ category~dataType("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return -1 - pos = .Point~new(xPos, yPos) - return .Window~new(hwnd)~moveTo(pos, showOptions) - -::method setCategoryControlFont unguarded - use strict arg id, hFont, bRedraw = 1, category = "" - if arg(4, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hCtrl = self~getControlHandle(id, self~catalog['handles'][category]) - msg = self~WM_SETFONT - return self~sendWinHandleMsg(msg, hFont, bRedraw, hCtrl) - -::method focusCategoryControl unguarded - use strict arg id, category = "" - if arg(2,'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hCtrl = self~getControlHandle(id, self~catalog['handles'][category]) - hDlg = self~catalog['handles'][category] - msg = self~WM_NEXTDLGCTL - return self~sendWinHandleMsg(msg, hCtrl, 1, hDlg) - - --- The following methods are to set or get the 'data' of a single dialog control on one of --- the category pages of the CategroyDialog. It is necessary to know the category page number --- of the dialog control in order for to correctly identify the control. If the page number --- argument is omitted, it is assumed the page number is the current page number. - -::method getControlDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method getCheckBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method getRadioButtonDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method getEditDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method getListBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method getComboBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" - -::method setControlDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setStaticDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setCheckBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setRadioButtonDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setEditDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setListBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method setComboBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" - -::method getDataAttribute unguarded - use arg attributeName, category - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - id = self~dataConnection~first - do while (id \= .nil) - if self~dataConnection[id] = attributeName then do - data = self~getControlData(id, category) - self~sendWith(attributeName'=', .array~of(data)) - return - end - i = self~dataConnection~Next(i) - end - -::method setDataAttribute unguarded - use arg attributeName, category - if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current category page */ - id = self~dataConnection~first - do while (id \= .nil) - if self~dataConnection[id] = attributeName then do - data = self~send(attributeName) - return self~setControlData(id, data, category) - end - id = self~dataConnection~next(id) - end - - - --- DEPRECATED and DEPRECATED Maybe to end of file -::method getCategoryEntryLine unguarded - forward message 'getEditDataPage' -::method getCategoryListLine unguarded - forward message 'getListBoxDataPage' -::method getCategoryComboLine unguarded - forward message 'getComboBoxDataPage' -::method getCategoryCheckBox unguarded - forward message 'getCheckBoxDataPage' -::method getCategoryRadioButton unguarded - forward message 'getRadioButtonDataPage' -::method getCategoryMultiList unguarded - forward message 'getListBoxDataPage' -::method getCategoryValue unguarded - forward message 'getControlDataPage' -::method getCategoryAttrib unguarded - forward message 'getDataAttribute' -::method setCategoryStaticText unguarded - forward message 'setStaticDataPage' -::method setCategoryEntryLine unguarded - forward message 'setEditDataPage' -::method setCategoryListLine unguarded - forward message 'setListBoxDataPage' -::method setCategoryComboLine unguarded - forward message 'setComboBoxDataPage' -::method setCategoryCheckBox unguarded - forward message 'setCheckBoxDataPage' -::method setCategoryRadioButton unguarded - forward message 'setRadioButtonDataPage' -::method setCategoryMultiList unguarded - forward message 'setListBoxDataPage' -::method setCategoryValue unguarded - forward message 'setControlDataPage' -::method setCategoryAttrib unguarded - forward message 'setDataAttribute' -::method sendMessageToCategoryItem unguarded - forward message "sendMessageToCategoryControl" -::method getItem unguarded - forward message 'getControlHandle' -::method enableCategoryItem unguarded - forward message 'enableCategoryControl' -::method disableCategoryItem unguarded - forward message 'disableCategoryControl' -::method hideCategoryItem unguarded - forward message 'hideCategoryControl' -::method showCategoryItem unguarded - forward message 'showCategoryControl' -::method setCategoryItemFont unguarded - forward message "setCategoryControlFont" -::method focusCategoryItem unguarded - forward message "focusCategoryControl" - --- DEPRECATED (maybe?) -::method resizeCategoryItem unguarded -- Old method using dialog units, this is not accurate - use strict arg id, width, height, showOptions = "", category = "" - if arg(5, 'O') | \ category~datatype("W") then category = self~catalog['category'] - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return -1 - size = .Size~new(trunc(width * self~factorX), trunc(height * self~factorY)) - return .Window~new(hwnd)~resizeTo(size, showOptions) - -::method moveCategoryItem unguarded -- Old method using dialog units, this is not accurate - use strict arg id, xPos, yPos, showOptions = "", category = "" - if arg(5, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ - - hwnd = self~getControlHandle(id, self~catalog['handles'][category]) - if hwnd = 0 then return -1 - pos = .Point~new(trunc(xPos * self~factorX), trunc(yPos * self~factorY)) - return .Window~new(hwnd)~moveTo(pos, showOptions) - -::method getCategoryListItemHeight unguarded -- Old method using dialog units, this is not accurate - use strict arg id, pageID = (-1) - pixels = self~getCategoryListItemHeightPx(id, pageID) - if pixels <= 0 then return pixels - else return pixels / self~factorY - -::method setCategoryListWidth unguarded -- Old method using dialog units, this is not accurate - use strict arg id, dlgunits, pageID = (-1) - pixels = dlgunits * self~factorX - return self~setCategoryListWidthPx(id, pixels, pageID) - -::method getCategoryListWidth unguarded -- Old method using dialog units, this is not accurate - use strict arg id, pageID = (-1) - pixels = self~getListWidthPx(id, pageID) - if pixels <= 0 then return pixels - else return pixels / self~factorX - -::method setCategoryListColumnWidth unguarded -- Old method using dialog units, this is not accurate - use strict arg id, dlgunits, pageID = (-1) - pixels = dlgunits * self~factorX - return self~setCategoryListColumnWidthPx(id, pixels, pageID) - -::method setCategoryListItemHeight unguarded -- Old method using dialog units, this is not accurate - use strict arg id, dlgunits, pageID = (-1) - pixels = dlgunits * self~factorY - return self~setCategoryItemHeightPx(id, pixels, pageID) - --- End DEPRECATED (maybe ?) Deleted: main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2012-08-11 14:46:18 UTC (rev 8184) +++ main/trunk/extensions/platform/windows/oodialog/PropertySheet.cls 2012-08-11 14:51:26 UTC (rev 8185) @@ -1,190 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2012 Rexx Language Association. All rights reserved. */ -/* */ -/* This program and the accompanying materials are made available under */ -/* the terms of the Common Public License v1.0 which accompanies this */ -/* distribution. A copy is also available at the following address: */ -/* http://www.oorexx.org/license.html */ -/* */ -/* Redistribution and use in source and binary forms, with or */ -/* without modification, are permitted provided that the following */ -/* conditions are met: */ -/* */ -/* Redistributions of source code must retain the above copyright */ -/* notice, this list of conditions and the following disclaimer. */ -/* Redistributions in binary form must reproduce the above copyright */ -/* notice, this list of conditions and the following disclaimer in */ -/* the documentation and/or other materials provided with the distribution. */ -/* */ -/* Neither the name of Rexx Language Association nor the names */ -/* of its contributors may be used to endorse or promote products */ -/* derived from this software without specific prior written permission. */ -/* */ -/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ -/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ -/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ -/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ -/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ -/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ -/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ -/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ -/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* */ -/*----------------------------------------------------------------------------*/ - -/** - * Windows Dialog Interface for Open Object Rexx (ooRexx.) - * - * Property Sheet Dialog Class. - */ -::requires "CategoryDialog.cls" -::requires "DialogControls.cls" - -/* This class creates and controls a dialog that has more than one panel */ -/* using a tab control to select the single pages */ - -::class 'PropertySheet' subclass CategoryDialog public - -::method init - argarr = arg(1, "A") - newarg = .array~new(argarr~items+1) - if argarr~hasindex(1) = 1 then newarg[1] = argarr[1] /* dlgData */ - if argarr~hasindex(2) = 1 then newarg[6] = argarr[2] /* CatLabels */ - if argarr~hasindex(3) = 1 then newarg[2] = argarr[3] /* tabx */ - if argarr~hasindex(4) = 1 then newarg[3] = argarr[4] /* taby */ - if argarr~hasindex(5) = 1 then newarg[5] = argarr[5] /* options */ - if argarr~hasindex(6) = 1 then newarg[9] = argarr[6] /* include file */ - newarg[4] = 0 - forward class (super) arguments (newarg) - - -::method defineDialog - if self~basePtr = 0 then return 0 - self~connectTabEvent(9001, "SELCHANGE", "CHANGEPAGE") - - do i = 1 to self~catalog['count'] - catnames.i = self~catalog['names'][i] - end - - self~catalog['category'] = 0 - - size = self~getTextSizeDu("Hg") - - self~catalog['page']['x'] = self~catx - self~catalog['page']['y'] = self~caty - self~catalog['page']['w'] = self~sizeX - self~catx*2 - self~catalog['page']['h'] = self~sizeY - self~catalog['page']['y'] - 27 - - self~categoryPage - - p = self~catalog['page'] - self~createTab(9001, p['x'], p['y'], p['w'], p['h'], self~catStyle || " CAT CLIPSIBLINGS") - - if \ self~startParentDialog(0, .false) then return 0 - - do i = 1 to self~catalog['count'] - self~catalog['category'] = i - - -- Start the dialog template for this page. (Ignore an error, an exception will be raised) - self~createCategoryDialog(p['x']+2, p['y']+(size~height*2), p['w']-10, p['h']-(size~height*3),p['font'], p['fsize'], p['expected']) - - -- Invoke the user defined method with the same name as the page name. This is where the - -- dialog control items for this page are defined. - self~send(self~catalog['names'][i]~space(0)) - - -- Create the underlying Windows dialog for this page. - hChildDlg = self~startChildDialog(self~catalog['base'][i], i) - self~catalog['base'][i] = 0 - self~catalog['handles'][i] = hChildDlg - end - - /* This method adds controls to the base window of a 'CategoryDialog' */ - -::method categoryPage protected - p = self~catalog['page'] - lbtext = p['leftbtntext'] - rbtext = p['rightbtntext'] - if lbtext~pos(" ") > 0 then lbtext = '"' || lbtext || '"' - if rbtext~pos(" ") > 0 then rbtext = '"' || rbtext || '"' - - if (p['btnwidth'] > 0) then bw = p['btnwidth']; else bw = 35 - - x = trunc(p['w'] + p['x'] + 2 - bw * 2.25) - y = self~sizeY - 15 - pbTextIdMsg = "&Ok 1 OK &Cancel 2 CANCEL" - wizardTextIdMsg = lbtext" 11 PreviousPage" rbtext" 12 NextPage" - - self~createPushButtonGroup(x, y, bw, , pbTextIdMsg, 1, "DEFAULT") - if self~wizard then self~createPushButtonGroup(p['x'] - 2, y, bw, , wizardTextIdMsg, 1, "") - - -::method initDialog - - tc = self~newTab(9001, 0) - if tc \= .nil then do - do i = 1 to self~catalog['count'] - tc~insert(,self~catalog['names'][i]) - end - tc~selectIndex(0) - end - if self~wizard then self~disableItem(11) - - -- call initXXXX for each category, if such a method exists. The Rect is for - -- setWindowPos(), where the values are ignored because of NOMOVE / NOSIZE. - r = .Rect~new - do i = 1 to self~catalog['count'] - self~catalog['category'] = i - initMethod = "init" || self~catalog['names'][i]~space(0) - if self~hasMethod(initMethod) then self~send(initMethod) - - -- This ensures the child dialog is above the tab control and prevents painting - -- problems when the dialog is covered by another window and then uncovered. - wnd = .Window~new(self~catalog['handles'][i]) - wnd~setWindowPos(TOP, r, "NOSIZE NOMOVE NOOWNERZORDER") - end - - /* set the mark to the first radio button */ - self~catalog['category'] = 1 - self~showWindow(self~catalog['handles'][self~catalog['category']]) - - -::method getSelectedPage unguarded - return self~newTab(9001, 0)~selectedIndex+1 - - -::method changePage unguarded - use arg newPage - - oldPage = self~catalog['category'] - /* if ChangePage is called automatically then 2 arguments are passed (WParam and LParam) */ - if arg(2,'o') = 0 | newPage > 9000 then newPage = self~getSelectedPage - else do - self~newTab(9001, 0)~selectIndex(newPage-1) - end - if (newPage = self~catalog['category']) |, - (newPage < 1 | newPage> self~catalog['count']) then return 0 - self~hideWindowFast(self~catalog['handles'][self~catalog['category']]) - self~catalog['category'] = newPage - if self~wizard then do - if newPage = 1 then do - self~disableItem(11) - self~enableItem(12) - end - else if newPage = self~catalog['count'] then do - self~enableItem(11) - self~disableItem(12) - end - else do - self~enableItem(11) - self~enableItem(12) - end - end - self~showWindow(self~catalog['handles'][self~catalog['category']]) - - self~pageHasChanged(oldPage, newPage) - return newPage - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |