From: <mie...@us...> - 2011-12-02 04:39:22
|
Revision: 7323 http://oorexx.svn.sourceforge.net/oorexx/?rev=7323&view=rev Author: miesfeld Date: 2011-12-02 04:39:15 +0000 (Fri, 02 Dec 2011) Log Message: ----------- ooDialog - clean up the bitmap button implementation, the implementation should be all in DialogExtensions Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/DialogControls.cls main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp Modified: main/trunk/extensions/platform/windows/oodialog/DialogControls.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/DialogControls.cls 2011-12-02 04:39:15 UTC (rev 7323) @@ -349,14 +349,12 @@ ::method getImageList unguarded external "LIBRARY oodialog bc_getImageList" ::method getImage unguarded external "LIBRARY oodialog bc_getImage" ::method setImage unguarded external "LIBRARY oodialog bc_setImage" -::method scroll unguarded external "LIBRARY oodialog bc_scroll" --- Bitmap button methods. -::method dimBitmap unguarded external "LIBRARY oodialog bc_dimBitmap" +-- Bitmap button methods ALL DEPRECATED. --- The following methods are implemented in DialogExtensions rather than here --- because many of them do not require that that underlying dialog is already --- created. There is no button control until after the dialog is created. +-- Almost all the bitmap button methods were implemented in DialogExtensions. +-- The whole 'bitmap' button idea is antiquated, so the DialogExtensions methods +-- are documented, the button methods are deprecated and not documented. ::method changeBitmap unguarded arga = arg(1,"A") newarg = .array~new(arga~Items+1) @@ -364,42 +362,44 @@ do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end forward to (self~oDlg) message "CHANGEBITMAPBUTTON" arguments (newarg) -::method setBitmapPosition unguarded - use strict arg x, y = 0 - if arg(2, "E") then return self~oDlg~setBimapPosition(self~id, x, y) - else return self~oDlg~setBimapPosition(self~id, x) +::method dimBitmap unguarded + arga = arg(1,"A") + newarg = .array~new(arga~Items+1) + newarg[1] = self~ID + do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end + forward to (self~oDlg) arguments (newarg) -::method getBitmapPosition unguarded - use strict arg pos - return self~oDlg~getBitmapPosition(self~ID, pos) - ::method displaceBitmap unguarded use strict arg x, y return self~oDlg~setBitmapPosition(self~ID, x, y) -::method getBmpDisplacement unguarded - return self~oDlg~getBmpDisplacement(self~ID) - -::method scrollText unguarded +::method drawBitmap unguarded arga = arg(1,"A") - newarg = .array~new(arga~Items+1) + newarg = .array~new(arga~Items+2) newarg[1] = self~hwnd - do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end + newarg[2] = self~id + do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+2] = arga[i]; end forward to (self~oDlg) arguments (newarg) +::method getBitmapPosition unguarded + use strict arg pos + return self~oDlg~getBitmapPosition(self~ID, pos) + ::method getBitmapSizeX unguarded return self~oDlg~getBitmapSizeX(self~ID) ::method getBitmapSizeY unguarded return self~oDlg~getBitmapSizeY(self~ID) -::method drawBitmap unguarded +::method getBmpDisplacement unguarded + return self~oDlg~getBmpDisplacement(self~ID) + +::method scroll unguarded arga = arg(1,"A") - newarg = .array~new(arga~Items+2) - newarg[1] = self~hwnd - newarg[2] = self~id - do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+2] = arga[i]; end - forward to (self~oDlg) arguments (newarg) + newarg = .array~new(arga~Items+1) + newarg[1] = self~ID + do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end + forward to (self~oDlg) message "SCROLLBUTTON" arguments (newarg) ::method scrollBitmapFromTo unguarded arga = arg(1,"A") @@ -408,7 +408,20 @@ do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end forward to (self~oDlg) arguments (newarg) +::method scrollText unguarded + arga = arg(1,"A") + newarg = .array~new(arga~Items+1) + newarg[1] = self~hwnd + do i = 1 to arga~Items; if arga~hasindex(i) = 1 then newarg[i+1] = arga[i]; end + forward to (self~oDlg) arguments (newarg) +::method setBitmapPosition unguarded + use strict arg x, y = 0 + if arg(2, "E") then return self~oDlg~setBimapPosition(self~id, x, y) + else return self~oDlg~setBimapPosition(self~id, x) + +-- Bitmap button methods END ALL DEPRECATED. + /* For internal testing only, do not use this method */ ::method test external "LIBRARY oodialog bc_test" ::method test class external "LIBRARY oodialog bc_test_cls" Modified: main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/DialogExtensions.cls 2011-12-02 04:39:15 UTC (rev 7323) @@ -346,11 +346,15 @@ || "," || moveY || "," || sizeX || "," || sizeY || "," || delay || "," || xNow || "," || yNow) -- Draw the bitmap step by step. -::method dimBitmap unguarded - use strict arg id, bmp, cx, cy, stepX = 2, stepY = 2, steps = 10 - button = self~newPushButton(id) +::method dimBitmap unguarded external "LIBRARY oodialog dlgext_dimBitmap" + +-- This method moves the rectangle within a button. TODO be sure can take a .Rect for arg +::method scrollButton unguarded + -- use arg id, xPos, yPos, left, top, right, bottom + newArgs = arg(2, "A") + button = self~newPushButton(arg(1)) if button == .nil then return -1 - return button~dimBitmap(bmp, cx, cy, stepX, stepY, steps) + return button~sendWith("scroll", newArgs) -- Scroll a bitmap from one position to another within a button. ::method scrollBitmapFromTo unguarded @@ -491,14 +495,6 @@ if button == .nil then return -1 else return button~write(xPos, yPos, text, fontName, fontSize, fontStyle, fgColor, bkColor) --- This method moves the rectangle within a button. TODO be sure can take a .Rect for arg -::method scrollButton unguarded - -- use arg id, xPos, yPos, left, top, right, bottom - newArgs = arg(2, "A") - button = self~newPushButton(arg(1)) - if button == .nil then return -1 - return button~sendWith("scroll", newArgs) - ::method getWindowDC unguarded external "LIBRARY oodialog dlgext_getWindowDC" ::method getButtonDC unguarded use strict arg id Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2011-12-02 04:39:15 UTC (rev 7323) @@ -4611,7 +4611,7 @@ if ( pcpbd->hDlg == NULL ) { noWindowsDialogException(context, pcpbd->rexxSelf); - return TheNegativeOneObj; + return 0; } return setDlgDataFromStem(context, pcpbd, internDlgData); @@ -4628,7 +4628,7 @@ if ( pcpbd->hDlg == NULL ) { noWindowsDialogException(context, pcpbd->rexxSelf); - return TheNegativeOneObj; + return 0; } return putDlgDataInStem(context, pcpbd, internDlgData); Modified: main/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/oodBasicControls.cpp 2011-12-02 04:39:15 UTC (rev 7323) @@ -1064,153 +1064,6 @@ return NULLOBJECT; } -/* TODO convert to using optional .Rect arg */ - -/** Button::scroll() - * - * Moves the specified rectangle within the button and redraws the uncovered - * area with the button background color. This method is used to move bitmaps - * within bitmap buttons. - * - * @note Sets .SystemErrorCode. - * - * @remarks TODO convert to using an options .Rect arg. - * - * The original ooDialog external function had an option whether or - * not to redraw the uncovered portion of the button. The option was - * not documented and internally the function was always called with - * true. That option was therefore eliminated - */ -RexxMethod7(logical_t, bc_scroll, int32_t, xPos, int32_t, yPos, int32_t, left, int32_t, top, int32_t, right, int32_t, bottom, CSELF, pCSelf) -{ - oodResetSysErrCode(context->threadContext); - - pCDialogControl pcdc = (pCDialogControl)pCSelf; - pCPlainBaseDialog pcpbd = dlgToCSelf(context, pcdc->oDlg); - - HWND hwnd = pcdc->hCtrl; - RECT r; - if ( GetWindowRect(hwnd, &r) ) - { - RECT rs; - HDC hDC = GetDC(hwnd); - - rs.left = left; - rs.top = top; - rs.right = right; - rs.bottom = bottom; - - r.right = r.right - r.left; - r.bottom = r.bottom - r.top; - r.left = 0; - r.top = 0; - - if ( ScrollDC(hDC, xPos, yPos, &rs, &r, NULL, NULL) == 0 ) - { - oodSetSysErrCode(context->threadContext); - goto err_out; - } - - // Draw uncovered rectangle with background color. - HBRUSH hBrush, hOldBrush; - HPEN hOldPen, hPen; - - if ( pcpbd->bkgBrush ) - { - hBrush = pcpbd->bkgBrush; - } - else - { - hBrush = GetSysColorBrush(COLOR_BTNFACE); - } - - hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE)); - hOldPen = (HPEN)SelectObject(hDC, hPen); - hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); - - if ( xPos > 0 ) - { - Rectangle(hDC, rs.left, rs.top, rs.left + xPos, rs.bottom); - } - else if ( xPos < 0 ) - { - Rectangle(hDC, rs.right + xPos, rs.top, rs.right, rs.bottom); - } - - if ( yPos > 0 ) - { - Rectangle(hDC, rs.left, rs.top, rs.right, rs.top + yPos); - } - else if ( yPos < 0 ) - { - Rectangle(hDC, rs.left, rs.bottom + yPos, rs.right, rs.bottom); - } - - SelectObject(hDC, hOldBrush); - SelectObject(hDC, hOldPen); - DeleteObject(hPen); - - ReleaseDC(hwnd, hDC); - return 0; - } - -err_out: - return 1; -} - - -/** Button::dimBitmap() - * - * - */ -RexxMethod7(RexxObjectPtr, bc_dimBitmap, POINTERSTRING, hBmp, uint32_t, width, uint32_t, height, - OPTIONAL_uint32_t, stepX, OPTIONAL_uint32_t, stepY, OPTIONAL_uint32_t, steps, CSELF, pCSelf) -{ - HWND hwnd = getDChCtrl(pCSelf); - - stepX = (argumentOmitted(4) ? 2 : stepX); - stepY = (argumentOmitted(5) ? 2 : stepY); - steps = (argumentOmitted(6) ? 10 : steps); - - HDC hDC = GetWindowDC(hwnd); - - LOGBRUSH logicalBrush; - logicalBrush.lbStyle = BS_DIBPATTERNPT; - logicalBrush.lbColor = DIB_RGB_COLORS; - logicalBrush.lbHatch = (ULONG_PTR)hBmp; - - HBRUSH hBrush = CreateBrushIndirect(&logicalBrush); - HPEN hPen = CreatePen(PS_NULL, 0, PALETTEINDEX(0)); - - HBRUSH oldBrush = (HBRUSH)SelectObject(hDC, hBrush); - HPEN oldPen = (HPEN)SelectObject(hDC, hPen); - - uint32_t diffY = steps * stepY; - uint32_t diffX = steps * stepX; - - uint32_t a, i, j, x, y; - - for ( a = 0; a < steps; a++ ) - { - for ( y = a * stepY, i = 0; i < height / steps; y += diffY, i++ ) - { - for ( x = a * stepX, j = 0; j < width / steps; x += diffX, j++ ) - { - Rectangle(hDC, x - a * stepX, y - a * stepY, x + stepX + 1, y + stepY + 1); - } - } - } - - SelectObject(hDC, oldBrush); - SelectObject(hDC, oldPen); - DeleteObject(oldBrush); - DeleteObject(oldPen); - ReleaseDC(hwnd, hDC); - - return TheZeroObj; -} - - /** RadioButton::checkInGroup() [class method] * * Checks the button specified in a group of buttons and unchecks all the rest. Modified: main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/oodDeviceGraphics.cpp 2011-12-02 04:39:15 UTC (rev 7323) @@ -1536,6 +1536,10 @@ * Note that we want to be able to call this, some times, before the underlying * dialog has been created, so we bypass dlgExtSetup(). * + * Passing in null for phCtrl, signals that the underlying dialog does not need + * to be created yet. If phCtrl is not null, then that signals that the method + * requires the underlying dialog to exist. + * * @param c * @param self * @param rxID @@ -2517,6 +2521,212 @@ } +/** DialogExtensions:scrollButton() + * + * Moves the specified rectangle within the button and redraws the uncovered + * area with the button background color. This method is used to move bitmaps + * within bitmap buttons. + * + * @note Sets .SystemErrorCode. + * + * @remarks TODO convert to using an options .Rect arg. + * + * The original ooDialog external function had an option whether or + * not to redraw the uncovered portion of the button. The option was + * not documented and internally the function was always called with + * true. That option was therefore eliminated + * + * This method was originally a Button method, the scroll() method. + * But it belongs in the rather silly bitmap button category. Since + * the majority of these methods were implemented in the dialog + * extensions class, this method was moved here. + * + * The DialogExtensions class already had the scrollButton() method, + * which simply forwarded to the Button::scroll() method. So we just + * reversed the logic and have the Button::scroll() method forward to + * this method. + * + * For backwards compatibility, the Button::scroll() method has to be + * maintained. It now simply forwards to this method. The button + * method is deprecated, and therefore no longer documented. + */ +RexxMethod8(logical_t, dlgext_scrollButton, RexxObjectPtr, rxID, int32_t, xPos, int32_t, yPos, int32_t, left, int32_t, top, + int32_t, right, int32_t, bottom, OSELF, self) +{ + pCPlainBaseDialog pcpbd; + HWND hwnd; + + if ( dlgExtControlSetup(context, self, rxID, &pcpbd, NULL, &hwnd) != TheZeroObj ) + { + return FALSE; + } + + // Enforce that this is a button control. + oodControl_t controlType = oodName2controlType("PUSHBUTTON"); + if ( ! isControlMatch(hControl, controlType) ) + { + return TheNegativeOneObj; + } + + RECT r; + if ( GetWindowRect(hwnd, &r) ) + { + RECT rs; + HDC hDC = GetDC(hwnd); + + rs.left = left; + rs.top = top; + rs.right = right; + rs.bottom = bottom; + + r.right = r.right - r.left; + r.bottom = r.bottom - r.top; + r.left = 0; + r.top = 0; + + if ( ScrollDC(hDC, xPos, yPos, &rs, &r, NULL, NULL) == 0 ) + { + oodSetSysErrCode(context->threadContext); + goto err_out; + } + + // Draw uncovered rectangle with background color. + HBRUSH hBrush, hOldBrush; + HPEN hOldPen, hPen; + + if ( pcpbd->bkgBrush ) + { + hBrush = pcpbd->bkgBrush; + } + else + { + hBrush = GetSysColorBrush(COLOR_BTNFACE); + } + + hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE)); + hOldPen = (HPEN)SelectObject(hDC, hPen); + hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); + + if ( xPos > 0 ) + { + Rectangle(hDC, rs.left, rs.top, rs.left + xPos, rs.bottom); + } + else if ( xPos < 0 ) + { + Rectangle(hDC, rs.right + xPos, rs.top, rs.right, rs.bottom); + } + + if ( yPos > 0 ) + { + Rectangle(hDC, rs.left, rs.top, rs.right, rs.top + yPos); + } + else if ( yPos < 0 ) + { + Rectangle(hDC, rs.left, rs.bottom + yPos, rs.right, rs.bottom); + } + + SelectObject(hDC, hOldBrush); + SelectObject(hDC, hOldPen); + DeleteObject(hPen); + + ReleaseDC(hwnd, hDC); + return 0; + } + +err_out: + return 1; +} + + +/** Button::dimBitmap() + * + * Draws a bitmap on the client area of the button control step by step. + * + * @param id The resource ID of the bitmap button. Can be numeric or + * symbolic. + * @param hBmp A handle to the bitmap loaded with loadBitmap. + * + * @param cx, cy [required] The width and height of the bitmap. + * + * @param stepx, stepy [optional] The number of pixels to increment the x and + * y position of the bitmap at each step. The default is 2 + * pixels for both cx and cy. + * + * @param steps [optional] The number of iterations used to draw the bitmap. + * The bitmap is redrawn at each step. The default is + * 10. + * + * @notes We enforce that the control must be a button. + * + * @remarks This method was originally a Button method, but it belongs in the + * rather silly bitmap button category. Since the majority of these + * methods were implemented in the dialog extensions class, this + * method was moved here. + * + * For backwards compatibility, the Button::dimBitmap() method has to + * be maintained. It now simply forwards to this method. The button + * method is deprecated, and therefore no longer documented. + */ +RexxMethod8(RexxObjectPtr, dlgext_dimBitmap, RexxObjectPtr, rxID, POINTERSTRING, hBmp, uint32_t, width, uint32_t, height, + OPTIONAL_uint32_t, stepX, OPTIONAL_uint32_t, stepY, OPTIONAL_uint32_t, steps, OSELF, self) +{ + HWND hwnd; + + if ( dlgExtControlSetup(context, self, rxID, NULL, NULL, &hwnd) != TheZeroObj ) + { + return TheNegativeOneObj; + } + + // Enforce that this is a button control. + oodControl_t controlType = oodName2controlType("PUSHBUTTON"); + if ( ! isControlMatch(hControl, controlType) ) + { + return TheNegativeOneObj; + } + + stepX = (argumentOmitted(4) ? 2 : stepX); + stepY = (argumentOmitted(5) ? 2 : stepY); + steps = (argumentOmitted(6) ? 10 : steps); + + HDC hDC = GetWindowDC(hwnd); + + LOGBRUSH logicalBrush; + logicalBrush.lbStyle = BS_DIBPATTERNPT; + logicalBrush.lbColor = DIB_RGB_COLORS; + logicalBrush.lbHatch = (ULONG_PTR)hBmp; + + HBRUSH hBrush = CreateBrushIndirect(&logicalBrush); + HPEN hPen = CreatePen(PS_NULL, 0, PALETTEINDEX(0)); + + HBRUSH oldBrush = (HBRUSH)SelectObject(hDC, hBrush); + HPEN oldPen = (HPEN)SelectObject(hDC, hPen); + + uint32_t diffY = steps * stepY; + uint32_t diffX = steps * stepX; + + uint32_t a, i, j, x, y; + + for ( a = 0; a < steps; a++ ) + { + for ( y = a * stepY, i = 0; i < height / steps; y += diffY, i++ ) + { + for ( x = a * stepX, j = 0; j < width / steps; x += diffX, j++ ) + { + Rectangle(hDC, x - a * stepX, y - a * stepY, x + stepX + 1, y + stepY + 1); + } + } + } + + SelectObject(hDC, oldBrush); + SelectObject(hDC, oldPen); + DeleteObject(oldBrush); + DeleteObject(oldPen); + ReleaseDC(hwnd, hDC); + + return TheZeroObj; +} + + RexxMethod2(RexxObjectPtr, dlgext_drawButton, RexxObjectPtr, rxID, OSELF, self) { pCPlainBaseDialog pcpbd; Modified: main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2011-12-02 03:38:59 UTC (rev 7322) +++ main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp 2011-12-02 04:39:15 UTC (rev 7323) @@ -596,6 +596,8 @@ REXX_METHOD_PROTOTYPE(dlgext_installBitmapButton); REXX_METHOD_PROTOTYPE(dlgext_changeBitmapButton); REXX_METHOD_PROTOTYPE(dlgext_drawBitmap); +REXX_METHOD_PROTOTYPE(dlgext_dimBitmap); +REXX_METHOD_PROTOTYPE(dlgext_scrollButton); REXX_METHOD_PROTOTYPE(dlgext_drawButton); REXX_METHOD_PROTOTYPE(dlgext_getBitmapPosition); REXX_METHOD_PROTOTYPE(dlgext_setBitmapPosition); @@ -876,8 +878,6 @@ REXX_METHOD_PROTOTYPE(bc_setImage); REXX_METHOD_PROTOTYPE(bc_setImageList); REXX_METHOD_PROTOTYPE(bc_getImageList); -REXX_METHOD_PROTOTYPE(bc_scroll); -REXX_METHOD_PROTOTYPE(bc_dimBitmap); REXX_METHOD_PROTOTYPE(rb_checkInGroup_cls); REXX_METHOD_PROTOTYPE(rb_getCheckState); REXX_METHOD_PROTOTYPE(rb_checked); @@ -1401,6 +1401,8 @@ REXX_METHOD(dlgext_setControlColor, dlgext_setControlColor), REXX_METHOD(dlgext_installBitmapButton, dlgext_installBitmapButton), REXX_METHOD(dlgext_changeBitmapButton, dlgext_changeBitmapButton), + REXX_METHOD(dlgext_dimBitmap, dlgext_dimBitmap), + REXX_METHOD(dlgext_scrollButton, dlgext_scrollButton), REXX_METHOD(dlgext_drawBitmap, dlgext_drawBitmap), REXX_METHOD(dlgext_drawButton, dlgext_drawButton), REXX_METHOD(dlgext_getBitmapPosition, dlgext_getBitmapPosition), @@ -1677,8 +1679,6 @@ REXX_METHOD(bc_setImage, bc_setImage), REXX_METHOD(bc_setImageList, bc_setImageList), REXX_METHOD(bc_getImageList, bc_getImageList), - REXX_METHOD(bc_scroll, bc_scroll), - REXX_METHOD(bc_dimBitmap, bc_dimBitmap), REXX_METHOD(rb_checkInGroup_cls, rb_checkInGroup_cls), REXX_METHOD(rb_checked, rb_checked), REXX_METHOD(rb_check, rb_check), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |