From: <mie...@us...> - 2009-10-11 20:11:29
|
Revision: 5249 http://oorexx.svn.sourceforge.net/oorexx/?rev=5249&view=rev Author: miesfeld Date: 2009-10-11 20:11:22 +0000 (Sun, 11 Oct 2009) Log Message: ----------- Start of converting Wnd_Desktop() to the C++ API Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls main/trunk/extensions/platform/windows/oodialog/resdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-10-11 17:32:25 UTC (rev 5248) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-10-11 20:11:22 UTC (rev 5249) @@ -1973,8 +1973,137 @@ } -/** PlainBaseDialog::getItem() +/** PlainBaseDialog::getWindowText() * + * Gets the text of the specified window. + * + * For a window with a frame, this is the window title. But for a dialog + * control, this is the text for the control. This of course varies depending + * on the type of control. For a button, it is the button label, for an edit + * control it is the edit text, etc.. + * + * @param hwnd The handle of the window. + * + * @return On success, the window text, which could be the empty string. On + * failure, the empty string. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod1(RexxStringObject, pbdlg_getWindowText, POINTERSTRING, hwnd) +{ + RexxStringObject result = context->NullString(); + rxGetWindowText(context, (HWND)hwnd, &result); + return result; +} + +/** PlainBaseDialog::setWindowText() + * + * Sets the text for the specified window. + * + * @param hwnd The handle of the window. + * @param text The text to be set. + * + * @return 0 for success, 1 for error. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod2(wholenumber_t, pbdlg_setWindowText, POINTERSTRING, hwnd, CSTRING, text) +{ + oodResetSysErrCode(context->threadContext); + if ( SetWindowText((HWND)hwnd, text) == 0 ) + { + oodSetSysErrCode(context->threadContext); + return 1; + } + return 0; +} + +/** PlainBaseDialog::getControlText() + * + * Gets the text of the specified control. + * + * @param rxID The resource ID of the control, may be numeric or symbolic. + * + * @return On success, the window text, which could be the empty string. On + * failure, the empty string. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod2(RexxStringObject, pbdlg_getControlText, RexxObjectPtr, rxID, CSELF, pCSelf) +{ + oodResetSysErrCode(context->threadContext); + + pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + RexxStringObject result = context->NullString(); + + uint32_t id; + if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) + { + oodSetSysErrCode(context->threadContext, ERROR_INVALID_WINDOW_HANDLE); + } + else + { + HWND hCtrl = GetDlgItem(pcpbd->hDlg, id); + if ( hCtrl == NULL ) + { + oodSetSysErrCode(context->threadContext); + } + else + { + rxGetWindowText(context, hCtrl, &result); + } + } + return result; +} + +/** PlainBaseDialog::setControlText() + * + * Sets the text for the specified control. + * + * @param rxID The resource ID of the control, may be numeric or symbolic. + * @param text The text to be set. + * + * @return 0 for success, -1 for an incorrect resource ID, 1 for other errors. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod3(RexxObjectPtr, pbdlg_setControlText, RexxObjectPtr, rxID, CSTRING, text, CSELF, pCSelf) +{ + oodResetSysErrCode(context->threadContext); + + pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + RexxObjectPtr result = TheOneObj; + + uint32_t id; + if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) + { + oodSetSysErrCode(context->threadContext, ERROR_INVALID_WINDOW_HANDLE); + result = TheNegativeOneObj; + } + else + { + HWND hCtrl = GetDlgItem(pcpbd->hDlg, id); + if ( hCtrl == NULL ) + { + oodSetSysErrCode(context->threadContext); + } + else + { + if ( SetWindowText(hCtrl, text) == 0 ) + { + oodSetSysErrCode(context->threadContext); + } + else + { + result = TheZeroObj; + } + } + } + return result; +} + +/** PlainBaseDialog::getControlHandle() + * * Gets the window handle of a dialog control. * * @param rxID The resource ID of the control, which may be numeric or @@ -1984,14 +2113,18 @@ * * @return The window handle of the specified dialog control on success. -1 if * the ID can not be resolved. A null handle there is no such control. + * + * @note Sets the .SystemErrorCode. */ -RexxMethod3(RexxObjectPtr, pbdlg_getItem, RexxObjectPtr, rxID, OPTIONAL_RexxStringObject, _hDlg, CSELF, pCSelf) +RexxMethod3(RexxObjectPtr, pbdlg_getControlHandle, RexxObjectPtr, rxID, OPTIONAL_RexxStringObject, _hDlg, CSELF, pCSelf) { + oodResetSysErrCode(context->threadContext); pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; uint32_t id; if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) { + oodSetSysErrCode(context->threadContext, ERROR_INVALID_WINDOW_HANDLE); return TheNegativeOneObj; } @@ -2004,7 +2137,13 @@ { hDlg = (HWND)string2pointer(context, _hDlg); } - return pointer2string(context, GetDlgItem(hDlg, id)); + + HWND hCtrl = GetDlgItem(hDlg, id); + if ( hCtrl == NULL ) + { + oodSetSysErrCode(context->threadContext); + } + return pointer2string(context, hCtrl); } RexxMethod1(int32_t, pbdlg_getControlID, CSTRING, hwnd) Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2009-10-11 17:32:25 UTC (rev 5248) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2009-10-11 20:11:22 UTC (rev 5249) @@ -231,7 +231,11 @@ REXX_METHOD_PROTOTYPE(pbdlg_get); REXX_METHOD_PROTOTYPE(pbdlg_isDialogActive); REXX_METHOD_PROTOTYPE(pbdlg_stopIt); -REXX_METHOD_PROTOTYPE(pbdlg_getItem); +REXX_METHOD_PROTOTYPE(pbdlg_getControlHandle); +REXX_METHOD_PROTOTYPE(pbdlg_getWindowText); +REXX_METHOD_PROTOTYPE(pbdlg_setWindowText); +REXX_METHOD_PROTOTYPE(pbdlg_getControlText); +REXX_METHOD_PROTOTYPE(pbdlg_setControlText); REXX_METHOD_PROTOTYPE(pbdlg_getControlID); REXX_METHOD_PROTOTYPE(pbdlg_doMinMax); REXX_METHOD_PROTOTYPE(pbdlg_setTabGroup); @@ -622,7 +626,11 @@ REXX_METHOD(pbdlg_putDlgDataInStem_pvt, pbdlg_putDlgDataInStem_pvt), REXX_METHOD(plbdlg_getControlData, plbdlg_getControlData), REXX_METHOD(pbdlg_setControlData, pbdlg_setControlData), - REXX_METHOD(pbdlg_getItem, pbdlg_getItem), + REXX_METHOD(pbdlg_getControlHandle, pbdlg_getControlHandle), + REXX_METHOD(pbdlg_getWindowText, pbdlg_getWindowText), + REXX_METHOD(pbdlg_setWindowText, pbdlg_setWindowText), + REXX_METHOD(pbdlg_getControlText, pbdlg_getControlText), + REXX_METHOD(pbdlg_setControlText, pbdlg_setControlText), REXX_METHOD(pbdlg_getControlID, pbdlg_getControlID), REXX_METHOD(pbdlg_doMinMax, pbdlg_doMinMax), REXX_METHOD(pbdlg_setTabGroup, pbdlg_setTabGroup), Modified: main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2009-10-11 17:32:25 UTC (rev 5248) +++ main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2009-10-11 20:11:22 UTC (rev 5249) @@ -63,19 +63,6 @@ CHECKARGL(1); - if (!strcmp(argv[0].strptr,"TXT")) /* get the window text/title */ - { - CHECKARG(2); - hW = GET_HWND(argv[1].strptr); - if (hW) - { - retstr->strlength = GetWindowText(hW, retstr->strptr, 255); - return 0; - } - retstr->strlength = 0; - return 0; - } - else if (!strcmp(argv[0].strptr,"ENABLE")) /* enable/disable the window */ { ULONG st; @@ -97,17 +84,8 @@ } RETVAL(st) } - else - if (!strcmp(argv[0].strptr,"SETTXT")) /* set the window text/title */ + else if (!strcmp(argv[0].strptr,"SETFOC")) { - CHECKARG(3); - - hW = GET_HWND(argv[1].strptr); - RETC(!SetWindowText(hW, argv[2].strptr)) - } - else - if (!strcmp(argv[0].strptr,"SETFOC")) - { CHAR qualifier = 'C'; LRESULT result; HWND hDlg, hNextFocus; @@ -155,8 +133,7 @@ else return 0; /* retstr has handle of control that previously had the focus */ } - else - if (!strcmp(argv[0].strptr,"GETFOC")) + else if (!strcmp(argv[0].strptr,"GETFOC")) { CHECKARG(2); @@ -166,8 +143,7 @@ getCurrentFocus(hW, retstr); return 0; } - else - if (!strcmp(argv[0].strptr,"TOP")) /* put window to the foreground */ + else if (!strcmp(argv[0].strptr,"TOP")) /* put window to the foreground */ { CHECKARG(2); hW = GetForegroundWindow(); @@ -178,40 +154,11 @@ else RETVAL(0) /* indicate failure */ } - else - if (!strcmp(argv[0].strptr,"FG")) /* get foreground window */ + else if (!strcmp(argv[0].strptr,"FG")) /* get foreground window */ { RETHANDLE(GetForegroundWindow()) } - else - if (!strcmp(argv[0].strptr,"RECT")) /* get the window pos and size */ /* same as WindoRect("Get",hw) but in plain */ - { - RECT r; - CHECKARG(2); - retstr->strlength = 0; - - hW = GET_HWND(argv[1]); - if (hW) - { - if (!GetWindowRect(hW, &r)) return 0; - sprintf(retstr->strptr, "%d %d %d %d", r.left, r.top, r.right, r.bottom); - retstr->strlength = strlen(retstr->strptr); - } - return 0; - } - else - if (!strcmp(argv[0].strptr,"ID")) /* get the window id */ - { - CHECKARG(2); - hW = GET_HWND(argv[1]); - if (hW) - { - RETVAL((ULONG)GetWindowLong(hW, GWL_ID)) - } - RETC(0); - } - else - if (!strcmp(argv[0].strptr,"CAP")) /* get/set/release the mouse capture */ + else if (!strcmp(argv[0].strptr,"CAP")) /* get/set/release the mouse capture */ { /* capture must be handled by window thread, therefore sendmessage is used */ CHECKARG(3); hW = GET_HWND(argv[1]); @@ -230,8 +177,7 @@ } RETERR } - else - if (!strcmp(argv[0].strptr,"CURSOR")) /* get/set the mouse cursor */ + else if (!strcmp(argv[0].strptr,"CURSOR")) /* get/set the mouse cursor */ { if (argc == 1) { @@ -275,8 +221,7 @@ } RETERR } - else - if (!strcmp(argv[0].strptr,"KSTAT")) /* key state and mouse buttons*/ + else if (!strcmp(argv[0].strptr,"KSTAT")) /* key state and mouse buttons*/ { /* keystate must be handled by window thread, therefore sendmessage is used */ CHECKARG(3); hW = GET_HWND(argv[1]); @@ -292,8 +237,7 @@ } RETC(0) } - else - if (!strcmp(argv[0].strptr,"COORD")) /* screen to client and vice versa */ + else if (!strcmp(argv[0].strptr,"COORD")) /* screen to client and vice versa */ { CHECKARG(5); hW = GET_HWND(argv[1]); Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-10-11 17:32:25 UTC (rev 5248) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-10-11 20:11:22 UTC (rev 5249) @@ -425,10 +425,13 @@ ::method get unguarded external "LIBRARY oodialog pbdlg_get" ::method getSelf unguarded external "LIBRARY oodialog pbdlg_getDlgHandle" -::method getItem unguarded external "LIBRARY oodialog pbdlg_getItem" --- TODO getItem() could be deprecated and forward to getControl(). getControl would return --- a .Pointer; getItem() could check for a null pointer and return 0 in its place. +-- TODO getItem() could be deprecated and forward to getControlHandle(). getControl would return +-- a .Pointer; getItem() could check for a null pointer and return 0 in its place. Also need to +-- deal with -1 for bad resource ID, although the return for getItem is not documented as returning +-- -1. +::method getControlHandle unguarded external "LIBRARY oodialog pbdlg_getControlHandle" +::method getItem unguarded external "LIBRARY oodialog pbdlg_getControlHandle" ::method getControlID unguarded external "LIBRARY oodialog pbdlg_getControlID" @@ -457,21 +460,11 @@ ::method EnsureVisible unguarded return SendWinMsg("ANY", self~dlgHandle, "0x0402", 0, 0) - /* This method changes the title of a window */ +::method getWindowText unguarded external "LIBRARY oodialog pbdlg_getWindowText" +::method setWindowText unguarded external "LIBRARY oodialog pbdlg_setWindowText" +::method getControlText unguarded external "LIBRARY oodialog pbdlg_getControlText" +::method setControlText unguarded external "LIBRARY oodialog pbdlg_setControlText" -::method SetWindowTitle unguarded - use arg hwnd, text - return Wnd_Desktop("SETTXT", hwnd, text) - -::method WindowTitle unguarded - use arg handle - return Wnd_Desktop("TXT", handle) - - /* This method returns the title of the item 'id' */ -::method ItemTitle unguarded - use arg id - return Wnd_Desktop("TXT", self~getItem(id)) - /* The following methods 'connect' a Windows dialog control with a 'data' attribute of the Rexx * dialog object. For each dialog control an attribute of the dialog object is created and an * entry is added to the data table to 'connect' the control and the attribute. When auto detection @@ -867,7 +860,6 @@ end - /* This method will clear all pending dialog messages */ ::method ClearMessages unguarded protected @@ -916,19 +908,6 @@ use arg hwnd return WndShow_Pos("S",hwnd, "NORMAL", self~adm) - /* resize a dialog including border */ -::method Resize unguarded - use arg width, hight, showOptions - if arg(3,"o") = 1 then showOptions = ""; else showOptions = showOptions~translate - parse value Wnd_Desktop("RECT", self~hwnd) with x y cx cy - /* diffsx and diffsy are needed for the title and the frame */ - diffsx = cx - x - (self~sizeX * self~factorX) - diffsy = cy - y - (self~sizeY * self~factorY) - self~sizeX = width - self~sizeY = hight - return WndShow_Pos("P", self~dlgHandle, 0, 0, width * self~factorX + diffsx,, - hight* self~factorY + diffsy,"NOMOVE "||showOptions ) - ::method FocusItem unguarded use arg id return SendWinMsg("ANY", self~dlgHandle, "0x0028", self~getItem(id), 1) @@ -941,10 +920,6 @@ ::method getTextSizeDlg unguarded external "LIBRARY oodialog pbdlg_getTextSizeDlg" -::method getTextSize unguarded - forward message "getTextSizeDlg" continue - return result~width result~height - ::method setTabStop unguarded external "LIBRARY oodialog pbdlg_setTabGroup" ::method setGroup unguarded external "LIBRARY oodialog pbdlg_setTabGroup" @@ -1055,3 +1030,15 @@ ::method setAttrib unguarded forward message 'setControlDataAttribute' +::method setWindowTitle unguarded + forward message 'setWindowText' +::method windowTitle unguarded + forward message 'getWindowText' +::method ItemTitle unguarded + forward message 'getControlText' + + +::method getTextSize unguarded + forward message "getTextSizeDlg" continue + return result~width result~height + Modified: main/trunk/extensions/platform/windows/oodialog/resdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/resdlg.cls 2009-10-11 17:32:25 UTC (rev 5248) +++ main/trunk/extensions/platform/windows/oodialog/resdlg.cls 2009-10-11 20:11:22 UTC (rev 5249) @@ -82,11 +82,8 @@ if self~autoDetect then do ids = self~getDataTableIDs do id over ids - hnd = self~getItem(id) - if (hnd \= 0) then do - txt = Wnd_Desktop("TXT",hnd) - self~addAttribute(id, txt) - end + text = self~getControlText(id) + self~addAttribute(id, txt) end end self~initDialog This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |