From: <mie...@us...> - 2009-10-17 15:11:13
|
Revision: 5266 http://oorexx.svn.sourceforge.net/oorexx/?rev=5266&view=rev Author: miesfeld Date: 2009-10-17 15:11:06 +0000 (Sat, 17 Oct 2009) Log Message: ----------- Finish the conversion of Wnd_Desktop() to the C++ API. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/basedlg.cls main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp main/trunk/extensions/platform/windows/oodialog/oodControl.cpp main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oodUser.cpp main/trunk/extensions/platform/windows/oodialog/oodialog.mak main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-10-17 15:11:06 UTC (rev 5266) @@ -79,22 +79,19 @@ else return SetBackground(self~oDlg~adm, "COL", self~id, colorbk, colorfg, "SYS") /* set both, background and foreground color */ -::method assignFocus - return SendWinMsg("ANY",self~hDlg, "0x0028", self~hwnd, 1) - ::method getFocus unguarded - return self~oDlg~getFocus + forward to (self~oDlg) ::method setFocus unguarded - use arg hwnd - return Wnd_Desktop("SETFOC", self~hDlg, hwnd) + forward to (self~oDlg) ::method tabToNext unguarded - return Wnd_Desktop("SETFOC", self~hDlg, 0, "N") + forward to (self~oDlg) ::method tabToPrevious unguarded - return Wnd_Desktop("SETFOC", self~hDlg, 1, "P") + forward to (self~oDlg) +::method assignFocus external "LIBRARY oodialog dlgctrl_assignFocus" ::method tabStop unguarded external "LIBRARY oodialog dlgctrl_tabGroup" ::method group unguarded external "LIBRARY oodialog dlgctrl_tabGroup" ::method redrawRect unguarded external "LIBRARY oodialog dlgctrl_redrawRect" @@ -110,18 +107,17 @@ --self~oDlg~setControlData(self~Id, data, self~hDlg) self~oDlg~setControlData(self~Id, data) -::method captureMouse - return Wnd_Desktop("CAP", self~hDlg, self~hwnd) ::method getMouseCapture - return Wnd_Desktop("CAP", self~hDlg, "G") + forward to (self~oDlg) ::method releaseMouseCapture - return Wnd_Desktop("CAP", self~hDlg, "R") + forward to (self~oDlg) -::method IsMouseButtonDown +::method isMouseButtonDown forward to (self~oDlg) +::method captureMouse external "LIBRARY oodialog dlgctrl_captureMouse" ::method connectFKeyPress unguarded external "LIBRARY oodialog dlgctrl_connectFKeyPress" ::method connectKeyPress unguarded external "LIBRARY oodialog dlgctrl_connectKeyPress" ::method disconnectKeyPress unguarded external "LIBRARY oodialog dlgctrl_disconnectKeyPress" Modified: main/trunk/extensions/platform/windows/oodialog/basedlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2009-10-17 15:11:06 UTC (rev 5266) @@ -306,7 +306,7 @@ ::method newDateTimePicker unguarded external "LIBRARY oodialog baseDlg_newControl" ::method putControl private unguarded external "LIBRARY oodialog baseDlg_putControl_pvt" -::method test unguarded external "LIBRARY oodialog baseDlg_test" +::method baseDlgTest unguarded external "LIBRARY oodialog baseDlg_test" -- TODO needs doc ::method getMenuBar Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-10-17 15:11:06 UTC (rev 5266) @@ -42,12 +42,12 @@ * Dialog class extensions. */ -::class 'DialogExtensions' public MIXINCLASS object +::class 'DialogExtensions' public mixinclass Object /* This method will do the same as execute but it will do an asynchronous */ /* dispatch of messages */ -::method ExecuteAsync unguarded +::method executeAsync unguarded use arg sleeptime, sh, icon = 0, nomodal if sleeptime~Datatype('N') = 0 then sleeptime = 10 if arg(2,'o') = 1 then sh = "DEFAULT" @@ -70,7 +70,7 @@ /* This method ends the asynchronous execution of a dialog */ -::method EndAsyncExecution unguarded +::method endAsyncExecution unguarded do while self~finished = 0 call msSleep 20 end @@ -104,7 +104,7 @@ end /* Run a nonmodal dialog */ -::method Popup +::method popup use arg sh, sleeptime, icon = 0 if arg(1,'o') = 1 then sh = "DEFAULT" if sleeptime~Datatype('N') = 0 then sleeptime = 10 @@ -112,7 +112,7 @@ self~start("execute", sh, icon, sleeptime, "NOTMODAL") -::method PopupAsChild +::method popupAsChild use arg parent, sh, sleeptime, icon = 0 if arg(1,'o') = 1 | parent = 0 then do @@ -128,13 +128,16 @@ self~start("execute", sh, icon, sleeptime, "NOTMODAL") -::method SendMessageToItem unguarded +::method sendMessageToItem unguarded parse arg id,a2,a3,a4 if id~DataType("N") = 0 then id = self~resolveSymbolicId(id) if id = -1 then return -1 return SendWinMsg("DLG",self~dlgHandle,id,a2,a3,a4) +::method peekDialogMessage unguarded + return getDlgMsg(self~adm, .true) + /* The following Methods are to set/get the behaviour of/from a scrollbar */ /* You can use scrollbars to connect them with numerical entry fields */ @@ -607,7 +610,7 @@ else return HandleDC_Obj("B", self~adm, color, brushSpecifier) /* brushSpecifier must be filename or resource ID */ -::method SetItemSysColor +::method setControlSysColor use arg id, colorbk, colorfg if \ id~DataType("W") then id = self~resolveSymbolicId(id) if id = -1 then return -1 @@ -616,7 +619,7 @@ else return SetBackground(self~adm, "COL", id, colorbk, colorfg, "SYS") -::method SetItemColor +::method setControlColor use arg id, colorbk, colorfg if \ id~DataType("W") then id = self~resolveSymbolicId(id) if id = -1 then return -1 @@ -625,7 +628,13 @@ else return SetBackground(self~adm, "COL", id, colorbk, colorfg) +::method setItemColor + forward message "setControlColor" +::method setItemSysColor + forward message "setControlSysColor" + + /* This method scrolls 'text' in the button */ ::method ScrollInButton unguarded @@ -732,29 +741,9 @@ hwnd = self~getItem(id) return self~FreeWindowDC(hwnd, dc) -/******************************************************************************/ -/* New extensions */ - -::method PeekDialogMessage unguarded - return getDlgMsg(self~adm, .true) - -::method SetFocus unguarded - use arg hwnd - return Wnd_Desktop("SETFOC", self~dlgHandle, hwnd) - -::method SetFocusToWindow unguarded - use arg hwnd - return Wnd_Desktop("SETFOC", self~dlgHandle, hwnd, 'F') - -::method GetMouseCapture - return Wnd_Desktop("CAP", self~dlgHandle, "G") - -::method CaptureMouse - return Wnd_Desktop("CAP", self~dlgHandle, self~dlgHandle) - -::method ReleaseMouseCapture - return Wnd_Desktop("CAP", self~dlgHandle, "R") - +::method CaptureMouse external "LIBRARY oodialog dlgext_captureMouse" +::method getMouseCapture external "LIBRARY oodialog dlgext_mouseCapture" +::method releaseMouseCapture external "LIBRARY oodialog dlgext_mouseCapture" ::method isMouseButtonDown external "LIBRARY oodialog dlgext_isMouseButtonDown" Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-10-17 15:11:06 UTC (rev 5266) @@ -1019,7 +1019,7 @@ ::method addCheckGroup forward message "CREATECHECKBOXGROUP" ::method addCheckBoxStem - forward message "CREATECHEKCBOXSTEM" + forward message "CREATECHECKBOXSTEM" ::method addRadioGroup forward message "CREATERADIOBUTTONGROUP" ::method addRadioStem Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -155,15 +155,23 @@ case WM_COMMAND: - switch( LOWORD(wParam) ) { - case IDOK: - if (!HIWORD(wParam)) addressedTo->LeaveDialog = 1; /* Notify code must be 0 */ - return TRUE; - break; - case IDCANCEL: - if (!HIWORD(wParam)) addressedTo->LeaveDialog = 2; /* Notify code must be 0 */ - return TRUE; - break; + switch( LOWORD(wParam) ) + { + // For both IDOK and IDCANCEL, the notification code (the high + // word value,) must be 0. + case IDOK: + if ( HIWORD(wParam) == 0 ) + { + addressedTo->LeaveDialog = 1; + } + return TRUE; + + case IDCANCEL: + if ( HIWORD(wParam) == 0 ) + { + addressedTo->LeaveDialog = 2; + } + return TRUE; } break; @@ -199,17 +207,35 @@ hW = CreateDialogIndirectParam(MyInstance, (DLGTEMPLATE *)lParam, hDlg, (DLGPROC)RexxDlgProc, addressedTo->Use3DControls); ReplyMessage((LRESULT)hW); return (LRESULT)hW; + case WM_USER_INTERRUPTSCROLL: addressedTo->StopScroll = wParam; return (TRUE); + case WM_USER_GETFOCUS: ReplyMessage((LRESULT)GetFocus()); return (TRUE); + case WM_USER_GETSETCAPTURE: - if (!wParam) ReplyMessage((LRESULT)GetCapture()); - else if (wParam == 2) ReplyMessage((LRESULT)ReleaseCapture()); - else ReplyMessage((LRESULT)SetCapture((HWND)lParam)); + if ( wParam == 0 ) + { + ReplyMessage((LRESULT)GetCapture()); + } + else if ( wParam == 2 ) + { + uint32_t rc = 0; + if ( ReleaseCapture == 0 ) + { + rc = GetLastError(); + } + ReplyMessage((LRESULT)rc); + } + else + { + ReplyMessage((LRESULT)SetCapture((HWND)lParam)); + } return (TRUE); + case WM_USER_GETKEYSTATE: ReplyMessage((LRESULT)GetAsyncKeyState((int)wParam)); return (TRUE); @@ -1502,6 +1528,70 @@ return hwnd; } + +/** WindowBase::screen2client() + * WindowBase::client2screen() + * + * screen2client() converts the screen coordinates of the specified point on + * the screen to client-area coordinates of this window. + * + * This method uses the screen coordinates given in the .Point object to + * compute client-area coordinates. It then replaces the screen coordinates + * with the client coordinates. The new coordinates are relative to the + * upper-left corner of this window's client area. + * + * + * client2screen() converts the client-area coordinates of the specified point + * to screen coordinates. + * + * This method uses the client-area coordinates given in the .Point object to + * compute screen coordinates. It then replaces the client-area coordinates + * with the screen coordinates. The new coordinates are relative to the + * upper-left corner of the screen. + * + * @param pt [in/out] On entry, the coordinates to be converted, on exit the + * converted coordinates. + * + * @return True on success, false on failure. The .SystemErrorCode should + * contain the reason for failure. + * + * @note Sets the .SystemErrorCode. + * + */ +RexxMethod4(logical_t, wb_screenClient, RexxObjectPtr, pt, NAME, method, OSELF, self, CSELF, pCSelf) +{ + oodResetSysErrCode(context->threadContext); + BOOL success = FALSE; + + HWND hwnd = getWBWindow(pCSelf); + if ( hwnd == NULL ) + { + noWindowsDialogException(context, self); + goto done_out; + } + + POINT *p = rxGetPoint(context, pt, 1); + if ( p != NULL ) + { + if ( *method == 'S' ) + { + success = ScreenToClient(hwnd, p); + } + else + { + success = ClientToScreen(hwnd, p); + } + + if ( ! success ) + { + oodSetSysErrCode(context->threadContext); + } + } + +done_out: + return success; +} + /** WindowBase::getWindowLong() [private] * * Retrieves information about this window. Specifically, the information @@ -1643,7 +1733,7 @@ { oodResetSysErrCode(c->threadContext); - if ( hwnd == NULL ) + if ( hwnd == NULL || ! IsWindow(hwnd) ) { oodSetSysErrCode(c->threadContext, ERROR_INVALID_WINDOW_HANDLE); return TheZeroObj; @@ -1661,7 +1751,7 @@ rc = ERROR_NOT_SUPPORTED; } oodSetSysErrCode(c->threadContext, rc); - hwndPrevious = NULL; + return TheZeroObj; } } return pointer2string(c, hwndPrevious); @@ -2299,6 +2389,99 @@ return oodGetFocus(context, getPBDWindow(pCSelf)); } +/** PlainBaseDialog::setFocus() + * + * Sets the focus to the dialog control specified. + * + * @param hwnd The window handle of the dialog control to recieve the focus. + * + * PlainBaseDialog::setFocusToWindow() + * + * Sets the focus to the dialog or other top-level window specified. + * + * @param hwnd The window handle of the dialog or other top-level window that + * will be brought to the foreground. + * + * @return On success, the window handle of the dialog control that previously + * had the focus. Otherwise, 0, if the focus was changed, but the + * previous focus could not be determined, and -1 on error. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod3(RexxObjectPtr, pbdlg_setFocus, RexxStringObject, hwnd, NAME, method, CSELF, pCSelf) +{ + oodResetSysErrCode(context->threadContext); + + HWND hDlg = getPBDWindow(pCSelf); + if ( hDlg == NULL ) + { + noWindowsDialogException(context, ((pCPlainBaseDialog)pCSelf)->rexxSelf); + return TheNegativeOneObj; + } + + HWND focusNext = (HWND)string2pointer(context, hwnd); + if ( ! IsWindow(focusNext) ) + { + oodSetSysErrCode(context->threadContext, ERROR_INVALID_WINDOW_HANDLE); + return TheNegativeOneObj; + } + + RexxObjectPtr previousFocus = oodGetFocus(context, hDlg); + if ( strlen(method) > 7 ) + { + if ( oodSetForegroundWindow(context, focusNext) == TheZeroObj ) + { + return TheNegativeOneObj; + } + } + else + { + SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)focusNext, TRUE); + } + return previousFocus; +} + +/** PlainBaseDialog::TabToNext() + * + * Sets the focus to the next tab stop dialog control in the dialog and returns + * the window handle of the dialog control that currently has the focus. + * + * PlainBaseDialog::TabToPrevious() + * + * Sets the focus to the previous tab stop dialog control in the dialog and + * returns the window handle of the dialog control that currently has the + * focus. + * + * @return On success, the window handle of the dialog control that previously + * had the focus. Otherwise, 0, if the focus was changed, but the + * previous focus could not be determined, and -1 on error. + * + * @note Sets the .SystemErrorCode, but there is nothing that would change it + * from 0. + */ +RexxMethod2(RexxObjectPtr, pbdlg_tabTo, NAME, method, CSELF, pCSelf) +{ + oodResetSysErrCode(context->threadContext); + + HWND hDlg = getPBDWindow(pCSelf); + if ( hDlg == NULL ) + { + noWindowsDialogException(context, ((pCPlainBaseDialog)pCSelf)->rexxSelf); + return TheNegativeOneObj; + } + + RexxObjectPtr previousFocus = oodGetFocus(context, hDlg); + if ( method[5] == 'N' ) + { + SendMessage(hDlg, WM_NEXTDLGCTL, 0, FALSE); + } + else + { + SendMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE); + } + return previousFocus; +} + /** PlainBaseDialog::getControlText() * * Gets the text of the specified control. @@ -2360,6 +2543,32 @@ return result; } + +/** PlainBaseDialog::focusControl + * + * Sets the focus to the specified control in this dialog. + * + * @param rxID The resource ID of the control, may be numeric or symbolic. + * + * @return 0 on success, -1 if there is a problem identifying the dialog + * control. + * + * @note Sets the .SystemErrorCode. + */ +RexxMethod2(RexxObjectPtr, pbdlg_focusControl, RexxObjectPtr, rxID, CSELF, pCSelf) +{ + HWND hCtrl = getPBDControlWindow(context, (pCPlainBaseDialog)pCSelf, rxID); + if ( hCtrl != NULL ) + { + SendMessage(((pCPlainBaseDialog)pCSelf)->hDlg, WM_NEXTDLGCTL, (WPARAM)hCtrl, TRUE); + return TheZeroObj; + } + else + { + return TheNegativeOneObj; + } +} + /** PlainBaseDialog::enableControl() * PlainBaseDialog::disableControl() * @@ -2389,10 +2598,6 @@ } result = EnableWindow(hCtrl, enable) == 0 ? TheZeroObj : TheOneObj; } - else - { - result = TheNegativeOneObj; - } return result; } @@ -2469,27 +2674,27 @@ */ RexxMethod2(RexxObjectPtr, pbdlg_doMinMax, NAME, method, CSELF, pCSelf) { - pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; - if ( pcpbd->hDlg == NULL ) + HWND hDlg = getPBDWindow(pCSelf); + if ( hDlg == NULL ) { - noWindowsDialogException(context, pcpbd->rexxSelf); + noWindowsDialogException(context, ((pCPlainBaseDialog)pCSelf)->rexxSelf); return TheFalseObj; } if ( *method == 'M' ) { uint32_t flag = (method[1] == 'I' ? SW_SHOWMINIMIZED : SW_SHOWMAXIMIZED); - return (ShowWindow(pcpbd->hDlg, flag) ? TheZeroObj : TheOneObj); + return (ShowWindow(hDlg, flag) ? TheZeroObj : TheOneObj); } if ( method[3] == 'A' ) { // Zoomed is Maximized. - return (IsZoomed(pcpbd->hDlg) ? TheTrueObj : TheFalseObj); + return (IsZoomed(hDlg) ? TheTrueObj : TheFalseObj); } // Iconic is Minimized. - return (IsIconic(pcpbd->hDlg) ? TheTrueObj : TheFalseObj); + return (IsIconic(hDlg) ? TheTrueObj : TheFalseObj); } Modified: main/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodBaseDialog.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -219,15 +219,23 @@ return TheNilObj; } -RexxMethod3(RexxObjectPtr, baseDlg_test, int, x, CSTRING, y, CSELF, pCSelf) +RexxMethod1(RexxObjectPtr, baseDlg_test, CSELF, pCSelf) { RexxMethodContext *c = context; - /* - size_t count = c->ArrayItems(args); - size_t size = c->ArraySize(args); - printf("Arg count=%d size=%d\n", count, size); - */ + pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + DIALOGADMIN *dlgAdm = pcpbd->dlgAdm; + + MESSAGETABLEENTRY *m = dlgAdm->MsgTab; + + for ( size_t i = 0; i < dlgAdm->MT_size; i++ ) + { + printf("method: %s msg=0x%08x msgF=0x%08x\n", m[i].rexxProgram, m[i].msg, m[i].filterM); + printf("wp=0x%016I64x wpF=0x%016I64x lp=0x%016I64x lpF=0x%016I64x\n", + m[i].wParam, m[i].filterP, m[i].lParam, m[i].filterL); + + } + return TheTrueObj; } Modified: main/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -559,6 +559,12 @@ } return NULLOBJECT; } +RexxMethod1(RexxObjectPtr, dlgctrl_assignFocus, CSELF, pCSelf) +{ + SendMessage(((pCDialogControl)pCSelf)->hDlg, WM_NEXTDLGCTL, (WPARAM)((pCDialogControl)pCSelf)->hCtrl, TRUE); + return TheZeroObj; +} + RexxMethod4(int32_t, dlgctrl_connectKeyPress, CSTRING, methodName, CSTRING, keys, OPTIONAL_CSTRING, filter, CSELF, pCSelf) { @@ -850,6 +856,28 @@ } +/** DialogControl::captureMouse + * + * Sets the mouse capture to this dialog control. captureMouse() captures + * mouse input either when the mouse is over the control, or when the mouse + * button was pressed while the mouse was over the control and the button is + * still down. Only one window at a time can capture the mouse. + * + * If the mouse cursor is over a window created by another thread, the system + * will direct mouse input to the specified window only if a mouse button is + * down. + * + * @return The window handle of the window that previously had captured the + * mouse, or the null handle if there was no such window. + */ +RexxMethod1(RexxObjectPtr, dlgctrl_captureMouse, CSELF, pCSelf) +{ + pCDialogControl pcdc = (pCDialogControl)pCSelf; + HWND oldCapture = (HWND)SendMessage(pcdc->hDlg, WM_USER_GETSETCAPTURE, 1, (LPARAM)pcdc->hCtrl); + return pointer2string(context, oldCapture); +} + + /** * Methods for the Edit class. */ Modified: main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -1114,7 +1114,84 @@ } +/** DialogExtensions::getMouseCapture() + * + * Retrieves a handle to the window (if any) that has captured the mouse. + * + * Only one window at a time can capture the mouse; this window receives mouse + * input whether or not the cursor is within its borders. + * + * @return A NULL return value means the current thread has not captured the + * mouse. However, it is possible that another thread or process has + * captured the mouse. + * + * DialogExtensions::releaseMouseCapture() + * + * Releases the mouse capture from a window in the current thread and restores + * normal mouse input processing. + * + * @return 0 on success, 1 on error. + * + * @note Sets the .SystemErrorCode, but that only has meaning for + * releaseMouseCapture(). + * + * @remarks GetCapture() and ReleaseCapture() need to run on the same thread + * as the dialog's message loop. So we use SendMessage with one of + * the custom window messages. + * + */ +RexxMethod2(RexxObjectPtr, dlgext_mouseCapture, NAME, method, OSELF, self) +{ + RexxObjectPtr result = NULLOBJECT; + pCPlainBaseDialog pcpbd = dlgExtSetup(context, self); + if ( pcpbd != NULL ) + { + if ( *method == 'G' ) + { + HWND hwnd = (HWND)SendMessage(pcpbd->hDlg, WM_USER_GETSETCAPTURE, 0, 0); + result = pointer2string(context, hwnd); + } + else + { + RexxMethodContext *c = context; + uint32_t rc = (uint32_t)SendMessage(pcpbd->hDlg, WM_USER_GETSETCAPTURE, 2,0); + result = (rc == 0 ? TheZeroObj : c->UnsignedInt32(rc)); + } + } + return result; +} + +/** DialogExtensions::captureMouse + * + * Sets the mouse capture to this dialog window. captureMouse() captures mouse + * input either when the mouse is over the dialog, or when the mouse button was + * pressed while the mouse was over the dialog and the button is still down. + * Only one window at a time can capture the mouse. + * + * If the mouse cursor is over a window created by another thread, the system + * will direct mouse input to the specified window only if a mouse button is + * down. + * + * @return The window handle of the window that previously had captured the + * mouse, or 0 if there was no such window. + * + * @note Sets the .SystemErrorCode, + */ +RexxMethod1(RexxObjectPtr, dlgext_captureMouse, OSELF, self) +{ + RexxObjectPtr result = TheZeroObj; + + pCPlainBaseDialog pcpbd = dlgExtSetup(context, self); + if ( pcpbd != NULL ) + { + HWND oldCapture = (HWND)SendMessage(pcpbd->hDlg, WM_USER_GETSETCAPTURE, 1, (LPARAM)pcpbd->hDlg); + result = pointer2string(context, oldCapture); + } + return result; +} + + /** DialogExtensions::isMouseButtonDown() * * Determines if one of the mouse buttons is down. Modified: main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodMessaging.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -62,7 +62,12 @@ strcat(Qptr, msg); strcat(Qptr, ";"); return 1; - } else return 0; + } + else + { + printf("MESSAGE QUEUE OVERFLOW\n"); + } + return 0; } Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -95,7 +95,6 @@ REXX_CLASSIC_ROUTINE_PROTOTYPE(SendWinMsg); -REXX_CLASSIC_ROUTINE_PROTOTYPE(Wnd_Desktop); REXX_CLASSIC_ROUTINE_PROTOTYPE(HandleScrollBar); REXX_CLASSIC_ROUTINE_PROTOTYPE(BmpButton); REXX_CLASSIC_ROUTINE_PROTOTYPE(DCDraw); @@ -126,7 +125,6 @@ RexxRoutineEntry oodialog_functions[] = { REXX_CLASSIC_ROUTINE(SendWinMsg, SendWinMsg), - REXX_CLASSIC_ROUTINE(Wnd_Desktop, Wnd_Desktop), REXX_CLASSIC_ROUTINE(HandleScrollBar, HandleScrollBar), REXX_CLASSIC_ROUTINE(BmpButton, BmpButton), REXX_CLASSIC_ROUTINE(DCDraw, DCDraw), @@ -203,6 +201,7 @@ REXX_METHOD_PROTOTYPE(wb_clientRect); REXX_METHOD_PROTOTYPE(wb_clear); REXX_METHOD_PROTOTYPE(wb_foreGroundWindow); +REXX_METHOD_PROTOTYPE(wb_screenClient); REXX_METHOD_PROTOTYPE(wb_getWindowLong_pvt); REXX_METHOD_PROTOTYPE(en_init_eventNotification); @@ -233,6 +232,9 @@ REXX_METHOD_PROTOTYPE(pbdlg_show); REXX_METHOD_PROTOTYPE(pbdlg_toTheTop); REXX_METHOD_PROTOTYPE(pbdlg_getFocus); +REXX_METHOD_PROTOTYPE(pbdlg_setFocus); +REXX_METHOD_PROTOTYPE(pbdlg_tabTo); +REXX_METHOD_PROTOTYPE(pbdlg_focusControl); REXX_METHOD_PROTOTYPE(pbdlg_showControl); REXX_METHOD_PROTOTYPE(pbdlg_showWindow); REXX_METHOD_PROTOTYPE(pbdlg_getControlHandle); @@ -266,6 +268,8 @@ REXX_METHOD_PROTOTYPE(dlgext_resizeMoveControl); REXX_METHOD_PROTOTYPE(dlgext_setForgroundWindow); REXX_METHOD_PROTOTYPE(dlgext_drawButton); +REXX_METHOD_PROTOTYPE(dlgext_mouseCapture); +REXX_METHOD_PROTOTYPE(dlgext_captureMouse); REXX_METHOD_PROTOTYPE(dlgext_isMouseButtonDown); REXX_METHOD_PROTOTYPE(baseDlg_init); @@ -375,10 +379,12 @@ REXX_METHOD_PROTOTYPE(dlgctrl_connectFKeyPress); REXX_METHOD_PROTOTYPE(dlgctrl_disconnectKeyPress); REXX_METHOD_PROTOTYPE(dlgctrl_hasKeyPressConnection); +REXX_METHOD_PROTOTYPE(dlgctrl_assignFocus); REXX_METHOD_PROTOTYPE(dlgctrl_tabGroup); REXX_METHOD_PROTOTYPE(dlgctrl_redrawRect); REXX_METHOD_PROTOTYPE(dlgctrl_clearRect); REXX_METHOD_PROTOTYPE(dlgctrl_getTextSizeDlg); +REXX_METHOD_PROTOTYPE(dlgctrl_captureMouse); // Edit REXX_METHOD_PROTOTYPE(e_selection); @@ -616,6 +622,7 @@ REXX_METHOD(wb_clientRect, wb_clientRect), REXX_METHOD(wb_clear, wb_clear), REXX_METHOD(wb_foreGroundWindow, wb_foreGroundWindow), + REXX_METHOD(wb_screenClient, wb_screenClient), REXX_METHOD(wb_getWindowLong_pvt, wb_getWindowLong_pvt), REXX_METHOD(en_init_eventNotification, en_init_eventNotification), @@ -643,6 +650,9 @@ REXX_METHOD(pbdlg_showWindow, pbdlg_showWindow), REXX_METHOD(pbdlg_toTheTop, pbdlg_toTheTop), REXX_METHOD(pbdlg_getFocus, pbdlg_getFocus), + REXX_METHOD(pbdlg_setFocus, pbdlg_setFocus), + REXX_METHOD(pbdlg_tabTo, pbdlg_tabTo), + REXX_METHOD(pbdlg_focusControl, pbdlg_focusControl), REXX_METHOD(pbdlg_showControl, pbdlg_showControl), REXX_METHOD(pbdlg_connect_ControName, pbdlg_connect_ControName), REXX_METHOD(pbdlg_setDlgDataFromStem_pvt, pbdlg_setDlgDataFromStem_pvt), @@ -676,6 +686,8 @@ REXX_METHOD(dlgext_resizeMoveControl, dlgext_resizeMoveControl), REXX_METHOD(dlgext_setForgroundWindow, dlgext_setForgroundWindow), REXX_METHOD(dlgext_drawButton, dlgext_drawButton), + REXX_METHOD(dlgext_mouseCapture, dlgext_mouseCapture), + REXX_METHOD(dlgext_captureMouse, dlgext_captureMouse), REXX_METHOD(dlgext_isMouseButtonDown, dlgext_isMouseButtonDown), REXX_METHOD(baseDlg_init, baseDlg_init), @@ -729,10 +741,12 @@ REXX_METHOD(dlgctrl_connectFKeyPress, dlgctrl_connectFKeyPress), REXX_METHOD(dlgctrl_disconnectKeyPress, dlgctrl_disconnectKeyPress), REXX_METHOD(dlgctrl_hasKeyPressConnection, dlgctrl_hasKeyPressConnection), + REXX_METHOD(dlgctrl_assignFocus, dlgctrl_assignFocus), REXX_METHOD(dlgctrl_tabGroup, dlgctrl_tabGroup), REXX_METHOD(dlgctrl_clearRect, dlgctrl_clearRect), REXX_METHOD(dlgctrl_redrawRect, dlgctrl_redrawRect), REXX_METHOD(dlgctrl_getTextSizeDlg, dlgctrl_getTextSizeDlg), + REXX_METHOD(dlgctrl_captureMouse, dlgctrl_captureMouse), REXX_METHOD(window_init, window_init), REXX_METHOD(window_unInit, window_unInit), Modified: main/trunk/extensions/platform/windows/oodialog/oodUser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodUser.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodUser.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -2009,7 +2009,7 @@ * pointer attribute was not used after it was freed. This attribute is now * set to null when it is freed, making this method redundent. */ -RexxMethod1(RexxObjectPtr, dyndlg_stopDynamic_pvt, CSELF, pCSelf) +RexxMethod2(RexxObjectPtr, dyndlg_stopDynamic_pvt, OPTIONAL_RexxObjectPtr, ignored, CSELF, pCSelf) { pCDynamicDialog pcdd = (pCDynamicDialog)pCSelf; Modified: main/trunk/extensions/platform/windows/oodialog/oodialog.mak =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodialog.mak 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oodialog.mak 2009-10-17 15:11:06 UTC (rev 5266) @@ -51,14 +51,14 @@ SOURCEF= $(OR_OUTDIR)\APICommon.obj $(OR_OUTDIR)\oodBaseDialog.obj $(OR_OUTDIR)\oodCommon.obj $(OR_OUTDIR)\oodControl.obj \ $(OR_OUTDIR)\oodData.obj $(OR_OUTDIR)\oodDeviceGraphics.obj $(OR_OUTDIR)\ooDialog.obj $(OR_OUTDIR)\oodMenu.obj \ $(OR_OUTDIR)\oodMessaging.obj $(OR_OUTDIR)\oodPackageEntry.obj $(OR_OUTDIR)\oodRoutines.obj $(OR_OUTDIR)\oodUser.obj \ - $(OR_OUTDIR)\oodUtilities.obj $(OR_OUTDIR)\oovbmp.obj $(OR_OUTDIR)\oovdeskt.obj $(OR_OUTDIR)\oovother.obj \ + $(OR_OUTDIR)\oodUtilities.obj $(OR_OUTDIR)\oovbmp.obj $(OR_OUTDIR)\oovother.obj \ $(OR_OUTDIR)\oovscrll.obj $(OR_OUTDIR)\oodText.obj $(OR_OUTDIR)\oodialog.res # All Source files that include oodCommon.hpp COMMON_SOURCEF = $(OR_OUTDIR)\oodBaseDialog.obj $(OR_OUTDIR)\oodCommon.obj $(OR_OUTDIR)\oodData.obj \ $(OR_OUTDIR)\oodDeviceGraphics.obj $(OR_OUTDIR)\oodMenu.obj $(OR_OUTDIR)\oodMessaging.obj \ $(OR_OUTDIR)\oodRoutines.obj $(OR_OUTDIR)\oodUser.obj $(OR_OUTDIR)\oodUtilities.obj $(OR_OUTDIR)\oovbmp.obj \ - $(OR_OUTDIR)\oovdeskt.obj $(OR_OUTDIR)\oovother.obj $(OR_OUTDIR)\oovscrll.obj $(OR_OUTDIR)\oodText.obj + $(OR_OUTDIR)\oovother.obj $(OR_OUTDIR)\oovscrll.obj $(OR_OUTDIR)\oodText.obj # All Source files that include APICommon.hpp APICOMMON_SOURCEF = $(OR_OUTDIR)\APICommon.obj $(OR_OUTDIR)\oodBaseDialog.obj $(OR_OUTDIR)\oodCommon.obj \ Modified: main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2009-10-17 15:11:06 UTC (rev 5266) @@ -63,56 +63,7 @@ CHECKARGL(1); - if (!strcmp(argv[0].strptr,"SETFOC")) - { - CHAR qualifier = 'C'; - LRESULT result; - HWND hDlg, hNextFocus; - CHECKARGL(3); - - hDlg = GET_HWND(argv[1].strptr); - if ( ! IsWindow(hDlg) ) - RETVAL(-1) - - /* Get the handle of the window control that had the focus before setting - * the new focus. This will be returned to the caller in retstr. - */ - getCurrentFocus(hDlg, retstr); - - if ( argc > 3 ) - qualifier = argv[3].strptr[0]; - - switch ( qualifier ) - { - case 'F' : /* set window to Foreground like Wnd_Desktop("TOP"..) but returns hwnd of previous control */ - hNextFocus = GET_HWND(argv[2]); - if ( ! IsWindow(hNextFocus) ) - RETVAL(-1) - result = SetForegroundWindow(hNextFocus); - break; - - case 'N' : /* set focus on Next tab stop control */ - result = SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)0, (LPARAM)FALSE); - break; - - case 'P' : /* set focus on Previous tab stop control */ - result = SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)1, (LPARAM)FALSE); - break; - - case 'C' : /* set focus on specified Control */ - default : - hNextFocus = GET_HWND(argv[2]); - if ( ! IsWindow(hNextFocus) ) - RETVAL(-1) - result = SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)hNextFocus, TRUE); - break; - } - if ( ! result ) - RETVAL(-1) /* change retstr to indicate failure */ - else - return 0; /* retstr has handle of control that previously had the focus */ - } - else if (!strcmp(argv[0].strptr,"CAP")) /* get/set/release the mouse capture */ + 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]); Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-10-16 21:24:24 UTC (rev 5265) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-10-17 15:11:06 UTC (rev 5266) @@ -115,47 +115,53 @@ ::method clientRect unguarded external "LIBRARY oodialog wb_clientRect" ::method clear unguarded external "LIBRARY oodialog wb_clear" -::method resize unguarded -- old method, this is not accurate. +::method resize unguarded -- old method, this is not accurate. use strict arg width, height, showOptions = "" p = .Point~new(0, 0) s = .Size~new(trunc(width * self~factorX), trunc(height * self~factorY)) return self~setRect(p, s, "NOMOVE " || showOptions); -::method move unguarded -- old method, this is not accurate. +::method move unguarded -- old method, this is not accurate. use strict arg xPos, yPos, showOptions = "" p = .Point~new(trunc(xPos * self~factorX), trunc(yPos * self~factorY)) s = .Size~new(0, 0) return self~setRect(p, s, "NOSIZE " || showOptions); -::method getSize unguarded -- old method, this is not accurate. +::method getSize unguarded -- old method, this is not accurate. forward message "getRealSize" continue size = result return (size~width % self~factorX) || " " || (size~height % self~factorY) -::method getPos unguarded -- old method, this is not accurate. +::method getPos unguarded -- old method, this is not accurate. forward message "getRealPos" continue p = result return (p~x % self~factorX) || " " || (p~y % self~factorY) -::method getRect unguarded -- old method returns coordinates as a string +::method getRect unguarded -- old method returns coordinates as a string forward message "windowRect" continue rect = result return rect~left rect~top rect~right rect~bottom -::method getClientRect unguarded -- old method returns coordinates as a string +::method getClientRect unguarded -- old method returns coordinates as a string forward message "clientRect" continue rect = result return rect~left rect~top rect~right rect~bottom -::method ForegroundWindow unguarded external "LIBRARY oodialog wb_foreGroundWindow" +::method foregroundWindow unguarded external "LIBRARY oodialog wb_foreGroundWindow" +::method screen2client unguarded external "LIBRARY oodialog wb_screenClient" +::method client2screen unguarded external "LIBRARY oodialog wb_screenClient" -::method ScreenToClient unguarded - use arg x,y - return Wnd_Desktop("COORD", self~hwnd, x, y, "S2C") +::method screenToClient unguarded -- old method returns coordinates as a string + use strict arg x, y + p = .Point~new(x, y) + if self~screen2client(p) then return p.x p.y + else return 0 0 -::method ClientToScreen unguarded - use arg x,y - return Wnd_Desktop("COORD", self~hwnd, x, y, "C2S") +::method clientToScreen unguarded -- old method returns coordinates as a string + use strict arg x, y + p = .Point~new(x, y) + if self~client2screen(p) then return p.x p.y + else return 0 0 ::method unknown unguarded use arg msgname @@ -837,7 +843,7 @@ /* This method will clear all pending dialog messages */ -::method ClearMessages unguarded protected +::method clearMessages unguarded protected if self~adm = 0 then return msg = getDlgMsg(self~adm) do while msg \= "" & self~adm \= 0 @@ -871,16 +877,14 @@ ::method hideItemFast unguarded forward message "hideControlFast" -::method FocusItem unguarded - use arg id - return SendWinMsg("ANY", self~dlgHandle, "0x0028", self~getItem(id), 1) +::method focusItem unguarded + forward message "focusControl" -::method TabToNext unguarded - return Wnd_Desktop("SETFOC", self~dlgHandle, 0, "N") - -::method TabToPrevious unguarded - return Wnd_Desktop("SETFOC", self~dlgHandle, 1, "P") - +::method focusControl unguarded external "LIBRARY oodialog pbdlg_focusControl" +::method setFocusToWindow unguarded external "LIBRARY oodialog pbdlg_setFocus" +::method TabToNext unguarded external "LIBRARY oodialog pbdlg_tabTo" +::method TabToPrevious unguarded external "LIBRARY oodialog pbdlg_tabTo" +::method setFocus unguarded external "LIBRARY oodialog pbdlg_setFocus" ::method getFocus unguarded external "LIBRARY oodialog pbdlg_getFocus" ::method getTextSizeDlg unguarded external "LIBRARY oodialog pbdlg_getTextSizeDlg" ::method setTabStop unguarded external "LIBRARY oodialog pbdlg_setTabGroup" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |