From: <mie...@us...> - 2008-08-15 00:30:08
|
Revision: 2967 http://oorexx.svn.sourceforge.net/oorexx/?rev=2967&view=rev Author: miesfeld Date: 2008-08-15 00:30:17 +0000 (Fri, 15 Aug 2008) Log Message: ----------- [ 2022005 ] Update the ooDialog Static control Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/msgext.cls main/trunk/extensions/platform/windows/oodialog/oovuser.cpp Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-08-14 21:48:27 UTC (rev 2966) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-08-15 00:30:17 UTC (rev 2967) @@ -214,7 +214,6 @@ if style~wordpos("SS_RIGHTJUST") > 0 then ret = ret || " RIGHTJUST" if style~wordpos("SS_REALSIZECONTROL") > 0 then ret = ret || " SIZECONTROL" if style~wordpos("SS_REALSIZEIMAGE") > 0 then ret = ret || " SIZEIMAGE" - if style~wordpos("SS_SIMPLE") > 0 then ret = ret || " SIMPLE" if style~wordpos("SS_SUNKEN") > 0 then ret = ret || " SUNKEN" if style~wordpos("SS_WORDELLIPSIS") > 0 then ret = ret || " WORDELLIPSIS" @@ -417,10 +416,11 @@ if s~wordpos("CONTROL") > 0 then do - parse var s type '"'name'"' "," id "," class "," style "," x "," y "," w "," h + parse var s type '"'name'"' "," id "," class "," style "," x "," y "," w "," h "," extStyle opts = "" class = class~strip~translate style = style~translate(" ", "|") + extStyle = extStyle~translate(" ", "|") select when class = '"BUTTON"' then do if style~wordpos("BS_AUTORADIOBUTTON") > 0 | style~wordpos("BS_RADIOBUTTON") > 0 then @@ -460,11 +460,11 @@ when style~wordpos("SS_BLACKFRAME") > 0 then self~AddBlackFRAME(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDFRAME") > 0 then - self~AddStatic(id, x, y, w, h, "ETCHED " || opts) + self~AddEtchedFrame(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDHORZ") > 0 then - self~AddStatic(id, x, y, w, h, "HORZ " || opts) + self~AddEtchedHorizonatlFrame(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDVERT") > 0 then - self~AddStatic(id, x, y, w, h, "VERT " || opts) + self~AddEtchedVerticalFrame(x, y, w, h, opts, id) when style~wordpos("SS_BITMAP") > 0 then self~AddImage(id, x, y, w, h, "BITMAP " || opts) when style~wordpos("SS_ENHMETAFILE") > 0 then @@ -516,10 +516,11 @@ end /* select 2*/ end else do - parse var s type '"'name'"' "," id "," x "," y "," w "," h "," style - if id~space(0) = "" then parse var s type id "," x "," y "," w "," h "," style + parse var s type '"'name'"' "," id "," x "," y "," w "," h "," style "," extStyle + if id~space(0) = "" then parse var s type id "," x "," y "," w "," h "," style "," extStyle type = type~strip~translate style = style~translate(" ", "|") + extStyle = extStyle~translate(" ", "|") select when type = "DEFPUSHBUTTON" | type = "PUSHBUTTON" then @@ -617,30 +618,62 @@ self~AktPtr = UsrAddControl("GB",self~AktPtr, x, y, cx, cy, opts, text, id) +::method AddStatic + use arg id = (-1), x, y, cx = 0, cy = 0, options, text = "" + argA = .array~new + options = self~GetDefaultOpts(options) + argA[1] = x + argA[2] = y + argA[3] = cx + argA[4] = cy + argA[5] = options + argA[6] = id + select + when options~wordpos("WHITERECT") > 0 then return self~InternAddStatic(argA, 0) + when options~wordpos("GRAYRECT") > 0 then return self~InternAddStatic(argA, 1) + when options~wordpos("BLACKRECT") > 0 then return self~InternAddStatic(argA, 2) + when options~wordpos("WHITEFRAME") > 0 then return self~InternAddStatic(argA, 3) + when options~wordpos("GRAYFRAME") > 0 then return self~InternAddStatic(argA, 4) + when options~wordpos("BLACKFRAME") > 0 then return self~InternAddStatic(argA, 5) + when options~wordpos("ETCHED") > 0 then return self~InternAddStatic(argA, 6) + when options~wordpos("HORZ") > 0 then return self~InternAddStatic(argA, 7) + when options~wordpos("VERT") > 0 then return self~InternAddStatic(argA, 8) + + when options~wordpos("BITMAP") > 0 then forward message "AddImage" + when options~wordpos("METAFILE") > 0 then forward message "AddImage" + when options~wordpos("ICON") > 0 then forward message "AddImage" + + when options~wordpos("LEFT") > 0 then return self~addText(x, y, cx, cy, text, options, id) + when options~wordpos("RIGHT") > 0 then return self~addText(x, y, cx, cy, text, options, id) + when options~wordpos("CENTER") > 0 then return self~addText(x, y, cx, cy, text, options, id) + when options~wordpos("SIMPLE") > 0 then return self~addText(x, y, cx, cy, text, options, id) + when options~wordpos("LEFTNOWRAP") > 0 then return self~addText(x, y, cx, cy, text, options, id) + otherwise return -1 + end + -- End select + + return 0 + +::method AddImage + use arg id, x, y, cx, cy, options + id = self~ItemAdd(id) + if id < 0 then return id + options = self~GetDefaultOpts(options) + self~AktPtr = UsrAddControl("IMG", self~AktPtr, id, x, y, cx, cy, options) + ::method AddText - use arg x, y, cx, cy, text, opts, id - if Arg(5, 'o') = 1 then return 1 - if Arg(3, 'o') = 1 then cx = 0 - if Arg(4, 'o') = 1 then cy = 0 + use arg x, y, cx = 0, cy = 0, text = "", opts, id = (-1) + if cx = 0 | cy = 0 then do parse value GetStdTextSize(text) with icx icy if cx = 0 then cx = icx+2 if cy = 0 then cy = icy end - id = self~ItemAdd(id, \(Arg(7,"o") | id = "ID")) + id = self~ItemAdd(id) if id = -2 then return id opts = self~GetDefaultOpts(opts) self~AktPtr = UsrAddControl("TXT", self~AktPtr, x, y, cx, cy, opts, text, id) - - - -::method InternAddStatic - use arg arga, type - if arga~hasindex(6) = 0 then id = self~ItemAdd(-1, 0); else id = self~ItemAdd(arga[6],1) - if id = -2 then return id - opts = self~GetDefaultOpts(arga[5]) - self~AktPtr = UsrAddControl("FRM", self~AktPtr, arga[1], arga[2], arga[3], arga[4], type, opts, id) return 0 ::method AddWhiteRect @@ -661,38 +694,23 @@ ::method AddBlackFrame return self~InternAddStatic(Arg(1,"A"), 5) -::method AddStatic - use arg id, x, y, cx, cy, options - arga = .array~new - options = self~GetDefaultOpts(options) - arga[1] = x - arga[2] = y - arga[3] = cx - arga[4] = cy - arga[5] = options - if arg(1, 'E') then arga[6] = id +::method AddEtchedFrame + return self~InternAddStatic(Arg(1,"A"), 6) - select - when options~wordpos("WHITERECT") > 0 then return self~InternAddStatic(arga, 0) - when options~wordpos("GRAYRECT") > 0 then return self~InternAddStatic(arga, 1) - when options~wordpos("BLACKRECT") > 0 then return self~InternAddStatic(arga, 2) - when options~wordpos("WHITEFRAME") > 0 then return self~InternAddStatic(arga, 3) - when options~wordpos("GRAYFRAME") > 0 then return self~InternAddStatic(arga, 4) - when options~wordpos("BLACKFRAME") > 0 then return self~InternAddStatic(arga, 5) - when options~wordpos("ETCHED") > 0 then return self~InternAddStatic(arga, 6) - when options~wordpos("HORZ") > 0 then return self~InternAddStatic(arga, 7) - when options~wordpos("VERT") > 0 then return self~InternAddStatic(arga, 8) - otherwise return -1 - end - -- End select +::method AddEtchedHorizontalFrame + return self~InternAddStatic(Arg(1,"A"), 7) -::method AddImage - use arg id, x, y, cx, cy, options - id = self~ItemAdd(id) - if id < 0 then return id - options = self~GetDefaultOpts(options) - self~AktPtr = UsrAddControl("IMG", self~AktPtr, id, x, y, cx, cy, options) +::method AddEtchedVerticalFrame + return self~InternAddStatic(Arg(1,"A"), 8) +::method InternAddStatic private + use arg arga, type + if arga~hasindex(6) = 0 then id = self~ItemAdd(-1, 0); else id = self~ItemAdd(arga[6],1) + if id = -2 then return id + opts = self~GetDefaultOpts(arga[5]) + self~AktPtr = UsrAddControl("FRM", self~AktPtr, arga[1], arga[2], arga[3], arga[4], type, opts, id) + return 0 + ::method AddEntryLine use arg id, fname, x, y, cx, cy, opts symbid = id Modified: main/trunk/extensions/platform/windows/oodialog/msgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/msgext.cls 2008-08-14 21:48:27 UTC (rev 2966) +++ main/trunk/extensions/platform/windows/oodialog/msgext.cls 2008-08-15 00:30:17 UTC (rev 2967) @@ -284,9 +284,9 @@ if Arg(3,'o') = 1 then msgToRise = "On" || type type = type~translate select - when type = "KEYDOWN" then lp = -550 - when type = "SELCHANGE" then lp = -551 - when type = "SELCHANGING" then lp = -552 + when type = "KEYDOWN" then lp = -550 + when type = "SELCHANGE" then lp = -551 + when type = "SELCHANGING" then lp = -552 otherwise return -1 end return self~AddUserMsg(msgToRise, 0x0000004E, "0xFFFFFFFF", id, "0xFFFFFFFF", lp, "0xFFFFFFFF") @@ -302,15 +302,15 @@ if Arg(3,'o') = 1 then msgToRise = "On" || type type = type~translate select - when type = "UP" then wp =0 - when type = "DOWN" then wp =1 - when type = "PAGEUP" then wp =2 - when type = "PAGEDOWN" then wp =3 - when type = "POSITION" then wp =4 - when type = "DRAG" then wp =5 - when type = "TOP" then wp =6 - when type = "BOTTOM" then wp =7 - when type = "ENDTRACK" then wp =8 + when type = "UP" then wp =0 + when type = "DOWN" then wp =1 + when type = "PAGEUP" then wp =2 + when type = "PAGEDOWN" then wp =3 + when type = "POSITION" then wp =4 + when type = "DRAG" then wp =5 + when type = "TOP" then wp =6 + when type = "BOTTOM" then wp =7 + when type = "ENDTRACK" then wp =8 otherwise return -1 end ret = self~AddUserMsg(msgToRise, 0x00000114, "0xFFFFFFFF", wp, "0x0000FFFF", hwnd, "0xFFFFFFFF") /* WM_HSCROLL */ @@ -318,6 +318,22 @@ return self~AddUserMsg(msgToRise, 0x00000115, "0xFFFFFFFF", wp, "0x0000FFFF", hwnd, "0xFFFFFFFF") /* WM_VSCROLL */ +::method connectStaticNotify + use strict arg id, type, msgToRaise = "" + if \ id~DataType("W") then id = self~ResolveSymbolicId(id) + if id = -1 then return -1 + if msgToRaise == "" then msgToRaise = "On" || type + type = type~translate + select + when type = "CLICK" then lp = 0 + when type = "DBLCLK" then lp = 1 + when type = "ENABLE" then lp = 2 + when type = "DISABLE" then lp = 3 + otherwise return -1 + end + return self~AddUserMsg(msgToRaise, 0x00000111, "0xFFFFFFFF", lp~x2d * X2D("10000") + id, "0xFFFFFFFF", 0, 0) + + ::method DefTreeEditStarter use arg id, dummy, category if Arg(3,'o') = 1 then tc = self~GetTreeControl(id) Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-08-14 21:48:27 UTC (rev 2966) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-08-15 00:30:17 UTC (rev 2967) @@ -733,38 +733,6 @@ /* id x y cx cy */ UAddControl(&p, 0x0081, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], NULL, lStyle); } - else if (!strcmp(argv[0].strptr,"TXT")) - { - CHECKARGL(8); - - /* UsrAddControl("TXT", self~AktPtr, x, y, cx, cy, opts, text, id) */ - for ( i = 0; i < 4; i++ ) - { - buffer[i] = atoi(argv[i+2].strptr); - } - - p = (WORD *)GET_POINTER(argv[1]); - - if (argc > 8) - i = atoi(argv[8].strptr); - else i = -1; - - lStyle = WS_CHILD; - if (strstr(argv[6].strptr,"CENTER")) lStyle |= SS_CENTER; - else if (strstr(argv[6].strptr,"RIGHT")) lStyle |= SS_RIGHT; - else if (strstr(argv[6].strptr,"SIMPLE")) lStyle |= SS_SIMPLE; - else if (strstr(argv[6].strptr,"LEFTNOWRAP")) lStyle |= SS_LEFTNOWORDWRAP; - else lStyle |= SS_LEFT; - - if (!strstr(argv[6].strptr,"HIDDEN")) lStyle |= WS_VISIBLE; - if (strstr(argv[6].strptr,"GROUP")) lStyle |= WS_GROUP; - if (strstr(argv[6].strptr,"DISABLED")) lStyle |= WS_DISABLED; - if (strstr(argv[6].strptr,"BORDER")) lStyle |= WS_BORDER; - if (strstr(argv[6].strptr,"TAB")) lStyle |= WS_TABSTOP; - - /* id x y cx cy */ - UAddControl(&p, 0x0082, i, buffer[0], buffer[1], buffer[2], buffer[3], argv[7].strptr, lStyle); - } else if (!strcmp(argv[0].strptr,"LB")) { CHECKARG(8); @@ -826,6 +794,46 @@ /* id x y cx cy */ UAddControl(&p, 0x0085, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], NULL, lStyle); } + else if (!strcmp(argv[0].strptr,"TXT")) + { + CHECKARGL(8); + + /* UsrAddControl("TXT", self~AktPtr, x, y, cx, cy, opts, text, id) */ + for ( i = 0; i < 4; i++ ) + { + buffer[i] = atoi(argv[i+2].strptr); + } + + p = (WORD *)GET_POINTER(argv[1]); + + if (argc > 8) + i = atoi(argv[8].strptr); + else i = -1; + + lStyle = WS_CHILD; + if (strstr(argv[6].strptr,"CENTER")) lStyle |= SS_CENTER; + else if (strstr(argv[6].strptr,"RIGHT")) lStyle |= SS_RIGHT; + else if (strstr(argv[6].strptr,"SIMPLE")) lStyle |= SS_SIMPLE; + else if (strstr(argv[6].strptr,"LEFTNOWRAP")) lStyle |= SS_LEFTNOWORDWRAP; + else lStyle |= SS_LEFT; + + if (strstr(argv[6].strptr,"NOTIFY")) lStyle |= SS_NOTIFY; + if (strstr(argv[6].strptr,"SUNKEN")) lStyle |= SS_SUNKEN; + if (strstr(argv[6].strptr,"EDITCONTROL")) lStyle |= SS_EDITCONTROL; + if (strstr(argv[6].strptr,"ENDELLIPSIS")) lStyle |= SS_ENDELLIPSIS; + if (strstr(argv[6].strptr,"NOPREFIX")) lStyle |= SS_NOPREFIX; + if (strstr(argv[6].strptr,"PATHELLIPSIS")) lStyle |= SS_PATHELLIPSIS; + if (strstr(argv[6].strptr,"WORDELLIPSIS")) lStyle |= SS_WORDELLIPSIS; + + if (!strstr(argv[6].strptr,"HIDDEN")) lStyle |= WS_VISIBLE; + if (strstr(argv[6].strptr,"GROUP")) lStyle |= WS_GROUP; + if (strstr(argv[6].strptr,"DISABLED")) lStyle |= WS_DISABLED; + if (strstr(argv[6].strptr,"BORDER")) lStyle |= WS_BORDER; + if (strstr(argv[6].strptr,"TAB")) lStyle |= WS_TABSTOP; + + /* id x y cx cy */ + UAddControl(&p, 0x0082, i, buffer[0], buffer[1], buffer[2], buffer[3], argv[7].strptr, lStyle); + } else if (!strcmp(argv[0].strptr,"FRM")) { CHECKARGL(8); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-08-18 05:07:16
|
Revision: 2990 http://oorexx.svn.sourceforge.net/oorexx/?rev=2990&view=rev Author: miesfeld Date: 2008-08-18 05:07:25 +0000 (Mon, 18 Aug 2008) Log Message: ----------- Fix 64-bit compile on Windows. Fix the ooDialog compile. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovtext.cpp main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2008-08-18 04:52:50 UTC (rev 2989) +++ main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2008-08-18 05:07:25 UTC (rev 2990) @@ -269,7 +269,7 @@ HCURSOR oC, hC; res = atoi(argv[3].strptr); hC = LoadCursor(NULL, MAKEINTRESOURCE(res)); - oC = (HCURSOR)SetClassLongPtr(hW, GCL_HCURSOR, (LONG_PTR)hC); + oC = (HCURSOR)SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); SetCursor(hC); RETHANDLE(oC) } @@ -277,12 +277,12 @@ { HCURSOR hC = (HCURSOR)GET_HANDLE(argv[3]); if (hC) { - SetClassLongPtr(hW, GCL_HCURSOR, (LONG_PTR)hC); + SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); RETHANDLE(SetCursor(hC)) } else { - SetClassLongPtr(hW, GCL_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW)); + SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW)); RETHANDLE(SetCursor(LoadCursor(NULL, IDC_ARROW))) } } Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-08-18 04:52:50 UTC (rev 2989) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-08-18 05:07:25 UTC (rev 2990) @@ -1271,11 +1271,11 @@ { if ( argc == 3 ) { - RETVAL(GetWindowLong(hCtrl, GWL_USERDATA)); + RETVAL(GetWindowLongPtr(hCtrl, GWLP_USERDATA)); } else if ( argc == 4 ) { - RETVAL(SetWindowLong(hCtrl, GWL_USERDATA, atol(argv[3].strptr))); + RETVAL(SetWindowLongPtr(hCtrl, GWLP_USERDATA, atol(argv[3].strptr))); } else RETERR } @@ -4673,7 +4673,7 @@ } uint32_t red; - context->ObjectToUnsignedNumber(r, &red); + context->ObjectToUnsignedNumber(r, (size_t *)&red); return RGB((uint8_t)red, g, b); } Modified: main/trunk/extensions/platform/windows/oodialog/oovtext.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovtext.cpp 2008-08-18 04:52:50 UTC (rev 2989) +++ main/trunk/extensions/platform/windows/oodialog/oovtext.cpp 2008-08-18 05:07:25 UTC (rev 2990) @@ -229,7 +229,7 @@ if (!TimerEvent) { TimerEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - Timer = SetTimer(NULL,GetCurrentThreadId(), sleep, ScrollTimerProc); + Timer = SetTimer(NULL,GetCurrentThreadId(), sleep, (TIMERPROC)ScrollTimerProc); TimerCount++; } else TimerCount++; Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-08-18 04:52:50 UTC (rev 2989) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-08-18 05:07:25 UTC (rev 2990) @@ -499,8 +499,8 @@ if ( GetDialogIcons(dlgAdm, atoi(argv[7].strptr), ICON_FILE, (PHANDLE)&hBig, (PHANDLE)&hSmall) ) { - dlgAdm->SysMenuIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCL_HICON, (LONG_PTR)hBig); - dlgAdm->TitleBarIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCL_HICONSM, (LONG_PTR)hSmall); + dlgAdm->SysMenuIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCLP_HICON, (LONG_PTR)hBig); + dlgAdm->TitleBarIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCLP_HICONSM, (LONG_PTR)hSmall); dlgAdm->DidChangeIcon = TRUE; SendMessage(dlgAdm->TheDlg, WM_SETICON, ICON_SMALL, (LPARAM)hSmall); @@ -1264,7 +1264,7 @@ return IsDialogMessage(dlgAdm->TheDlg, lpmsg); default: - hParent = (HWND) GetWindowLongPtr(lpmsg->hwnd, GWL_HWNDPARENT); + hParent = (HWND) GetWindowLongPtr(lpmsg->hwnd, GWLP_HWNDPARENT); if (!hParent) return FALSE; return IsDialogMessage(hParent, lpmsg); } @@ -1274,7 +1274,7 @@ if (lpmsg->wParam == VK_SHIFT) SHIFTkey = FALSE; break; } - hParent = (HWND) GetWindowLongPtr(lpmsg->hwnd, GWL_HWNDPARENT); + hParent = (HWND) GetWindowLongPtr(lpmsg->hwnd, GWLP_HWNDPARENT); if (hParent) return IsDialogMessage(hParent, lpmsg); else return IsDialogMessage(dlgAdm->TheDlg, lpmsg); Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-08-18 04:52:50 UTC (rev 2989) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-08-18 05:07:25 UTC (rev 2990) @@ -469,10 +469,10 @@ */ if ( aDlg->DidChangeIcon ) { - hIconBig = (HICON)SetClassLongPtr(aDlg->TheDlg, GCL_HICON, (LONG_PTR)aDlg->SysMenuIcon); + hIconBig = (HICON)SetClassLongPtr(aDlg->TheDlg, GCLP_HICON, (LONG_PTR)aDlg->SysMenuIcon); if ( aDlg->TitleBarIcon ) { - hIconSmall = (HICON)SetClassLongPtr(aDlg->TheDlg, GCL_HICONSM, (LONG_PTR)aDlg->TitleBarIcon); + hIconSmall = (HICON)SetClassLongPtr(aDlg->TheDlg, GCLP_HICONSM, (LONG_PTR)aDlg->TitleBarIcon); } if ( ! aDlg->SharedIcon ) @@ -480,7 +480,7 @@ DestroyIcon(hIconBig); if ( ! hIconSmall ) { - hIconSmall = (HICON)GetClassLongPtr(aDlg->TheDlg, GCL_HICONSM); + hIconSmall = (HICON)GetClassLongPtr(aDlg->TheDlg, GCLP_HICONSM); } } else @@ -741,8 +741,8 @@ if ( GetDialogIcons(dlgAdm, atoi(argv[5].strptr), ICON_DLL, (PHANDLE)&hBig, (PHANDLE)&hSmall) ) { - dlgAdm->SysMenuIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCL_HICON, (LONG_PTR)hBig); - dlgAdm->TitleBarIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCL_HICONSM, (LONG_PTR)hSmall); + dlgAdm->SysMenuIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCLP_HICON, (LONG_PTR)hBig); + dlgAdm->TitleBarIcon = (HICON)SetClassLongPtr(dlgAdm->TheDlg, GCLP_HICONSM, (LONG_PTR)hSmall); dlgAdm->DidChangeIcon = TRUE; SendMessage(dlgAdm->TheDlg, WM_SETICON, ICON_SMALL, (LPARAM)hSmall); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-09-04 17:04:42
|
Revision: 3155 http://oorexx.svn.sourceforge.net/oorexx/?rev=3155&view=rev Author: miesfeld Date: 2008-09-04 17:04:52 +0000 (Thu, 04 Sep 2008) Log Message: ----------- [ 2033206 ] - Update the ooDialog ButtonControl(s) Group boxes are buttons in Windows and ooDialog should treat them as such. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-09-04 16:23:10 UTC (rev 3154) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-09-04 17:04:52 UTC (rev 3155) @@ -55,6 +55,7 @@ when type = "BUT" then class = .ButtonControl when type = "RB" then class = .RadioButton when type = "CH" then class = .CheckBox + when type = "GB" then class = .GroupBox when type = "LB" then class = .ListBox when type = "CB" then class = .ComboBox when type = "SB" then class = .ScrollBar @@ -102,6 +103,11 @@ arr[3] = "CH" forward message "GetControl" Arguments (arr) +::method GetGroupBox unguarded + arr = Arg(1,"A") + arr[3] = "GB" + forward message "GetControl" Arguments (arr) + ::method GetListBox unguarded arr = Arg(1,"A") arr[3] = "LB" @@ -1684,6 +1690,9 @@ /******************* ButtonControl Classes ************************************/ +::class 'GroupBox' subclass DialogControl public +::method "style=" external "LIBRARY oodialog gb_setStyle" + ::class 'ButtonControl' subclass DialogControl public ::constant BUTTON_IMAGELIST_ALIGN_LEFT 0 Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-09-04 16:23:10 UTC (rev 3154) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-09-04 17:04:52 UTC (rev 3155) @@ -135,6 +135,7 @@ else if style~wordpos("WS_VISIBLE") > 0 then ret = "VISIBLE" if style~wordpos("WS_DISABLED") > 0 & style~wordpos("NOT WS_DISABLED") == 0 then ret = ret || " DISABLED" if style~wordpos("WS_GROUP") > 0 & style~wordpos("NOT WS_GROUP") == 0 then ret = ret || " GROUP" + if kind = "DLG" then do if style~wordpos("DS_CENTER") > 0 then ret = ret ||" CENTER" if style~wordpos("DS_SYSMODAL") > 0 then ret = ret ||" SYSTEMMODAL" @@ -168,6 +169,12 @@ if style~wordpos("WS_TABSTOP") = 0 then ret = ret || " NOTAB" end end + else if kind = "GB" then do + if style~wordpos("BS_LEFT") > 0 then ret = ret || " LEFT" + if style~wordpos("BS_RIGHT") > 0 then ret = ret || " RIGHT" + if style~wordpos("WS_BORDER") > 0 then ret = ret || " BORDER" + if style~wordpos("WS_TABSTOP") > 0 then ret = ret || " TAB" + end else if kind = "EDIT" then do if style~wordpos("ES_AUTOHSCROLL") > 0 then ret = ret || " AUTOSCROLLH" if style~wordpos("ES_AUTOVSCROLL") > 0 then ret = ret || " AUTOSCROLLV" @@ -428,7 +435,7 @@ else if style~wordpos("BS_AUTOCHECKBOX") > 0 | style~wordpos("BS_CHECKBOX") > 0 then self~InternAddRC_RBCB(id, x, y, w, h, name, style, loadOptions, "C") else if style~wordpos("BS_GROUPBOX") > 0 then - self~AddGroupBox(x, y, w, h, name, self~InternGetRCStyle(style, "ST"), id) + self~AddGroupBox(x, y, w, h, name, self~InternGetRCStyle(style, "GB"), id) else if style~pos("BS_OWNERDRAW") = 0 & style~wordpos("BS_AUTO3STATE") > 0 then /* if 3state is not ownerdrawn */ self~InternAddRC_RBCB(id, x, y, w, h, name, style, loadOptions, "C") else self~InternAddRCButton(id, x, y, w, h, name, style, loadOptions) @@ -547,7 +554,7 @@ end when type = "GROUPBOX" then - self~AddGroupBox(x, y, w, h, name, self~InternGetRCStyle(style, "ST"), id) + self~AddGroupBox(x, y, w, h, name, self~InternGetRCStyle(style, "GB"), id) when type = "COMBOBOX" then self~AddComboBox(id, name, x, y, w, h, self~InternGetRCStyle(style, "CB")) Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-09-04 16:23:10 UTC (rev 3154) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-09-04 17:04:52 UTC (rev 3155) @@ -3827,6 +3827,62 @@ } +#define MIN_HALFHEIGHT_GB 12 + +/** .GroupBox~style = + * + * A group box is a button, but the only style change that makes much sense is + * the right or left alignment of the text. Other changes either have no + * effect, or cause the group box / dialog to paint in a weird way. + */ +RexxMethod2(int, gb_setStyle, OSELF, self, CSTRING, opts) +{ + HWND hwnd = rxGetWindowHandle(context, self); + + DWORD style = (DWORD)GetWindowLongPtr(hwnd, GWL_STYLE); + + if ( stricmp(opts, "RIGHT") == 0 ) + { + style = (style & ~BS_CENTER) | BS_RIGHT; + } + else if ( stricmp(opts, "LEFT") == 0 ) + { + style = (style & ~BS_CENTER) | BS_LEFT; + } + else + { + wrongArgValueException(context, 1, "RIGHT, LEFT", opts); + return 0; + } + + /** + * When the alignment changes, we need to force the dialog to redraw the + * area occupied by the group box. Otherwise the old text remains on the + * screen. But, it is only the top part of the group box that needs to be + * redrawn, so we only invalidate the top half of the group box. + */ + + HWND hDlg = GetParent(hwnd); + RECT r; + + // Get the screen area of the group box and map it to the client area of the + // dialog. + GetWindowRect(hwnd, &r); + MapWindowPoints(NULL, hDlg, (LPPOINT)&r, 2); + + LONG halfHeight = ((r.bottom - r.top) / 2); + r.bottom = (halfHeight >= MIN_HALFHEIGHT_GB ? r.top + halfHeight : r.bottom); + + // Change the group box style, force the dialog to repaint. + SetWindowLongPtr(hwnd, GWL_STYLE, style); + SendMessage(hwnd, BM_SETSTYLE, (WPARAM)style, (LPARAM)TRUE); + + InvalidateRect(hDlg, &r, TRUE); + UpdateWindow(hDlg); + + return 0; +} + RexxMethod2(RexxObjectPtr, bc_setStyle, OSELF, self, CSTRING, opts) { HWND hwnd = rxGetWindowHandle(context, self); Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-09-04 16:23:10 UTC (rev 3154) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-09-04 17:04:52 UTC (rev 3155) @@ -681,7 +681,11 @@ p = (WORD *)GET_POINTER(argv[1]); + // We support right or left aligned text. By default the alignment is + // left so we only need to check for the RIGHT key word. + lStyle = WS_CHILD | BS_GROUPBOX; + if (strstr(argv[6].strptr,"RIGHT")) lStyle |= BS_RIGHT; if (!strstr(argv[6].strptr,"HIDDEN")) lStyle |= WS_VISIBLE; if (strstr(argv[6].strptr,"GROUP")) lStyle |= WS_GROUP; if (strstr(argv[6].strptr,"DISABLED")) lStyle |= WS_DISABLED; Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-09-04 16:23:10 UTC (rev 3154) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-09-04 17:04:52 UTC (rev 3155) @@ -2146,6 +2146,7 @@ REXX_METHOD_PROTOTYPE(pbc_test); REXX_METHOD_PROTOTYPE(bc_cls_checkInGroup); +REXX_METHOD_PROTOTYPE(gb_setStyle); REXX_METHOD_PROTOTYPE(bc_getState); REXX_METHOD_PROTOTYPE(bc_setState); REXX_METHOD_PROTOTYPE(bc_setStyle); @@ -2208,6 +2209,7 @@ REXX_METHOD(bc_cls_checkInGroup, bc_cls_checkInGroup), REXX_METHOD(bc_getState, bc_getState), REXX_METHOD(bc_setState, bc_setState), + REXX_METHOD(gb_setStyle, gb_setStyle), REXX_METHOD(bc_setStyle, bc_setStyle), REXX_METHOD(bc_click, bc_click), REXX_METHOD(bc_getImage, bc_getImage), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-09-07 22:50:55
|
Revision: 3224 http://oorexx.svn.sourceforge.net/oorexx/?rev=3224&view=rev Author: miesfeld Date: 2008-09-07 22:51:04 +0000 (Sun, 07 Sep 2008) Log Message: ----------- ooDialog - fix the WinTimer() function and the ScrollBitmapFromTo() method. Fix spot where pointer was being returned as a long. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-09-07 22:00:07 UTC (rev 3223) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-09-07 22:51:04 UTC (rev 3224) @@ -753,7 +753,7 @@ if (cursy > yl) then cursy = yl hwnd = self~GetItem(id) - if hwnd = 0 then return -1 + if hwnd~substr(3) = 0 then return -1 parse value self~GetWindowRect(hwnd) with r.left r.top r.right r.bottom r.right = r.right - r.left @@ -800,7 +800,7 @@ ret = ScrollTheWindow(self~Adm, hwnd, stepx, stepy, sleft, s_top, srgt, sbot, "yes") if ret = 1 then do - if (timer > 0) then ret = WinTimer("STOP", timer) + if (timer \== 0) then ret = WinTimer("STOP", timer) return 1 end @@ -817,7 +817,7 @@ if stepx \= 0 & drawx=1 then self~DrawBitmap(hwnd, id, left, top, cursx, cursy, abs(stepx), yl) if stepy \= 0 & drawy=1 then self~DrawBitmap(hwnd, id, left, top, cursx, cursy, xl, abs(stepy)) - if (timer > 0) then ret = WinTimer("WAIT", timer) + if (timer \== 0) then ret = WinTimer("WAIT", timer) drawx = 0 if (stepx <= 0) then do @@ -858,7 +858,7 @@ if (stepx<0) & (curx+stepx >= tox) then worktodo = 1 if (stepy<0) & (cury+stepy >= toy) then worktodo = 1 end - if (timer > 0) then ret = WinTimer("STOP", timer) + if (timer \== 0) then ret = WinTimer("STOP", timer) self~DisplaceBitmap(id, tox, toy); self~RedrawButton(id,0) return 0 Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-09-07 22:00:07 UTC (rev 3223) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-09-07 22:51:04 UTC (rev 3224) @@ -292,32 +292,37 @@ size_t RexxEntry WinTimer(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { - UINT_PTR timer; - MSG msg; + UINT_PTR timerID; + MSG msg; - CHECKARG(2); - if (!stricmp(argv[0].strptr, "START")) - { - timer = SetTimer(NULL, 1001, atoi(argv[1].strptr), NULL); - RETPTR(timer) - } else - if (!stricmp(argv[0].strptr, "STOP")) - { - timer = KillTimer(NULL, atoi(argv[1].strptr)); + CHECKARG(2); + if ( !stricmp(argv[0].strptr, "START") ) + { + timerID = SetTimer(NULL, 1001, atoi(argv[1].strptr), NULL); + RETPTR(timerID) + } + else if ( !stricmp(argv[0].strptr, "STOP") ) + { + timerID = (UINT_PTR)GET_POINTER(argv[1]); + if ( KillTimer(NULL, timerID) == 0 ) + { + RETVAL(GetLastError()) + } RETC(0) - } else - if (!stricmp(argv[0].strptr, "WAIT")) - { - while (!PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE) || (msg.wParam != (ULONG)atoi(argv[1].strptr))) {}; - RETC(0) - } - RETC(1) + } + else if ( !stricmp(argv[0].strptr, "WAIT") ) + { + timerID = (UINT_PTR)GET_POINTER(argv[1]); + while ( !PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE) || (msg.wParam != timerID) ) + { + ; // do nothing + } + RETC(0) + } + RETC(1) } - - - HIMAGELIST CreateImageList(INT start, HWND h, CONSTRXSTRING *argv, size_t argc) { HBITMAP hBmp = NULL; @@ -1271,11 +1276,11 @@ { if ( argc == 3 ) { - RETVAL(GetWindowLongPtr(hCtrl, GWLP_USERDATA)); + RETPTR(GetWindowLongPtr(hCtrl, GWLP_USERDATA)); } else if ( argc == 4 ) { - RETVAL(SetWindowLongPtr(hCtrl, GWLP_USERDATA, atol(argv[3].strptr))); + RETPTR(SetWindowLongPtr(hCtrl, GWLP_USERDATA, atol(argv[3].strptr))); } else RETERR } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-09-29 15:43:18
|
Revision: 3414 http://oorexx.svn.sourceforge.net/oorexx/?rev=3414&view=rev Author: miesfeld Date: 2008-09-29 15:43:08 +0000 (Mon, 29 Sep 2008) Log Message: ----------- ooDialog - fix the static control so a default type is used. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/oovuser.cpp Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-09-28 22:38:42 UTC (rev 3413) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-09-29 15:43:08 UTC (rev 3414) @@ -626,51 +626,44 @@ ::method AddStatic - use arg id = (-1), x, y, cx = 0, cy = 0, options, text = "" + use strict arg id = (-1), x, y, cx = 0, cy = 0, opts = "", text = "" argA = .array~new - options = self~GetDefaultOpts(options) + opts = self~GetDefaultOpts(opts) argA[1] = x argA[2] = y argA[3] = cx argA[4] = cy - argA[5] = options + argA[5] = opts argA[6] = id select - when options~wordpos("WHITERECT") > 0 then return self~InternAddStatic(argA, 0) - when options~wordpos("GRAYRECT") > 0 then return self~InternAddStatic(argA, 1) - when options~wordpos("BLACKRECT") > 0 then return self~InternAddStatic(argA, 2) - when options~wordpos("WHITEFRAME") > 0 then return self~InternAddStatic(argA, 3) - when options~wordpos("GRAYFRAME") > 0 then return self~InternAddStatic(argA, 4) - when options~wordpos("BLACKFRAME") > 0 then return self~InternAddStatic(argA, 5) - when options~wordpos("ETCHED") > 0 then return self~InternAddStatic(argA, 6) - when options~wordpos("HORZ") > 0 then return self~InternAddStatic(argA, 7) - when options~wordpos("VERT") > 0 then return self~InternAddStatic(argA, 8) + when opts~wordpos("BITMAP") > 0 | opts~wordpos("METAFILE") > 0 | opts~wordpos("ICON") > 0 then do + forward message "AddImage" + end - when options~wordpos("BITMAP") > 0 then forward message "AddImage" - when options~wordpos("METAFILE") > 0 then forward message "AddImage" - when options~wordpos("ICON") > 0 then forward message "AddImage" + when opts~wordpos("WHITERECT") > 0 then return self~InternAddStatic(argA, 0) + when opts~wordpos("GRAYRECT") > 0 then return self~InternAddStatic(argA, 1) + when opts~wordpos("BLACKRECT") > 0 then return self~InternAddStatic(argA, 2) + when opts~wordpos("WHITEFRAME") > 0 then return self~InternAddStatic(argA, 3) + when opts~wordpos("GRAYFRAME") > 0 then return self~InternAddStatic(argA, 4) + when opts~wordpos("BLACKFRAME") > 0 then return self~InternAddStatic(argA, 5) + when opts~wordpos("ETCHED") > 0 then return self~InternAddStatic(argA, 6) + when opts~wordpos("HORZ") > 0 then return self~InternAddStatic(argA, 7) + when opts~wordpos("VERT") > 0 then return self~InternAddStatic(argA, 8) - when options~wordpos("LEFT") > 0 then return self~addText(x, y, cx, cy, text, options, id) - when options~wordpos("RIGHT") > 0 then return self~addText(x, y, cx, cy, text, options, id) - when options~wordpos("CENTER") > 0 then return self~addText(x, y, cx, cy, text, options, id) - when options~wordpos("SIMPLE") > 0 then return self~addText(x, y, cx, cy, text, options, id) - when options~wordpos("LEFTNOWRAP") > 0 then return self~addText(x, y, cx, cy, text, options, id) - otherwise return -1 + otherwise return self~addText(x, y, cx, cy, text, opts, id) end -- End select - return 0 - ::method AddImage - use arg id, x, y, cx, cy, options + use strict arg id, x, y, cx, cy, options = "" id = self~ItemAdd(id) if id < 0 then return id options = self~GetDefaultOpts(options) self~AktPtr = UsrAddControl("IMG", self~AktPtr, id, x, y, cx, cy, options) ::method AddText - use arg x, y, cx = 0, cy = 0, text = "", opts, id = (-1) + use arg x, y, cx = 0, cy = 0, text = "", opts = "", id = (-1) if cx = 0 | cy = 0 then do parse value GetStdTextSize(text) with icx icy Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-09-28 22:38:42 UTC (rev 3413) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-09-29 15:43:08 UTC (rev 3414) @@ -889,9 +889,9 @@ p = (WORD *)GET_POINTER(argv[1]); lStyle = WS_CHILD; - if (strstr(argv[7].strptr,"METAFILE")) lStyle |= SS_ENHMETAFILE; else - if (strstr(argv[7].strptr,"BITMAP")) lStyle |= SS_BITMAP; else - if (strstr(argv[7].strptr,"ICON")) lStyle |= SS_ICON; + if (strstr(argv[7].strptr,"METAFILE")) lStyle |= SS_ENHMETAFILE; + else if (strstr(argv[7].strptr,"BITMAP")) lStyle |= SS_BITMAP; + else lStyle |= SS_ICON; if (strstr(argv[7].strptr,"NOTIFY")) lStyle |= SS_NOTIFY; if (strstr(argv[7].strptr,"CENTERIMAGE")) lStyle |= SS_CENTERIMAGE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-10-19 00:27:42
|
Revision: 3576 http://oorexx.svn.sourceforge.net/oorexx/?rev=3576&view=rev Author: miesfeld Date: 2008-10-19 00:27:36 +0000 (Sun, 19 Oct 2008) Log Message: ----------- Fix a logic error in two of the dialog init methods that has existed for some time, but had been masked. A change in the 4.0.0 ooDialog code uncovered it. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/pludlg.cls main/trunk/extensions/platform/windows/oodialog/userdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/pludlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/pludlg.cls 2008-10-19 00:21:50 UTC (rev 3575) +++ main/trunk/extensions/platform/windows/oodialog/pludlg.cls 2008-10-19 00:27:36 UTC (rev 3576) @@ -48,15 +48,18 @@ /* This class extends the 'PlainBaseDialog' class */ ::class 'PlainUserDialog' subclass PlainBaseDialog public inherit DynamicDialog - /* The init method */ -::method Init +::method init use arg DlgData., includeFile - if arg() >= 2 then ret = self~init:super(0, 0, DlgData., includeFile) - else ret = self~init:super(0, 0, DlgData.) + newArgs = .array~new(2) + newArgs[1] = 0 + newArgs[2] = 0 + if arg(1, 'E') then newArgs[3] = dlgData. + if Arg(2, 'E') then newArgs[4] = includeFile + forward class (super) arguments (newArgs) continue - if ret = 0 then forward message "DynamicInit" - else return ret + if result = 0 then forward message "DynamicInit" + else return result ::method StopIt forward class (super) continue Modified: main/trunk/extensions/platform/windows/oodialog/userdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/userdlg.cls 2008-10-19 00:21:50 UTC (rev 3575) +++ main/trunk/extensions/platform/windows/oodialog/userdlg.cls 2008-10-19 00:27:36 UTC (rev 3576) @@ -49,17 +49,19 @@ /* This class extends the 'BaseDialog' class */ ::class 'UserDialog' subclass BaseDialog public inherit DynamicDialog - /* The init method */ -::method Init - select - when Arg() >= 2 then InitRet = self~init:super(0, 0, Arg(1),Arg(2)) - when Arg() == 1 then InitRet = self~init:super(0, 0, Arg(1)) - otherwise InitRet = self~init:super - end +::method init + use arg DlgData., includeFile - if InitRet = 0 then forward message "DynamicInit" - else return InitRet + newArgs = .array~new(2) + newArgs[1] = 0 + newArgs[2] = 0 + if arg(1, 'E') then newArgs[3] = dlgData. + if Arg(2, 'E') then newArgs[4] = includeFile + forward class (super) arguments (newArgs) continue + if result = 0 then forward message "DynamicInit" + else return result + ::method StopIt forward class (super) continue forward message "StopDynamic" continue This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-11-05 18:08:34
|
Revision: 3655 http://oorexx.svn.sourceforge.net/oorexx/?rev=3655&view=rev Author: miesfeld Date: 2008-11-05 18:08:28 +0000 (Wed, 05 Nov 2008) Log Message: ----------- Fix bug in isChecked() method of the Menu class in ooDialog Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/Menu.cls main/trunk/extensions/platform/windows/oodialog/Menu.cpp Modified: main/trunk/extensions/platform/windows/oodialog/Menu.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/Menu.cls 2008-11-03 20:23:10 UTC (rev 3654) +++ main/trunk/extensions/platform/windows/oodialog/Menu.cls 2008-11-05 18:08:28 UTC (rev 3655) @@ -409,7 +409,7 @@ itemID = self~resolveItemID(itemID, byPosition) if itemID == -1 then return -1 - return GetMII("STATE", self~hMenu, itemID, byPosition) + return GetMII("ISTATE", self~hMenu, itemID, byPosition) ::method getType use strict arg itemID, byPosition = .false Modified: main/trunk/extensions/platform/windows/oodialog/Menu.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/Menu.cpp 2008-11-03 20:23:10 UTC (rev 3654) +++ main/trunk/extensions/platform/windows/oodialog/Menu.cpp 2008-11-05 18:08:28 UTC (rev 3655) @@ -1159,7 +1159,7 @@ mii.cbSize = sizeof(MENUITEMINFO); - if ( strcmp(argv[0].strptr, "STATE") == 0 ) /* Get the state of a menu item. */ + if ( strcmp(argv[0].strptr, "ISTATE") == 0 ) /* Get the state of a menu item. */ { mii.fMask = MIIM_STATE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-11-07 17:08:45
|
Revision: 3661 http://oorexx.svn.sourceforge.net/oorexx/?rev=3661&view=rev Author: miesfeld Date: 2008-11-07 17:08:32 +0000 (Fri, 07 Nov 2008) Log Message: ----------- Take a different approach to checking for null handles / null pointers in ooDialog. Try to ensure that exactly 0 is returned for null. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-11-07 16:11:45 UTC (rev 3660) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-11-07 17:08:32 UTC (rev 3661) @@ -80,7 +80,7 @@ ctrlobj = class~new(self, id, category) end - if ctrlobj~hwnd = 0 | ctrlobj~hwnd~substr(3) = 0 then + if ctrlobj~hwnd = 0 then return .nil else return ctrlobj @@ -399,24 +399,29 @@ ::method new class use arg pdialog, id, category - Forward Class(Super) continue /* this also calls Init */ + + -- Before this returns, the object init() method will have been invoked. If + -- there are args, then init() will have resolved id to a numeric resource + -- id. + Forward Class(Super) continue obj = result if obj \= .Nil then do - obj~Hwnd = '0x00000000' -- Signal hwnd is not assigned yet. + obj~Hwnd = 0 -- Signal hwnd is not assigned yet. + if Arg() = 0 then do obj~init_WindowBase obj~oDlg = .nil obj~Id = 0 return obj end - else do - parse value GetDialogFactor() with x y - obj~FactorX=x - obj~FactorY=Y - end - if obj~id = -1 then return .Nil + if obj~id = -1 then return .nil + + parse value GetDialogFactor() with x y + obj~FactorX=x + obj~FactorY=Y + if Arg(3,'o') = 1 | category = 0 then do obj~hDlg = pDialog~DlgHandle obj~AssignWindow(pDialog~GetItem(id)) @@ -440,7 +445,7 @@ ::method AssignWindow use arg hwnd, parent, category self~Hwnd = hwnd - if hwnd = 0 | hwnd~substr(3) = 0 then return 0 + if hwnd = 0 then return 0 parse value Wnd_Desktop("RECT", hwnd) with x y cx cy self~SizeX = (cx - x) % self~FactorX self~SizeY = (cy - y) % self~FactorY @@ -605,20 +610,20 @@ ::method Modify use arg hItem, text = "", image = (-1), selImage = (-1), state = "", children = (-1) if arg(1, 'O') then hItem = self~Selected - if hitem~substr(3) = 0 then return -1 + if hitem = 0 then return -1 return HandleTreeCtrl("SET", self~Hwnd, hItem, text, image, state~translate, children, selImage) ::method ItemInfo use arg hItem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 ret = HandleTreeCtrl("GET", self~Hwnd, hItem, "InternalTVItemInfo") return InternalTVItemInfo. ::method MoveItem use arg hItem, hNewParent, redraw = 1, extended = "" - if arg(1, 'O') | hItem~substr(3) = 0 then return 0 - if arg(2, 'O') | hNewParent~substr(3) = 0 then return 0 + if arg(1, 'O') | hItem = 0 then return 0 + if arg(2, 'O') | hNewParent = 0 then return 0 extended = extended~translate if hItem = hNewParent | hNewParent = self~Parent(hItem) | self~IsAncestor(hItem, hNewParent) = 1 then return 0 @@ -626,11 +631,11 @@ newRoot = self~Insert(hNewParent,,iinfo.!Text, iinfo.!Image, iinfo.!SelectedImage, iinfo.!State, iinfo.!Children) if iinfo.!Children = 1 then do child = self~Child(hItem) - if child~substr(3) \= 0 then self~MoveItem(child, newRoot, 0, "SIBLINGS") + if child \= 0 then self~MoveItem(child, newRoot, 0, "SIBLINGS") end if extended = "SIBLINGS" then do sibling = self~next(hItem) - do while sibling~substr(3) \= 0 + do while sibling \= 0 self~MoveItem(sibling, hNewParent, 0, "NODELETE") oldsib = sibling sibling = self~next(sibling) @@ -644,11 +649,11 @@ ::method IsAncestor use arg hParent, hItem - if arg(1, 'O') | hParent~substr(3) = 0 then return 0 - if arg(2, 'O') | hItem~substr(3) = 0 then return 0 + if arg(1, 'O') | hParent = 0 then return 0 + if arg(2, 'O') | hItem = 0 then return 0 if hItem = hParent then return 0 act = self~Parent(hItem) - do while act~substr(3) \= 0 & act \= hParent + do while act \= 0 & act \= hParent act = self~Parent(act) end if act = hParent then return 1 @@ -666,12 +671,12 @@ ::method Parent use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "PARENT") ::method Child use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "CHILD") ::method Selected @@ -685,27 +690,27 @@ ::method Next use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "NEXT") ::method NextVisible use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "NEXTVISIBLE") ::method Previous use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "PREVIOUS") ::method PreviousVisible use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("GETHND", self~Hwnd, hitem, "PREVIOUSVISIBLE") ::method Delete use arg hItem - if arg(1, 'O') | hItem~substr(3) = 0 | (\ hItem~substr(3)~datatype("W")) then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("DEL",self~hwnd, item) ::method DeleteAll @@ -713,27 +718,27 @@ ::method Collapse use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("EXPAND", self~Hwnd, hitem, "COLLAPSE") ::method CollapseAndReset use arg hitem - if arg(1,'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("EXPAND", self~Hwnd, hitem, "COLLAPSE RESET") ::method Expand use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("EXPAND", self~Hwnd, hitem, "EXPAND") ::method Toggle use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("EXPAND", self~Hwnd, hitem, "TOGGLE") ::method EnsureVisible use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("ENVIS", self~Hwnd, hitem) ::method Indent @@ -746,7 +751,7 @@ ::method Edit use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("EDIT", self~Hwnd, hitem) ::method EndEdit @@ -762,12 +767,12 @@ ::method Select use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("SEL", self~Hwnd, hitem, "") ::method MakeFirstVisible use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("SEL", self~Hwnd, hitem, "FIRSTVIS") ::method DropHighlight @@ -782,7 +787,7 @@ ::method SortChildren use arg hitem - if arg(1, 'O') | hItem~substr(3) = 0 then return -1 + if arg(1, 'O') | hItem = 0 then return -1 return HandleTreeCtrl("SORT", self~Hwnd, hitem, 0) /* recursive not yet supported */ ::method SetImages Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-11-07 16:11:45 UTC (rev 3660) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-11-07 17:08:32 UTC (rev 3661) @@ -753,7 +753,7 @@ if (cursy > yl) then cursy = yl hwnd = self~GetItem(id) - if hwnd~substr(3) = 0 then return -1 + if hwnd = 0 then return -1 parse value self~GetWindowRect(hwnd) with r.left r.top r.right r.bottom r.right = r.right - r.left Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-11-07 16:11:45 UTC (rev 3660) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-11-07 17:08:32 UTC (rev 3661) @@ -117,7 +117,14 @@ void pointer2string(char *result, void *pointer) { - sprintf(result, "0x%p", pointer); + if ( pointer == NULL ) + { + sprintf(result, "0"); + } + else + { + sprintf(result, "0x%p", pointer); + } } @@ -1747,13 +1754,13 @@ hW = GetDlgItem(hD, atoi(argv[1].strptr)); - if (hW) + if (hW == NULL) { - RETHANDLE(hW); + RETC(0); } else { - RETC(0); + RETHANDLE(hW); } } else if (!strcmp(argv[0].strptr, "STOP")) /* Stop a dialog */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-12-04 22:16:00
|
Revision: 3749 http://oorexx.svn.sourceforge.net/oorexx/?rev=3749&view=rev Author: miesfeld Date: 2008-12-04 22:11:50 +0000 (Thu, 04 Dec 2008) Log Message: ----------- Add the .Size utility class to ooDialog. I was originally trying to use the .Point class for both point and size objects, but the semantics is not good. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-04 04:57:18 UTC (rev 3748) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-04 22:11:50 UTC (rev 3749) @@ -3145,10 +3145,10 @@ if ( RectClass != NULL ) { RexxArrayObject args = context->NewArray(4); - context->ArrayAppend(args, context->WholeNumberToObject(l)); - context->ArrayAppend(args, context->WholeNumberToObject(t)); - context->ArrayAppend(args, context->WholeNumberToObject(r)); - context->ArrayAppend(args, context->WholeNumberToObject(b)); + context->ArrayAppend(args, context->WholeNumber(l)); + context->ArrayAppend(args, context->WholeNumber(t)); + context->ArrayAppend(args, context->WholeNumber(r)); + context->ArrayAppend(args, context->WholeNumber(b)); rect = context->SendMessage(RectClass, "NEW", args); } @@ -3170,11 +3170,31 @@ RexxClassObject PointClass = context->FindContextClass("POINT"); if ( PointClass != NULL ) { - point = context->SendMessage2(PointClass, "NEW", context->WholeNumberToObject(x), context->WholeNumberToObject(y)); + point = context->SendMessage2(PointClass, "NEW", context->WholeNumber(x), context->WholeNumber(y)); } return point; } +PSIZE rxGetSize(RexxMethodContext *context, RexxObjectPtr s, int argPos) +{ + if ( requiredClass(context, s, "Size", argPos) ) + { + return (PSIZE)context->ObjectToCSelf(s); + } + return NULL; +} + +RexxObjectPtr rxNewSize(RexxMethodContext *context, long cx, long cy) +{ + RexxObjectPtr size = NULL; + RexxClassObject SizeClass = context->FindContextClass("SIZE"); + if ( SizeClass != NULL ) + { + size = context->SendMessage2(SizeClass, "NEW", context->WholeNumber(cx), context->WholeNumber(cy)); + } + return size; +} + inline bool hasStyle(HWND hwnd, DWORD_PTR style) { if ( (GetWindowLongPtr(hwnd, GWL_STYLE) & style) || (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & style) ) @@ -4244,7 +4264,7 @@ SIZE size; if ( Button_GetIdealSize(hwnd, &size) ) { - result = rxNewPoint(context, size.cx, size.cy); + result = rxNewSize(context, size.cx, size.cy); } return (result == NULLOBJECT) ? context->Nil() : result; } @@ -4335,7 +4355,7 @@ void *result = NULL; - PPOINT pSize = rxGetPoint(context, size, 2); + PSIZE pSize = rxGetSize(context, size, 2); if ( pSize == NULL ) { return result; @@ -4365,7 +4385,7 @@ biml.uAlign = argumentExists(5) ? align : BUTTON_IMAGELIST_ALIGN_CENTER; - HIMAGELIST himl = ImageList_Create(pSize->x, pSize->y, flag, 5, 5); + HIMAGELIST himl = ImageList_Create(pSize->cx, pSize->cy, flag, 5, 5); if ( himl == NULL ) { oodSetSysErrCode(context); @@ -4438,7 +4458,7 @@ POINT *p = (POINT *)context->BufferData(obj); p->x = argumentExists(1) ? x : 0; - p->y = argumentExists(2) ? y : p->x; + p->y = argumentExists(2) ? y : 0; return NULLOBJECT; } @@ -4449,6 +4469,27 @@ RexxMethod2(RexxObjectPtr, point_setY, CSELF, p, int32_t, y) { ((POINT *)p)->y = y; return NULLOBJECT; } /** + * Methods for the ooDialog .Size class. + */ +RexxMethod2(RexxObjectPtr, size_init, OPTIONAL_int32_t, cx, OPTIONAL_int32_t, cy) +{ + RexxBufferObject obj = context->NewBuffer(sizeof(SIZE)); + context->SetObjectVariable("CSELF", obj); + + SIZE *s = (SIZE *)context->BufferData(obj); + + s->cx = argumentExists(1) ? cx : 0; + s->cy = argumentExists(2) ? cy : 0; + + return NULLOBJECT; +} + +RexxMethod1(int32_t, size_cx, CSELF, s) { return ((SIZE *)s)->cx; } +RexxMethod1(int32_t, size_cy, CSELF, s) { return ((SIZE *)s)->cy; } +RexxMethod2(RexxObjectPtr, size_setCX, CSELF, s, int32_t, cx) { ((SIZE *)s)->cx = cx; return NULLOBJECT; } +RexxMethod2(RexxObjectPtr, size_setCY, CSELF, s, int32_t, cy) { ((SIZE *)s)->cy = cy; return NULLOBJECT; } + +/** * Methods for the ooDialog .Rect class. */ RexxMethod4(RexxObjectPtr, rect_init, OPTIONAL_int32_t, left, OPTIONAL_int32_t, top, @@ -4460,9 +4501,9 @@ RECT *r = (RECT *)context->BufferData(obj); r->left = argumentExists(1) ? left : 0; - r->top = argumentExists(2) ? top : r->left; - r->right = argumentExists(3) ? right : r->left; - r->bottom = argumentExists(4) ? bottom : r->left; + r->top = argumentExists(2) ? top : 0; + r->right = argumentExists(3) ? right : 0; + r->bottom = argumentExists(4) ? bottom : 0; return NULLOBJECT; } Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-04 04:57:18 UTC (rev 3748) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-04 22:11:50 UTC (rev 3749) @@ -2197,6 +2197,12 @@ REXX_METHOD_PROTOTYPE(point_y); REXX_METHOD_PROTOTYPE(point_setY); +REXX_METHOD_PROTOTYPE(size_init); +REXX_METHOD_PROTOTYPE(size_cx); +REXX_METHOD_PROTOTYPE(size_setCX); +REXX_METHOD_PROTOTYPE(size_cy); +REXX_METHOD_PROTOTYPE(size_setCY); + RexxMethodEntry oodialog_methods[] = { REXX_METHOD(dlgutil_init, dlgutil_init), REXX_METHOD(dlgutil_comctl32Version, dlgutil_comctl32Version), @@ -2254,6 +2260,11 @@ REXX_METHOD(point_setX, point_setX), REXX_METHOD(point_y, point_y), REXX_METHOD(point_setY, point_setY), + REXX_METHOD(size_init, size_init), + REXX_METHOD(size_cx, size_cx), + REXX_METHOD(size_setCX, size_setCX), + REXX_METHOD(size_cy, size_cy), + REXX_METHOD(size_setCY, size_setCY), REXX_LAST_METHOD() }; Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2008-12-04 04:57:18 UTC (rev 3748) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2008-12-04 22:11:50 UTC (rev 3749) @@ -76,6 +76,12 @@ ::method y external "LIBRARY oodialog point_y" ::method 'y=' external "LIBRARY oodialog point_setY" +::class 'Size' public +::method init external "LIBRARY oodialog size_init" +::method width external "LIBRARY oodialog size_cx" +::method 'width=' external "LIBRARY oodialog size_setCX" +::method height external "LIBRARY oodialog point_y" +::method 'height=' external "LIBRARY oodialog point_setY" /******************************************************************************/ /* The class WindowBase implements methods that are common to all windows, */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-12-07 06:48:07
|
Revision: 3761 http://oorexx.svn.sourceforge.net/oorexx/?rev=3761&view=rev Author: miesfeld Date: 2008-12-07 06:48:01 +0000 (Sun, 07 Dec 2008) Log Message: ----------- Get the button control setImageList() method ready for release. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-06 21:02:23 UTC (rev 3760) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-07 06:48:01 UTC (rev 3761) @@ -1710,6 +1710,7 @@ ::method "style=" external "LIBRARY oodialog gb_setStyle" ::class 'ButtonControl' subclass DialogControl public +::method releaseImageList class external "LIBRARY oodialog bc_cls_releaseImageList" ::constant BUTTON_IMAGELIST_ALIGN_LEFT 0 ::constant BUTTON_IMAGELIST_ALIGN_RIGHT 1 Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-06 21:02:23 UTC (rev 3760) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-07 06:48:01 UTC (rev 3761) @@ -3697,6 +3697,22 @@ return type; } +/** ButtonControl::releaseImageList() [class method] + * + * Used to destroy an image list. + * + * @param himl [required] The image list handle. + * + */ +RexxMethod1(RexxObjectPtr, bc_cls_releaseImageList, POINTER, himl) +{ + if ( himl != NULL ) + { + ImageList_Destroy((HIMAGELIST)himl); + } + return NULLOBJECT; +} + RexxMethod4(int, bc_cls_checkInGroup, RexxObjectPtr, dlg, RexxObjectPtr, idFirst, RexxObjectPtr, idLast, RexxObjectPtr, idCheck) { @@ -4367,88 +4383,60 @@ return result; } -/** - * Sets an image list for the button. - * - * @return The handle to the image list used for BUTTON_IMAGELIST struct. - * - * This method sets the ooDialog System error code (.SystemErrorCode). - * - * @note This method is intended to accept either a .ImageList object, or an - * array of files names, to use for the button image list. Since the - * .ImageList class has not been added to ooDialog, yet, this code will - * need to be revisited. - */ -RexxMethod6(POINTER, bc_setImageList, OSELF, self, RexxArrayObject, files, - RexxObjectPtr, size, uint32_t, flag, OPTIONAL_RexxObjectPtr, margin, OPTIONAL_uint8_t, align) +static HIMAGELIST getImageListFromObject(RexxMethodContext *context, RexxObjectPtr imageList, int argPos) { - if ( ! requiredComCtl32Version(context, "setImageList", COMCTL32_6_0) ) + /* At this time, it must be a directory object. */ + if ( ! context->IsDirectory(imageList) ) { + wrongClassException(context, argPos, "Directory"); return NULL; } - HWND hwnd = rxGetWindowHandle(context, self); + HIMAGELIST himl = NULL; - oodSetSysErrCode(context, 0); + // Note that size is both the directory entry name and the class name. + RexxObjectPtr size = context->DirectoryAt((RexxDirectoryObject)imageList, "SIZE"); + RexxClassObject rxClass = context->FindContextClass("SIZE"); + if ( size == NULLOBJECT || ! context->IsInstanceOf(size, rxClass) ) + { + goto bad_directory; + } + PSIZE pSize = (PSIZE)context->ObjectToCSelf(size); - void *result = NULL; - - PSIZE pSize = rxGetSize(context, size, 2); - if ( pSize == NULL ) + uint32_t flag; + RexxObjectPtr f = context->DirectoryAt((RexxDirectoryObject)imageList, "FLAGS"); + if ( f == NULLOBJECT || ! context->ObjectToUnsignedInt32(f, &flag) ) { - return result; + goto bad_directory; } - BUTTON_IMAGELIST biml; - - if ( argumentExists(5) ) + f = context->DirectoryAt((RexxDirectoryObject)imageList, "FILES"); + if ( f == NULLOBJECT || ! context->IsArray(f) ) { - PRECT pRect = rxGetRect(context, margin, 4); - if ( pRect == NULL ) - { - return result; - } - biml.margin.top = pRect->top; - biml.margin.left = pRect->left; - biml.margin.right = pRect->right; - biml.margin.bottom = pRect->bottom; + goto bad_directory; } - else + + RexxArrayObject files = (RexxArrayObject)f; + int count = (int)context->ArraySize(files); + if ( count < 1 ) { - biml.margin.top = 3; - biml.margin.left = 3; - biml.margin.right = 3; - biml.margin.bottom = 3; + goto bad_directory; } - biml.uAlign = argumentExists(6) ? align : BUTTON_IMAGELIST_ALIGN_CENTER; - - HIMAGELIST himl = ImageList_Create(pSize->cx, pSize->cy, flag, 5, 5); + himl = ImageList_Create(pSize->cx, pSize->cy, flag, count, count); if ( himl == NULL ) { oodSetSysErrCode(context); - return result; + goto winapi_failed; } - size_t count = context->ArraySize(files); - if ( count != 1 && count != 5 ) - { - context->RaiseException1( - Rexx_Error_Incorrect_method_user_defined, - context->NewStringFromAsciiz("The bitmap files array must contain exactly 1 or 5 file names")); - return NULL; - } - HANDLE hBitmap; - for ( size_t i = 1; i <= count; i++ ) + for ( int i = 1; i <= count; i++ ) { - RexxObjectPtr f = context->ArrayAt(files, i); + f = context->ArrayAt(files, i); if ( f == NULLOBJECT || ! context->IsString(f) ) { - context->RaiseException1( - Rexx_Error_Incorrect_method_array_nostring, - context->WholeNumberToObject(i + 1)); - return NULL; + goto bad_directory; } const char *file = context->ObjectToStringValue(f); @@ -4458,15 +4446,118 @@ if ( hBitmap == NULL ) { oodSetSysErrCode(context); - ImageList_Destroy(himl); - return NULL; + goto winapi_failed; } + // REVISIT ImageList_ADD() returns -1 if the add fails, should we quit, + // throw an exception, or just continue? + // + // One problem is that last error is not set, so oodSetSysErrCode() does + // nothing to give the user a clue as to what the problem is. If we just + // continue, then the user will not get bitmaps at the right indexes, if + // only one or two add fails. Or get no bitmaps if they all fail. But, + // will not have a clue that there was problem. An execption would at + // least let him know where the problem is. ImageList_Add(himl, (HBITMAP)hBitmap, NULL); DeleteObject(hBitmap); } + return himl; +bad_directory: + char msg[256]; + _snprintf(msg, sizeof(msg), + "The Directory object, method argument %d, does not have the proper entries", argPos); + context->RaiseException1(Rexx_Error_Incorrect_method_user_defined, context->String(msg)); + +winapi_failed: + if ( himl != NULL ) + { + ImageList_Destroy(himl); + } + return NULL; +} + +/** ButtonControl::setImageList() + * + * Sets an image list for the button. + * + * @param imageList [required] An object describing the image list. Curently + * this must be a .Directory object with the format + * described below. A future enhancement is to allow a + * .ImageList, but that class is not yet implemented. + * + * @param margin [optional] A .Rect object containing the margins around + * the image. + * + * @param align [optional] One of the BUTTON_IMAGELIST_ALIGN_xxx + * constant values. + * + * @return A .Pointer object containing the handle to the image list used in + * the BUTTON_IMAGELIST struct. This will be a null .Pointer on a + * Win32 API error. + * + * @remarks This method sets the ooDialog System error code (.SystemErrorCode) + * if the args seem valid but one of the Windows APIs fails. + * + * @note This method is intended to accept either a .ImageList object, or the + * current .Directory object. Since the .ImageList class has not been + * added to ooDialog, yet, it currently only accepts the .Directory + * object. + * + * .Directory object format to create the image list: + * d~files -> an array of file names + * The array must contain index 1 and any item 1 through 6 must be a string. + * The count of files in the array can be any number, but only the first 6 + * are used. For any number of items in the the array must not be sparse. + * Otherwise no restrictions. + * + * Note that in the BCM_SETIMAGELIST MSDN doc, the enum PUSHBUTTONSTATES in + * the remarks section perfectly names the ooRexx indexes. + * + * d~size -> a .Size object + * The bitmap dimensions. + * + * d~flags -> a number This is the ILC_ flags for ImageList_Create(), the + * user will need to figure out the correct number. ILC_COLOR24 is 0x18 (24 + * decimal for instance.) + */ +RexxMethod4(POINTER, bc_setImageList, RexxObjectPtr, imageList, OPTIONAL_RexxObjectPtr, margin, + OPTIONAL_uint8_t, align, OSELF, self) +{ + if ( ! requiredComCtl32Version(context, "setImageList", COMCTL32_6_0) ) + { + return NULLOBJECT; + } + + oodSetSysErrCode(context, 0); + + HWND hwnd = rxGetWindowHandle(context, self); + + HIMAGELIST himl = getImageListFromObject(context, imageList, 1); + if ( himl == NULL ) + { + return NULLOBJECT; + } + + BUTTON_IMAGELIST biml = {0}; biml.himl = himl; + + if ( argumentExists(2) ) + { + PRECT pRect = rxGetRect(context, margin, 2); + if ( pRect == NULL ) + { + return NULLOBJECT; + } + biml.margin.top = pRect->top; + biml.margin.left = pRect->left; + biml.margin.right = pRect->right; + biml.margin.bottom = pRect->bottom; + } + + biml.uAlign = argumentExists(3) ? align : BUTTON_IMAGELIST_ALIGN_CENTER; + + void *result = NULL; if ( Button_SetImageList(hwnd, &biml) ) { result = himl; @@ -4694,15 +4785,18 @@ return true; } -/** - * This is the .DlgUtil class init() method. It executes when the .DlgUtil - * class is constructed, which is done during the processing of the ::requires - * directive for oodPlain.cls. This makes it the ideal place for any - * initialization that must be done prior to ooDialog starting. +/** DlgUtil::init() [class method] * + * The .DlgUtil class init() method. It executes when the .DlgUtil class is + * constructed, which is done during the processing of the ::requires directive + * for oodPlain.cls. This makes it the ideal place for any initialization that + * must be done prior to ooDialog starting. + * * Note that an exception raised here effectively terminates ooDialog before any * user code is executed. * + * The method: + * * 1.) Determines the version of comctl32.dll and initializes the common * controls. The minimum acceptable version of 4.71 is supported on Windows 95 * with Internet Explorer 4.0, Windows NT 4.0 with Internet Explorer 4.0, Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-06 21:02:23 UTC (rev 3760) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-07 06:48:01 UTC (rev 3761) @@ -2157,6 +2157,7 @@ REXX_METHOD_PROTOTYPE(pbc_setBarColor); REXX_METHOD_PROTOTYPE(pbc_test); +REXX_METHOD_PROTOTYPE(bc_cls_releaseImageList); REXX_METHOD_PROTOTYPE(bc_cls_checkInGroup); REXX_METHOD_PROTOTYPE(gb_setStyle); REXX_METHOD_PROTOTYPE(bc_getState); @@ -2224,6 +2225,7 @@ REXX_METHOD(pbc_setBkColor, pbc_setBkColor), REXX_METHOD(pbc_setBarColor, pbc_setBarColor), REXX_METHOD(pbc_test, pbc_test), + REXX_METHOD(bc_cls_releaseImageList, bc_cls_releaseImageList), REXX_METHOD(bc_cls_checkInGroup, bc_cls_checkInGroup), REXX_METHOD(bc_getState, bc_getState), REXX_METHOD(bc_setState, bc_setState), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-12-09 00:57:30
|
Revision: 3772 http://oorexx.svn.sourceforge.net/oorexx/?rev=3772&view=rev Author: miesfeld Date: 2008-12-09 00:57:24 +0000 (Tue, 09 Dec 2008) Log Message: ----------- Use hiWord / loWord instead of BinaryAnd in ooDialog classes Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/dlgarea.cls main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/propsht.cls Modified: main/trunk/extensions/platform/windows/oodialog/dlgarea.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgarea.cls 2008-12-09 00:39:15 UTC (rev 3771) +++ main/trunk/extensions/platform/windows/oodialog/dlgarea.cls 2008-12-09 00:57:24 UTC (rev 3772) @@ -386,8 +386,8 @@ /* ------------------------------------------------------------------------- */ expose DlgObjList use arg dlg,data - dlg~SizeX = binaryand(data, "0x0000FFFF") % dlg~FactorX - dlg~SizeY = binaryand(data, "0xFFFF0000") % X2D("FFFF") % dlg~FactorY + dlg~SizeX = .DlgUtil~loWord(data) % dlg~FactorX + dlg~SizeY = .DlgUtil~hiWord(data) % dlg~FactorY wFactor = (dlg~SizeX / self~OriginalWidth ) * Self~CorrectionFactor hFactor = (dlg~SizeY / self~OriginalHeight) * Self~CorrectionFactor Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-09 00:39:15 UTC (rev 3771) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-09 00:57:24 UTC (rev 3772) @@ -243,7 +243,7 @@ use arg id, posdata, single, page if Arg(3,"o") = 1 then single = 1 if Arg(4,"o") = 1 then page = 10 - code = BinaryAnd(posdata, 0x0000FFFF) + code = .DlgUtil~loWord(posdata) parse value self~GetSBRange(id) with rmin rmax pos = self~GetSBPos(id) select @@ -256,9 +256,9 @@ /* page down */ when code = 3 then pos = min(rmax,pos + page) /* track position */ - when code = 4 then pos = BinaryAnd(posdata, 0xFFFF0000) % X2D("10000") + when code = 4 then pos = .DlgUtil~hiWord(posdata) /* tracking */ - when code = 5 then pos = BinaryAnd(posdata, 0xFFFF0000) % X2D("10000") + when code = 5 then pos = .DlgUtil~hiWord(posdata) /* top */ when code = 6 then pos = rmin /* bottom */ Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-09 00:39:15 UTC (rev 3771) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-09 00:57:24 UTC (rev 3772) @@ -4719,7 +4719,7 @@ /** * Methods for the ooDialog .Size class. */ -RexxMethod2(RexxObjectPtr, size_init, OPTIONAL_int32_t, cx, OPTIONAL_int32_t, cy) +RexxMethod2(RexxObjectPtr, size_init, OPTIONAL_int32_t, cx, OPTIONAL_int32_t, cy) { RexxBufferObject obj = context->NewBuffer(sizeof(SIZE)); context->SetObjectVariable("CSELF", obj); Modified: main/trunk/extensions/platform/windows/oodialog/propsht.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/propsht.cls 2008-12-09 00:39:15 UTC (rev 3771) +++ main/trunk/extensions/platform/windows/oodialog/propsht.cls 2008-12-09 00:57:24 UTC (rev 3772) @@ -146,7 +146,7 @@ ::method PropSheetActivated use arg wP, lp if Arg() = 0 then code = 0 - else code = BinaryAnd(wp, "0x0000FFFF") + else code = .DlgUtil~loWord(wp) if code \= 0 then do self~Update wnd = .DialogControl~new This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-12-11 04:02:16
|
Revision: 3791 http://oorexx.svn.sourceforge.net/oorexx/?rev=3791&view=rev Author: miesfeld Date: 2008-12-11 04:02:14 +0000 (Thu, 11 Dec 2008) Log Message: ----------- Some non-essential cleanup. Call the active pointer activePtr instead of AktPtr so it is more obvious what it is. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/catdlg.cls main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/propsht.cls Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-11 04:02:14 UTC (rev 3791) @@ -306,7 +306,7 @@ if Arg(2,'o') = 1 then attname = "DATA"id opts = self~GetDefaultOpts(opts) if opts = "ALL" then opts = "LINES VSCROLL HSCROLL EDIT BUTTONS ATROOT SHOWSELALWAYS" - self~AktPtr = UsrAddNewCtrl("TREE", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("TREE", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do self~ConnectTreeControl(symbid, attname) end @@ -319,7 +319,7 @@ if id < 0 then return id if Arg(2,'o') = 1 then attname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("LIST", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("LIST", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do self~ConnectListControl(symbid, attname) end @@ -330,7 +330,7 @@ id = self~ItemAdd(id) if id < 0 then return id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("PROGRESS", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("PROGRESS", self~activePtr, id, x, y, cx, cy, opts) ::method AddSliderControl @@ -340,7 +340,7 @@ if id < 0 then return id if Arg(2,'o') = 1 then attname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("SLIDER", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("SLIDER", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do self~ConnectSliderControl(symbid, attname) end @@ -353,7 +353,7 @@ if id < 0 then return id if Arg(2,'o') = 1 then attname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("TAB", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("TAB", self~activePtr, id, x, y, cx, cy, opts) if opts~wordpos("CAT") = 0 & self~AutoDetect = 1 then do self~ConnectTabControl(symbid, attname) end @@ -366,7 +366,7 @@ if id < 0 then return id if Arg(2, 'O') then attname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("DTP", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("DTP", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do self~ConnectDateTimePicker(symbid, attname) end @@ -379,7 +379,7 @@ if id < 0 then return id if Arg(2, 'O') then attname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddNewCtrl("MONTH", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddNewCtrl("MONTH", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do self~ConnectMonthCalendar(symbid, attname) end Modified: main/trunk/extensions/platform/windows/oodialog/catdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2008-12-11 04:02:14 UTC (rev 3791) @@ -233,7 +233,7 @@ end self~DlgHandle = UsrCreateDialog(self~Adm, "PARENT", self~DialogItemCount, 0, self~BasePtr, self~AutoDetect, 1, 0, 0) - self~AktPtr = 0 + self~activePtr = 0 if self~DlgHandle = 0 then return 0 do i = 1 to self~catalog['count'] @@ -244,7 +244,7 @@ msg = "self~" || self~catalog['names'][i]~space(0) interpret(msg) ret = UsrCreateDialog(self~Adm, "CHILD", self~DialogItemCount, self~catalog['base'][i], self~DlgHandle, i) - self~AktPtr = 0 + self~activePtr = 0 self~catalog['handles'][i] = ret end @@ -297,7 +297,7 @@ parse var ret base Ptr self~catalog['base'][self~catalog['category']] = base - self~AktPtr = Ptr + self~activePtr = Ptr return Ptr /* */ Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-11 04:02:14 UTC (rev 3791) @@ -391,7 +391,7 @@ ::method AddBitmapButton use arg id, x, y, cx, cy, text, fnk, bmp, focus, sel, disabl, opts - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 id = self~CheckId(id) if id = -1 then return if Arg(4, 'o') = 1 then cx = 0 @@ -405,7 +405,7 @@ if focus = "" & sel = "" & opts~wordpos("FRAME") = 0 & opts~wordpos("TAB") = 0 then opts = opts || " NOTAB" self~DialogItemCount = self~DialogItemCount + 1 - self~AktPtr = UsrAddControl("BUT", self~AktPtr, id, x, y, cx, cy, text, opts) + self~activePtr = UsrAddControl("BUT", self~activePtr, id, x, y, cx, cy, text, opts) self~ConnectBitmapButton(id, fnk~space(0), bmp, focus, sel, disabl, opts) Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-12-11 04:02:14 UTC (rev 3791) @@ -47,12 +47,12 @@ /* attributes for internal use */ ::method BasePtr attribute protected -::method AktPtr attribute protected +::method activePtr attribute protected ::method DialogItemCount attribute protected ::method DynamicInit private - self~AktPtr = 0 + self~activePtr = 0 self~DialogItemCount = 0 if Arg(1,'o') = 1 then self~UseStem = 0; else self~UseStem = 1 return 0 @@ -84,12 +84,12 @@ options, expected) parse var ret base ptr self~BasePtr = base - self~AktPtr = ptr + self~activePtr = ptr if ptr = 0 then call HandleDlg("STOP") self~SizeX = cx self~SizeY = cy self~DefineDialog - return ptr /* self~AktPtr could have been set to 0 for a CategoryDialog */ + return ptr /* self~activePtr could have been set to 0 for a CategoryDialog */ /* This method will create the dialog and place it in a centered position */ /* See 'Create' for possible 'options' */ @@ -251,7 +251,7 @@ if id < 0 then return opts = self~InternGetRCStyle(style, "BTN") self~DialogItemCount = self~DialogItemCount + 1 - self~AktPtr = UsrAddControl("BUT", self~AktPtr, id, x, y, w, h, name, opts) + self~activePtr = UsrAddControl("BUT", self~activePtr, id, x, y, w, h, name, opts) if lOpts~wordpos("CONNECTBUTTONS") > 0 then self~ConnectButton(id, name~space(0)~changestr('&','')~changestr(':','')) else self~ConnectButton(id) @@ -375,7 +375,7 @@ ::method LoadItems protected use arg resfile, dialogid, loadOptions - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 file = SysSearchPath("PATH",resfile) f = .stream~new(file) @@ -590,7 +590,7 @@ ::method ItemAdd use arg id, staticId - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if Arg(2,'o') = 1 then do id = self~CheckId(id) if id = -1 then return -1 @@ -607,22 +607,22 @@ /* a message that will be rised if the butten is pushed. */ /* argument 'options' can be one of: */ -::method AddButton - use arg id, x, y, cx, cy, text, msgToRise, options - id = self~ItemAdd(id) +::method addButton + use arg id, x, y, cx, cy, text = "", msgToRise, options + id = self~itemAdd(id) if id < 0 then return id - options = self~GetDefaultOpts(options) - self~AktPtr = UsrAddControl("BUT", self~AktPtr, id, x, y, cx, cy, text, options) + options = self~getDefaultOpts(options) + self~activePtr = UsrAddControl("BUT", self~activePtr, id, x, y, cx, cy, text, options) if Arg(7,"o") = 0 then - self~ConnectButton(id, msgToRise~space(0)) + self~connectButton(id, msgToRise~space(0)) -::method AddGroupBox - use arg x, y, cx, cy, text, opts, id +::method addGroupBox + use arg x, y, cx, cy, text = "", opts, id id = self~ItemAdd(id, \(Arg(7,"o") | id = "ID")) if id = -2 then return id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("GB",self~AktPtr, x, y, cx, cy, opts, text, id) + self~activePtr = UsrAddControl("GB",self~activePtr, x, y, cx, cy, opts, text, id) ::method addStatic @@ -662,7 +662,7 @@ id = self~ItemAdd(id) if id < 0 then return id options = self~GetDefaultOpts(options) - self~AktPtr = UsrAddControl("IMG", self~AktPtr, id, x, y, cx, cy, options) + self~activePtr = UsrAddControl("IMG", self~activePtr, id, x, y, cx, cy, options) ::method AddText use arg x, y, cx = 0, cy = 0, text = "", opts = "", id = (-1) @@ -675,7 +675,7 @@ id = self~ItemAdd(id, 1) if id = -2 then return id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("TXT", self~AktPtr, x, y, cx, cy, opts, text, id) + self~activePtr = UsrAddControl("TXT", self~activePtr, x, y, cx, cy, opts, text, id) return 0 ::method AddWhiteRect @@ -710,7 +710,7 @@ if arga~hasindex(6) = 0 then id = self~ItemAdd(-1, 0); else id = self~ItemAdd(arga[6],1) if id = -2 then return id opts = self~GetDefaultOpts(arga[5]) - self~AktPtr = UsrAddControl("FRM", self~AktPtr, arga[1], arga[2], arga[3], arga[4], type, opts, id) + self~activePtr = UsrAddControl("FRM", self~activePtr, arga[1], arga[2], arga[3], arga[4], type, opts, id) return 0 ::method AddEntryLine @@ -725,7 +725,7 @@ cy = cy +4 end opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("EL", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddControl("EL", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then self~ConnectEntryLine(symbid, fname) @@ -743,7 +743,7 @@ if id < 0 then return id if Arg(2,'o') = 1 then fname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("LB", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddControl("LB", self~activePtr, id, x, y, cx, cy, opts) if self~AutoDetect = 1 then do if opts~wordpos("MULTI") > 0 then self~ConnectMultiListBox(symbid, fname) else self~ConnectListBox(symbid, fname) @@ -757,7 +757,7 @@ if id < 0 then return id if Arg(2,'o') = 1 then fname = "DATA"id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("CB", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddControl("CB", self~activePtr, id, x, y, cx, cy, opts) if opts~wordpos("CAT") = 0 & self~AutoDetect = 1 then self~ConnectComboBox(symbid, fname, opts) @@ -775,7 +775,7 @@ if cy = 0 then cy = icy end opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("CH", self~AktPtr, id, x, y, cx, cy, text, opts) + self~activePtr = UsrAddControl("CH", self~activePtr, id, x, y, cx, cy, text, opts) if self~AutoDetect = 1 then self~ConnectCheckBox(symbid, fname) @@ -793,7 +793,7 @@ if cy=0 then cy=icy end opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("RB", self~AktPtr, id, x, y, cx, cy, text, opts) + self~activePtr = UsrAddControl("RB", self~activePtr, id, x, y, cx, cy, text, opts) if opts~wordpos("CAT") = 0 & self~AutoDetect = 1 then self~ConnectRadioButton(symbid, fname) @@ -802,7 +802,7 @@ id = self~ItemAdd(id) if id < 0 then return id opts = self~GetDefaultOpts(opts) - self~AktPtr = UsrAddControl("SB", self~AktPtr, id, x, y, cx, cy, opts) + self~activePtr = UsrAddControl("SB", self~activePtr, id, x, y, cx, cy, opts) ::method AddRadioGroup @@ -818,7 +818,7 @@ ::method InternAddRBCBGroup use arg startid, x, y, cx, inp, opts, idstat, kind - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(startid) = -1 then return if Arg(4, 'o') = 1 then cx = 0 parse var inp rb inp @@ -850,7 +850,7 @@ ::method AddInput use arg id, fname, x, y, cx1, cx2, cy, text, opts, idstat - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(id) = -1 then return if Arg(2,'o') = 1 then fname = text if Arg(5, 'o') = 1 then cx1 = 0 @@ -870,7 +870,7 @@ use arg startid, x, y, cx1, cx2, inp, opts, idstat parse var inp rb inp - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(startid) = -1 then return if Arg(4, 'o') = 1 then cx1 = 0 count = 0; ll = 0 @@ -903,7 +903,7 @@ ::method AddComboInput use arg id, attname, x, y, cx1, cx2, clines, text, opts, idstat - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(id) = -1 then return if Arg(2, 'o') = 1 then attname = text if Arg(5, 'o') = 1 then cx1 = 0 @@ -921,7 +921,7 @@ ::method AddInputStem use arg startid, x, y, cx1, cx2, inp., opts, idstat - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(startid)= -1 then return if Arg(4, 'o') = 1 then cx1 = 0 count = 0; ll = 0 @@ -962,7 +962,7 @@ ::method InternAddRBCBStem private use arg startid, x, y, cxx, inp., max, opts, idstat, fn, fs, kind - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if self~CheckID(startid) = -1 then return if Arg(4, 'o') = 1 then cxx = 0 count = 0; ll = 0 @@ -1020,7 +1020,7 @@ use arg x, y, cx, cy, inp, bottom, opts parse var inp bt bid bfnk newinp - if self~AktPtr = 0 then return -2 + if self~activePtr = 0 then return -2 if Arg(6,"o") = 1 then bottom = 0 if cx = 0 | Arg(3,"o") = 1 then cx = 40 if cy = 0 | Arg(4,"o") = 1 then cy = 12 @@ -1081,7 +1081,7 @@ else modal = 0 end self~DlgHandle = UsrCreateDialog(self~Adm, "PARENT", self~DialogItemCount, 0, self~BasePtr, 0 /* no autodetection */, 1, icon, modal) - self~AktPtr = 0 + self~activePtr = 0 if self~DlgHandle = 0 then return 0 else self~InitDialog return self~DlgHandle Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-12-11 04:02:14 UTC (rev 3791) @@ -627,7 +627,7 @@ { CHECKARG(9); - /* UsrAddControl("BUT", self~AktPtr, id, x, y, w, h, name, opts) */ + /* UsrAddControl("BUT", self~activePtr, id, x, y, w, h, name, opts) */ for ( i = 0; i < 5; i++ ) { buffer[i] = atoi(argv[i+2].strptr); @@ -669,7 +669,7 @@ { CHECKARGL(8); - /* UsrAddControl("GB",self~AktPtr, x, y, cx, cy, opts, text, id) */ + /* UsrAddControl("GB",self~activePtr, x, y, cx, cy, opts, text, id) */ for ( i = 0; i < 4; i++ ) { buffer[i] = atoi(argv[i+2].strptr); @@ -699,7 +699,7 @@ { CHECKARG(8); - /* UsrAddControl("EL", self~AktPtr, id, x, y, cx, cy, opts) */ + /* UsrAddControl("EL", self~activePtr, id, x, y, cx, cy, opts) */ for ( i = 0; i < 5; i++ ) { buffer[i] = atoi(argv[i+2].strptr); @@ -802,7 +802,7 @@ { CHECKARGL(8); - /* UsrAddControl("TXT", self~AktPtr, x, y, cx, cy, opts, text, id) */ + /* UsrAddControl("TXT", self~activePtr, x, y, cx, cy, opts, text, id) */ for ( i = 0; i < 4; i++ ) { buffer[i] = atoi(argv[i+2].strptr); Modified: main/trunk/extensions/platform/windows/oodialog/propsht.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/propsht.cls 2008-12-10 23:41:57 UTC (rev 3790) +++ main/trunk/extensions/platform/windows/oodialog/propsht.cls 2008-12-11 04:02:14 UTC (rev 3791) @@ -86,7 +86,7 @@ self~AddTabControl(9001,,p['x'], p['y'], p['w'], p['h'],self~CatStyle || " CAT CLIPSIBLINGS") self~DlgHandle = UsrCreateDialog(self~Adm, "PARENT", self~DialogItemCount, 0, self~BasePtr, self~AutoDetect, 1, 0, 0) - self~AktPtr = 0 + self~activePtr = 0 if self~DlgHandle = 0 then return 0 do i = 1 to self~catalog['count'] @@ -96,7 +96,7 @@ msg = "self~" || self~catalog['names'][i]~space(0) interpret(msg) ret = UsrCreateDialog(self~Adm, "CHILD", self~DialogItemCount, self~catalog['base'][i], self~DlgHandle, i) - self~AktPtr = 0 + self~activePtr = 0 self~catalog['handles'][i] = ret end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-12-15 06:13:25
|
Revision: 3795 http://oorexx.svn.sourceforge.net/oorexx/?rev=3795&view=rev Author: miesfeld Date: 2008-12-15 06:13:13 +0000 (Mon, 15 Dec 2008) Log Message: ----------- This commit has a number of different ooDialog items: * Restore the instMMFuncs() external function as a nop. * Some general naming / code clean up. * Fix shortcomings in new ooDialog methods that become apparent while documenting / writing samples for them. * Add the .ResourceImage class to help fix shortcomings * Add the .Image class to help fix shortcomings * Redo some new function to better take advantage of the new APIs before documenting them locked us into the old way of doing things. 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/oodialog.rc main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovtools.cpp main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.h 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 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-15 06:13:13 UTC (rev 3795) @@ -1541,20 +1541,14 @@ ::class 'StaticControl' subclass DialogControl public -::method SetIcon - use strict arg hIcon - return SendWinMsg("ANY", self~hwnd, "0x0170", hIcon, 0) -- 0x0170 == STM_SETICON +::method getIcon external "LIBRARY oodialog stc_getIcon" +::method setIcon external "LIBRARY oodialog stc_setIcon" +::method getImage external "LIBRARY oodialog stc_getImage" +::method setImage external "LIBRARY oodialog stc_setImage" +::method getText external "LIBRARY oodialog stc_getText" +::method setText external "LIBRARY oodialog stc_setText" -::method GetIcon - return SendWinMsg("ANY", self~hwnd, "0x0171", "0x0", 0) -- 0x0171 == STM_GETICON -::method SetText - use strict arg text - return HandleControlEx(self~hDlg, self~id, "E", "TXT", text) - -::method GetText - return HandleControlEx(self~hDlg, self~id, "E", "TXT") - /****************************************************** Edit Control Class *********************************************************/ ::class 'EditControl' subclass DialogControl public @@ -1710,7 +1704,7 @@ ::method "style=" external "LIBRARY oodialog gb_setStyle" ::class 'ButtonControl' subclass DialogControl public -::method releaseImageList class external "LIBRARY oodialog bc_cls_releaseImageList" +::method releaseImageList class external "LIBRARY oodialog bc_releaseImageList_cls" ::constant BUTTON_IMAGELIST_ALIGN_LEFT 0 ::constant BUTTON_IMAGELIST_ALIGN_RIGHT 1 @@ -1800,7 +1794,7 @@ ::class 'RadioButton' subclass ButtonControl public -::method checkInGroup class external "LIBRARY oodialog bc_cls_checkInGroup" +::method checkInGroup class external "LIBRARY oodialog bc_checkInGroup_cls" ::method checked external "LIBRARY oodialog bc_checked" ::method isChecked external "LIBRARY oodialog bc_isChecked" @@ -2179,3 +2173,5 @@ ::method setDate use strict arg day, month, year = (date('S')~left(4)) return HandleMonthCalendar(self~hwnd, 'S', 'CUR', day month year) + + Modified: main/trunk/extensions/platform/windows/oodialog/basedlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-15 06:13:13 UTC (rev 3795) @@ -204,23 +204,6 @@ use arg hBitmap return LoadRemoveBitmap(0 /* NULL Adm */, hBitmap, "REMOVE") -::method LoadSysIcon unguarded - use strict arg iconName - return WinAPI32Func('I', 'S', iconName~translate) - -::method LoadIconDirect unguarded - use strict arg iconID, cx = 0, cy = 0, src = 'U' - if \ iconID~isA(.string) then return -1 - if \ iconID~datatype("W") then iconID = self~ResolveSymbolicId(iconID) - if iconID = -1 then return iconID - if src~left(1)~translate == 'D' then src = 'D' - else src = 'U' - return WinAPI32Func('I', 'N', self~adm, iconID, cx, cy, src) - -::method LoadIcon unguarded - use strict arg fileName, cx = 0, cy = 0 - return WinAPI32Func('I', 'F', fileName, cx, cy) - ::method CreateBrush unguarded use arg color, brushSpecifier if Arg() = 0 then return HandleDC_Obj("B") @@ -393,14 +376,6 @@ ret.bottom = b/self~FactorY return ret. - /* create a COLORREF */ -::method RGB /* currently only color indexes are supported by functions using colors */ - use arg red, green, blue - if Arg(1,'o') = 1 then red = 0 - if Arg(2,'o') = 1 then green = 0 - if Arg(3,'o') = 1 then blue = 0 - return (blue*256*256) + (green*256) + red - /** class: BaseDialog * Implements methods that are common to all 3 types of dialogs, ResDialog, * RcDialog, and UserDialog. @@ -420,3 +395,33 @@ self~bkgBrushBmp = 0 -- no background bitmap self~menuBar = .nil return 0 + + +::class 'ResourceImage' public + +::method init external "LIBRARY oodialog ri_init" +::method release external "LIBRARY oodialog ri_release" +::method handle external "LIBRARY oodialog ri_handle" +::method isNull external "LIBRARY oodialog ri_isNull" +::method systemErrorCode external "LIBRARY oodialog ri_systemErrorCode" +::method getImage external "LIBRARY oodialog ri_getImage" + + +::class 'Image' public + +::method init class external "LIBRARY oodialog image_init_cls" +::method id class external "LIBRARY oodialog image_id_cls" +::method getImage class external "LIBRARY oodialog image_getImage_cls" +::method saveImage class private external "LIBRARY oodialog image_saveImage_cls" +::method removeImage class private external "LIBRARY oodialog image_removeImage_cls" + +::method colorRef class external "LIBRARY oodialog image_colorRef_cls" +::method getRValue class external "LIBRARY oodialog image_getRValue_cls" +::method getGValue class external "LIBRARY oodialog image_getGValue_cls" +::method getBValue class external "LIBRARY oodialog image_getBValue_cls" + +::method init external "LIBRARY oodialog image_init" +::method handle external "LIBRARY oodialog image_handle" +::method isNull external "LIBRARY oodialog image_isNull" +::method systemErrorCode external "LIBRARY oodialog image_systemErrorCode" +::method assignImage private external "LIBRARY oodialog image_assignImage" Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2008-12-15 06:13:13 UTC (rev 3795) @@ -1108,4 +1108,3 @@ NUMERIC DIGITS d end - Modified: main/trunk/extensions/platform/windows/oodialog/oodialog.rc =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodialog.rc 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oodialog.rc 2008-12-15 06:13:13 UTC (rev 3795) @@ -65,7 +65,7 @@ VALUE "FileVersion", OOREXX_VER_STR "\0" VALUE "InternalName", "OODIALOG GUI\0" VALUE "LegalCopyright", "Copyright \xA9 RexxLA " OOREXX_COPY_YEAR ".\0" - VALUE "OriginalFilename", "OODIALOG.DLL\0" + VALUE "OriginalFilename", "oodialog.dll\0" VALUE "ProductName", "Open Object Rexx for Windows\0" VALUE "ProductVersion", OOREXX_VER_STR "\0" END Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-15 06:13:13 UTC (rev 3795) @@ -40,6 +40,7 @@ #define WINVER 0x0501 #define STRICT +#define OEMRESOURCE #include <windows.h> #include <mmsystem.h> @@ -51,6 +52,14 @@ #include <commctrl.h> #include "oovutil.h" +// Map strings representing constant defines to their int values. For +// translating things like "IDI_APPLICATION" from the user to the proper API +// value. +#include <string> +#include <map> +using namespace std; +typedef map<string, int, less<string> > String2Int; + #define FILENAME_BUFFER_LEN 65535 extern LONG SetRexxStem(const char * name, INT id, const char * secname, const char * data); @@ -69,6 +78,9 @@ static void freeSubclassData(SUBCLASSDATA *); static BOOL removeKeyPressSubclass(SUBCLASSDATA *, HWND, INT); +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry PlaySoundFile(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { UINT opts; @@ -86,7 +98,9 @@ RETC(1) } - +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry PlaySoundFileInLoop(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { UINT opts; @@ -101,7 +115,9 @@ RETC(1) } - +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry StopSoundFile(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { UINT opts; @@ -191,6 +207,9 @@ #define VALIDARG(argn) (argc >= argn) && argv[argn-1].strptr && argv[argn-1].strptr[0] +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry GetFileNameWindow(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { BOOL fSuccess; @@ -280,7 +299,9 @@ RETC(1) } - +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry SleepMS(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { CHECKARG(1); @@ -289,7 +310,9 @@ RETC(0) } - +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry WinTimer(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { UINT_PTR timerID; @@ -1065,16 +1088,13 @@ /* Determine the control, or other function. The single first letter is * checked. */ - if ( argv[2].strptr[0] == 'E' ) /* Edit control function (or also static) */ + if ( argv[2].strptr[0] == 'E' ) /* Edit control function */ { + if ( ! checkWindowClass(hCtrl, WC_EDIT) ) + RETVAL(-1) + if ( strcmp(argv[3].strptr, "TXT") == 0 ) /* Set or get the control's text. */ { - /* The same function is used to set / get the text for an edit - * control or for a static control. - */ - if ( ! (checkWindowClass(hCtrl, WC_EDIT) || checkWindowClass(hCtrl, WC_STATIC)) ) - RETVAL(-1) - if ( argc > 4 ) { if ( SetWindowText(hCtrl, argv[4].strptr) == 0 ) @@ -1114,12 +1134,7 @@ } return 0; } - - /* The remaining functions are for an edit control only */ - if ( ! checkWindowClass(hCtrl, WC_EDIT) ) - RETVAL(-1) - - if ( !strcmp(argv[3].strptr, "MSG") ) /* Send an edit message (EM_*) */ + else if ( !strcmp(argv[3].strptr, "MSG") ) /* Send an edit message (EM_*) */ { CHECKARGL(5); @@ -3098,7 +3113,7 @@ _snprintf(buf, sizeof(buf), "Could not retrieve the dialog administration block information for %s", context->ObjectToStringValue(name)); - context->RaiseException1(Rexx_Error_Execution_user_defined, context->NewStringFromAsciiz(buf)); + context->RaiseException1(Rexx_Error_Execution_user_defined, context->String(buf)); } return adm; } @@ -3112,7 +3127,7 @@ void systemServiceException(RexxMethodContext *context, char *msg) { - context->RaiseException1(Rexx_Error_System_service_user_defined, context->NewStringFromAsciiz(msg)); + context->RaiseException1(Rexx_Error_System_service_user_defined, context->String(msg)); } void systemServiceException(RexxMethodContext *context, char *msg, const char *sub) @@ -3143,30 +3158,47 @@ systemServiceException(context, buffer); } -inline void outOfMemoryException(RexxMethodContext *c) +void outOfMemoryException(RexxMethodContext *c) { systemServiceException(c, "Failed to allocate memory"); } -inline void *wrongClassException(RexxMethodContext *c, int pos, const char *n) +void *wrongClassException(RexxMethodContext *c, int pos, const char *n) { - c->RaiseException2(Rexx_Error_Incorrect_method_noclass, c->WholeNumberToObject(pos), c->NewStringFromAsciiz(n)); + c->RaiseException2(Rexx_Error_Incorrect_method_noclass, c->WholeNumber(pos), c->String(n)); return NULL; } -void wrongArgValueException(RexxMethodContext *c, int pos, const char *list, RexxObjectPtr actual) +void nullPointerException(RexxMethodContext *c, int pos) { - RexxArrayObject a = c->NewArray(3); - c->ArrayAppend(a, c->WholeNumberToObject(pos)); - c->ArrayAppend(a, c->NewStringFromAsciiz(list)); - c->ArrayAppend(a, actual); + c->RaiseException1(Rexx_Error_Incorrect_method_null, c->WholeNumber(pos)); +} - c->RaiseException(Rexx_Error_Incorrect_method_list, a); +void wrongRangeException(RexxMethodContext *c, int pos, int min, int max, RexxObjectPtr actual) +{ + c->RaiseException(Rexx_Error_Invalid_argument_range, + c->ArrayOfFour(c->WholeNumber(pos), c->WholeNumber(min), c->WholeNumber(max), actual)); } +void userDefinedMsgException(RexxMethodContext *c, CSTRING msg) +{ + c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(msg)); +} + +void wrongRangeException(RexxMethodContext *c, int pos, int min, int max, int actual) +{ + wrongRangeException(c, pos, min, max, c->WholeNumber(actual)); +} + +void wrongArgValueException(RexxMethodContext *c, int pos, const char *list, RexxObjectPtr actual) +{ + c->RaiseException(Rexx_Error_Incorrect_method_list, + c->ArrayOfThree(c->WholeNumber(pos), c->String(list), actual)); +} + void wrongArgValueException(RexxMethodContext *c, int pos, const char *list, const char *actual) { - wrongArgValueException(c, pos, list, c->NewStringFromAsciiz(actual)); + wrongArgValueException(c, pos, list, c->String(actual)); } bool requiredComCtl32Version(RexxMethodContext *context, const char *methodName, DWORD minimum) @@ -3175,16 +3207,23 @@ { char msg[256]; _snprintf(msg, sizeof(msg), "The %s() method requires %s or later", methodName, comctl32VersionName(minimum)); - context->RaiseException1(Rexx_Error_System_service_user_defined, context->NewStringFromAsciiz(msg)); + context->RaiseException1(Rexx_Error_System_service_user_defined, context->String(msg)); return false; } return true; } +bool isInstanceOf(RexxMethodContext *context, RexxObjectPtr obj, const char *name) +{ + RexxClassObject rxClass = context->FindContextClass(name); + return (rxClass != NULLOBJECT && context->IsInstanceOf(obj, rxClass)) ? true : false; +} + + bool requiredClass(RexxMethodContext *context, RexxObjectPtr obj, const char *name, int argPos) { RexxClassObject rxClass = context->FindContextClass(name); - if ( ! context->IsInstanceOf(obj, rxClass) ) + if ( ! isInstanceOf(context, obj, name) ) { wrongClassException(context, argPos, name); return false; @@ -3192,11 +3231,11 @@ return true; } -void wrongWindowStyleException(RexxMethodContext *context, const char *obj, const char *style) +void wrongWindowStyleException(RexxMethodContext *c, const char *obj, const char *style) { char msg[128]; _snprintf(msg, sizeof(msg), "This %s does not have the %s style", obj, style); - context->RaiseException1(Rexx_Error_Incorrect_method_user_defined, context->NewStringFromAsciiz(msg)); + userDefinedMsgException(c, msg); } /** @@ -3284,6 +3323,53 @@ return size; } +RexxObjectPtr rxNewEmptyImage(RexxMethodContext *c) +{ + RexxObjectPtr image = NULLOBJECT; + RexxClassObject ImageClass = c->FindContextClass("Image"); + if ( ImageClass == NULL ) + { + c->RaiseException1(Rexx_Error_Execution_noclass, c->String("Image")); + return image; + } + + image = c->SendMessage0(ImageClass, "NEW"); + if ( image == NULLOBJECT ) + { + c->RaiseException2(Rexx_Error_No_method_name, c->String("Image"), c->String("new")); + } + return image; +} + +/** + * Instantiates a new .Image object, specifically from an image returned from + * LoadImage(). + * + * @param context + * @param hImage + * @param type + * @param size + * @param flags + * @param fileName This arg is currently ignored and the empty string is used. + * + * @return RexxObjectPtr + */ +RexxObjectPtr rxNewImage(RexxMethodContext *c, HANDLE hImage, uint8_t type, RexxObjectPtr size, + uint32_t flags, CSTRING fileName) +{ + RexxObjectPtr image = rxNewEmptyImage(c); + + if ( image != NULLOBJECT ) + { + RexxArrayObject args = c->ArrayOfFour(c->NewPointer(hImage), c->UnsignedInt32(type), size, + c->UnsignedInt32(flags)); + c->ArrayAppend(args, c->String(fileName)); + c->SendMessage(image, "realInit", args); + } + return image; +} + + inline bool hasStyle(HWND hwnd, DWORD_PTR style) { if ( (GetWindowLongPtr(hwnd, GWL_STYLE) & style) || (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & style) ) @@ -3518,7 +3604,7 @@ DWORD range = (DWORD)SendMessage(hwnd, PBM_SETRANGE32, min, max); _snprintf(buf, sizeof(buf), "%d %d", LOWORD(range), HIWORD(range)); - return context->NewStringFromAsciiz(buf); + return context->String(buf); } RexxMethod1(RexxStringObject, pbc_getRange, OSELF, self) @@ -3530,7 +3616,7 @@ SendMessage(hwnd, PBM_GETRANGE, TRUE, (LPARAM)&pbr); _snprintf(buf, sizeof(buf), "%d %d", pbr.iLow, pbr.iHigh); - return context->NewStringFromAsciiz(buf); + return context->String(buf); } RexxMethod2(int, pbc_setStep, OSELF, self, OPTIONAL_int32_t, newStep) @@ -3683,9 +3769,90 @@ } /** + * Methods for the .StaticControl. + */ +#define STATIC_CLASS "StaticControl" + +RexxMethod2(uint32_t, stc_setText, CSTRING, text, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + uint32_t rc = 0; + + if ( SetWindowText(hwnd, text) == 0 ) + { + rc = -(LONG)GetLastError(); + } + return rc; +} + +RexxMethod1(RexxStringObject, stc_getText, OSELF, self) +{ + RexxStringObject result = NULLOBJECT; + HWND hwnd = rxGetWindowHandle(context, self); + + ULONG count = (ULONG)GetWindowTextLength(hwnd); + if ( count == 0 ) + { + result = context->String(""); + } + else + { + char *buf = (char *)malloc(count); + if ( ! buf ) + { + outOfMemoryException(context); + } + else + { + GetWindowText(hwnd, buf, count); + result = context->String(buf); + free(buf); + } + } + return result; +} + +RexxMethod2(POINTERSTRING, stc_setIcon, POINTERSTRING, hIcon, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + return (void *)SendMessage(hwnd, STM_SETICON, (WPARAM)(HICON)hIcon, 0); +} + +RexxMethod1(POINTERSTRING, stc_getIcon, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + return (void *)SendMessage(hwnd, STM_GETICON, 0, 0); +} + +RexxMethod3(POINTERSTRING, stc_setImage, POINTERSTRING, hImage, uint8_t, type, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + + if ( type > 3 ) + { + wrongRangeException(context, 2, 0, 3, type); + } + //HANDLE myImage = LoadImage(NULL, "Camera.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_LOADMAP3DCOLORS); + HANDLE myImage = LoadImage(NULL, MAKEINTRESOURCE(OBM_ZOOM), IMAGE_BITMAP, 0, 0, LR_SHARED); + + //HANDLE tmp = (void *)SendMessage(hwnd, STM_SETIMAGE, (WPARAM)type, (LPARAM)(HANDLE)myImage); + HANDLE tmp = (void *)SendMessage(hwnd, STM_SETIMAGE, (WPARAM)type, (LPARAM)(HANDLE)hImage); + printf("setImage() hImage=0x%p type=%d myImage=0x%p returned=0x%p\n", hImage, type, myImage, tmp); + + return tmp; +} + +RexxMethod1(POINTERSTRING, stc_getImage, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + return (void *)SendMessage(hwnd, STM_GETICON, 0, 0); +} + +/** * Methods for the ooDialog class: .ButtonControl and its subclasses * .RadioButton and .CheckBox. */ +#define BUTTON_CLASS "ButtonControl" #define BC_SETSTYLE_OPTS "PUSHBOX, DEFPUSHBUTTON, CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE, " \ "RADIO, AUTORADIO, GROUPBOX, OWNERDRAW, LEFTTEXT, RIGHTBUTTON, NOTLEFTTEXT, " \ @@ -3796,7 +3963,7 @@ * @param himl [required] The image list handle. * */ -RexxMethod1(RexxObjectPtr, bc_cls_releaseImageList, POINTER, himl) +RexxMethod1(RexxObjectPtr, bc_releaseImageList_cls, POINTER, himl) { if ( himl != NULL ) { @@ -3805,7 +3972,7 @@ return NULLOBJECT; } -RexxMethod4(int, bc_cls_checkInGroup, RexxObjectPtr, dlg, RexxObjectPtr, idFirst, +RexxMethod4(int, bc_checkInGroup_cls, RexxObjectPtr, dlg, RexxObjectPtr, idFirst, RexxObjectPtr, idLast, RexxObjectPtr, idCheck) { int result = 0; @@ -3940,7 +4107,7 @@ strcat(buf, "PUSHED"); } - return context->NewStringFromAsciiz(buf); + return context->String(buf); } /** @@ -4490,7 +4657,7 @@ { _snprintf(msg, sizeof(msg), "The Pointer object, method argument %d, must not be null", argPos); - context->RaiseException1(Rexx_Error_Incorrect_method_user_defined, context->String(msg)); + userDefinedMsgException(context, msg); goto failed_himl; } goto good_himl; @@ -4575,9 +4742,8 @@ return himl; bad_directory: - _snprintf(msg, sizeof(msg), - "The Directory object, method argument %d, does not have the proper entries", argPos); - context->RaiseException1(Rexx_Error_Incorrect_method_user_defined, context->String(msg)); + _snprintf(msg, sizeof(msg), "The Directory object, method argument %d, does not have the proper entries", argPos); + userDefinedMsgException(context, msg); failed_himl: if ( himl != NULL ) @@ -4690,14 +4856,600 @@ } /* This method is used as a convenient way to test code. */ -RexxMethod2(int, bc_test, RexxObjectPtr, dlg, RexxObjectPtr, id) +RexxMethod1(int, bc_test, RexxObjectPtr, obj) { return 0; } /** + * Methods for the .Image class. + */ +#define IMAGE_CLASS "Image" + + +typedef struct _OODIMAGE +{ + SIZE size; + HANDLE hImage; + LONG type; + DWORD flags; + DWORD lastError; + CSTRING fileName; // Not currently used, may change to char[256]. + bool canRelease; + bool isValid; +} OODIMAGE, *POODIMAGE; + +void imageInvalidException(RexxMethodContext *c) +{ + userDefinedMsgException(c, "The Image object is not valid"); +} + + +/** + * Look up the int value of a string. + */ +int getConstantValue(String2Int *cMap, const char * str) +{ + String2Int::iterator itr; + itr = cMap->find(str); + if ( itr != cMap->end() ) + { + return itr->second; + } + return -1; +} + +/** + * Initializes the string to int map specific to the .Image class. + * + * @return String2Int* + * + * @note All IDs are included here, except the obsolete ones, and things like + * OBM_OLD*, all of which were for 16-bit Windows. + */ +static String2Int *imageInitMap(void) +{ + String2Int *cMap = new String2Int; + + cMap->insert(String2Int::value_type("IDI_APPLICATION", 32512)); + cMap->insert(String2Int::value_type("IDI_HAND", 32513)); + cMap->insert(String2Int::value_type("IDI_QUESTION", 32514)); + cMap->insert(String2Int::value_type("IDI_EXCLAMATION", 32515)); + cMap->insert(String2Int::value_type("IDI_ASTERISK", 32516)); + cMap->insert(String2Int::value_type("IDI_WINLOGO", 32517)); + + cMap->insert(String2Int::value_type("IMAGE_BITMAP", 0)); + cMap->insert(String2Int::value_type("IMAGE_ICON", 1)); + cMap->insert(String2Int::value_type("IMAGE_CURSOR", 2)); + cMap->insert(String2Int::value_type("IMAGE_ENHMETAFILE", 3)); + + cMap->insert(String2Int::value_type("OCR_NORMAL", 32512)); + cMap->insert(String2Int::value_type("OCR_IBEAM", 32513)); + cMap->insert(String2Int::value_type("OCR_WAIT", 32514)); + cMap->insert(String2Int::value_type("OCR_CROSS", 32515)); + cMap->insert(String2Int::value_type("OCR_UP", 32516)); + cMap->insert(String2Int::value_type("OCR_SIZENWSE", 32642)); + cMap->insert(String2Int::value_type("OCR_SIZENESW", 32643)); + cMap->insert(String2Int::value_type("OCR_SIZEWE", 32644)); + cMap->insert(String2Int::value_type("OCR_SIZENS", 32645)); + cMap->insert(String2Int::value_type("OCR_SIZEALL", 32646)); + cMap->insert(String2Int::value_type("OCR_NO", 32648)); + cMap->insert(String2Int::value_type("OCR_HAND", 32649)); + cMap->insert(String2Int::value_type("OCR_APPSTARTING", 32650)); + + cMap->insert(String2Int::value_type("OBM_CLOSE", 32754)); + cMap->insert(String2Int::value_type("OBM_UPARROW", 32753)); + cMap->insert(String2Int::value_type("OBM_DNARROW", 32752)); + cMap->insert(String2Int::value_type("OBM_RGARROW", 32751)); + cMap->insert(String2Int::value_type("OBM_LFARROW", 32750)); + cMap->insert(String2Int::value_type("OBM_REDUCE", 32749)); + cMap->insert(String2Int::value_type("OBM_ZOOM", 32748)); + cMap->insert(String2Int::value_type("OBM_RESTORE", 32747)); + cMap->insert(String2Int::value_type("OBM_REDUCED", 32746)); + cMap->insert(String2Int::value_type("OBM_ZOOMD", 32745)); + cMap->insert(String2Int::value_type("OBM_RESTORED", 32744)); + cMap->insert(String2Int::value_type("OBM_UPARROWD", 32743)); + cMap->insert(String2Int::value_type("OBM_DNARROWD", 32742)); + cMap->insert(String2Int::value_type("OBM_RGARROWD", 32741)); + cMap->insert(String2Int::value_type("OBM_LFARROWD", 32740)); + cMap->insert(String2Int::value_type("OBM_MNARROW", 32739)); + cMap->insert(String2Int::value_type("OBM_COMBO", 32738)); + cMap->insert(String2Int::value_type("OBM_UPARROWI", 32737)); + cMap->insert(String2Int::value_type("OBM_DNARROWI", 32736)); + cMap->insert(String2Int::value_type("OBM_RGARROWI", 32735)); + cMap->insert(String2Int::value_type("OBM_LFARROWI", 32734)); + + cMap->insert(String2Int::value_type("OBM_SIZE", 32766)); + cMap->insert(String2Int::value_type("OBM_BTSIZE", 32761)); + cMap->insert(String2Int::value_type("OBM_CHECK", 32760)); + cMap->insert(String2Int::value_type("OBM_CHECKBOXES", 32759)); + cMap->insert(String2Int::value_type("OBM_BTNCORNERS", 32758)); + + cMap->insert(String2Int::value_type("LR_DEFAULTCOLOR", 0x0000)); + cMap->insert(String2Int::value_type("LR_MONOCHROME", 0x0001)); + cMap->insert(String2Int::value_type("LR_COLOR", 0x0002)); + cMap->insert(String2Int::value_type("LR_COPYRETURNORG", 0x0004)); + cMap->insert(String2Int::value_type("LR_COPYDELETEORG", 0x0008)); + cMap->insert(String2Int::value_type("LR_LOADFROMFILE", 0x0010)); + cMap->insert(String2Int::value_type("LR_LOADTRANSPARENT", 0x0020)); + cMap->insert(String2Int::value_type("LR_DEFAULTSIZE", 0x0040)); + cMap->insert(String2Int::value_type("LR_VGACOLOR", 0x0080)); + cMap->insert(String2Int::value_type("LR_LOADMAP3DCOLORS", 0x1000)); + cMap->insert(String2Int::value_type("LR_CREATEDIBSECTION", 0x2000)); + cMap->insert(String2Int::value_type("LR_COPYFROMRESOURCE", 0x4000)); + cMap->insert(String2Int::value_type("LR_SHARED", 0x8000)); + + + //cMap->insert(String2Int::value_type("", )); + + return cMap; +} + +#define PUT_IMAGE_METHOD_CLS "forward MESSAGE \"saveImage\"\n" +#define DEL_IMAGE_METHOD_CLS "forward MESSAGE \"removeImage\"\n" + +#define REAL_INIT_METHOD "forward MESSAGE \"assignImage\"\n" + +RexxMethod1(RexxObjectPtr, image_init_cls, OSELF, self) +{ + RexxMethodContext *c = context; + + RexxObjectPtr mObj = c->NewMethod("putImage", PUT_IMAGE_METHOD_CLS, strlen(PUT_IMAGE_METHOD_CLS)); + c->SendMessage(self, "SETMETHOD", c->ArrayOfThree(c->String("putImage"), mObj, c->String("OBJECT"))); + + mObj = c->NewMethod("delImage", DEL_IMAGE_METHOD_CLS, strlen(DEL_IMAGE_METHOD_CLS)); + c->SendMessage(self, "SETMETHOD", c->ArrayOfThree(c->String("delImage"), mObj, c->String("OBJECT"))); + + mObj = c->NewMethod("realInit", REAL_INIT_METHOD, strlen(REAL_INIT_METHOD)); + c->SendMessage(self, "DEFINE", c->ArrayOfTwo(c->String("realInit"), mObj)); + + return NULLOBJECT; +} + +RexxMethod1(RexxObjectPtr, image_saveImage_cls, RexxObjectPtr, image) +{ + return NULLOBJECT; +} + +RexxMethod1(RexxObjectPtr, image_removeImage_cls, RexxObjectPtr, image) +{ + return NULLOBJECT; +} + +RexxMethod1(int, image_id_cls, CSTRING, id) +{ + static String2Int *imageConstantsMap = NULL; + + if ( imageConstantsMap == NULL ) + { + imageConstantsMap = imageInitMap(); + } + int idValue = getConstantValue(imageConstantsMap, id); + if ( idValue == -1 ) + { + wrongArgValueException(context, 1, "the Image class symbol IDs", id); + } + return idValue; +} + + +/** Image::getImage() [class method] + * + * Load a stand alone image from a file or one of the system images. + * + * + * @note This method is designed to always return an .Image object, or raise an + * exception. The user would need to test the returned .Image object for + * null to be sure it is good. I.e.: + * + * image = .Image~getImage(...) + * if image~isNull then do + * -- error + * end + */ +RexxMethod4(RexxObjectPtr, image_getImage_cls, RexxObjectPtr, id, OPTIONAL_uint8_t, type, + OPTIONAL_RexxObjectPtr, size, OPTIONAL_uint32_t, flags) +{ + RexxObjectPtr result = NULLOBJECT; + SIZE s = {0}; + + oodSetSysErrCode(context, 0); + + bool fromFile = true; + LPCTSTR name = NULL; + + if ( context->IsString(id) ) + { + name = context->StringData((RexxStringObject)id); + } + else + { + int resourceID; + + if ( ! context->Int32(id, &resourceID) ) + { + wrongArgValueException(context, 1, "either an image file name, or a system image ID", id); + goto out; + } + name = MAKEINTRESOURCE(resourceID); + fromFile = false; + } + + if ( argumentOmitted(2) ) + { + type = IMAGE_BITMAP; + } + if ( argumentExists(3) ) + { + SIZE *p = rxGetSize(context, size, 3); + if ( p == NULL ) + { + goto out; + } + s.cx = p->cx; + s.cy = p->cy; + } + else + { + size = rxNewSize(context, s.cx, s.cy); + } + + if ( argumentOmitted(4) ) + { + if ( fromFile ) + { + flags = LR_LOADFROMFILE | LR_VGACOLOR; + } + else + { + flags = LR_SHARED | LR_DEFAULTSIZE | LR_VGACOLOR; + } + } + else + { + if ( fromFile ) + { + // Ensure the user did not use shared and did use load from file. + flags = (flags & ~LR_SHARED) | LR_LOADFROMFILE; + } + else + { + // Ensure the user did not use load from file and did use shared. + flags = (flags & ~LR_LOADFROMFILE) | LR_SHARED; + } + } + + HANDLE hImage = LoadImage(NULL, name, type, s.cx, s.cy, flags); + if ( hImage == NULL ) + { + oodSetSysErrCode(context); + result = rxNewEmptyImage(context); + goto out; + } + + result = rxNewImage(context, hImage, type, size, flags, ""); + +out: + return result; +} + +RexxMethod3(uint32_t, image_colorRef_cls, OPTIONAL_RexxObjectPtr, r, OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b) +{ + uint32_t red; + + // Note that if arg 2 and 3 are omitted, then g and b will be 0. Since 0 is + // the default, we do not need to check for ommitted args for g and b. + + if ( argumentOmitted(1) ) + { + red = 0; + } + else if ( context->IsString(r) ) + { + const char * s = context->ObjectToStringValue(r); + if ( *s == 'D' || *s == 'd' ) + { + return CLR_DEFAULT; + } + else if ( *s == 'N' || *s == 'n' ) + { + return CLR_NONE; + } + else + { + wrongArgValueException(context, 1, "DEFAULT, NONE", s); + return 0; + } + } + else if ( ! context->ObjectToUnsignedInt32(r, &red) || red > 0xff ) + { + wrongRangeException(context, 1, 0, 255, r); + return 0; + } + + return RGB((uint8_t)red, g, b); +} + +RexxMethod1(uint8_t, image_getRValue_cls, uint32_t, colorRef) { return GetRValue(colorRef); } +RexxMethod1(uint8_t, image_getGValue_cls, uint32_t, colorRef) { return GetGValue(colorRef); } +RexxMethod1(uint8_t, image_getBValue_cls, uint32_t, colorRef) { return GetBValue(colorRef); } + + +/** Image::init() + * + * + */ +RexxMethod0(RexxObjectPtr, image_init) +{ + RexxBufferObject obj = context->NewBuffer(sizeof(OODIMAGE)); + context->SetObjectVariable("CSELF", obj); + + POODIMAGE cself = (POODIMAGE)context->BufferData(obj); + + // Set everything to invalid. + memset(cself, 0, sizeof(OODIMAGE)); + cself->type = -1; + cself->size.cx = -1; + cself->size.cy = -1; + + return NULLOBJECT; +} + +/** Image::assignImage [private method] + * + * + */ +RexxMethod6(RexxObjectPtr, image_assignImage, POINTER, hImage, uint8_t, type, RexxObjectPtr, size, + uint32_t, flags, CSTRING, fileName, CSELF, oi) +{ + POODIMAGE pOI = (POODIMAGE)oi; + + if ( hImage == NULL ) + { + nullPointerException(context, 1); + goto out; + } + if ( type > 3 ) + { + wrongRangeException(context, 2, 0, 3, type); + goto out; + } + + SIZE *s = rxGetSize(context, size, 3); + if ( s == NULL ) + { + goto out; + } + + pOI->hImage = hImage; + pOI->type = type; + pOI->size.cx = s->cx; + pOI->size.cy = s->cy; + pOI->flags = flags; + pOI->isValid = true; + pOI->canRelease = ! (flags & LR_SHARED); + +out: + return NULLOBJECT; +} + +RexxMethod1(POINTER, image_handle, CSELF, oi) +{ + if ( ! ((POODIMAGE)oi)->isValid ) + { + imageInvalidException(context); + } + return ((POODIMAGE)oi)->hImage; +} + +RexxMethod1(logical_t, image_isNull, CSELF, oi) { return ( ! ((POODIMAGE)oi)->isValid ); } +RexxMethod1(uint32_t, image_systemErrorCode, CSELF, oi) { return ((POODIMAGE)oi)->lastError; } + + +/** + * Methods for the ooDialog .ResourceImage class. + */ +#define RESOURCE_IMAGE_CLASS "ResourceImage" + + +typedef struct _RESOURCEIMAGE +{ + HMODULE hMod; + DWORD lastError; + bool canRelease; + bool isValid; +} RESOURCEIMAGE, *PRESOURCEIMAGE; + +void riInvalidException(RexxMethodContext *c) +{ + userDefinedMsgException(c, "The ResourceImage object is null"); +} + +/** ResouceImage::init() + * + * + */ +RexxMethod2(RexxObjectPtr, ri_init, CSTRING, file, OPTIONAL_RexxObjectPtr, dlg) +{ + oodSetSysErrCode(context, 0); + + RexxBufferObject cself = context->NewBuffer(sizeof(RESOURCEIMAGE)); + context->SetObjectVariable("CSELF", cself); + + PRESOURCEIMAGE ri = (PRESOURCEIMAGE)context->BufferData(cself); + memset(ri, 0, sizeof(RESOURCEIMAGE)); + + if ( argumentOmitted(2) ) + { + ri->hMod = LoadLibraryEx(file, NULL, LOAD_LIBRARY_AS_DATAFILE); + if ( ri->hMod == NULL ) + { + ri->lastError = GetLastError(); + oodSetSysErrCode(context, ri->lastError); + } + else + { + ri->canRelease = true; + ri->isValid = true; + } + } + else + { + if ( ! requiredClass(context, dlg, "PlainBaseDialog", 2) ) + { + goto err_out; + } + + if ( stricmp(OODDLL, file) == 0 ) + { + ri->hMod = MyInstance; + ri->isValid = true; + } + else + { + if ( ! requiredClass(context, dlg, "ResDialog", 2) ) + { + goto err_out; + } + + DIALOGADMIN *adm = rxGetDlgAdm(context, dlg); + if ( adm == NULL ) + { + goto err_out; + } + + ri->hMod = adm->TheInstance; + ri->isValid = true; + } + } + + return NULLOBJECT; + +err_out: + + // 1812 ERROR_RESOURCE_DATA_NOT_FOUND + // The specified image file did not contain a resource section. + + ri->lastError = 1812; + oodSetSysErrCode(context, ri->lastError); + return NULLOBJECT; +} + +RexxMethod1(uint32_t, ri_release, CSELF, r) +{ + uint32_t rc = 0; + PRESOURCEIMAGE ri = (PRESOURCEIMAGE)r; + + if ( ri->canRelease ) + { + if ( ! FreeLibrary((HMODULE)ri->hMod) ) + { + rc = GetLastError(); + } + } + + ri->canRelease = false; + ri->isValid = false; + ri->hMod = NULL; + ri->lastError = rc; + oodSetSysErrCode(context, ri->lastError); + + return rc; +} + +RexxMethod1(POINTER, ri_handle, CSELF, ri) +{ + if ( ! ((PRESOURCEIMAGE)ri)->isValid ) + { + riInvalidException(context); + } + return ((PRESOURCEIMAGE)ri)->hMod; +} + +RexxMethod1(logical_t, ri_isNull, CSELF, ri) { return ( ! ((PRESOURCEIMAGE)ri)->isValid); } +RexxMethod1(uint32_t, ri_systemErrorCode, CSELF, ri) { return ((PRESOURCEIMAGE)ri)->lastError; } + +/** ResourceImage::getImage() + * + * Loads an image from this resource binary. + * + * + * @return An instantiated .Image object, which may be a null Image if an error + * occurred. + * + * @note This method is designed to always return an .Image object, or raise an + * exception. The user would need to test the returned .Image object for + * null to be sure it is good. I.e.: + * + * mod = .ResourceImage~new(...) + * ... + * image = mod~getImage(...) + * if image~isNull then do + * -- error + * end + */ +RexxMethod5(RexxObjectPtr, ri_getImage, int, id, OPTIONAL_uint8_t, type, + OPTIONAL_RexxObjectPtr, size, OPTIONAL_uint32_t, flags, CSELF, cself) +{ + PRESOURCEIMAGE ri = (PRESOURCEIMAGE)cself; + RexxObjectPtr result = NULLOBJECT; + SIZE s = {0}; + + oodSetSysErrCode(context, 0); + ri->lastError = 0; + + if ( ! ri->isValid ) + { + riInvalidException(context); + goto out; + } + + if ( argumentOmitted(2) ) + { + type = IMAGE_BITMAP; + } + + if ( argumentExists(3) ) + { + SIZE *p = rxGetSize(context, size, 3); + if ( p == NULL ) + { + goto out; + } + s.cx = p->cx; + s.cy = p->cy; + } + else + { + size = rxNewSize(context, s.cx, s.cy); + } + + if ( argumentOmitted(4) ) + { + flags = LR_SHARED | LR_VGACOLOR; + } + + HANDLE hImage = LoadImage(ri->hMod, MAKEINTRESOURCE(id), type, s.cx, s.cy, flags); + if ( hImage == NULL ) + { + ri->lastError = GetLastError(); + oodSetSysErrCode(context, ri->lastError); + result = rxNewEmptyImage(context); + goto out; + } + + result = rxNewImage(context, hImage, type, size, flags, ""); + +out: + return result; +} + +/** * Methods for the ooDialog .Point class. */ +#define POINT_CLASS "Point" + + RexxMethod2(RexxObjectPtr, point_init, OPTIONAL_int32_t, x, OPTIONAL_int32_t, y) { RexxBufferObject obj = context->NewBuffer(sizeof(POINT)); @@ -4719,6 +5471,8 @@ /** * Methods for the ooDialog .Size class. */ +#define SIZE_CLASE "Size" + RexxMethod2(RexxObjectPtr, size_init, OPTIONAL_int32_t, cx, OPTIONAL_int32_t, cy) { RexxBufferObject obj = context->NewBuffer(sizeof(SIZE)); @@ -4740,6 +5494,8 @@ /** * Methods for the ooDialog .Rect class. */ +#define RECT_CLASS "Rect" + RexxMethod4(RexxObjectPtr, rect_init, OPTIONAL_int32_t, left, OPTIONAL_int32_t, top, OPTIONAL_int32_t, right, OPTIONAL_int32_t, bottom) { @@ -4765,6 +5521,11 @@ RexxMethod2(RexxObjectPtr, rect_setRight, CSELF, pRect, int32_t, right) { ((RECT *)pRect)->right = right; return NULLOBJECT; } RexxMethod2(RexxObjectPtr, rect_setBottom, CSELF, pRect, int32_t, bottom) { ((RECT *)pRect)->bottom = bottom; return NULLOBJECT; } +/** + * Methods for the .DlgUtil class. + */ +#define DLG_UTIL_CLASS "DlgUtil" + #define COMCTL_ERR_TITLE "ooDialog - Windows Common Controls Error" #define GENERIC_ERR_TITLE "ooDialog - Error" @@ -4922,15 +5683,15 @@ * Windows 98, and Windows 2000. * * 2.) Initializes a null pointer Pointer object and places it in the .local - * directory. (.NullPointer) This allows ooRexx code to test for a null - * pointer. + * directory. (.NullHandle) This allows ooRexx code to use a null handle for an + * argument where appropriate. * * 3.) Places the SystemErrorCode (.SystemErrorCode) variable in the .local * directory. * * @return .true if comctl32.dll is at least version 4.71, otherwise .false. */ -RexxMethod0(logical_t, dlgutil_init) +RexxMethod0(logical_t, dlgutil_init_cls) { if ( ! getComCtl32Version(context, &ComCtl32Version, COMCTL32_4_71, "ooDialog", COMCTL_ERR_TITLE) ) { @@ -4946,14 +5707,14 @@ RexxDirectoryObject local = context->GetLocalEnvironment(); if ( local != NULLOBJECT ) { - context->DirectoryPut(local, context->NewPointer(NULL), "NULLPOINTER"); + context->DirectoryPut(local, context->NewPointer(NULL), "NULLHANDLE"); context->DirectoryPut(local, context->WholeNumberToObject(0), "SYSTEMERRORCODE"); } return true; } -/** DlgUtil::comCtl32Version() [Class method] +/** DlgUtil::comCtl32Version() [class method] * * Returns the comctl32.dll version that ooDialog is currently using in one of * the 4 formats listed below. @@ -4970,7 +5731,7 @@ * Short: Same as number. * OS: The OS name part of the full string. */ -RexxMethod1(RexxStringObject, dlgutil_comctl32Version, OPTIONAL_CSTRING, format) +RexxMethod1(RexxStringObject, dlgutil_comctl32Version_cls, OPTIONAL_CSTRING, format) { const char *ver; char f = argumentOmitted(1) ? 'S' : *format; @@ -4998,7 +5759,7 @@ return context->String(ver); } -/** DlgUtil::version() [Class method] +/** DlgUtil::version() [class method] * * Returns the ooDialog version string, either the full string, or just the * number part of the string. @@ -5009,7 +5770,7 @@ * short form (number part of the string) is returned. In all * other cases the full string is returned. */ -RexxMethod1(RexxStringObject, dlgutil_version, OPTIONAL_CSTRING, format) +RexxMethod1(RexxStringObject, dlgutil_version_cls, OPTIONAL_CSTRING, format) { char buf[64]; @@ -5024,61 +5785,13 @@ return context->String(buf); } -RexxMethod3(uint32_t, dlgutil_colorRef, RexxObjectPtr, r, OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b) +RexxMethod1(logical_t, dlgutil_test_cls, RexxObjectPtr, obj) { - size_t count = rxArgCount(context); - - if ( count == 1 ) - { - if (! context->IsString(r) ) - { - wrongClassException(context, 1, "String"); - return 0; - } - const char * s = context->ObjectToStringValue(r); - if ( *s == 'D' || *s == 'd' ) - { - return CLR_DEFAULT; - } - else if ( *s == 'N' || *s == 'n' ) - { - return CLR_NONE; - } - else - { - wrongArgValueException(context, 1, "DEFAULT, NONE", s); - return 0; - } - } - - if ( count != 3 ) - { - context->RaiseException1(Rexx_Error_Incorrect_method_minarg, context->WholeNumberToObject(3)); - return 0; - } - - uint32_t red; - if ( ! context->ObjectToUnsignedInt32(r, &red) ) - { - context->RaiseException2(Rexx_Error_Incorrect_method_whole, context->WholeNumberToObject(1), r); - return 0; - } - if ( red > 0xff ) - { - context->RaiseException(Rexx_Error_Invalid_argument_range, - context->ArrayOfFour(context->WholeNumber(1), context->WholeNumber(0), - context->WholeNumber(255), r)); - return 0; - } - - return RGB((uint8_t)red, g, b); + return 0; } -RexxMethod1(uint8_t, dlgutil_getRValue, uint32_t, colorRef) { return GetRValue(colorRef); } -RexxMethod1(uint8_t, dlgutil_getGValue, uint32_t, colorRef) { return GetGValue(colorRef); } -RexxMethod1(uint8_t, dlgutil_getBValue, uint32_t, colorRef) { return GetBValue(colorRef); } -RexxMethod1(uint16_t, dlgutil_hiWord, uint32_t, dw) { return HIWORD(dw); } -RexxMethod1(uint16_t, dlgutil_loWord, uint32_t, dw) { return LOWORD(dw); } +RexxMethod1(uint16_t, dlgutil_hiWord_cls, uint32_t, dw) { return HIWORD(dw); } +RexxMethod1(uint16_t, dlgutil_loWord_cls, uint32_t, dw) { return LOWORD(dw); } /** * A temporary utility to convert from a handle that is still being stored in @@ -5086,8 +5799,8 @@ * interface is needed to facilitate testing Windows extensions that have been * converted to only use pointer valules. */ -RexxMethod1(POINTER, dlgutil_handleToPointer, CSTRING, handle) +RexxMethod1(POINTER, dlgutil_handleToPointer_cls, POINTERSTRING, handle) { - return string2pointer(handle); + return handle; } Modified: main/trunk/extensions/platform/windows/oodialog/oovtools.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovtools.cpp 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oovtools.cpp 2008-12-15 06:13:13 UTC (rev 3795) @@ -70,6 +70,9 @@ return ( s && (*s == 'N' || *s == 'n') ); } +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry InfoMessage(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { HWND hW; @@ -82,6 +85,9 @@ } +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry ErrorMessage(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { HWND hW; @@ -93,6 +99,9 @@ RETC(0) } +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry YesNoMessage(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { HWND hW; @@ -130,7 +139,10 @@ return 0; } - +/** + * This classic Rexx external function was NOT documented prior to 4.0.0. But, + * it was used in some of the sample code in the doc. + */ size_t RexxEntry BinaryAnd(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { ULONG n, m; Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2008-12-15 06:13:13 UTC (rev 3795) @@ -182,6 +182,9 @@ } +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry GetScreenSize(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { ULONG sx, sy; @@ -199,12 +202,16 @@ } +/** + * This classic Rexx external function was documented prior to 4.0.0. + */ size_t RexxEntry GetSysMetrics(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) { ULONG uVal; - /* The intent is to extend this function in the future to get multiple, and - * perhaps all, values at once. + /* The intent was to extend this function in the future to get multiple, and + * perhaps all, values at once. Now the intent is to add the functionnality + * to get multiple values at once to .DlgUtil. */ if ( argc == 1 ) { Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-15 06:13:13 UTC (rev 3795) @@ -68,7 +68,6 @@ extern LONG HandleError(PRXSTRING r, CHAR * text); extern LONG SetRexxStem(const char * name, INT id, const char * secname, const char * data); extern BOOL GetDialogIcons(DIALOGADMIN *, INT, UINT, PHANDLE, PHANDLE); -extern HICON GetIconForID(DIALOGADMIN *, UINT, UINT, int, int); /* Shared functions for keyboard hooks and key press subclassing */ extern LONG setKeyPressData(KEYPRESSDATA *, CONSTRXSTRING, CONSTRXSTRING, const char *); @@ -83,6 +82,7 @@ static LONG setKBHook(DIALOGADMIN *, HWND); static void removeKBHook(DIALOGADMIN *); static BOOL parseKeyToken(PCHAR, PUINT, PUINT); +static HICON GetIconForID(DIALOGADMIN *, UINT, UINT, int, int); class LoopThreadArgs @@ -881,7 +881,7 @@ * * @return The handle to the loaded icon on success, or null on failure. */ -HICON GetIconForID(DIALOGADMIN *dlgAdm, UINT id, UINT iconSrc, int cx, int cy) +static HICON GetIconForID(DIALOGADMIN *dlgAdm, UINT id, UINT iconSrc, int cx, int cy) { HINSTANCE hInst = NULL; LPCTSTR pName = NULL; @@ -913,20 +913,13 @@ pName = MAKEINTRESOURCE(id); loadFlags = LR_SHARED; } - else if ( iconSrc & ICON_DLL ) + else { /* Load the icon from the user's resource DLL. */ hInst = dlgAdm->TheInstance; pName = MAKEINTRESOURCE(id); loadFlags = LR_SHARED; } - else - { - /* Load one of the System icons. */ - hInst = NULL; - pName = MAKEINTRESOURCE(id); - loadFlags = LR_SHARED; - } return (HICON)LoadImage(hInst, pName, IMAGE_ICON, cx, cy, loadFlags); } @@ -1095,69 +1088,7 @@ RETVAL(ret) } } - else if ( argv[0].strptr[0] == 'I' ) /* work with Icons */ - { - HICON hIcon; - UINT id; - CHECKARGL(3); - - if ( argv[1].strptr[0] == 'S' ) /* System icon */ - { - id = IDICON_WINLOGO; - if ( !strcmp(argv[2].strptr, "APPLICATION") ) id = IDICON_APPLICATION; - else if ( !strcmp(argv[2].strptr, "HAND") ) id = IDICON_HAND; - else if ( !strcmp(argv[2].strptr, "QUESTION") ) id = IDICON_QUESTION; - else if ( !strcmp(argv[2].strptr, "EXCLAMATION") ) id = IDICON_EXCLAMATION; - else if ( !strcmp(argv[2].strptr, "ASTERISK") ) id = IDICON_ASTERISK; - else if ( !strcmp(argv[2].strptr, "WINLOGO") ) id = IDICON_WINLOGO; - - SetLastError(0); - hIcon = GetIconForID(NULL, id, ICON_SYSTEM, 0, 0); - if ( ! hIcon ) - RETVAL(-(INT)GetLastError()) - } - else if ( argv[1].strptr[0] == 'N' ) /* Numeric resource ID */ - { - DIALOGADMIN *dlgAdm = NULL; - int cx, cy; - UINT flag = ICON_FILE; - - CHECKARGL(7) - - dlgAdm = (DIALOGADMIN *)GET_POINTER(argv[2]); - if ( !dlgAdm ) RETVAL(-2) - - id = (UINT)atoi(argv[3].strptr); - if ( id < 1 ) RETVAL(-1) - - cx = atoi(argv[4].strptr); - cy = atoi(argv[5].strptr); - if ( argv[6].strptr[0] == 'D' ) - flag = ICON_DLL; - - SetLastError(0); - hIcon = GetIconForID(dlgAdm, id, flag, cx, cy); - if ( ! hIcon ) - RETVAL(-(INT)GetLastError()) - } - else if ( argv[1].strptr[0] == 'F' ) /* load directly from File */ - { - CHECKARGL(5) - - hIcon = (HICON)LoadImage(NULL, argv[2].strptr, IMAGE_ICON, atoi(argv[3].strptr), - atoi(argv[4].strptr), LR_LOADFROMFILE); - if ( ! hIcon ) - RETVAL(-(INT)GetLastError()) - } - else - { - RETERR - } - - RETHANDLE(hIcon) - } - RETERR } @@ -2000,6 +1931,16 @@ } #endif +/** + * This function was documented in the ooDialog doc prior to 4.0.0, so for now + * it needs to stay. Does nothing. + */ +size_t RexxEntry InstMMFuncs(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) +{ + // the old function returned 1 + RETC(1) +} + REXX_CLASSIC_ROUTINE_PROTOTYPE(GetDlgMsg); REXX_CLASSIC_ROUTINE_PROTOTYPE(SendWinMsg); REXX_CLASSIC_ROUTINE_PROTOTYPE(HandleDlg); @@ -2068,6 +2009,7 @@ // now build the actual entry list RexxRoutineEntry oodialog_functions[] = { + REXX_CLASSIC_ROUTINE(InstMMFuncs, InstMMFuncs), REXX_CLASSIC_ROUTINE(GetDlgMsg, GetDlgMsg), REXX_CLASSIC_ROUTINE(SendWinMsg, SendWinMsg), REXX_CLASSIC_ROUTINE(HandleDlg, HandleDlg), @@ -2135,17 +2077,36 @@ REXX_LAST_ROUTINE() }; -REXX_METHOD_PROTOTYPE(dlgutil_init); -REXX_METHOD_PROTOTYPE(dlgutil_comctl32Version); -REXX_METHOD_PROTOTYPE(dlgutil_version); -REXX_METHOD_PROTOTYPE(dlgutil_hiWord); -REXX_METHOD_PROTOTYPE(dlgutil_loWord); -REXX_METHOD_PROTOTYPE(dlgutil_colorRef); -REXX_METHOD_PROTOTYPE(dlgutil_getRValue); -REXX_METHOD_PROTOTYPE(dlgutil_getGValue); -REXX_METHOD_PROTOTYPE(dlgutil_getBValue); -REXX_METHOD_PROTOTYPE(dlgutil_handleToPointer); +REXX_METHOD_PROTOTYPE(dlgutil_init_cls); +REXX_METHOD_PROTOTYPE(dlgutil_comctl32Version_cls); +REXX_METHOD_PROTOTYPE(dlgutil_version_cls); +REXX_METHOD_PROTOTYPE(dlgutil_hiWord_cls); +REXX_METHOD_PROTOTYPE(dlgutil_loWord_cls); +REXX_METHOD_PROTOTYPE(dlgutil_handleToPointer_cls); +REXX_METHOD_PROTOTYPE(dlgutil_test_cls); +REXX_METHOD_PROTOTYPE(ri_init); +REXX_METHOD_PROTOTYPE(ri_release); +REXX_METHOD_PROTOTYPE(ri_handle); +REXX_METHOD_PROTOTYPE(ri_isNull); +REXX_METHOD_PROTOTYPE(ri_systemErrorCode); +REXX_METHOD_PROTOTYPE(ri_getImage); + +REXX_METHOD_PROTOTYPE(image_init_cls); +REXX_METHOD_PROTOTYPE(image_saveImage_cls); +REXX_METHOD_PROTOTYPE(image_removeImage_cls); +REXX_METHOD_PROTOTYPE(image_id_cls); +REXX_METHOD_PROTOTYPE(image_getImage_cls); +REXX_METHOD_PROTOTYPE(image_colorRef_cls); +REXX_METHOD_PROTOTYPE(image_getRValue_cls); +REXX_METHOD_PROTOTYPE(image_getGValue_cls); +REXX_METHOD_PROTOTYPE(image_getBValue_cls); +REXX_METHOD_PROTOTYPE(image_init); +REXX_METHOD_PROTOTYPE(image_assignImage); +REXX_METHOD_PROTOTYPE(image_isNull); +REXX_METHOD_PROTOTYPE(image_handle); +REXX_METHOD_PROTOTYPE(image_systemErrorCode); + REXX_METHOD_PROTOTYPE(pbc_stepIt); REXX_METHOD_PROTOTYPE(pbc_getPos); REXX_METHOD_PROTOTYPE(pbc_setPos); @@ -2157,8 +2118,15 @@ REXX_METHOD_PROTOTYPE(pbc_setBarColor); REXX_METHOD_PROTOTYPE(pbc_test); -REXX_METHOD_PROTOTYPE(bc_cls_releaseImageList); -REXX_METHOD_PROTOTYPE(bc_cls_checkInGroup); +REXX_METHOD_PROTOTYPE(stc_getText); +REXX_METHOD_PROTOTYPE(stc_setText); +REXX_METHOD_PROTOTYPE(stc_getIcon); +REXX_METHOD_PROTOTYPE(stc_setIcon); +REXX_METHOD_PROTOTYPE(stc_getImage); +REXX_METHOD_PROTOTYPE(stc_setImage); + +REXX_METHOD_PROTOTYPE(bc_releaseImageList_cls); +REXX_METHOD_PROTOTYPE(bc_checkInGroup_cls); REXX_METHOD_PROTOTYPE(gb_setStyle); REXX_METHOD_PROTOTYPE(bc_getState); REXX_METHOD_PROTOTYPE(bc_setState); @@ -2205,16 +2173,36 @@ REXX_METHOD_PROTOTYPE(size_setCY); RexxMethodEntry oodialog_methods[] = { - REXX_METHOD(dlgutil_init, dlgutil_init), - REXX_METHOD(dlgutil_comctl32Version, dlgutil_comctl32Version), - REXX_METHOD(dlgutil_version, dlgutil_version), - REXX_METHOD(dlgutil_hiWord, dlgutil_hiWord), - REXX_METHOD(dlgutil_loWord, dlgutil_loWord), - REXX_METHOD(dlgutil_colorRef, dlgutil_colorRef), - REXX_METHOD(dlgutil_getRValue, dlgutil_getRValue), - REXX_METHOD(dlgutil_getGValue, dlgutil_getGValue), - REXX_METHOD(dlgutil_getBValue, dlgutil_getBValue), - REXX_METHOD(dlgutil_handleToPointer, dlgutil_handleToPointer), + REXX_METHOD(dlgutil_init_cls, dlgutil_init_cls), + REXX_METHOD(dlgutil_comctl32Version_cls, dlgutil_comctl32Version_cls), + REXX_METHOD(dlgutil_version_cls, dlgutil_version_cls), + REXX_METHOD(dlgutil_hiWord_cls, dlgutil_hiWord_cls), + REXX_METHOD(dlgutil_loWord_cls, dlgutil_loWord_cls), + REXX_METHOD(dlgutil_handleToPointer_cls, dlgutil_handleToPointer_cls), + REXX_METHOD(dlgutil_test_cls, dlgutil_test_cls), + + REXX_METHOD(ri_init, ri_init), + REXX_METHOD(ri_release, ri_release), + REXX_METHOD(ri_handle, ri_handle), + REXX_METHOD(ri_isNull, ri_isNull), + REXX_METHOD(ri_systemErrorCode, ri_systemErrorCode), + REXX_METHOD(ri_getImage, ri_getImage), + + REXX_METHOD(image_init_cls, image_init_cls), + REXX_METHOD(image_saveImage_cls, image_saveImage_cls), + REXX_METHOD(image_removeImage_cls, image_removeImage_cls), + REXX_METHOD(image_id_cls, image_id_cls), + REXX_METHOD(image_getImage_cls, image_getImage_cls), + REXX_METHOD(image_colorRef_cls, image_colorRef_cls), + REXX_METHOD(image_getRValue_cls, image_getRValue_cls), + REXX_METHOD(image_getGValue_cls, image_getGValue_cls), + REXX_METHOD(image_getBValue_cls, image_getBValue_cls), + REXX_METHOD(image_init, image_init), + REXX_METHOD(image_assignImage, image_assignImage), + REXX_METHOD(image_isNull, image_isNull), + REXX_METHOD(image_systemErrorCode, image_systemErrorCode), + REXX_METHOD(image_handle, image_handle), + REXX_METHOD(pbc_stepIt, pbc_stepIt), REXX_METHOD(pbc_getPos, pbc_getPos), REXX_METHOD(pbc_setPos, pbc_setPos), @@ -2225,8 +2213,16 @@ REXX_METHOD(pbc_setBkColor, pbc_setBkColor), REXX_METHOD(pbc_setBarColor, pbc_setBarColor), REXX_METHOD(pbc_test, pbc_test), - REXX_METHOD(bc_cls_releaseImageList, bc_cls_releaseImageList), - REXX_METHOD(bc_cls_checkInGroup, bc_cls_checkInGroup), + + REXX_METHOD(stc_getText, stc_getText), + REXX_METHOD(stc_setText, stc_setText), + REXX_METHOD(stc_getIcon, stc_getIcon), + REXX_METHOD(stc_setIcon, stc_setIcon), + REXX_METHOD(stc_getImage, stc_getImage), + REXX_METHOD(stc_setImage, stc_setImage), + + REXX_METHOD(bc_releaseImageList_cls, bc_releaseImageList_cls), + REXX_METHOD(bc_checkInGroup_cls, bc_checkInGroup_cls), REXX_METHOD(bc_getState, bc_getState), REXX_METHOD(bc_setState, bc_setState), REXX_METHOD(gb_setStyle, gb_setStyle), Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.h =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.h 2008-12-12 18:56:37 UTC (rev 3794) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.h 2008-12-15 06:13:13 UTC (rev 3795) @@ -66,7 +66,7 @@ #define WM_USER_HOOK WM_USER + 0x0608 #define WM_USER_CONTEXT_... [truncated message content] |
From: <mie...@us...> - 2008-12-23 16:26:28
|
Revision: 3803 http://oorexx.svn.sourceforge.net/oorexx/?rev=3803&view=rev Author: miesfeld Date: 2008-12-23 16:26:23 +0000 (Tue, 23 Dec 2008) Log Message: ----------- This commit continues the process of getting ooDialog ready for the 4.0.0 release. * Adds the .ImageList class * Adds infrastructure for future conversion to the new native API * Fixes several existing bugs found while testing the new APIs * Refines methods in ButtonControl, StaticControl, and ListControl that use the new API * Some general code clean up Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/basedlg.cls main/trunk/extensions/platform/windows/oodialog/catdlg.cls main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/oovdata.cpp main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp main/trunk/extensions/platform/windows/oodialog/oovdraw.cpp main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.h main/trunk/extensions/platform/windows/oodialog/plbdlg.cls main/trunk/extensions/platform/windows/oodialog/stddlg.cls main/trunk/extensions/platform/windows/oodialog/stdext.cls Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2008-12-23 16:26:23 UTC (rev 3803) @@ -45,6 +45,7 @@ ::class 'AdvancedControls' Mixinclass Object public +::method putControl private unguarded external "LIBRARY oodialog advCtrl_putControl_pvt" ::method GetControl unguarded private use arg id, category, type @@ -80,25 +81,31 @@ ctrlobj = class~new(self, id, category) end - if ctrlobj~hwnd = 0 then + if ctrlobj \== .nil, ctrlobj~hwnd = 0 then return .nil else return ctrlobj +::method getStaticControl unguarded external "LIBRARY oodialog advCtrl_getStaticControl" +/* ::method GetStaticControl unguarded arr = Arg(1,"A") arr[3] = "ST" forward message "GetControl" Arguments (arr) +*/ ::method GetEditControl unguarded arr = Arg(1,"A") arr[3] = "EL" forward message "GetControl" Arguments (arr) +::method getButtonControl unguarded external "LIBRARY oodialog advCtrl_getButtonControl" +/* ::method GetButtonControl unguarded arr = Arg(1,"A") arr[3] = "BUT" forward message "GetControl" Arguments (arr) +*/ ::method GetRadioControl unguarded arr = Arg(1,"A") @@ -135,13 +142,16 @@ arr[3] = "TC" forward message "GetControl" Arguments (arr) +::method getListControl unguarded external "LIBRARY oodialog advCtrl_getListControl" +/* ::method GetListControl unguarded arr = Arg(1,"A") arr[3] = "LC" forward message "GetControl" Arguments (arr) continue listControl = result - listControl~lastItem = listControl~items - 1 + if listControl \== .nil then listControl~lastItem = listControl~items - 1 return listControl +*/ ::method GetProgressBar unguarded arr = Arg(1,"A") @@ -1183,6 +1193,7 @@ if Arg(2,'o') = 1 then partial = 0 return HandleListCtrl("M", "ENVIS", self~Hwnd, item, partial) +-- This method is deprecated, use setImageList() ::method SetSmallImages use arg bmp, cx, cy if Arg(1,'o') = 1 then return -1 @@ -1190,6 +1201,7 @@ if Arg(3,'o') = 1 then cy = 0 return HandleListCtrl("I", "SETIMG",self~Hwnd, bmp, cx, cy, "SMALL") +-- This method is deprecated, use setImageList() ::method SetImages use arg bmp, cx, cy if Arg(1,'o') = 1 then return -1 @@ -1197,12 +1209,17 @@ if Arg(3,'o') = 1 then cy = 0 return HandleListCtrl("I", "SETIMG",self~Hwnd, bmp, cx, cy, "") +-- This method is deprecated, use setImageList() ::method RemoveSmallImages return HandleListCtrl("I", "UNSETIMG", self~Hwnd, "SMALL") +-- This method is deprecated, use setImageList() ::method RemoveImages return HandleListCtrl("I", "UNSETIMG", self~Hwnd, "") +::method setImageList external "LIBRARY oodialog lv_setImageList" +::method getImageList external "LIBRARY oodialog lv_getImageList" + ::method Find use arg txt, startItem, wrap if Arg(2,'o') = 1 then startItem = -1 @@ -1704,27 +1721,19 @@ ::method "style=" external "LIBRARY oodialog gb_setStyle" ::class 'ButtonControl' subclass DialogControl public -::method releaseImageList class external "LIBRARY oodialog bc_releaseImageList_cls" -::constant BUTTON_IMAGELIST_ALIGN_LEFT 0 -::constant BUTTON_IMAGELIST_ALIGN_RIGHT 1 -::constant BUTTON_IMAGELIST_ALIGN_TOP 2 -::constant BUTTON_IMAGELIST_ALIGN_BOTTOM 3 -::constant BUTTON_IMAGELIST_ALIGN_CENTER 4 - ::method state external "LIBRARY oodialog bc_getState" ::method "state=" external "LIBRARY oodialog bc_setState" ::method "style=" external "LIBRARY oodialog bc_setStyle" +::method push external "LIBRARY oodialog bc_click" +::method click external "LIBRARY oodialog bc_click" + ::method getIdealSize external "LIBRARY oodialog bc_getIdealSize" ::method getTextMargin external "LIBRARY oodialog bc_getTextMargin" ::method setTextMargin external "LIBRARY oodialog bc_setTextMargin" ::method setImageList external "LIBRARY oodialog bc_setImageList" ::method getImageList external "LIBRARY oodialog bc_getImageList" - -::method push external "LIBRARY oodialog bc_click" -::method click external "LIBRARY oodialog bc_click" - ::method getImage external "LIBRARY oodialog bc_getImage" ::method setImage external "LIBRARY oodialog bc_setImage" @@ -1794,20 +1803,20 @@ ::class 'RadioButton' subclass ButtonControl public -::method checkInGroup class external "LIBRARY oodialog bc_checkInGroup_cls" +::method checkInGroup class external "LIBRARY oodialog rb_checkInGroup_cls" -::method checked external "LIBRARY oodialog bc_checked" -::method isChecked external "LIBRARY oodialog bc_isChecked" -::method check external "LIBRARY oodialog bc_check" -::method uncheck external "LIBRARY oodialog bc_uncheck" +::method checked external "LIBRARY oodialog rb_checked" +::method isChecked external "LIBRARY oodialog rb_isChecked" +::method check external "LIBRARY oodialog rb_check" +::method uncheck external "LIBRARY oodialog rb_uncheck" /* This method is DEPRECATED radio buttons can not be set to indeterminate. */ -::method indeterminate external "LIBRARY oodialog bc_check" +::method indeterminate external "LIBRARY oodialog rb_check" ::class 'CheckBox' subclass RadioButton public -::method indeterminate external "LIBRARY oodialog bc_indeterminate" -::method isIndeterminate external "LIBRARY oodialog bc_isIndeterminate" +::method indeterminate external "LIBRARY oodialog ckbx_indeterminate" +::method isIndeterminate external "LIBRARY oodialog ckbx_isIndeterminate" /**************** List Box Class **********************************************/ Modified: main/trunk/extensions/platform/windows/oodialog/basedlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-23 16:26:23 UTC (rev 3803) @@ -405,6 +405,7 @@ ::method isNull external "LIBRARY oodialog ri_isNull" ::method systemErrorCode external "LIBRARY oodialog ri_systemErrorCode" ::method getImage external "LIBRARY oodialog ri_getImage" +::method getImages external "LIBRARY oodialog ri_getImages" ::class 'Image' public @@ -412,8 +413,8 @@ ::method init class external "LIBRARY oodialog image_init_cls" ::method id class external "LIBRARY oodialog image_id_cls" ::method getImage class external "LIBRARY oodialog image_getImage_cls" -::method saveImage class private external "LIBRARY oodialog image_saveImage_cls" -::method removeImage class private external "LIBRARY oodialog image_removeImage_cls" +::method fromFiles class external "LIBRARY oodialog image_fromFiles_cls" +::method fromIDs class external "LIBRARY oodialog image_fromIDs_cls" ::method colorRef class external "LIBRARY oodialog image_colorRef_cls" ::method getRValue class external "LIBRARY oodialog image_getRValue_cls" @@ -421,7 +422,25 @@ ::method getBValue class external "LIBRARY oodialog image_getBValue_cls" ::method init external "LIBRARY oodialog image_init" +::method release external "LIBRARY oodialog image_release" ::method handle external "LIBRARY oodialog image_handle" ::method isNull external "LIBRARY oodialog image_isNull" ::method systemErrorCode external "LIBRARY oodialog image_systemErrorCode" ::method assignImage private external "LIBRARY oodialog image_assignImage" + +::class 'ImageList' public +::method create class external "LIBRARY oodialog il_create_cls" + +::method init external "LIBRARY oodialog il_init" +::method release external "LIBRARY oodialog il_release" +::method add external "LIBRARY oodialog il_add" +::method addMasked external "LIBRARY oodialog il_addMasked" +::method addIcon external "LIBRARY oodialog il_addIcon" +::method addImages external "LIBRARY oodialog il_addImages" +::method getCount external "LIBRARY oodialog il_getCount" +::method getImageSize external "LIBRARY oodialog il_getImageSize" +::method duplicate external "LIBRARY oodialog il_duplicate" +::method remove external "LIBRARY oodialog il_remove" +::method removeAll external "LIBRARY oodialog il_removeAll" +::method handle external "LIBRARY oodialog il_handle" +::method isNull external "LIBRARY oodialog il_isNull" Modified: main/trunk/extensions/platform/windows/oodialog/catdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2008-12-23 16:26:23 UTC (rev 3803) @@ -260,9 +260,9 @@ parse value GetStdTextSize("Hg") with . stdty if self~catstyle~wordpos("TOPLINE") > 0 then - self~AddWhiteRect(0, 2, self~SizeX, stdty + (self~caty+2)) + self~addWhiteRect(0, 2, self~SizeX, stdty + (self~caty+2)) else if self~catstyle~wordpos("DROPDOWN") > 0 then - self~AddWhiteRect(0, 2, self~SizeX, stdty + (self~caty*2)+1) + self~addWhiteRect(0, 2, self~SizeX, stdty + (self~caty*2)+1) lbtext = self~catalog['page']['leftbtntext'] rbtext = self~catalog['page']['rightbtntext'] @@ -281,7 +281,7 @@ if self~Wizard = 1 then self~AddButtonGroup(5, self~SizeY - 15,,, lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "FIX") end - self~AddWhiteFrame(0, self~SizeY - 20, self~SizeX, 1) + self~addWhiteFrame(0, self~SizeY - 20, self~SizeX, 1) /* */ Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2008-12-23 16:26:23 UTC (rev 3803) @@ -445,39 +445,39 @@ opts = self~InternGetRCStyle(style, "ST") select when style~wordpos("SS_LEFT") > 0 then - self~AddText(x, y, w, h, name, opts, id) + self~addText(x, y, w, h, name, opts, id) when style~wordpos("SS_RIGHT") > 0 then - self~AddText(x, y, w, h, name, opts || " RIGHT", id) + self~addText(x, y, w, h, name, opts || " RIGHT", id) when style~wordpos("SS_CENTER") > 0 then - self~AddText(x, y, w, h, name, opts || " CENTER", id) + self~addText(x, y, w, h, name, opts || " CENTER", id) when style~wordpos("SS_SIMPLE") > 0 then - self~AddText(x, y, w, h, name, opts || " SIMPLE", id) + self~addText(x, y, w, h, name, opts || " SIMPLE", id) when style~wordpos("SS_LEFTNOWORDWRAP") > 0 then - self~AddText(x, y, w, h, name, opts || " LEFTNOWRAP", id) + self~addText(x, y, w, h, name, opts || " LEFTNOWRAP", id) when style~wordpos("SS_WHITERECT") > 0 then - self~AddWhiteRect(x, y, w, h, opts, id) + self~addWhiteRect(x, y, w, h, opts, id) when style~wordpos("SS_GRAYRECT") > 0 then - self~AddGrayRect(x, y, w, h, opts, id) + self~addGrayRect(x, y, w, h, opts, id) when style~wordpos("SS_BLACKRECT") > 0 then - self~AddBlackRect(x, y, w, h, opts, id) + self~addBlackRect(x, y, w, h, opts, id) when style~wordpos("SS_WHITEFRAME") > 0 then - self~AddWhiteFRAME(x, y, w, h, opts, id) + self~addWhiteFrame(x, y, w, h, opts, id) when style~wordpos("SS_GRAYFRAME") > 0 then - self~AddGrayFRAME(x, y, w, h, opts, id) + self~addGrayFrame(x, y, w, h, opts, id) when style~wordpos("SS_BLACKFRAME") > 0 then - self~AddBlackFRAME(x, y, w, h, opts, id) + self~addBlackFrame(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDFRAME") > 0 then - self~AddEtchedFrame(x, y, w, h, opts, id) + self~addEtchedFrame(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDHORZ") > 0 then - self~AddEtchedHorizontalFrame(x, y, w, h, opts, id) + self~addEtchedHorizontalFrame(x, y, w, h, opts, id) when style~wordpos("SS_ETCHEDVERT") > 0 then - self~AddEtchedVerticalFrame(x, y, w, h, opts, id) + self~addEtchedVerticalFrame(x, y, w, h, opts, id) when style~wordpos("SS_BITMAP") > 0 then - self~AddImage(id, x, y, w, h, "BITMAP " || opts) + self~addImage(id, x, y, w, h, "BITMAP " || opts) when style~wordpos("SS_ENHMETAFILE") > 0 then - self~AddImage(id, x, y, w, h, "METAFILE " || opts) + self~addImage(id, x, y, w, h, "METAFILE " || opts) when style~wordpos("SS_ICON") > 0 then - self~AddImage(id, x, y, w, h, "ICON " || opts) + self~addImage(id, x, y, w, h, "ICON " || opts) otherwise ret = ErrorMessage("Static item ignored due to unknown static style option in:" || - '0d0a'x || f "("s")") @@ -545,12 +545,12 @@ if type = "CTEXT" then opts = opts || " CENTER"; else if type = "RTEXT" then opts = opts || " RIGHT"; else if style~wordpos("SS_LEFTNOWORDWRAP") > 0 then opts = opts || " LEFTNOWRAP"; - self~AddText(x, y, w, h, name, opts, id) + self~addText(x, y, w, h, name, opts, id) end when type = "ICON" then do opts = self~InternGetRCStyle(style, "ST") - self~AddImage(id, x, y, w, h, "ICON " || opts) + self~addImage(id, x, y, w, h, "ICON " || opts) end when type = "GROUPBOX" then @@ -640,7 +640,7 @@ when opts~wordpos("TEXT") > 0 then return self~addText(x, y, cx, cy, text, opts, id) when opts~wordpos("BITMAP") > 0 | opts~wordpos("METAFILE") > 0 | opts~wordpos("ICON") > 0 then do - forward message "AddImage" + forward message "addImage" end when opts~wordpos("WHITERECT") > 0 then return self~InternAddStatic(argA, 0) @@ -657,14 +657,14 @@ end -- End select -::method AddImage +::method addImage use strict arg id, x, y, cx, cy, options = "" id = self~ItemAdd(id) if id < 0 then return id options = self~GetDefaultOpts(options) self~activePtr = UsrAddControl("IMG", self~activePtr, id, x, y, cx, cy, options) -::method AddText +::method addText use arg x, y, cx = 0, cy = 0, text = "", opts = "", id = (-1) if cx = 0 | cy = 0 then do @@ -678,31 +678,31 @@ self~activePtr = UsrAddControl("TXT", self~activePtr, x, y, cx, cy, opts, text, id) return 0 -::method AddWhiteRect +::method addWhiteRect return self~InternAddStatic(Arg(1,"A"), 0) -::method AddGrayRect +::method addGrayRect return self~InternAddStatic(Arg(1,"A"), 1) -::method AddBlackRect +::method addBlackRect return self~InternAddStatic(Arg(1,"A"), 2) -::method AddWhiteFrame +::method addWhiteFrame return self~InternAddStatic(Arg(1,"A"), 3) -::method AddGrayFrame +::method addGrayFrame return self~InternAddStatic(Arg(1,"A"), 4) -::method AddBlackFrame +::method addBlackFrame return self~InternAddStatic(Arg(1,"A"), 5) -::method AddEtchedFrame +::method addEtchedFrame return self~InternAddStatic(Arg(1,"A"), 6) -::method AddEtchedHorizontalFrame +::method addEtchedHorizontalFrame return self~InternAddStatic(Arg(1,"A"), 7) -::method AddEtchedVerticalFrame +::method addEtchedVerticalFrame return self~InternAddStatic(Arg(1,"A"), 8) ::method InternAddStatic private @@ -862,7 +862,7 @@ end if Arg(10,'o') = 1 then idstat = self~GetStaticID(idstat) opts = self~GetDefaultOpts(opts) - self~AddText(x, y+2, cx1, cy, text, opts, idstat) + self~addText(x, y+2, cx1, cy, text, opts, idstat) self~AddEntryLine(id, fname, x+cx1+1, y, cx2, cy, opts) @@ -914,7 +914,7 @@ if cx1 = 0 then cx1 = stepx + 4 if Arg(10,'o') = 1 then idstat = self~GetStaticID(idstat) opts = self~GetDefaultOpts(opts) - self~AddText(x, y, cx1, cy, text, opts, idstat) + self~addText(x, y, cx1, cy, text, opts, idstat) self~AddComboBox(id, attname, x+cx1+2, y, cx2, cy*clines, opts) Modified: main/trunk/extensions/platform/windows/oodialog/oovdata.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdata.cpp 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/oovdata.cpp 2008-12-23 16:26:23 UTC (rev 3803) @@ -894,7 +894,7 @@ parent = aDlg->TheDlg; current = parent; next = GetTopWindow(current); - while ((next) && ((HWND)GetWindowLongPtr(next, GWLP_HWNDPARENT) == parent)) + while ((next) && ((HWND)getWindowPtr(next, GWLP_HWNDPARENT) == parent)) { current = next; Modified: main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/oovdeskt.cpp 2008-12-23 16:26:23 UTC (rev 3803) @@ -269,7 +269,7 @@ HCURSOR oC, hC; res = atoi(argv[3].strptr); hC = LoadCursor(NULL, MAKEINTRESOURCE(res)); - oC = (HCURSOR)SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); + oC = (HCURSOR)setClassPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); SetCursor(hC); RETHANDLE(oC) } @@ -277,12 +277,12 @@ { HCURSOR hC = (HCURSOR)GET_HANDLE(argv[3]); if (hC) { - SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); + setClassPtr(hW, GCLP_HCURSOR, (LONG_PTR)hC); RETHANDLE(SetCursor(hC)) } else { - SetClassLongPtr(hW, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW)); + setClassPtr(hW, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW)); RETHANDLE(SetCursor(LoadCursor(NULL, IDC_ARROW))) } } @@ -356,7 +356,7 @@ if (strstr(argv[2].strptr, "REDRAW")) { - if (RedrawWindow(w, NULL, NULL, RDW_ERASE | RDW_ALLCHILDREN)) + if (RedrawWindow(w, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN)) RETC(0) else RETC(1) } else Modified: main/trunk/extensions/platform/windows/oodialog/oovdraw.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovdraw.cpp 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/oovdraw.cpp 2008-12-23 16:26:23 UTC (rev 3803) @@ -303,7 +303,7 @@ hBmp = (HBITMAP) LoadDIB(argv[3].strptr); /* we have a file name */ lb.lbStyle = BS_DIBPATTERNPT; lb.lbColor = DIB_RGB_COLORS; - lb.lbHatch = (LONG)hBmp; + lb.lbHatch = (ULONG_PTR)hBmp; hB = CreateBrushIndirect(&lb); LocalFree((void *)hBmp); } Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-22 16:48:11 UTC (rev 3802) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-23 16:26:23 UTC (rev 3803) @@ -48,6 +48,7 @@ #include <stdio.h> #include <dlgs.h> #include <malloc.h> +#include <errno.h> #include <shlwapi.h> #include <commctrl.h> #include "oovutil.h" @@ -78,7 +79,125 @@ static void freeSubclassData(SUBCLASSDATA *); static BOOL removeKeyPressSubclass(SUBCLASSDATA *, HWND, INT); +/* Enum for the type of a dialog control. Types to be added as needed. */ +typedef enum {oodcStatic, oodcButton, oodcEdit, oodcProgressBar,} oodControl_t; + +/* General purpose helper functions */ +RexxObjectPtr rxGetBagObjVar(RexxMethodContext *, CSTRING); +RexxObjectPtr rxPutInBag(RexxMethodContext *, RexxObjectPtr, CSTRING); +RexxObjectPtr rxRemoveFromBag(RexxMethodContext *, RexxObjectPtr, CSTRING); + + /** + * Defines and structs for the DlgUtil class. + */ +#define DLGUTILCLASS ".DlgUtil" +#define COMCTL_ERR_TITLE "ooDialog - Windows Common Controls Error" +#define GENERIC_ERR_TITLE "ooDialog - Error" +#define DLLGETVERSION_FUNCTION "DllGetVersion" +#define COMMON_CONTROL_DLL "comctl32.dll" + +extern DWORD ComCtl32Version = 0; + + +/** + * Defines and structs for Button controls: .ButtonControl, .GroupBox, etc.. + */ +#define BUTTONCONTROLCLASS ".ButtonControl" +#define RADIOBUTTONCLASS ".RadioButton" +#define CHECKBOXCLASS ".CheckBox" +#define GROUPBOXCLASS ".GroupBox" +#define ANIMATEDBUTTONCLASS ".AnimatedButton" + +#define BC_SETSTYLE_OPTS "PUSHBOX, DEFPUSHBUTTON, CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE, " \ + "RADIO, AUTORADIO, GROUPBOX, OWNERDRAW, LEFTTEXT, RIGHTBUTTON, NOTLEFTTEXT, " \ + "TEXT, ICON, BITMAP, LEFT, RIGHT, HCENTER, TOP, BOTTOM, VCENTER, PUSHLIKE, " \ + "NOTPUSHLIKE, MULTILINE, NOTMULTILINE, NOTIFY, NOTNOTIFY, FLAT, NOTFLAT" + +#define BC_SETSTATE_OPTS "CHECKED, UNCHECKED, INDETERMINATE, FOCUS, PUSH, NOTPUSHED" +#define BS_IMAGEMASK 0x000000c0 +#define MIN_HALFHEIGHT_GB 12 + +typedef enum {push, check, radio, group, owner, notButton} BUTTONTYPE, *PBUTTONTYPE; +typedef enum {def, autoCheck, threeState, autoThreeState, noSubtype } BUTTONSUBTYPE, *PBUTTONSUBTYPE; + +/** + * Defines, structs, etc., for the .ImageList class. + */ + +#define IMAGELISTCLASS ".ImageList" + + +// ImageList helper functions. +HIMAGELIST rxGetImageList(RexxMethodContext *, RexxObjectPtr, int); +RexxObjectPtr rxNewImageList(RexxMethodContext *, HIMAGELIST); + +#define IL_DEFAULT_FLAGS ILC_COLOR32 | ILC_MASK +#define IL_DEFAULT_COUNT 6 +#define IL_DEFAULT_GROW 0 + + +/** + * Defines, structs, etc., for the .Image class. + */ + +#define IMAGECLASS ".Image" + +// This is a generic helper function, but it is currently only used by .Image objects. +void rxDefineMethod(RexxMethodContext *, RexxObjectPtr, CSTRING name, CSTRING); + +// Helper functions. +RexxObjectPtr rxNewImageFromControl(RexxMethodContext *, HWND, HANDLE, uint8_t, oodControl_t); +CSTRING getImageTypeName(uint8_t); +RexxObjectPtr rxNewEmptyImage(RexxMethodContext *); +RexxObjectPtr rxNewImage(RexxMethodContext *, HANDLE, uint8_t, RexxObjectPtr, uint32_t, bool, CSTRING); + +#define REALINIT_MTH_DEF "forward MESSAGE \"assignImage\"\n" +#define REALINIT_PUB_NAME "laerTini" + +#define IMAGE_TYPE_LIST "Bitmap, Icon, Cursor, Enhanced Metafile" + +typedef struct _OODIMAGE +{ + SIZE size; + HANDLE hImage; + LONG type; + DWORD flags; + DWORD lastError; + CSTRING typeName; + CSTRING fileName; // Not currently used, may change to char[256]. + + bool srcOOD; // True - comes from ooDialog code using LoadImage(), + // False comes from a raw retrieved handle. + bool canRelease; + bool isValid; +} OODIMAGE, *POODIMAGE; + +POODIMAGE rxGetOodImage(RexxMethodContext *, RexxObjectPtr, int); +POODIMAGE rxGetImageIcon(RexxMethodContext *, RexxObjectPtr, int); +POODIMAGE rxGetImageBitmap(RexxMethodContext *, RexxObjectPtr, int); + + +/** + * Defines and structs for the .ResourceImage class. + */ +#define RESOURCEIMAGECLASS ".ResourceImage" + +typedef struct _RESOURCEIMAGE +{ + HMODULE hMod; + DWORD lastError; + bool canRelease; + bool isValid; +} RESOURCEIMAGE, *PRESOURCEIMAGE; + + +/** + * Defines and structs for the .ProgressBar class. + */ +#define PROGRESSBARCLASS ".ProgressBar" + +/** * This classic Rexx external function was documented prior to 4.0.0. */ size_t RexxEntry PlaySoundFile(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) @@ -786,7 +905,7 @@ HWND ew = TreeView_GetEditControl(h); if (ew) { - WNDPROC oldProc = (WNDPROC)SetWindowLongPtr(ew, GWLP_WNDPROC, (LONG_PTR)CatchReturnSubProc); + WNDPROC oldProc = (WNDPROC)setWindowPtr(ew, GWLP_WNDPROC, (LONG_PTR)CatchReturnSubProc); if (oldProc != (WNDPROC)CatchReturnSubProc) wpOldEditProc = oldProc; RETPTR(oldProc) } @@ -798,7 +917,7 @@ HWND ew = TreeView_GetEditControl(h); if (ew) { - SetWindowLongPtr((HWND)ew, GWLP_WNDPROC, (LONG_PTR)wpOldEditProc); + setWindowPtr((HWND)ew, GWLP_WNDPROC, (LONG_PTR)wpOldEditProc); RETC(0) } RETVAL(-1) @@ -1291,11 +1410,11 @@ { if ( argc == 3 ) { - RETPTR(GetWindowLongPtr(hCtrl, GWLP_USERDATA)); + RETPTR(getWindowPtr(hCtrl, GWLP_USERDATA)); } else if ( argc == 4 ) { - RETPTR(SetWindowLongPtr(hCtrl, GWLP_USERDATA, atol(argv[3].strptr))); + RETPTR(setWindowPtr(hCtrl, GWLP_USERDATA, atol(argv[3].strptr))); } else RETERR } @@ -1601,7 +1720,7 @@ else if ( strcmp(argv[2].strptr, "ORDER") == 0 ) /* Set, get column Order */ { int count; - int *order; + int *order, *pOrder; int i = 0; int retVal = 1; @@ -1617,6 +1736,7 @@ { RETVAL(-(LONG)GetLastError()) } + pOrder = order; if ( argc == 3 ) { @@ -1648,9 +1768,9 @@ else { retstr->strptr[0] = '\0'; - for ( i = 0; i < count; i++, order++ ) + for ( i = 0; i < count; i++, pOrder++ ) { - strcat(retstr->strptr, ltoa(*order, buf, 10)); + strcat(retstr->strptr, ltoa(*pOrder, buf, 10)); strcat(retstr->strptr, " "); } retstr->strlength = strlen(retstr->strptr); @@ -1665,12 +1785,19 @@ token = strtok(str, " "); while( token != NULL && i++ < count ) { - *order++ = atoi(token); + *pOrder++ = atoi(token); token = strtok(NULL, " "); } free(str); retVal = ListView_SetColumnOrderArray(hList, count, order) == 0 ? -2 : 0; + + // If we don't redraw the list view and it is already displayed + // on the screen, it will look mangled. + if ( retVal == 0 ) + { + RedrawWindow(hList, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); + } } else { @@ -1942,7 +2069,7 @@ HWND ew = ListView_GetEditControl(h); if (ew) { - WNDPROC oldProc = (WNDPROC)SetWindowLongPtr(ew, GWLP_WNDPROC, (LONG_PTR)CatchReturnSubProc); + WNDPROC oldProc = (WNDPROC)setWindowPtr(ew, GWLP_WNDPROC, (LONG_PTR)CatchReturnSubProc); if (oldProc != (WNDPROC)CatchReturnSubProc) wpOldEditProc = oldProc; RETPTR(oldProc) } @@ -1954,7 +2081,7 @@ HWND ew = ListView_GetEditControl(h); if (ew) { - SetWindowLongPtr(ew, GWLP_WNDPROC, (LONG_PTR)wpOldEditProc); + setWindowPtr(ew, GWLP_WNDPROC, (LONG_PTR)wpOldEditProc); RETC(0) } RETVAL(-1) @@ -2955,6 +3082,8 @@ * just used by native method functions in this source file. */ +bool rxStr2Number(RexxMethodContext *, CSTRING, uint64_t *, int); + #define OOD_ID_EXCEPTION -9 #define NO_HMODULE_MSG "failed to obtain %s module handle; OS error code %d" @@ -3118,13 +3247,11 @@ return adm; } - inline HWND rxGetWindowHandle(RexxMethodContext * context, RexxObjectPtr self) { return (HWND)rxGetPointerAttribute(context, self, "HWND"); } - void systemServiceException(RexxMethodContext *context, char *msg) { context->RaiseException1(Rexx_Error_System_service_user_defined, context->String(msg)); @@ -3163,12 +3290,64 @@ systemServiceException(c, "Failed to allocate memory"); } +void userDefinedMsgException(RexxMethodContext *c, CSTRING msg) +{ + c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(msg)); +} + void *wrongClassException(RexxMethodContext *c, int pos, const char *n) { c->RaiseException2(Rexx_Error_Incorrect_method_noclass, c->WholeNumber(pos), c->String(n)); return NULL; } +void invalidTypeException(RexxMethodContext *c, int pos, const char *type) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d is not a valid %s", pos, type); + userDefinedMsgException(c, buffer); +} + +void invalidImageException(RexxMethodContext *c, int pos, CSTRING type, CSTRING actual) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d must be a %s image; found %s", pos, type, actual); + userDefinedMsgException(c, buffer); +} + +void wrongObjInArrayException(RexxMethodContext *c, int argPos, size_t index, CSTRING obj) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d is an array and index %d is not a %s", argPos, index, obj); + userDefinedMsgException(c, buffer); +} + +void emptyArrayException(RexxMethodContext *c, int argPos) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d must be a non-empty array", argPos); + userDefinedMsgException(c, buffer); +} + +void nullObjectException(RexxMethodContext *c, CSTRING name, int pos) +{ + TCHAR buffer[256]; + if ( pos == 0 ) + { + _snprintf(buffer, sizeof(buffer), "The %s object must not be null", name); + } + else + { + _snprintf(buffer, sizeof(buffer), "Method argument %d, the %s object, must not be null", pos, name); + } + userDefinedMsgException(c, buffer); +} + +void nullObjectException(RexxMethodContext *c, CSTRING name) +{ + nullObjectException(c, name, 0); +} + void nullPointerException(RexxMethodContext *c, int pos) { c->RaiseException1(Rexx_Error_Incorrect_method_null, c->WholeNumber(pos)); @@ -3180,11 +3359,6 @@ c->ArrayOfFour(c->WholeNumber(pos), c->WholeNumber(min), c->WholeNumber(max), actual)); } -void userDefinedMsgException(RexxMethodContext *c, CSTRING msg) -{ - c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(msg)); -} - void wrongRangeException(RexxMethodContext *c, int pos, int min, int max, int actual) { wrongRangeException(c, pos, min, max, c->WholeNumber(actual)); @@ -3201,6 +3375,13 @@ wrongArgValueException(c, pos, list, c->String(actual)); } +void wrongWindowStyleException(RexxMethodContext *c, const char *obj, const char *style) +{ + char msg[128]; + _snprintf(msg, sizeof(msg), "This %s does not have the %s style", obj, style); + userDefinedMsgException(c, msg); +} + bool requiredComCtl32Version(RexxMethodContext *context, const char *methodName, DWORD minimum) { if ( ComCtl32Version < minimum ) @@ -3213,31 +3394,16 @@ return true; } -bool isInstanceOf(RexxMethodContext *context, RexxObjectPtr obj, const char *name) +bool requiredClass(RexxMethodContext *c, RexxObjectPtr obj, const char *name, int pos) { - RexxClassObject rxClass = context->FindContextClass(name); - return (rxClass != NULLOBJECT && context->IsInstanceOf(obj, rxClass)) ? true : false; -} - - -bool requiredClass(RexxMethodContext *context, RexxObjectPtr obj, const char *name, int argPos) -{ - RexxClassObject rxClass = context->FindContextClass(name); - if ( ! isInstanceOf(context, obj, name) ) + if ( obj == NULLOBJECT || ! c->IsOfType(obj, name) ) { - wrongClassException(context, argPos, name); + wrongClassException(c, pos, name); return false; } return true; } -void wrongWindowStyleException(RexxMethodContext *c, const char *obj, const char *style) -{ - char msg[128]; - _snprintf(msg, sizeof(msg), "This %s does not have the %s style", obj, style); - userDefinedMsgException(c, msg); -} - /** * Return the number of existing arguments in an ooRexx method invocation. In * others words, it is intended to count neither the omitted args in the ooRexx @@ -3257,6 +3423,29 @@ return (size_t)count; } +bool rxStr2Number(RexxMethodContext *c, CSTRING str, uint64_t *number, int pos) +{ + char *end; + *number = _strtoui64(str, &end, 0); + if ( (end - str != strlen(str)) || errno == EINVAL || *number == _UI64_MAX ) + { + invalidTypeException(c, pos, "number"); + return false; + } + return true; + +} + +RexxClassObject rxGetContextClass(RexxMethodContext *c, CSTRING name) +{ + RexxClassObject theClass = c->FindContextClass(name); + if ( theClass == NULL ) + { + c->RaiseException1(Rexx_Error_Execution_noclass, c->String(name)); + } + return theClass; +} + PRECT rxGetRect(RexxMethodContext *context, RexxObjectPtr r, int argPos) { if ( requiredClass(context, r, "Rect", argPos) ) @@ -3269,7 +3458,8 @@ RexxObjectPtr rxNewRect(RexxMethodContext *context, long l, long t, long r, long b) { RexxObjectPtr rect = NULL; - RexxClassObject RectClass = context->FindContextClass("RECT"); + + RexxClassObject RectClass = rxGetContextClass(context, "RECT"); if ( RectClass != NULL ) { RexxArrayObject args = context->NewArray(4); @@ -3292,13 +3482,13 @@ return NULL; } -RexxObjectPtr rxNewPoint(RexxMethodContext *context, long x, long y) +RexxObjectPtr rxNewPoint(RexxMethodContext *c, long x, long y) { RexxObjectPtr point = NULL; - RexxClassObject PointClass = context->FindContextClass("POINT"); + RexxClassObject PointClass = rxGetContextClass(c, "POINT"); if ( PointClass != NULL ) { - point = context->SendMessage2(PointClass, "NEW", context->WholeNumber(x), context->WholeNumber(y)); + point = c->SendMessage2(PointClass, "NEW", c->WholeNumber(x), c->WholeNumber(y)); } return point; } @@ -3312,71 +3502,100 @@ return NULL; } -RexxObjectPtr rxNewSize(RexxMethodContext *context, long cx, long cy) +RexxObjectPtr rxNewSize(RexxMethodContext *c, long cx, long cy) { RexxObjectPtr size = NULL; - RexxClassObject SizeClass = context->FindContextClass("SIZE"); + RexxClassObject SizeClass = rxGetContextClass(c, "SIZE"); if ( SizeClass != NULL ) { - size = context->SendMessage2(SizeClass, "NEW", context->WholeNumber(cx), context->WholeNumber(cy)); + size = c->SendMessage2(SizeClass, "NEW", c->WholeNumber(cx), c->WholeNumber(cy)); } return size; } -RexxObjectPtr rxNewEmptyImage(RexxMethodContext *c) +inline bool hasStyle(HWND hwnd, DWORD_PTR style) { - RexxObjectPtr image = NULLOBJECT; - RexxClassObject ImageClass = c->FindContextClass("Image"); - if ( ImageClass == NULL ) + if ( (GetWindowLongPtr(hwnd, GWL_STYLE) & style) || (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & style) ) { - c->RaiseException1(Rexx_Error_Execution_noclass, c->String("Image")); - return image; + return true; } + return false; +} - image = c->SendMessage0(ImageClass, "NEW"); - if ( image == NULLOBJECT ) +/** + * Gets a .Bag object from an object variable. If the object variable does yet + * exist, it is first added to the object. + * + * @param c The method context we are executing under. + * @param varName The name of the object variable. + * + * @return The .Bag object, or the NULLOBJECT if something goes wrong. + */ +RexxObjectPtr rxGetBagObjVar(RexxMethodContext *c, CSTRING varName) +{ + // This should never fail, do we need an exception if it does? FIXME TODO + + RexxObjectPtr bag = c->GetObjectVariable(varName); + if ( bag == NULLOBJECT ) { - c->RaiseException2(Rexx_Error_No_method_name, c->String("Image"), c->String("new")); + RexxObjectPtr theBagClass = c->FindClass("BAG"); + if ( theBagClass != NULLOBJECT ) + { + bag = c->SendMessage0(theBagClass, "NEW"); + c->SetObjectVariable(varName, bag); + } } - return image; + return bag; } /** - * Instantiates a new .Image object, specifically from an image returned from - * LoadImage(). + * Put an object into a bag, where the bag is an object variable of some object + * instance. If the bag object variable does not yet exist, it is created. * - * @param context - * @param hImage - * @param type - * @param size - * @param flags - * @param fileName This arg is currently ignored and the empty string is used. + * @param c The method context of the object we are executing in. + * @param obj The object to put in the bag. + * @param varName The object variable name of the bag. * - * @return RexxObjectPtr + * @return NULLOBJECT, always + * + * @note This helper function is used by both the Image and ImageList classes. */ -RexxObjectPtr rxNewImage(RexxMethodContext *c, HANDLE hImage, uint8_t type, RexxObjectPtr size, - uint32_t flags, CSTRING fileName) +RexxObjectPtr rxPutInBag(RexxMethodContext *c, RexxObjectPtr obj, CSTRING varName) { - RexxObjectPtr image = rxNewEmptyImage(c); - - if ( image != NULLOBJECT ) + RexxObjectPtr bag = rxGetBagObjVar(c, varName); + if ( bag != NULLOBJECT ) { - RexxArrayObject args = c->ArrayOfFour(c->NewPointer(hImage), c->UnsignedInt32(type), size, - c->UnsignedInt32(flags)); - c->ArrayAppend(args, c->String(fileName)); - c->SendMessage(image, "realInit", args); + c->SendMessage2(bag, "PUT", obj, obj); } - return image; + return NULLOBJECT; } - -inline bool hasStyle(HWND hwnd, DWORD_PTR style) +/** + * Remove an object from a bag, where the bag is an object variable of some + * object instance. If the bag object variable does not yet exist, it is + * created. + * + * @param c The method context of the object we are executing in. + * @param obj The object to remove from the bag. + * @param varName The object variable name of the bag. + * + * @return The removed object, which can be .nil if there is no such item in the + * bag. (Which includes the scenario where the bag was created.) + * + */ +RexxObjectPtr rxRemoveFromBag(RexxMethodContext *c, RexxObjectPtr obj, CSTRING varName) { - if ( (GetWindowLongPtr(hwnd, GWL_STYLE) & style) || (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & style) ) + RexxObjectPtr item = NULLOBJECT; + RexxObjectPtr bag = rxGetBagObjVar(c, varName); + if ( bag != NULLOBJECT ) { - return true; + item = c->SendMessage1(bag, "REMOVE", obj); } - return false; + if ( item == NULLOBJECT ) + { + item = c->Nil(); + } + return item; } /** @@ -3458,6 +3677,22 @@ return retStr; } +DWORD oodGetSysErrCode(RexxMethodContext *c) +{ + uint32_t code = 0; + + RexxDirectoryObject local = c->GetLocalEnvironment(); + if ( local != NULLOBJECT ) + { + RexxObjectPtr rxCode = c->DirectoryAt(local, "SYSTEMERRORCODE"); + if ( rxCode != NULLOBJECT ) + { + c->UnsignedInt32(rxCode, &code); + } + } + return (DWORD)code; +} + void oodSetSysErrCode(RexxMethodContext *context, DWORD code) { RexxDirectoryObject local = context->GetLocalEnvironment(); @@ -3466,6 +3701,7 @@ context->DirectoryPut(local, context->WholeNumberToObject(code), "SYSTEMERRORCODE"); } } + inline void oodSetSysErrCode(RexxMethodContext *context) { oodSetSysErrCode(context, GetLastError()); @@ -3481,7 +3717,7 @@ * @param id Resource ID. * @param argPosDlg Arg position of the assumed dialog object. Used for raised * exceptions. - * @param argPosID Arg positionof the ID, used for raised exceptions. + * @param argPosID Arg position of the ID, used for raised exceptions. * * @return int The resolved numeric ID, or OOD_ID_EXCEPTION * @@ -3538,7 +3774,162 @@ return result; } +RexxObjectPtr oodSetImageAttribute(RexxMethodContext *c, CSTRING varName, RexxObjectPtr image, HWND hwnd, + HANDLE hOldImage, uint8_t type, oodControl_t ctrl) +{ + RexxObjectPtr result = c->GetObjectVariable(varName); + if ( result == NULLOBJECT ) + { + result = c->Nil(); + } + c->SetObjectVariable(varName, image); + + // It could be that the existing image was set from a resource DLL. In + // which case we need to create an .Image object. + if ( result == c->Nil() && hOldImage != NULL ) + { + result = rxNewImageFromControl(c, hwnd, hOldImage, type, ctrl); + } + return result; +} + +RexxObjectPtr oodGetImageAttribute(RexxMethodContext *c, OSELF self, CSTRING varName, + UINT msg, WPARAM wParam, uint8_t type, oodControl_t ctrl) +{ + // If we already have an image in the object variable, just use it. + RexxObjectPtr result = c->GetObjectVariable(varName); + if ( result == NULLOBJECT ) + { + HWND hwnd = rxGetWindowHandle(c, self); + HANDLE hImage = (HANDLE)SendMessage(hwnd, msg, wParam, 0); + + if ( hImage == NULL ) + { + result = c->Nil(); + } + else + { + // Create a new .Image object from the image handle. + result = rxNewImageFromControl(c, hwnd, hImage, type, ctrl); + } + + // Set the result in the object variable. If there is a next time we + // can retrieve it easily. + c->SetObjectVariable(varName, result); + } + return result; +} + + /** + * Methods for the .AdvancedControls class. + */ +#define ADVANCEDCONTROLS_CLASS "AdvancedControls" +#define ADVCTRLCONTROLBAG_ATTRIBUTE "!advCtrlDlgControlBag" + + +RexxObjectPtr advGetControl(RexxMethodContext *c, ARGLIST args, OSELF self, CSTRING ctrl) +{ + RexxObjectPtr result = c->Nil(); + + HWND hwnd = rxGetWindowHandle(c, self); + if ( hwnd == NULL ) + { + // This happens if the user were to invoke a getXXXControl() method + // before the underlying dialog has been created. + goto out; + } + + HWND hControl = NULL; + RexxObjectPtr rxControl = NULLOBJECT; + + // We have the dialog window handle. We also need the resource ID to get + // the control. + RexxObjectPtr rxID = c->ArrayAt(args, 1); + if ( rxID == NULLOBJECT ) + { + c->RaiseException1(Rexx_Error_Incorrect_method_noarg, c->WholeNumber(1)); + goto out; + } + + // Using 0 for the dialog arg position is okay for now. + int id = oodResolveSymbolicID(c, self, rxID, 0, 1); + if ( id == OOD_ID_EXCEPTION ) + { + // We clear the condition because all the AdvancedControls::getXXCtrl() + // methods prior to 4.0.0 would return a .nil object for this error. It + // would be better to raise an exception, but ... + c->ClearCondition(); + goto out; + } + else + { + hControl = GetDlgItem(hwnd, id); + } + + if ( hControl != NULL ) + { + rxControl = (RexxObjectPtr)getWindowPtr(hControl, GWLP_USERDATA); + if ( rxControl != NULLOBJECT ) + { + // Okay, this specific control has already had a control object + // instantiated to represent it. We return this object. + result = rxControl; + goto out; + } + } + + // No pointer is stored in the user data area, so no control object has been + // instantiated for this specific control, yet. We instantiate one now and + // then store the object in the user data area of the control window. + c->ArrayPut(args, c->String(ctrl), 3); + rxControl = c->ForwardMessage(NULLOBJECT, "GetControl", NULLOBJECT, args); + if ( rxControl == NULLOBJECT ) + { + goto out; + } + result = rxControl; + + if ( result != c->Nil() ) + { + // Good object. + setWindowPtr(hControl, GWLP_USERDATA, (LONG_PTR)result); + c->SendMessage1(self, "putControl", result); + } + +out: + return result; +} + +RexxMethod2(RexxObjectPtr, advCtrl_getStaticControl, ARGLIST, args, OSELF, self) +{ + return advGetControl(context, args, self, "ST"); +} + +RexxMethod2(RexxObjectPtr, advCtrl_getButtonControl, ARGLIST, args, OSELF, self) +{ + return advGetControl(context, args, self, "BUT"); +} + +RexxMethod2(RexxObjectPtr, advCtrl_getListControl, ARGLIST, args, OSELF, self) +{ + return advGetControl(context, args, self, "LC"); +} + +RexxMethod2(RexxObjectPtr, advCtrl_putControl_pvt, RexxObjectPtr, control, OSELF, self) +{ + rxPutInBag(context, control, ADVCTRLCONTROLBAG_ATTRIBUTE); + return context->Nil(); +} + + +/** + * Methods for the ProgressBar class. + */ +#define PROGRESSBAR_CLASS "ProgressBar" + + +/** * Step the progress bar by the step increment or do a delta position. A delta * position moves the progress bar from its current position by the specified * amount. @@ -3768,11 +4159,138 @@ return rxArgCount(context); } + /** + * Methods for the .ListControl. + */ +#define LISTCONTROL_CLASS "ListControl" + +#define STATE_ATTRIBUTE "!STATEIMAGELIST" +#define SMALL_ATTRIBUTE "!SMALLIMAGELIST" +#define NORMAL_ATTRIBUTE "!NORMALIMAGELIST" + +CSTRING lvGetAttributeName(uint8_t type) +{ + switch ( type ) + { + case LVSIL_STATE : + return STATE_ATTRIBUTE; + case LVSIL_SMALL : + return SMALL_ATTRIBUTE; + case LVSIL_NORMAL : + default : + return NORMAL_ATTRIBUTE; + } + +} +RexxObjectPtr lvSetImages(RexxMethodContext *c, RexxObjectPtr imageList, uint8_t type, OSELF self) +{ + CSTRING varName = lvGetAttributeName(type); + + RexxObjectPtr result = c->GetObjectVariable(varName); + if ( result == NULLOBJECT ) + { + result = c->Nil(); + } + c->SetObjectVariable(varName, imageList); + + return result; +} + +/** ListControl::setImageList() + * + * Sets or removes one of a list-view's image lists. + * + * @param imageList An .ImageList object that references the image list to be + * set, or .nil. If .nil, an existing image list, if any is + * removed. + * + * @param type One of the list-view image list types and specifies which + * image list we are concerned with, normal, small or state. + * + * @return Returns the exsiting .ImageList object if there is one, or + * .nil if there is not an existing object. + * + */ +RexxMethod3(RexxObjectPtr, lv_setImageList, RexxObjectPtr, imageList, OPTIONAL_uint8_t, type, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + + // If imageList is .nil, then a NULL himl will remove the current image + // list, if any. + HIMAGELIST himl = NULL; + + if ( imageList != context->Nil() ) + { + // imageList is not .nil, so it has to be a .ImageList, or error. + himl = rxGetImageList(context, imageList, 1); + if ( himl == NULL ) + { + goto err_out; + } + } + + if ( argumentOmitted(2) ) + { + type = LVSIL_NORMAL; + } + else if ( type > LVSIL_STATE ) + { + wrongRangeException(context, 2, LVSIL_NORMAL, LVSIL_STATE, type); + goto err_out; + } + + // We ignore the return from ListView_SetImageList() and instead return what + // this ListControl object has at its image list attribute. + ListView_SetImageList(hwnd, himl, type); + + return lvSetImages(context, imageList, type, self); + +err_out: + return NULLOBJECT; +} + +/** ListControl::getImageList() + * + * Gets the list-view's specifed image list. + * + * @param type [optional] Identifies which image list to get. Normal, small, + * or state. Normalis the default. + * + * @return The image list, if it exists, otherwise .nil. + */ +RexxMethod2(RexxObjectPtr, lv_getImageList, OPTIONAL_uint8_t, type, OSELF, self) +{ + if ( argumentOmitted(1) ) + { + type = LVSIL_NORMAL; + } + else if ( type > LVSIL_STATE ) + { + wrongRangeException(context, 2, LVSIL_NORMAL, LVSIL_STATE, type); + return NULLOBJECT; + } + + RexxObjectPtr result = context->GetObjectVariable(lvGetAttributeName(type)); + if ( result == NULLOBJECT ) + { + result = context->Nil(); + } + return result; +} + + + +/** * Methods for the .StaticControl. */ -#define STATIC_CLASS "StaticControl" +#define STATIC_CLASS "StaticControl" +#define STATICIMAGE_ATTRIBUTE "!STATICIMAGE" +/** StaticControl::setText() + * + * + */ RexxMethod2(uint32_t, stc_setText, CSTRING, text, OSELF, self) { HWND hwnd = rxGetWindowHandle(context, self); @@ -3785,6 +4303,10 @@ return rc; } +/** StaticControl::getText() + * + * + */ RexxMethod1(RexxStringObject, stc_getText, OSELF, self) { RexxStringObject result = NULLOBJECT; @@ -3812,58 +4334,116 @@ return result; } -RexxMethod2(POINTERSTRING, stc_setIcon, POINTERSTRING, hIcon, OSELF, self) +/** StaticControl::setIcon() + * + * Sets or removes the icon image for this static control. + * + * @param icon The new icon image for the the static control, or .nil to + * remove the existing icon. + * + * @return The existing icon, or .nil if there is no existing icon. + */ +RexxMethod2(RexxObjectPtr, stc_setIcon, RexxObjectPtr, icon, OSELF, self) { + RexxObjectPtr result = NULLOBJECT; + + HANDLE hNewIcon = NULL; + if ( icon != context->Nil() ) + { + POODIMAGE oi = rxGetImageIcon(context, icon, 1); + if ( oi == NULL ) + { + goto out; + } + hNewIcon = oi->hImage; + } + HWND hwnd = rxGetWindowHandle(context, self); - return (void *)SendMessage(hwnd, STM_SETICON, (WPARAM)(HICON)hIcon, 0); + HICON hIcon = (HICON)SendMessage(hwnd, STM_SETICON, (WPARAM)hNewIcon, 0); + + result = oodSetImageAttribute(context, STATICIMAGE_ATTRIBUTE, icon, hwnd, hIcon, IMAGE_ICON, oodcStatic); +out: + return result; } -RexxMethod1(POINTERSTRING, stc_getIcon, OSELF, self) +/** StaticControl::getIcon() + * + * Gets the icon image for this static control. + * + * @return The icon image, or .nil if there is no icon image. + */ +RexxMethod1(RexxObjectPtr, stc_getIcon, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - return (void *)SendMessage(hwnd, STM_GETICON, 0, 0); + return oodGetImageAttribute(context, self, STATICIMAGE_ATTRIBUTE, STM_GETICON, 0, IMAGE_ICON, oodcStatic); } -RexxMethod3(POINTERSTRING, stc_setImage, POINTERSTRING, hImage, uint8_t, type, OSELF, self) +/** StaticControl::setImage() + * + * Sets or removes the image for this static control. + * + * @param rxNewImage The new image for the the control, or .nil to remove the + * existing image. + * + * @return The old image, if there is one, otherwise .nil. + */ +RexxMethod2(RexxObjectPtr, stc_setImage, RexxObjectPtr, rxNewImage, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); + RexxObjectPtr result = NULLOBJECT; - if ( type > 3 ) + long type = 0; + HANDLE hImage = NULL; + + if ( rxNewImage != context->Nil() ) { - wrongRangeException(context, 2, 0, 3, type); + POODIMAGE oi = rxGetOodImage(context, rxNewImage, 1); + if ( oi == NULL ) + { + goto out; + } + type = oi->type; + hImage = oi->hImage; } - //HANDLE myImage = LoadImage(NULL, "Camera.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_LOADMAP3DCOLORS); - HANDLE myImage = LoadImage(NULL, MAKEINTRESOURCE(OBM_ZOOM), IMAGE_BITMAP, 0, 0, LR_SHARED); - //HANDLE tmp = (void *)SendMessage(hwnd, STM_SETIMAGE, (WPARAM)type, (LPARAM)(HANDLE)myImage); - HANDLE tmp = (void *)SendMessage(hwnd, STM_SETIMAGE, (WPARAM)type, (LPARAM)(HANDLE)hImage); - printf("setImage() hImage=0x%p type=%d myImage=0x%p returned=0x%p\n", hImage, type, myImage, tmp); + HWND hwnd = rxGetWindowHandle(context, self); + HANDLE oldHandle = (HANDLE)SendMessage(hwnd, STM_SETIMAGE, (WPARAM)type, (LPARAM)hImage); - return tmp; + result = oodSetImageAttribute(context, STATICIMAGE_ATTRIBUTE, rxNewImage, hwnd, oldHandle, -1, oodcStatic); +out: + return result; } -RexxMethod1(POINTERSTRING, stc_getImage, OSELF, self) +/** StaticControl::getImage() + * + * Gets the image for this static control, if any. + * + * @param type [optional] Signals the type of image, one of the image type + * IDs. The default is IMAGE_BITMAP. + * + * @return The existing image, if there is one, otherwise .nil + */ +RexxMethod2(RexxObjectPtr, stc_getImage, OPTIONAL_uint8_t, type, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - return (void *)SendMessage(hwnd, STM_GETICON, 0, 0); + if ( argumentOmitted(1) ) + { + type = IMAGE_BITMAP; + } + if ( type > IMAGE_ENHMETAFILE ) + { + wrongArgValueException(context, 1, IMAGE_TYPE_LIST, getImageTypeName(type)); + return NULLOBJECT; + } + return oodGetImageAttribute(context, self, STATICIMAGE_ATTRIBUTE, STM_GETIMAGE, type, -1, oodcStatic); } /** * Methods for the ooDialog class: .ButtonControl and its subclasses * .RadioButton and .CheckBox. */ -#define BUTTON_CLASS "ButtonControl" +#define BUTTON_CLASS "ButtonControl" -#define BC_SETSTYLE_OPTS "PUSHBOX, DEFPUSHBUTTON, CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE, " \ - "RADIO, AUTORADIO, GROUPBOX, OWNERDRAW, LEFTTEXT, RIGHTBUTTON, NOTLEFTTEXT, " \ - "TEXT, ICON, BITMAP, LEFT, RIGHT, HCENTER, TOP, BOTTOM, VCENTER, PUSHLIKE, " \ - "NOTPUSHLIKE, MULTILINE, NOTMULTILINE, NOTIFY, NOTNOTIFY, FLAT, NOTFLAT" +#define BUTTONIMAGELIST_ATTRIBUTE "!BUTTONIMAGELIST" +#define BUTTONIMAGE_ATTRIBUTE "!BUTTONIMAGE" -#define BC_SETSTATE_OPTS "CHECKED, UNCHECKED, INDETERMINATE, FOCUS, PUSH, NOTPUSHED" - -typedef enum {push, check, radio, group, owner, notButton} BUTTONTYPE, *PBUTTONTYPE; -typedef enum {def, autoCheck, threeState, autoThreeState, noSubtype } BUTTONSUBTYPE, *PBUTTONSUBTYPE; - BUTTONTYPE getButtonInfo(HWND hwnd, PBUTTONSUBTYPE sub, DWORD *style) { BUTTONTYPE type = notButton; @@ -3956,49 +4536,174 @@ return type; } -/** ButtonControl::releaseImageList() [class method] +/** + * Changes the default push button in a dialog to that of the dialog control + * specified. * - * Used to destroy an image list. + * @param hCtrl The push button that is to become the default push button. * - * @param himl [required] The image list handle. + * @return True on success, otherwise false. * + * @assumes hCtrl is a push button control in a dialog. */ -RexxMethod1(RexxObjectPtr, bc_releaseImageList_cls, POINTER, himl) +HWND changeDefPushButton(HWND hCtrl) { - if ( himl != NULL ) + HWND hDlg = GetParent(hCtrl); + int id = GetDlgCtrlID(hCtrl); + HWND hOldDef = NULL; + + if ( hDlg != NULL ) { - ImageList_Destroy((HIMAGELIST)himl); + LRESULT result = SendMessage(hDlg, DM_GETDEFID, 0, 0); + + if ( HIWORD(result) == DC_HASDEFID ) + { + if ( LOWORD(result) == id ) + { + /* This control already is the default push button, just return. + */ + return hOldDef; + } + + /* The DM_SETDEFID message does not remove the default push button + * highlighting, we have to do that ourselves. + */ + hOldDef = (HWND)GetDlgItem(hDlg, LOWORD(result)); + } + + SendMessage(hDlg, DM_SETDEFID, (WPARAM)id, 0); + + if ( hOldDef ) + { + SendMessage(hOldDef, BM_SETSTYLE, (WPARAM)BS_PUSHBUTTON, (LPARAM)TRUE); + } } - return NULLOBJECT; + return hOldDef; } -RexxMethod4(int, bc_checkInGroup_cls, RexxObjectPtr, dlg, RexxObjectPtr, idFirst, - RexxObjectPtr, idLast, RexxObjectPtr, idCheck) +/** + * Gets the button image list information for this button, which includes the + * image list itself, the image alignment, and the margin around the image. + * + * @param c The method context we are executing in. + * @param self The ButtonControl object. + * + * @return A directory object containing the image list information, if there + * is an image list. Otherwise .nil. + * + * @note Button image lists can not be set from a resource file, so if there + * is an image list for this button, it had to be set from code. + * Meaning, if there is not an image list in the object variable, then + * this button does not have an image list. + */ +RexxObjectPtr bcGetImageList(RexxMethodContext *c, RexxObjectPtr self) { - int result = 0; - if ( requiredClass(context, dlg, "PlainBaseDialog", 1) ) + RexxObjectPtr result = c->Nil(); + + RexxObjectPtr imageList = c->GetObjectVariable(BUTTONIMAGELIST_ATTRIBUTE); + if ( imageList != NULLOBJECT && imageList != c->Nil() ) { - HWND hwnd = rxGetWindowHandle(context, dlg); + HWND hwnd = rxGetWindowHandle(c, self); + BUTTON_IMAGELIST biml; - int first = oodResolveSymbolicID(context, dlg, idFirst, 1, 2); - int last = oodResolveSymbolicID(context, dlg, idLast, 1, 3); - int check = oodResolveSymbolicID(context, dlg, idCheck, 1, 4); + Button_GetImageList(hwnd, &biml); + RexxDirectoryObject table = c->NewDirectory(); + if ( table != NULLOBJECT ) + { + c->DirectoryPut(table, imageList, "IMAGELIST"); - if ( first != OOD_ID_EXCEPTION && last != OOD_ID_EXCEPTION && check != OOD_ID_EXCEPTION ) - { - if ( CheckRadioButton(hwnd, first, last, check) =... [truncated message content] |
From: <mie...@us...> - 2008-12-28 16:31:10
|
Revision: 3817 http://oorexx.svn.sourceforge.net/oorexx/?rev=3817&view=rev Author: miesfeld Date: 2008-12-28 16:31:01 +0000 (Sun, 28 Dec 2008) Log Message: ----------- Simplify the instantiation of a new Image object Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/basedlg.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/basedlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-28 06:10:29 UTC (rev 3816) +++ main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2008-12-28 16:31:01 UTC (rev 3817) @@ -410,7 +410,6 @@ ::class 'Image' public -::method init class external "LIBRARY oodialog image_init_cls" ::method id class external "LIBRARY oodialog image_id_cls" ::method getImage class external "LIBRARY oodialog image_getImage_cls" ::method fromFiles class external "LIBRARY oodialog image_fromFiles_cls" @@ -426,7 +425,6 @@ ::method handle external "LIBRARY oodialog image_handle" ::method isNull external "LIBRARY oodialog image_isNull" ::method systemErrorCode external "LIBRARY oodialog image_systemErrorCode" -::method assignImage private external "LIBRARY oodialog image_assignImage" ::class 'ImageList' public ::method create class external "LIBRARY oodialog il_create_cls" Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-28 06:10:29 UTC (rev 3816) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2008-12-28 16:31:01 UTC (rev 3817) @@ -138,18 +138,13 @@ #define IMAGECLASS ".Image" -// This is a generic helper function, but it is currently only used by .Image objects. -void rxDefineMethod(RexxMethodContext *, RexxObjectPtr, CSTRING name, CSTRING); // Helper functions. -RexxObjectPtr rxNewImageFromControl(RexxMethodContext *, HWND, HANDLE, uint8_t, oodControl_t); CSTRING getImageTypeName(uint8_t); +RexxObjectPtr rxNewImageFromControl(RexxMethodContext *, HWND, HANDLE, uint8_t, oodControl_t); RexxObjectPtr rxNewEmptyImage(RexxMethodContext *); -RexxObjectPtr rxNewImage(RexxMethodContext *, HANDLE, uint8_t, RexxObjectPtr, uint32_t, bool, CSTRING); +RexxObjectPtr rxNewValidImage(RexxMethodContext *, HANDLE, uint8_t, PSIZE, uint32_t, bool); -#define REALINIT_MTH_DEF "forward MESSAGE \"assignImage\"\n" -#define REALINIT_PUB_NAME "laerTini" - #define IMAGE_TYPE_LIST "Bitmap, Icon, Cursor, Enhanced Metafile" typedef struct _OODIMAGE @@ -192,6 +187,7 @@ */ #define PROGRESSBARCLASS ".ProgressBar" + /** * This classic Rexx external function was documented prior to 4.0.0. */ @@ -5478,21 +5474,6 @@ #define IMAGELIST_CLASS "ImageList" -/** - * Add a new instance method to a class using the define() method of the .Class - * class. (This is a class method so self must be a class object pointer.) - * - * @param c The method context that self is executing in. - * @param self The self object. - * @param name The name of the new method. - * @param def The method definition. - */ -void rxDefineMethod(RexxMethodContext *c, RexxObjectPtr self, CSTRING name, CSTRING def) -{ - RexxObjectPtr mObj = c->NewMethod(name, def, strlen(def)); - c->SendMessage(self, "DEFINE", c->ArrayOfTwo(c->String(name), mObj)); -} - HIMAGELIST rxGetImageList(RexxMethodContext *context, RexxObjectPtr il, int argPos) { HIMAGELIST himl = NULL; @@ -5893,81 +5874,6 @@ */ #define IMAGE_CLASS "Image" -/** - * Creates an .Image object from an image handle retrieved from a dialog - * control. - * - * If the image had been set from ooDialog code, the .Image object would be - * known. Therefore, this an image assigned to the control, loaded from a - * resource DLL. The assumption then is, that the OS loaded the image as - * LR_SHARED. (Is this true?) - * - * We need to create an .Image object. If the image type is not passed in, - * (type=-1,) we can deduce the type (possibly) from the control style, but not - * the size or all the flags. However, we do use the LR_SHARED flag based on - * the above assumption. - * - * When the process that loaded the image ends, the OS will clean up the image - * resource (MSDN.) Using LR_SHARED will prevent the user from releasing an - * image that shouldn't be. - * - * @param c - * @param hwnd - * @param hImage - * - * @return RexxObjectPtr - */ -RexxObjectPtr rxNewImageFromControl(RexxMethodContext *c, HWND hwnd, HANDLE hImage, uint8_t type, - oodControl_t ctrl) -{ - LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE); - - // If the caller did not know the type, try to deduce it. - if ( type == -1 ) - { - switch ( ctrl ) - { - case oodcStatic : - // If it is a cursor image, the control type is SS_ICON. - switch ( style & SS_TYPEMASK ) - { - case SS_BITMAP : - type = IMAGE_BITMAP; - break; - case SS_ENHMETAFILE : - type = IMAGE_ENHMETAFILE; - break; - case SS_ICON : - default : - type = IMAGE_ICON; - break; - } - break; - - case oodcButton : - - switch ( style & BS_IMAGEMASK ) - { - case BS_BITMAP : - type = IMAGE_BITMAP; - break; - case BS_ICON : - default : - type = IMAGE_ICON; - break; - } - break; - - default : - // Shouldn't happen - type = IMAGE_BITMAP; - break; - - } - } - return rxNewImage(c, hImage, type, rxNewSize(c, 0, 0), LR_SHARED, false, ""); -} - CSTRING getImageTypeName(uint8_t type) { switch ( type ) @@ -6031,52 +5937,143 @@ return oi; } -RexxObjectPtr rxNewEmptyImage(RexxMethodContext *c) +RexxObjectPtr rxNewImageObject(RexxMethodContext *c, RexxBufferObject bufferObj) { RexxObjectPtr image = NULLOBJECT; RexxClassObject ImageClass = rxGetContextClass(c, "Image"); if ( ImageClass != NULL ) { - image = c->SendMessage0(ImageClass, "NEW"); + image = c->SendMessage1(ImageClass, "NEW", bufferObj); } return image; } +RexxObjectPtr rxNewEmptyImage(RexxMethodContext *c) +{ + RexxBufferObject bufferObj = c->NewBuffer(sizeof(OODIMAGE)); + POODIMAGE cself = (POODIMAGE)c->BufferData(bufferObj); + + // Set everything to invalid. + memset(cself, 0, sizeof(OODIMAGE)); + cself->type = -1; + cself->size.cx = -1; + cself->size.cy = -1; + + return rxNewImageObject(c, bufferObj); +} + /** - * Instantiates a new .Image object, specifically from an image returned from - * LoadImage(). + * Creates an .Image object from an image handle retrieved from a dialog + * control. * - * @param context - * @param hImage - * @param type - * @param size - * @param flags + * If the image had been set from ooDialog code, the .Image object would be + * known. Therefore, this an image assigned to the control, loaded from a + * resource DLL. The assumption then is, that the OS loaded the image as + * LR_SHARED. (Is this true?) * - * @param src True, ooDialog created using LoadImage(). False created from a - * handle (so type, size, flags may not be correct.) + * We need to create an .Image object. If the image type is not passed in, + * (type=-1,) we can deduce the type (possibly) from the control style, but not + * the size or all the flags. However, we do use the LR_SHARED flag based on + * the above assumption. * - * @param fileName This arg is currently ignored and the empty string is used. + * When the process that loaded the image ends, the OS will clean up the image + * resource (MSDN.) Using LR_SHARED will prevent the user from releasing an + * image that shouldn't be. * - * @return RexxObjectPtr + * @param c Method context we are operating in. + * @param hwnd Window handle of the dialog control. + * @param hImage Handle to the image. + * @param type Image type. + * @param ctrl Type of dialog control. + * + * @return A new .Image object. */ -RexxObjectPtr rxNewImage(RexxMethodContext *c, HANDLE hImage, uint8_t type, RexxObjectPtr size, - uint32_t flags, bool src, CSTRING fileName) +RexxObjectPtr rxNewImageFromControl(RexxMethodContext *c, HWND hwnd, HANDLE hImage, uint8_t type, + oodControl_t ctrl) { - RexxObjectPtr image = rxNewEmptyImage(c); + SIZE s = {0}; - if ( image != NULLOBJECT ) + // If the caller did not know the type, try to deduce it. + if ( type == -1 ) { - RexxArrayObject args = c->ArrayOfFour(c->NewPointer(hImage), c->UnsignedInt32(type), size, - c->UnsignedInt32(flags)); - c->ArrayAppend(args, c->Logical(src)); - c->ArrayAppend(args, c->String(fileName)); - c->SendMessage(image, REALINIT_PUB_NAME, args); + LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE); + switch ( ctrl ) + { + case oodcStatic : + // If it is a cursor image, the control type is SS_ICON. + switch ( style & SS_TYPEMASK ) + { + case SS_BITMAP : + type = IMAGE_BITMAP; + break; + case SS_ENHMETAFILE : + type = IMAGE_ENHMETAFILE; + break; + case SS_ICON : + default : + type = IMAGE_ICON; + break; + } + break; + + case oodcButton : + switch ( style & BS_IMAGEMASK ) + { + case BS_BITMAP : + type = IMAGE_BITMAP; + break; + case BS_ICON : + default : + type = IMAGE_ICON; + break; + } + break; + + default : + // Shouldn't happen + type = IMAGE_BITMAP; + break; + + } } - return image; + return rxNewValidImage(c, hImage, type, &s, LR_SHARED, false); } /** + * Instantiates a new, non-null, .Image object. + * + * @param context + * @param hImage + * @param type + * @param s + * @param flags + * @param src True, ooDialog created using LoadImage(). False created from + * a handle (so type, size, flags may not be correct.) + * + * @return A new .Image object. + */ +RexxObjectPtr rxNewValidImage(RexxMethodContext *c, HANDLE hImage, uint8_t type, PSIZE s, uint32_t flags, bool src) +{ + RexxBufferObject bufferObj = c->NewBuffer(sizeof(OODIMAGE)); + POODIMAGE cself = (POODIMAGE)c->BufferData(bufferObj); + + cself->hImage = hImage; + cself->type = type; + cself->size.cx = s->cx; + cself->size.cy = s->cy; + cself->flags = flags; + cself->isValid = true; + cself->srcOOD = src; + cself->canRelease = ! (flags & LR_SHARED); + cself->typeName = getImageTypeName(type); + cself->lastError = 0; + cself->fileName = ""; + + return rxNewImageObject(c, bufferObj); +} + +/** * Removes and releases all .Image objects in an .Array object. This is an * internal method assuming the args are correct. The array must contain *only* * .Image objects, but can be a sparse array. @@ -6099,7 +6096,7 @@ } RexxArrayObject rxImagesFromArrayOfInts(RexxMethodContext *c, RexxArrayObject ids, HINSTANCE hImage, - uint8_t type, SIZE s, RexxObjectPtr size, uint32_t flags) + uint8_t type, PSIZE s, uint32_t flags) { int resourceID; size_t count = c->ArraySize(ids); @@ -6120,7 +6117,7 @@ goto out; } - HANDLE hImage = LoadImage(NULL, MAKEINTRESOURCE(resourceID), type, s.cx, s.cy, flags); + HANDLE hImage = LoadImage(NULL, MAKEINTRESOURCE(resourceID), type, s->cx, s->cy, flags); if ( hImage == NULL ) { // Set the system error code and leave this slot in the array blank. @@ -6131,7 +6128,7 @@ // Theoretically, image could come back null, but this seems very // unlikely. Still, we'll check for it. If it is null, an // exception has already been raised. - RexxObjectPtr image = rxNewImage(c, hImage, type, size, flags, true, ""); + RexxObjectPtr image = rxNewValidImage(c, hImage, type, s, flags, true); if ( image == NULLOBJECT ) { if ( (flags & LR_SHARED) == 0 ) @@ -6148,7 +6145,7 @@ return result; } -bool getStandardImageArgs(RexxMethodContext *context, uint8_t *type, uint8_t defType, RexxObjectPtr *size, +bool getStandardImageArgs(RexxMethodContext *context, uint8_t *type, uint8_t defType, RexxObjectPtr size, SIZE *defSize, uint32_t *flags, uint32_t defFlags) { oodSetSysErrCode(context, 0); @@ -6157,9 +6154,10 @@ { *type = defType; } + if ( argumentExists(3) ) { - SIZE *p = rxGetSize(context, *size, 3); + SIZE *p = rxGetSize(context, size, 3); if ( p == NULL ) { return false; @@ -6167,10 +6165,6 @@ defSize->cx = p->cx; defSize->cy = p->cy; } - else - { - *size = rxNewSize(context, defSize->cx, defSize->cy); - } if ( argumentOmitted(4) ) { @@ -6328,12 +6322,6 @@ return cMap; } -RexxMethod1(RexxObjectPtr, image_init_cls, OSELF, self) -{ - rxDefineMethod(context, self, REALINIT_PUB_NAME, REALINIT_MTH_DEF); - return NULLOBJECT; -} - RexxMethod1(int, image_id_cls, CSTRING, id) { static String2Int *imageConstantsMap = NULL; @@ -6391,7 +6379,7 @@ fromFile = false; } - if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, &size, &s, &flags, + if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, size, &s, &flags, fromFile ? LR_LOADFROMFILE : LR_SHARED | LR_DEFAULTSIZE) ) { goto out; @@ -6405,7 +6393,7 @@ goto out; } - result = rxNewImage(context, hImage, type, size, flags, true, ""); + result = rxNewValidImage(context, hImage, type, &s, flags, true); out: return result; @@ -6419,7 +6407,7 @@ RexxArrayObject result = NULLOBJECT; SIZE s = {0}; - if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, &size, &s, &flags, LR_LOADFROMFILE) ) + if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, size, &s, &flags, LR_LOADFROMFILE) ) { goto out; } @@ -6450,7 +6438,7 @@ // Theoretically, image could come back null, but this seems very // unlikely. Still, we'll check for it. If it is null, an // exception has already been raised. - RexxObjectPtr image = rxNewImage(context, hImage, type, size, flags, true, ""); + RexxObjectPtr image = rxNewValidImage(context, hImage, type, &s, flags, true); if ( image == NULLOBJECT ) { rxReleaseAllImages(c, result, i - 1); @@ -6472,12 +6460,12 @@ RexxArrayObject result = NULLOBJECT; SIZE s = {0}; - if ( ! getStandardImageArgs(context, &type, IMAGE_ICON, &size, &s, &flags, LR_SHARED | LR_DEFAULTSIZE) ) + if ( ! getStandardImageArgs(context, &type, IMAGE_ICON, size, &s, &flags, LR_SHARED | LR_DEFAULTSIZE) ) { goto out; } - result = rxImagesFromArrayOfInts(context, ids, NULL, type, s, size, flags); + result = rxImagesFromArrayOfInts(context, ids, NULL, type, &s, flags); out: return result; @@ -6513,54 +6501,12 @@ * * */ -RexxMethod0(RexxObjectPtr, image_init) +RexxMethod1(RexxObjectPtr, image_init, RexxObjectPtr, cselfObj) { - RexxBufferObject obj = context->NewBuffer(sizeof(OODIMAGE)); - context->SetObjectVariable("CSELF", obj); - - POODIMAGE cself = (POODIMAGE)context->BufferData(obj); - - // Set everything to invalid. - memset(cself, 0, sizeof(OODIMAGE)); - cself->type = -1; - cself->size.cx = -1; - cself->size.cy = -1; - - return NULLOBJECT; -} - -/** Image::assignImage [private method] - * - * - * @note This is a private method, callable only from within the C++ code. As - * such, it is expected that the arguments are valid, hImage not null, - * type correct, etc. - */ -RexxMethod7(RexxObjectPtr, image_assignImage, POINTER, hImage, uint8_t, type, RexxObjectPtr, size, - uint32_t, flags, logical_t, src, CSTRING, fileName, CSELF, oi) -{ - POODIMAGE pOI = (POODIMAGE)oi; - - SIZE *s = rxGetSize(context, size, 3); - if ( s == NULL ) + if ( requiredClass(context, cselfObj, "Buffer", 1) ) { - // This should not ever be null, but if it is, rxGetSize() has raised an - // exception. - goto out; + context->SetObjectVariable("CSELF", cselfObj); } - - pOI->hImage = hImage; - pOI->type = type; - pOI->size.cx = s->cx; - pOI->size.cy = s->cy; - pOI->flags = flags; - pOI->isValid = true; - pOI->srcOOD = src ? true : false; - pOI->canRelease = ! (flags & LR_SHARED); - - pOI->typeName = getImageTypeName(type); - -out: return NULLOBJECT; } @@ -6743,7 +6689,7 @@ } ri->lastError = 0; - if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, &size, &s, &flags, LR_SHARED) ) + if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, size, &s, &flags, LR_SHARED) ) { goto out; } @@ -6757,7 +6703,7 @@ goto out; } - result = rxNewImage(context, hImage, type, size, flags, true, ""); + result = rxNewValidImage(context, hImage, type, &s, flags, true); out: return result; @@ -6777,12 +6723,12 @@ } ri->lastError = 0; - if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, &size, &s, &flags, LR_SHARED) ) + if ( ! getStandardImageArgs(context, &type, IMAGE_BITMAP, size, &s, &flags, LR_SHARED) ) { goto out; } - result = rxImagesFromArrayOfInts(context, ids, ri->hMod, type, s, size, flags); + result = rxImagesFromArrayOfInts(context, ids, ri->hMod, type, &s, flags); if ( result == NULLOBJECT ) { ri->lastError = oodGetSysErrCode(context); Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-28 06:10:29 UTC (rev 3816) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2008-12-28 16:31:01 UTC (rev 3817) @@ -2096,7 +2096,6 @@ REXX_METHOD_PROTOTYPE(ri_getImage); REXX_METHOD_PROTOTYPE(ri_getImages); -REXX_METHOD_PROTOTYPE(image_init_cls); REXX_METHOD_PROTOTYPE(image_id_cls); REXX_METHOD_PROTOTYPE(image_getImage_cls); REXX_METHOD_PROTOTYPE(image_fromFiles_cls); @@ -2106,7 +2105,6 @@ REXX_METHOD_PROTOTYPE(image_getGValue_cls); REXX_METHOD_PROTOTYPE(image_getBValue_cls); REXX_METHOD_PROTOTYPE(image_init); -REXX_METHOD_PROTOTYPE(image_assignImage); REXX_METHOD_PROTOTYPE(image_release); REXX_METHOD_PROTOTYPE(image_isNull); REXX_METHOD_PROTOTYPE(image_handle); @@ -2227,7 +2225,6 @@ REXX_METHOD(ri_getImage, ri_getImage), REXX_METHOD(ri_getImages, ri_getImages), - REXX_METHOD(image_init_cls, image_init_cls), REXX_METHOD(image_id_cls, image_id_cls), REXX_METHOD(image_getImage_cls, image_getImage_cls), REXX_METHOD(image_fromFiles_cls, image_fromFiles_cls), @@ -2237,7 +2234,6 @@ REXX_METHOD(image_getGValue_cls, image_getGValue_cls), REXX_METHOD(image_getBValue_cls, image_getBValue_cls), REXX_METHOD(image_init, image_init), - REXX_METHOD(image_assignImage, image_assignImage), REXX_METHOD(image_release, image_release), REXX_METHOD(image_isNull, image_isNull), REXX_METHOD(image_systemErrorCode, image_systemErrorCode), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-01-01 07:38:05
|
Revision: 3839 http://oorexx.svn.sourceforge.net/oorexx/?rev=3839&view=rev Author: miesfeld Date: 2009-01-01 07:38:02 +0000 (Thu, 01 Jan 2009) Log Message: ----------- Clean up the code related to using an application icon. Don't use the same IDs as already assigned to common resources (IDOK, IDCANCEL, etc.) Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/dlgext.cls main/trunk/extensions/platform/windows/oodialog/dyndlg.cls main/trunk/extensions/platform/windows/oodialog/oodResources.h main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls main/trunk/extensions/platform/windows/oodialog/resdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-01-01 07:38:02 UTC (rev 3839) @@ -49,7 +49,7 @@ /* dispatch of messages */ ::method ExecuteAsync unguarded - use arg sleeptime, sh, icon, nomodal + use arg sleeptime, sh, icon = 0, nomodal if sleeptime~Datatype('N') = 0 then sleeptime = 10 if Arg(2,'o') = 1 then sh = "DEFAULT" if Arg(4,'o') = 1 then nomodal = 0 @@ -101,7 +101,7 @@ /* Run a nonmodal dialog */ ::method Popup - use arg sh, sleeptime, icon + use arg sh, sleeptime, icon = 0 if Arg(1,'o') = 1 then sh = "DEFAULT" if sleeptime~Datatype('N') = 0 then sleeptime = 10 /* start Execute and return to caller */ @@ -109,7 +109,7 @@ ::method PopupAsChild - use arg parent, sh, sleeptime, icon + use arg parent, sh, sleeptime, icon = 0 if Arg(1,'o') = 1 | parent = 0 then do call ErrorMessage "No parent dialog specified!" Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-01-01 07:38:02 UTC (rev 3839) @@ -1073,9 +1073,7 @@ use arg icon = 0, modal = 0 if self~BasePtr = 0 then return 0 - if \ icon~DataType("W") then icon = self~ResolveSymbolicId(icon) - if icon < 0 then icon = 0 - + icon = self~resolveIconID(icon) if modal <> 0 & modal <> 1 then do if modal~translate = "NOTMODAL" then modal = 1 else modal = 0 Modified: main/trunk/extensions/platform/windows/oodialog/oodResources.h =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodResources.h 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/oodResources.h 2009-01-01 07:38:02 UTC (rev 3839) @@ -40,10 +40,11 @@ * IDs here, it would be nice to sync up the PlainBaseDialog. */ -#define IDI_DLG_OODIALOG 1 -#define IDI_DLG_APPICON 2 -#define IDI_DLG_APPICON2 3 -#define IDI_DLG_OOREXX 4 +#define IDI_DLG_OODIALOG 11 +#define IDI_DLG_APPICON 12 +#define IDI_DLG_APPICON2 13 +#define IDI_DLG_OOREXX 14 #define IDI_DLG_DEFAULT IDI_DLG_APPICON2 +#define IDI_DLG_MIN_ID IDI_DLG_OODIALOG #define IDI_DLG_MAX_ID IDI_DLG_OOREXX Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-01 07:38:02 UTC (rev 3839) @@ -815,7 +815,7 @@ } /* If one of the reserved IDs, iconSrc has to be ooDialog. */ - if ( id <= IDI_DLG_MAX_ID ) + if ( id >= IDI_DLG_MIN_ID && id <= IDI_DLG_MAX_ID ) { iconSrc = ICON_OODIALOG; } Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-01-01 07:38:02 UTC (rev 3839) @@ -295,6 +295,14 @@ end return -1 +::method resolveIconID private + use strict arg icon + + if \ icon~Datatype('W') then icon = self~ResolveSymbolicId(icon) + if icon = -1 then icon = 0 + else if icon >= 1, icon <= 4 then icon += 10 + return icon + ::method resolveResourceID unguarded use strict arg id if id~datatype("W"), id > -1 then return id @@ -392,11 +400,11 @@ self~ConstDir["IDC_STATIC"] = -1 -- ooDialog supplied resources, defined in oodResources.h - self~ConstDir["IDI_DLG_OODIALOG"] = 1 - self~ConstDir["IDI_DLG_APPICON"] = 2 - self~ConstDir["IDI_DLG_APPICON2"] = 3 - self~ConstDir["IDI_DLG_OOREXX"] = 4 - self~ConstDir["IDI_DLG_DEFAULT"] = 2 + self~ConstDir["IDI_DLG_OODIALOG"] = 11 + self~ConstDir["IDI_DLG_APPICON"] = 12 + self~ConstDir["IDI_DLG_APPICON2"] = 13 + self~ConstDir["IDI_DLG_OOREXX"] = 14 + self~ConstDir["IDI_DLG_DEFAULT"] = 12 if arg(4, 'E') then self~ParseIncludeFile(includeFile) @@ -432,9 +440,8 @@ ::method Execute unguarded expose DlgData. - use arg sh, icon, sleeptime, nomodal - if \ icon~Datatype('N') then icon = self~ResolveSymbolicId(icon) - if icon = -1 then icon = 0 + use arg sh, icon = 0, sleeptime, nomodal + icon = self~resolveIconId(icon) if sleeptime~Datatype('N') = 0 then sleeptime = 0 /* default is no sleep for execute */ if Arg(4, 'o') = 1 then nomodal = 0 if self~startit(icon, nomodal) \= 0 then Modified: main/trunk/extensions/platform/windows/oodialog/resdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/resdlg.cls 2009-01-01 06:06:17 UTC (rev 3838) +++ main/trunk/extensions/platform/windows/oodialog/resdlg.cls 2009-01-01 07:38:02 UTC (rev 3839) @@ -64,8 +64,7 @@ expose library resource dlgData. use arg icon = 0, modal = 0 - if \ icon~datatype("W") then icon = self~resolveSymbolicId(icon) - if icon < 0 then icon = 0 + icon = self~resolveIconID(icon) if modal <> 0 & modal <> 1 then do if modal~translate = "NOTMODAL" then modal = 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-01-04 23:57:59
|
Revision: 3869 http://oorexx.svn.sourceforge.net/oorexx/?rev=3869&view=rev Author: miesfeld Date: 2009-01-04 23:57:54 +0000 (Sun, 04 Jan 2009) Log Message: ----------- Remove the getSystemMetrics() method from WindowBase, where it doesn't belong. It was put there only because the 4.0 API was not available. Provide for backward compatibilty for the documented GetSysMetrics() external function. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oodutils.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovuser.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls Modified: main/trunk/extensions/platform/windows/oodialog/oodutils.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodutils.cls 2009-01-04 23:23:25 UTC (rev 3868) +++ main/trunk/extensions/platform/windows/oodialog/oodutils.cls 2009-01-04 23:57:54 UTC (rev 3869) @@ -103,7 +103,7 @@ ::routine systemMetrics public use strict arg index - return GetSysMetrics(index) + return .DlgUtil~getSystemMetrics(index) /*-------------------------------- shortcut routines ---------------------------------*/ Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-04 23:23:25 UTC (rev 3868) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-04 23:57:54 UTC (rev 3869) @@ -7156,6 +7156,29 @@ return result; } +/** DlgUtil::getSystemMetrics() [class method] + * + * Returns the system metric for the give index. + * + * @param index The index of the system metric to look up. + * + * @note There was a classic Rexx external function documented prior to 4.0.0 + * with the function name of GetSysMetrics. That function is now marked + * deprecated in the docs and the places where it was used are mapped to + * this .DlgUtil method. + * + * The intent was to extend this function in the future to get multiple, + * and perhaps all, values at once. This method could be enhanced to do + * that. + * + * MSDN documents that GetLastError does not provide extended error + * information. + */ +RexxMethod1(uint32_t, dlgutil_getSystemMetrics_cls, int32_t, index) +{ + return GetSystemMetrics(index); +} + /** * A temporary utility to convert from a handle that is still being stored in * ooDialog in string form ("0xFFFFAAAA") to its actual pointer value. The Modified: main/trunk/extensions/platform/windows/oodialog/oovuser.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2009-01-04 23:23:25 UTC (rev 3868) +++ main/trunk/extensions/platform/windows/oodialog/oovuser.cpp 2009-01-04 23:57:54 UTC (rev 3869) @@ -202,36 +202,6 @@ } -/** - * This classic Rexx external function was documented prior to 4.0.0. - */ -size_t RexxEntry GetSysMetrics(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr) -{ - ULONG uVal; - - /* The intent was to extend this function in the future to get multiple, and - * perhaps all, values at once. Now the intent is to add the functionnality - * to get multiple values at once to .DlgUtil. - */ - if ( argc == 1 ) - { - INT index = atoi(argv[0].strptr); - if ( index < 1 ) RETVAL(-1) - - /* GetSystemMetrics returns 0 on error, however it also returns 0 as a - * valid value for some indexes. - */ - uVal = GetSystemMetrics(index); - - sprintf(retstr->strptr, "%d", uVal); - retstr->strlength = strlen(retstr->strptr); - return 0; - } - - RETERR -} - - void UCreateDlg(WORD ** ppTemplate, WORD **p, INT NrItems, INT x, INT y, INT cx, INT cy, const char * dlgClass, const char * title, const char * fontname, INT fontsize, ULONG lStyle) { Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-04 23:23:25 UTC (rev 3868) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-04 23:57:54 UTC (rev 3869) @@ -2035,7 +2035,6 @@ REXX_CLASSIC_ROUTINE(SetLBTabStops, SetLBTabStops), REXX_CLASSIC_ROUTINE(BinaryAnd, BinaryAnd), REXX_CLASSIC_ROUTINE(GetScreenSize, GetScreenSize), - REXX_CLASSIC_ROUTINE(GetSysMetrics, GetSysMetrics), REXX_CLASSIC_ROUTINE(GetDialogFactor, GetDialogFactor), REXX_CLASSIC_ROUTINE(SleepMS, SleepMS), REXX_CLASSIC_ROUTINE(PlaySoundFile, PlaySoundFile), @@ -2085,6 +2084,7 @@ REXX_METHOD_PROTOTYPE(dlgutil_loWord_cls); REXX_METHOD_PROTOTYPE(dlgutil_and_cls); REXX_METHOD_PROTOTYPE(dlgutil_or_cls); +REXX_METHOD_PROTOTYPE(dlgutil_getSystemMetrics_cls); REXX_METHOD_PROTOTYPE(dlgutil_handleToPointer_cls); REXX_METHOD_PROTOTYPE(dlgutil_test_cls); @@ -2207,15 +2207,16 @@ REXX_METHOD_PROTOTYPE(size_setCY); RexxMethodEntry oodialog_methods[] = { - REXX_METHOD(dlgutil_init_cls, dlgutil_init_cls), - REXX_METHOD(dlgutil_comctl32Version_cls, dlgutil_comctl32Version_cls), - REXX_METHOD(dlgutil_version_cls, dlgutil_version_cls), - REXX_METHOD(dlgutil_hiWord_cls, dlgutil_hiWord_cls), - REXX_METHOD(dlgutil_and_cls, dlgutil_and_cls), - REXX_METHOD(dlgutil_or_cls, dlgutil_or_cls), - REXX_METHOD(dlgutil_loWord_cls, dlgutil_loWord_cls), - REXX_METHOD(dlgutil_handleToPointer_cls, dlgutil_handleToPointer_cls), - REXX_METHOD(dlgutil_test_cls, dlgutil_test_cls), + REXX_METHOD(dlgutil_init_cls, dlgutil_init_cls), + REXX_METHOD(dlgutil_comctl32Version_cls, dlgutil_comctl32Version_cls), + REXX_METHOD(dlgutil_version_cls, dlgutil_version_cls), + REXX_METHOD(dlgutil_hiWord_cls, dlgutil_hiWord_cls), + REXX_METHOD(dlgutil_and_cls, dlgutil_and_cls), + REXX_METHOD(dlgutil_or_cls, dlgutil_or_cls), + REXX_METHOD(dlgutil_loWord_cls, dlgutil_loWord_cls), + REXX_METHOD(dlgutil_handleToPointer_cls, dlgutil_handleToPointer_cls), + REXX_METHOD(dlgutil_getSystemMetrics_cls, dlgutil_getSystemMetrics_cls), + REXX_METHOD(dlgutil_test_cls, dlgutil_test_cls), REXX_METHOD(ri_init, ri_init), REXX_METHOD(ri_release, ri_release), Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-01-04 23:23:25 UTC (rev 3868) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-01-04 23:57:54 UTC (rev 3869) @@ -54,9 +54,16 @@ ::method loWord class external "LIBRARY oodialog dlgutil_loWord_cls" ::method and class external "LIBRARY oodialog dlgutil_and_cls" ::method or class external "LIBRARY oodialog dlgutil_or_cls" +::method getSystemMetrics class external "LIBRARY oodialog dlgutil_getSystemMetrics_cls" ::method handleToPointer class external "LIBRARY oodialog dlgutil_handleToPointer_cls" ::method test class external "LIBRARY oodialog dlgutil_test_cls" +-- Needed to maintain backward compatibilty with 3.2.0. The external function GetSysMetrics() +-- was foolishly documented. +::routine GetSysMetrics public + use strict arg index + return .DlgUtil~getSystemMetrics(index) + ::class 'Rect' public ::method init external "LIBRARY oodialog rect_init" ::method left external "LIBRARY oodialog rect_left" @@ -187,9 +194,10 @@ if Arg(4,'o') = 1 then hwnd = self~hwnd return GetStdTextSize(text, fontname, fontsize, hwnd) +/* This method is deprecated. Use .DlgUtil directly */ ::method GetSystemMetrics unguarded use strict arg index - return GetSysMetrics(index) + return .DlgUtil~getSystemMetrics(ind) ::class 'ResourceUtils' public mixinclass object This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-01-19 23:23:32
|
Revision: 3967 http://oorexx.svn.sourceforge.net/oorexx/?rev=3967&view=rev Author: miesfeld Date: 2009-01-19 23:23:29 +0000 (Mon, 19 Jan 2009) Log Message: ----------- Fix a problem with the implementation of getFont() discovered while documenting it. Take the opportunity to convert it and setFont() to the new APIs. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/basedlg.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-01-19 23:12:43 UTC (rev 3966) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-01-19 23:23:29 UTC (rev 3967) @@ -496,9 +496,6 @@ ::method GetStyleRaw -- Get the control's current GWL_STYLE style return HandleControlEx(self~hDlg, self~id, "X", "GET") -::method GetFont - return HandleControlEx(self~hDlg, self~id, "F", "GET") - ::method Clear parse value WindowRect("GET", self~Hwnd) with r.1 r.2 r.3 r.4 return WindowRect("CLR", self~oDlg~Adm, self~Hwnd,r.1,r.2,r.3,r.4) Modified: main/trunk/extensions/platform/windows/oodialog/basedlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2009-01-19 23:12:43 UTC (rev 3966) +++ main/trunk/extensions/platform/windows/oodialog/basedlg.cls 2009-01-19 23:23:29 UTC (rev 3967) @@ -71,10 +71,8 @@ end return WndShow_Pos("S",self~hwnd, disptype) -::method SetFont unguarded - use arg hFont, bRedraw /* WM_SETFONT */ - if Arg(2, 'o') = 1 then bRedraw = 1 - return SendWinMsg("ANY",self~hwnd, "0x0030", hFont, bRedraw) +::method setFont unguarded external "LIBRARY oodialog winex_setFont" +::method getFont unguarded external "LIBRARY oodialog winex_getFont" ::method GetRect unguarded return WindowRect("GET", self~Hwnd) Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-19 23:12:43 UTC (rev 3966) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-19 23:23:29 UTC (rev 3967) @@ -1527,14 +1527,6 @@ RETVAL(-2) /* Subclass procedure is not installed. */ } } - else if ( argv[2].strptr[0] == 'F' ) /* Font */ - { - if ( strcmp(argv[3].strptr, "GET" ) == 0) - { - RETHANDLE(SendMessage(hCtrl, WM_GETFONT, 0, 0)); - } - else RETERR - } RETERR } @@ -4315,7 +4307,66 @@ return NULLOBJECT; } +/** WindowExtensions::getFont() + * + * Returns the font in use for the dialog or dialog control. + * + * @note If the window returns NULL for the font, then it has not been set + * through a WM_SETFONT message. In this case it is using the stock + * system font. Rather than return 0, we return the stock system font to + * the ooDialog programmer. + * + */ +RexxMethod1(POINTERSTRING, winex_getFont, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + if ( hwnd == NULL ) + { + nullObjectException(context, "window handle"); + goto error_out; + } + HFONT hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); + if ( hFont == NULL ) + { + hFont = (HFONT)GetStockObject(SYSTEM_FONT); + } + return hFont; + +error_out: + return NULLOBJECT; +} + +/** WindowExtensions::setFont() + * + * Sets the font used for text in a dialog or dialog control. + * + * @param font Handle to the new font. + * + * @param redraw Optional. If true, the window will redraw itself. (According + * to MSDN.) The defualt if this argument is omitted is true. + * + * @return 0, always. The WM_SETFONT message does not return a value. + */ +RexxMethod3(int, winex_setFont, POINTERSTRING, font, OPTIONAL_logical_t, redraw, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + if ( hwnd == NULL ) + { + nullObjectException(context, "window handle"); + } + else + { + if ( argumentOmitted(2) ) + { + redraw = TRUE; + } + SendMessage(hwnd, WM_SETFONT, (WPARAM)font, redraw); + } + return 0; +} + + /** * Methods for the .DialogControl class. */ Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-19 23:12:43 UTC (rev 3966) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-19 23:23:29 UTC (rev 3967) @@ -2093,8 +2093,9 @@ REXX_METHOD_PROTOTYPE(resdlg_setFontAttrib_pvt); - REXX_METHOD_PROTOTYPE(winex_getTextSizeScreen); +REXX_METHOD_PROTOTYPE(winex_getFont); +REXX_METHOD_PROTOTYPE(winex_setFont); REXX_METHOD_PROTOTYPE(ri_init); REXX_METHOD_PROTOTYPE(ri_release); @@ -2237,6 +2238,8 @@ REXX_METHOD(resdlg_setFontAttrib_pvt, resdlg_setFontAttrib_pvt), REXX_METHOD(winex_getTextSizeScreen, winex_getTextSizeScreen), + REXX_METHOD(winex_getFont, winex_getFont), + REXX_METHOD(winex_setFont, winex_setFont), REXX_METHOD(ri_init, ri_init), REXX_METHOD(ri_release, ri_release), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-01-24 18:34:08
|
Revision: 4006 http://oorexx.svn.sourceforge.net/oorexx/?rev=4006&view=rev Author: miesfeld Date: 2009-01-24 18:34:02 +0000 (Sat, 24 Jan 2009) Log Message: ----------- Remove one warning from ooDialog compilation. Clean up the use of GetWindowLong / GetWindowLongPtr. The values at index GWL_STYLE and GWL_EXTSTYLE are longs and remain longs under 64-bit Windows so it is appropriate to use GetWindowLong rather than GetWindowLongPtr. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oovmsg.cpp main/trunk/extensions/platform/windows/oodialog/oovother.cpp Modified: main/trunk/extensions/platform/windows/oodialog/oovmsg.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovmsg.cpp 2009-01-24 00:50:47 UTC (rev 4005) +++ main/trunk/extensions/platform/windows/oodialog/oovmsg.cpp 2009-01-24 18:34:02 UTC (rev 4006) @@ -538,8 +538,7 @@ if ( n[2] == LB_SETCURSEL ) { // at first check if it is an multiple selection lb - LONG style; - style = GetWindowLongPtr(GetDlgItem( hWnd, n[1] ), GWL_STYLE); + LONG style = GetWindowLong(GetDlgItem( hWnd, n[1] ), GWL_STYLE); if ( style & LBS_MULTIPLESEL ) if ( argv[5].strptr[0] == 'D' ) Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-24 00:50:47 UTC (rev 4005) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-24 18:34:02 UTC (rev 4006) @@ -3535,9 +3535,9 @@ return result; } -inline bool hasStyle(HWND hwnd, DWORD_PTR style) +inline bool hasStyle(HWND hwnd, LONG style) { - if ( (GetWindowLongPtr(hwnd, GWL_STYLE) & style) || (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & style) ) + if ( (GetWindowLong(hwnd, GWL_STYLE) & style) || (GetWindowLong(hwnd, GWL_EXSTYLE) & style) ) { return true; } @@ -5237,7 +5237,7 @@ return type; } - DWORD _style = (DWORD)GetWindowLongPtr(hwnd, GWL_STYLE); + LONG _style = GetWindowLong(hwnd, GWL_STYLE); BUTTONSUBTYPE _sub; switch ( _style & BS_TYPEMASK ) @@ -5433,7 +5433,7 @@ { HWND hwnd = rxGetWindowHandle(context, self); - DWORD style = (DWORD)GetWindowLongPtr(hwnd, GWL_STYLE); + LONG style = GetWindowLong(hwnd, GWL_STYLE); if ( stricmp(opts, "RIGHT") == 0 ) { @@ -5468,7 +5468,7 @@ r.bottom = (halfHeight >= MIN_HALFHEIGHT_GB ? r.top + halfHeight : r.bottom); // Change the group box style, force the dialog to repaint. - SetWindowLongPtr(hwnd, GWL_STYLE, style); + SetWindowLong(hwnd, GWL_STYLE, style); SendMessage(hwnd, BM_SETSTYLE, (WPARAM)style, (LPARAM)TRUE); InvalidateRect(hDlg, &r, TRUE); @@ -5610,7 +5610,7 @@ type = getButtonInfo(hwnd, &sub, &style); oldStyle = style; - oldTypeStyle = ((DWORD)GetWindowLongPtr(hwnd, GWL_STYLE) & BS_TYPEMASK); + oldTypeStyle = ((DWORD)GetWindowLong(hwnd, GWL_STYLE) & BS_TYPEMASK); typeStyle = oldTypeStyle; char *token; @@ -5787,7 +5787,7 @@ if ( style != (oldStyle | oldTypeStyle) ) { - SetWindowLongPtr(hwnd, GWL_STYLE, style); + SetWindowLong(hwnd, GWL_STYLE, style); SendMessage(hwnd, BM_SETSTYLE, (WPARAM)style, (LPARAM)TRUE); RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); @@ -6675,7 +6675,7 @@ // If the caller did not know the type, try to deduce it. if ( type == -1 ) { - LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE); + LONG style = GetWindowLong(hwnd, GWL_STYLE); switch ( ctrl ) { case oodcStatic : This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-01-25 04:56:07
|
Revision: 4011 http://oorexx.svn.sourceforge.net/oorexx/?rev=4011&view=rev Author: miesfeld Date: 2009-01-25 04:55:59 +0000 (Sun, 25 Jan 2009) Log Message: ----------- Clean up the implementation of the button controls a little. Fix some things that became apparent while documenting them. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-01-25 04:54:05 UTC (rev 4010) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-01-25 04:55:59 UTC (rev 4011) @@ -1792,16 +1792,19 @@ ::method checkInGroup class external "LIBRARY oodialog rb_checkInGroup_cls" ::method checked external "LIBRARY oodialog rb_checked" -::method isChecked external "LIBRARY oodialog rb_isChecked" ::method check external "LIBRARY oodialog rb_check" ::method uncheck external "LIBRARY oodialog rb_uncheck" +::method getCheckState external "LIBRARY oodialog rb_getCheckState" -/* This method is DEPRECATED radio buttons can not be set to indeterminate. */ -::method indeterminate external "LIBRARY oodialog rb_check" +-- DEPRECATED +::method isChecked external "LIBRARY oodialog rb_isChecked" +-- DEPRECATED +::method indeterminate external "LIBRARY oodialog rb_indeterminate" + ::class 'CheckBox' subclass RadioButton public -::method indeterminate external "LIBRARY oodialog ckbx_indeterminate" +::method setIndeterminate external "LIBRARY oodialog ckbx_setIndeterminate" ::method isIndeterminate external "LIBRARY oodialog ckbx_isIndeterminate" /**************** List Box Class **********************************************/ Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-25 04:54:05 UTC (rev 4010) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-01-25 04:55:59 UTC (rev 4011) @@ -6083,40 +6083,63 @@ RexxMethod1(logical_t, rb_checked, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - return (SendMessage(hwnd, BM_GETCHECK, 0, 0) == BST_CHECKED ? 1 : 0); + return (SendMessage(rxGetWindowHandle(context, self), BM_GETCHECK, 0, 0) == BST_CHECKED ? 1 : 0); } -RexxMethod1(CSTRING, rb_isChecked, OSELF, self) +CSTRING getIsChecked(HWND hwnd) { - HWND hwnd = rxGetWindowHandle(context, self); - char * state = "UNCHECKED"; + char * state = "UNKNOWN"; + BUTTONTYPE type = getButtonInfo(hwnd, NULL, NULL); - switch ( SendMessage(hwnd, BM_GETCHECK, 0, 0) ) + if ( type == check || type == radio ) { - case BST_CHECKED : - state = "CHECKED"; - break; - case BST_INDETERMINATE : - state = "INDETERMINATE"; + switch ( SendMessage(hwnd, BM_GETCHECK, 0, 0) ) + { + case BST_CHECKED : + state = "CHECKED"; + break; + case BST_UNCHECKED : + state = "UNCHECKED"; + break; + case BST_INDETERMINATE : + state = getButtonInfo(hwnd, NULL, NULL) == check ? "INDETERMINATE" : "UNKNOWN"; + break; + default : + break; + } } return state; + } - +RexxMethod1(CSTRING, rb_getCheckState, OSELF, self) +{ + return getIsChecked(rxGetWindowHandle(context, self)); +} RexxMethod1(int, rb_check, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); + SendMessage(rxGetWindowHandle(context, self), BM_SETCHECK, BST_CHECKED, 0); return 0; } RexxMethod1(int, rb_uncheck, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - SendMessage(hwnd, BM_SETCHECK, BST_UNCHECKED, 0); + SendMessage(rxGetWindowHandle(context, self), BM_SETCHECK, BST_UNCHECKED, 0); return 0; } +/* DEPRECATED */ +RexxMethod1(CSTRING, rb_isChecked, OSELF, self) +{ + return getIsChecked(rxGetWindowHandle(context, self)); +} + +/* DEPRECATED */ +RexxMethod1(int, rb_indeterminate, OSELF, self) +{ + SendMessage(rxGetWindowHandle(context, self), BM_SETCHECK, BST_INDETERMINATE, 0); + return 0; +} + RexxMethod1(logical_t, ckbx_isIndeterminate, OSELF, self) { HWND hwnd = rxGetWindowHandle(context, self); @@ -6127,7 +6150,7 @@ return 0; } -RexxMethod1(int, ckbx_indeterminate, OSELF, self) +RexxMethod1(int, ckbx_setIndeterminate, OSELF, self) { HWND hwnd = rxGetWindowHandle(context, self); if ( getButtonInfo(hwnd, NULL, NULL) == check ) @@ -6137,6 +6160,7 @@ return 0; } + /* This method is used as a convenient way to test code. */ RexxMethod1(int, bc_test, RexxObjectPtr, obj) { Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-25 04:54:05 UTC (rev 4010) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-01-25 04:55:59 UTC (rev 4011) @@ -2184,12 +2184,14 @@ REXX_METHOD_PROTOTYPE(bc_setImageList); REXX_METHOD_PROTOTYPE(bc_getImageList); REXX_METHOD_PROTOTYPE(rb_checkInGroup_cls); -REXX_METHOD_PROTOTYPE(rb_isChecked); +REXX_METHOD_PROTOTYPE(rb_getCheckState); REXX_METHOD_PROTOTYPE(rb_checked); REXX_METHOD_PROTOTYPE(rb_check); REXX_METHOD_PROTOTYPE(rb_uncheck); +REXX_METHOD_PROTOTYPE(rb_isChecked); +REXX_METHOD_PROTOTYPE(rb_indeterminate); REXX_METHOD_PROTOTYPE(ckbx_isIndeterminate); -REXX_METHOD_PROTOTYPE(ckbx_indeterminate); +REXX_METHOD_PROTOTYPE(ckbx_setIndeterminate); REXX_METHOD_PROTOTYPE(bc_test); REXX_METHOD_PROTOTYPE(menu_test); @@ -2326,12 +2328,14 @@ REXX_METHOD(bc_setImageList, bc_setImageList), REXX_METHOD(bc_getImageList, bc_getImageList), REXX_METHOD(rb_checkInGroup_cls, rb_checkInGroup_cls), - REXX_METHOD(rb_isChecked, rb_isChecked), REXX_METHOD(rb_checked, rb_checked), REXX_METHOD(rb_check, rb_check), REXX_METHOD(rb_uncheck, rb_uncheck), + REXX_METHOD(rb_getCheckState, rb_getCheckState), + REXX_METHOD(rb_isChecked, rb_isChecked), + REXX_METHOD(rb_indeterminate, rb_indeterminate), REXX_METHOD(ckbx_isIndeterminate, ckbx_isIndeterminate), - REXX_METHOD(ckbx_indeterminate, ckbx_indeterminate), + REXX_METHOD(ckbx_setIndeterminate, ckbx_setIndeterminate), REXX_METHOD(gb_setStyle, gb_setStyle), REXX_METHOD(bc_test, bc_test), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-02-02 03:36:33
|
Revision: 4050 http://oorexx.svn.sourceforge.net/oorexx/?rev=4050&view=rev Author: miesfeld Date: 2009-02-02 03:36:30 +0000 (Mon, 02 Feb 2009) Log Message: ----------- Fix warning and types in ooDialog. WPARAM and LPARAM are 64 bits on 64-bit Windows. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.h Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-02 01:24:44 UTC (rev 4049) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-02 03:36:30 UTC (rev 4050) @@ -1826,7 +1826,6 @@ { ultoa(dlgAdm->MsgTab[i].msg, data, 16); if (!SetRexxStem(buffer, i+1, "msg", data)) { RETERR; } - // TODO the wParam and lParam types are wrong for Win64. pointer2string(data, (void *)dlgAdm->MsgTab[i].wParam); if (!SetRexxStem(buffer, i+1, "param1", data)) { RETERR; } pointer2string(data, (void *)dlgAdm->MsgTab[i].lParam); Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.h =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.h 2009-02-02 01:24:44 UTC (rev 4049) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.h 2009-02-02 03:36:30 UTC (rev 4050) @@ -347,11 +347,11 @@ /* structures to manage the dialogs */ typedef struct { + WPARAM wParam; + LPARAM lParam; ULONG msg; ULONG filterM; - ULONG wParam; ULONG filterP; - ULONG lParam; ULONG filterL; ULONG tag; PCHAR rexxProgram; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-02-02 03:59:47
|
Revision: 4052 http://oorexx.svn.sourceforge.net/oorexx/?rev=4052&view=rev Author: miesfeld Date: 2009-02-02 03:59:40 +0000 (Mon, 02 Feb 2009) Log Message: ----------- The new methods: getColumnOrder() setColumnOrder() getColumCount were implemented before the new native API was available. Using the new API improves the implementation. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-02 03:56:35 UTC (rev 4051) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-02 03:59:40 UTC (rev 4052) @@ -926,37 +926,10 @@ if width~datatype("N") = 1 then width = width * self~FactorX return HandleListCtrl("C","SETWIDTH", self~Hwnd, nr, width~translate) -::method GetColumnCount - return HandleListCtrlEx(self~hwnd, "G", "COLCOUNT") +::method getColumnCount external "LIBRARY oodialog lv_getColumnCount" +::method getColumnOrder external "LIBRARY oodialog lv_getColumnOrder" +::method setColumnOrder external "LIBRARY oodialog lv_setColumnOrder" -::method GetColumnOrder - - retStr = HandleListCtrlEx(self~hwnd, "M", "ORDER") - if retStr~datatype('W') then return retStr - - retArray = .array~new - do i = 1 to retStr~words - retArray~append(retStr~word(i)) - end - return retArray - -::method SetColumnOrder - use strict arg order - if \ order~isInstanceOf(.array) then return -3 - - count = order~items - if count < 2 then return 0 - - argStr = " " - do i = 1 to count - nr = order[i] - if \ nr~datatype('W') then return -3 - if \ (nr >= 0 & nr < count) then return -3 - argStr = argStr || nr || ' ' - end - - return HandleListCtrlEx(self~hwnd, "M", 'ORDER', argStr) - ::method StringWidth use arg text if Arg(1,'o') = 1 then return -1 @@ -1174,7 +1147,7 @@ if Arg(2,'o') = 1 then partial = 0 return HandleListCtrl("M", "ENVIS", self~Hwnd, item, partial) --- This method is deprecated, use setImageList() +-- DEPRECATED ::method SetSmallImages use arg bmp, cx, cy if Arg(1,'o') = 1 then return -1 @@ -1182,7 +1155,7 @@ if Arg(3,'o') = 1 then cy = 0 return HandleListCtrl("I", "SETIMG",self~Hwnd, bmp, cx, cy, "SMALL") --- This method is deprecated, use setImageList() +-- DEPRECATED ::method SetImages use arg bmp, cx, cy if Arg(1,'o') = 1 then return -1 @@ -1190,11 +1163,11 @@ if Arg(3,'o') = 1 then cy = 0 return HandleListCtrl("I", "SETIMG",self~Hwnd, bmp, cx, cy, "") --- This method is deprecated, use setImageList() +-- DEPRECATED ::method RemoveSmallImages return HandleListCtrl("I", "UNSETIMG", self~Hwnd, "SMALL") --- This method is deprecated, use setImageList() +-- DEPRECATED ::method RemoveImages return HandleListCtrl("I", "UNSETIMG", self~Hwnd, "") Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-02 03:56:35 UTC (rev 4051) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-02 03:59:40 UTC (rev 4052) @@ -1530,40 +1530,7 @@ RETERR } - -static inline int getLVColumnCount(HWND hList) -{ - return Header_GetItemCount(ListView_GetHeader(hList)); -} - /** - * What is a reasonable number of columns in a list-view? Seems silly to - * restrict the user, someone will always want 2 more. On the other hand, is - * someone going to have 1,000 columns? 10,000 columns? - * - * @param count The number of colums - * - * @return The size of a space separated ascii string of numbers big enough to - * hold count numbers. - */ -static inline size_t getColumnOrderStrlen(int count) -{ - if ( count < 100 ) - { - return 3 * count; - } - else if ( count < 1000 ) - { - return (3 * 99) + (4 * (count - 99)); - } - else if ( count < 10000 ) - { - return (3 * 99) + (4 * 900) + (5 * (count - 999)); - } - return 0; -} - -/** * Extended List-View control functionality. Implements capabilities not * present in the original ooDialog ListControl. In general, this will be * capabilities that Microsoft has added to the control. @@ -1703,115 +1670,7 @@ */ RETVAL(1); // Return 1 (failed) until this is implemented. } - else if ( strcmp(argv[2].strptr, "ORDER") == 0 ) /* Set, get column Order */ - { - int count; - int *order, *pOrder; - int i = 0; - int retVal = 1; - - count = getLVColumnCount(hList); - if ( count < 2 ) - { - /* The return is 0 or 1 columns, or -1 for an error. */ - RETVAL(count == -1 ? -2 : count) - } - - order = (int *)malloc(count * sizeof(int)); - if ( order == NULL ) - { - RETVAL(-(LONG)GetLastError()) - } - pOrder = order; - - if ( argc == 3 ) - { - char buf[4]; - - size_t l = getColumnOrderStrlen(count); - if ( l == 0 ) - { - retVal = -2; - } - else - { - if ( l > RXAUTOBUFLEN ) - { - PVOID p = GlobalAlloc(GMEM_FIXED, count); - if ( ! p ) - { - free(order); - RETVAL(-(LONG)GetLastError()) - } - - retstr->strptr = (PCHAR)p; - } - - if ( ListView_GetColumnOrderArray(hList, count, order) == 0 ) - { - retVal = -2; - } - else - { - retstr->strptr[0] = '\0'; - for ( i = 0; i < count; i++, pOrder++ ) - { - strcat(retstr->strptr, ltoa(*pOrder, buf, 10)); - strcat(retstr->strptr, " "); - } - retstr->strlength = strlen(retstr->strptr); - } - } - } - else if ( argc == 4 ) - { - char *token; - char *str = _strdup(argv[3].strptr); - - token = strtok(str, " "); - while( token != NULL && i++ < count ) - { - *pOrder++ = atoi(token); - token = strtok(NULL, " "); - } - free(str); - - retVal = ListView_SetColumnOrderArray(hList, count, order) == 0 ? -2 : 0; - - // If we don't redraw the list view and it is already displayed - // on the screen, it will look mangled. - if ( retVal == 0 ) - { - RedrawWindow(hList, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); - } - } - else - { - retVal = -3; /* Error with argument. */ - } - - free(order); - if ( retVal != 1 ) - { - RETVAL(retVal) - } - else - { - /* The return string is already set, just return 0. */ - return 0; - } - } - else RETERR; } - /* G - Get something function */ - else if ( argv[1].strptr[0] == 'G' ) - { - if ( !strcmp(argv[2].strptr, "COLCOUNT") ) /* Get List-view column count. */ - { - RETVAL(getLVColumnCount(hList)); - } - else RETERR; - } RETERR; } @@ -3293,6 +3152,13 @@ c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(msg)); } +void userDefinedMsgException(RexxMethodContext *c, int pos, CSTRING msg) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d %s", pos, msg); + userDefinedMsgException(c, buffer); +} + void *wrongClassException(RexxMethodContext *c, int pos, const char *n) { c->RaiseException2(Rexx_Error_Incorrect_method_noclass, c->WholeNumber(pos), c->String(n)); @@ -3320,6 +3186,13 @@ userDefinedMsgException(c, buffer); } +void wrongObjInDirectoryException(RexxMethodContext *c, int argPos, CSTRING index, CSTRING obj) +{ + TCHAR buffer[256]; + _snprintf(buffer, sizeof(buffer), "Method argument %d is a directory and index %s is not a %s", argPos, index, obj); + userDefinedMsgException(c, buffer); +} + void emptyArrayException(RexxMethodContext *c, int argPos) { TCHAR buffer[256]; @@ -4809,8 +4682,13 @@ #define LVSMALL_ATTRIBUTE "LV!SMALLIMAGELIST" #define LVNORMAL_ATTRIBUTE "LV!NORMALIMAGELIST" -CSTRING lvGetAttributeName(uint8_t type) +static inline int getLVColumnCount(HWND hList) { + return Header_GetItemCount(ListView_GetHeader(hList)); +} + +static inline CSTRING lvGetAttributeName(uint8_t type) +{ switch ( type ) { case LVSIL_STATE : @@ -4900,7 +4778,110 @@ return result; } +RexxMethod1(int, lv_getColumnCount, OSELF, self) +{ + return getLVColumnCount(rxGetWindowHandle(context, self)); +} +RexxMethod1(RexxObjectPtr, lv_getColumnOrder, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + + int count = getLVColumnCount(hwnd); + if ( count == -1 ) + { + return context->Nil(); + } + + RexxArrayObject order = context->NewArray(count); + RexxObjectPtr result = order; + + // the empty array covers the case when count == 0 + + if ( count == 1 ) + { + context->ArrayPut(order, context->Int32(0), 1); + } + else if ( count > 1 ) + { + int *pOrder = (int *)malloc(count * sizeof(int)); + if ( pOrder == NULL ) + { + outOfMemoryException(context); + } + else + { + if ( ListView_GetColumnOrderArray(hwnd, count, pOrder) == 0 ) + { + result = context->Nil(); + } + else + { + for ( int i = 0; i < count; i++) + { + context->ArrayPut(order, context->Int32(pOrder[i]), i + 1); + } + } + free(pOrder); + } + } + return result; +} + +RexxMethod2(logical_t, lv_setColumnOrder, RexxArrayObject, order, OSELF, self) +{ + HWND hwnd = rxGetWindowHandle(context, self); + + size_t items = context->ArrayItems(order); + int count = getLVColumnCount(hwnd); + int *pOrder = NULL; + logical_t success = FALSE; + + if ( count != -1 ) + { + if ( count != items ) + { + userDefinedMsgException(context, "the number of items in the order array does not match the number of columns"); + goto done; + } + + int *pOrder = (int *)malloc(items * sizeof(int)); + if ( pOrder != NULL ) + { + RexxObjectPtr item; + int column; + + for ( int i = 0; i < items; i++) + { + item = context->ArrayAt(order, i + 1); + if ( item == NULLOBJECT || ! context->ObjectToInt32(item, &column) ) + { + wrongObjInArrayException(context, 1, i + 1, "valid column number"); + goto done; + } + pOrder[i] = column; + printf("Item: %d value:%d\n", i, column); + } + + if ( ListView_SetColumnOrderArray(hwnd, count, pOrder) ) + { + // If we don't redraw the list view and it is already displayed + // on the screen, it will look mangled. + RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); + success = TRUE; + } + } + else + { + outOfMemoryException(context); + } + } + +done: + safeFree(pOrder); + return success; +} + /** * Methods for the .TreeControl class. */ @@ -5942,8 +5923,9 @@ * @exception A syntax error is raised for wrong comctl version. * * @note The only way to have an image list is for it have been put there by - * setImageList(). That method stores the .ImageList object in the - * window word. That stored object is the object returned. + * setImageList(). That method stores the .ImageList object as an + * attribute of the ButtonControl ojbect. That stored object is the + * object returned. */ RexxMethod1(RexxObjectPtr, bc_getImageList, OSELF, self) { @@ -7891,4 +7873,3 @@ { return handle; } - Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-02 03:56:35 UTC (rev 4051) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-02 03:59:40 UTC (rev 4052) @@ -2145,6 +2145,9 @@ REXX_METHOD_PROTOTYPE(lv_setImageList); REXX_METHOD_PROTOTYPE(lv_getImageList); +REXX_METHOD_PROTOTYPE(lv_getColumnCount); +REXX_METHOD_PROTOTYPE(lv_getColumnOrder); +REXX_METHOD_PROTOTYPE(lv_setColumnOrder); REXX_METHOD_PROTOTYPE(tv_setImageList); REXX_METHOD_PROTOTYPE(tv_getImageList); @@ -2290,6 +2293,9 @@ REXX_METHOD(lv_setImageList, lv_setImageList), REXX_METHOD(lv_getImageList, lv_getImageList), + REXX_METHOD(lv_getColumnCount, lv_getColumnCount), + REXX_METHOD(lv_getColumnOrder, lv_getColumnOrder), + REXX_METHOD(lv_setColumnOrder, lv_setColumnOrder), REXX_METHOD(tv_setImageList, tv_setImageList), REXX_METHOD(tv_getImageList, tv_getImageList), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-02-03 04:17:12
|
Revision: 4056 http://oorexx.svn.sourceforge.net/oorexx/?rev=4056&view=rev Author: miesfeld Date: 2009-02-03 04:17:08 +0000 (Tue, 03 Feb 2009) Log Message: ----------- All windows have the window style and extended style flags, so the getStyle / getExStyle methods should be common to all windows, not common to all dialog controls. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.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-02-03 01:41:14 UTC (rev 4055) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-03 04:17:08 UTC (rev 4056) @@ -494,9 +494,6 @@ if \ wantGroup~datatype('O')then return -3 return HandleControlEx(self~hDlg, self~id, "X", "GROUP", wantGroup) -::method GetStyleRaw -- Get the control's current GWL_STYLE style - return HandleControlEx(self~hDlg, self~id, "X", "GET") - ::method Clear parse value WindowRect("GET", self~Hwnd) with r.1 r.2 r.3 r.4 return WindowRect("CLR", self~oDlg~Adm, self~Hwnd,r.1,r.2,r.3,r.4) Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-03 01:41:14 UTC (rev 4055) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-03 04:17:08 UTC (rev 4056) @@ -1338,15 +1338,8 @@ CHECKARGL(4); - if ( !strcmp(argv[3].strptr, "GET") ) /* Get the window style */ + if ( !strcmp(argv[3].strptr, "TAB") ) /* Set or remove tab stop style */ { - /* Return the window style as an unsigned long for any dialog control. */ - ultoa((ULONG)lStyle, retstr->strptr, 10); - retstr->strlength = strlen(retstr->strptr); - return 0; - } - else if ( !strcmp(argv[3].strptr, "TAB") ) /* Set or remove tab stop style */ - { CHECKARGL(5); if ( argv[4].strptr[0] == '1' ) lStyle |= WS_TABSTOP; @@ -3926,6 +3919,22 @@ /** + * Methods for the .WindowBase mixin class. + */ +#define WINDOWBASE_CLASS "WindowBase" + +RexxMethod1(uint32_t, wb_getStyleRaw, OSELF, self) +{ + return GetWindowLong(rxGetWindowHandle(context, self), GWL_STYLE); +} + +RexxMethod1(uint32_t, wb_getExStyleRaw, OSELF, self) +{ + return GetWindowLong(rxGetWindowHandle(context, self), GWL_EXSTYLE); +} + + +/** * Methods for the .PlainBaseDialog class. */ #define PLAINBASEDIALOG_CLASS "PlainBaseDialog" Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-03 01:41:14 UTC (rev 4055) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-03 04:17:08 UTC (rev 4056) @@ -2084,6 +2084,9 @@ REXX_METHOD_PROTOTYPE(dlgutil_handleToPointer_cls); REXX_METHOD_PROTOTYPE(dlgutil_test_cls); +REXX_METHOD_PROTOTYPE(wb_getStyleRaw); +REXX_METHOD_PROTOTYPE(wb_getExStyleRaw); + REXX_METHOD_PROTOTYPE(pbdlg_init_cls); REXX_METHOD_PROTOTYPE(pbdlg_setDefaultFont_cls); REXX_METHOD_PROTOTYPE(pbdlg_getFontName_cls); @@ -2233,6 +2236,9 @@ REXX_METHOD(dlgutil_getSystemMetrics_cls, dlgutil_getSystemMetrics_cls), REXX_METHOD(dlgutil_test_cls, dlgutil_test_cls), + REXX_METHOD(wb_getStyleRaw, wb_getStyleRaw), + REXX_METHOD(wb_getExStyleRaw, wb_getExStyleRaw), + REXX_METHOD(pbdlg_init_cls, pbdlg_init_cls), REXX_METHOD(pbdlg_setDefaultFont_cls, pbdlg_setDefaultFont_cls), REXX_METHOD(pbdlg_getFontName_cls, pbdlg_getFontName_cls), Modified: main/trunk/extensions/platform/windows/oodialog/plbdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-02-03 01:41:14 UTC (rev 4055) +++ main/trunk/extensions/platform/windows/oodialog/plbdlg.cls 2009-02-03 04:17:08 UTC (rev 4056) @@ -187,8 +187,11 @@ ::method GetID unguarded return Wnd_Desktop("ID", self~hwnd) -/* This method is deprecated. Use .DlgUtil directly */ -::method GetSystemMetrics unguarded +::method getStyleRaw unguarded external "LIBRARY oodialog wb_getStyleRaw" +::method getExStyleRaw unguarded external "LIBRARY oodialog wb_getExStyleRaw" + +-- DEPRECATED +::method getSystemMetrics unguarded use strict arg index return .DlgUtil~getSystemMetrics(index) @@ -1309,13 +1312,6 @@ if \ wantGroup~datatype('O')then return -3 return HandleControlEx(self~DlgHandle, id, "X", "GROUP", wantGroup) - -- Get the window style for any control (the GWL_STYLE long value) -::method GetControlStyleRaw unguarded - use strict arg id - if \ id~datatype("W") then id = self~ResolveSymbolicId(id) - if id == -1 then return -1 - return HandleControlEx(self~DlgHandle, id, "X", "GET") - ::method Center unguarded use arg showOptions if Arg(1,"o") = 1 then showOptions = ""; else showOptions = showOptions~translate This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-02-04 02:58:11
|
Revision: 4065 http://oorexx.svn.sourceforge.net/oorexx/?rev=4065&view=rev Author: miesfeld Date: 2009-02-04 02:58:08 +0000 (Wed, 04 Feb 2009) Log Message: ----------- Have the colorRef() method return all COLORREF values including the special case ones. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-04 01:40:08 UTC (rev 4064) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-04 02:58:08 UTC (rev 4065) @@ -447,7 +447,7 @@ use arg msg, wP, lP return SendWinMsg("PTR", Self~hDlg, Self~Id, msg, wP, lP) -/* This method is deprecated. Use getTextSizeDlg() instead. */ +-- DEPRECATED ::method getTextSize unguarded forward message "getTextSizeDlg" continue return result~width result~height Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-04 01:40:08 UTC (rev 4064) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-04 02:58:08 UTC (rev 4065) @@ -6978,10 +6978,6 @@ cMap->insert(String2Int::value_type("LR_COPYFROMRESOURCE", 0x4000)); cMap->insert(String2Int::value_type("LR_SHARED", 0x8000)); - cMap->insert(String2Int::value_type("CLR_NONE", 0xFFFFFFFF)); - cMap->insert(String2Int::value_type("CLR_DEFAULT", 0xFF000000)); - - // ImageList_Create flags cMap->insert(String2Int::value_type("ILC_MASK", 0x0001)); cMap->insert(String2Int::value_type("ILC_COLOR", 0x0000)); @@ -7014,7 +7010,7 @@ return cMap; } -RexxMethod1(int, image_id_cls, CSTRING, id) +RexxMethod1(uint32_t, image_id_cls, CSTRING, id) { static String2Int *imageConstantsMap = NULL; @@ -7027,7 +7023,7 @@ { wrongArgValueException(context, 1, "the Image class symbol IDs", id); } - return idValue; + return (uint32_t)idValue; } @@ -7170,21 +7166,51 @@ * * Returns a COLORREF composed from the specified RGB valuses. * - * @param r The red component + * @param r The red component, or special case CLR_DEFAULT / CLR_NONE. * @param g The green component * @param b The blue component * * @return The COLORREF. * - * @note For CLR_DEFAULT and CLR_NONE, use .Image~id(). - * * @note For any omitted arg, the value of the arg will be 0. Since 0 is the - * default value for all of the args, we do not need to check for + * default value for the g and b args, we do not need to check for * ommitted args. */ -RexxMethod3(uint32_t, image_colorRef_cls, OPTIONAL_uint8_t, r, OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b) +RexxMethod3(uint32_t, image_colorRef_cls, OPTIONAL_RexxObjectPtr, rVal, + OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b) { + uint8_t r = 0; + if ( argumentExists(1) ) + { + CSTRING tmp = context->ObjectToStringValue(rVal); + if ( *tmp && toupper(*tmp) == 'C' ) + { + if ( stricmp(tmp, "CLR_DEFAULT") == 0 ) + { + return CLR_DEFAULT; + } + else if ( stricmp(tmp, "CLR_NONE") == 0 ) + { + return CLR_NONE; + } + else + { + goto error_out; + } + } + + uint32_t tmpR; + if ( ! context->ObjectToUnsignedInt32(rVal, &tmpR) || tmpR > 255 ) + { + goto error_out; + } + r = (uint8_t)tmpR; + } return RGB(r, g, b); + +error_out: + wrongArgValueException(context, 1, "CLR_DEFAULT, CLR_NONE, or a number from 0 through 255", rVal); + return 0; } RexxMethod1(uint8_t, image_getRValue_cls, uint32_t, colorRef) { return GetRValue(colorRef); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2009-02-04 03:04:35
|
Revision: 4066 http://oorexx.svn.sourceforge.net/oorexx/?rev=4066&view=rev Author: miesfeld Date: 2009-02-04 03:04:30 +0000 (Wed, 04 Feb 2009) Log Message: ----------- Sync the progress bar class up with the documentation. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/advctrl.cls main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/oovutil.cpp Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-04 02:58:08 UTC (rev 4065) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-02-04 03:04:30 UTC (rev 4066) @@ -1280,10 +1280,7 @@ ::method barColor external "LIBRARY oodialog pbc_setBarColor" ::method backgroundColor external "LIBRARY oodialog pbc_setBkColor" --- For internal testing only -::method test external "LIBRARY oodialog pbc_test" - /******************** Track Bar Class *********************************************************/ ::class 'SliderControl' subclass DialogControl public Modified: main/trunk/extensions/platform/windows/oodialog/oovother.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-04 02:58:08 UTC (rev 4065) +++ main/trunk/extensions/platform/windows/oodialog/oovother.cpp 2009-02-04 03:04:30 UTC (rev 4066) @@ -4466,7 +4466,7 @@ * * @return For both cases the previous position is returned. */ -RexxMethod2(int, pbc_stepIt, OPTIONAL_uint32_t, delta, OSELF, self) +RexxMethod2(int, pbc_stepIt, OPTIONAL_int32_t, delta, OSELF, self) { HWND hwnd = rxGetWindowHandle(context, self); @@ -4489,16 +4489,37 @@ */ RexxMethod2(int, pbc_setPos, int32_t, newPos, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - return (int)SendMessage(hwnd, PBM_SETPOS, newPos, 0); + return (int)SendMessage(rxGetWindowHandle(context, self), PBM_SETPOS, newPos, 0); } RexxMethod1(int, pbc_getPos, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - return (int)SendMessage(hwnd, PBM_GETPOS, 0, 0); + return (int)SendMessage(rxGetWindowHandle(context, self), PBM_GETPOS, 0, 0); } +/** ProgressBar::setRange() + * + * Sets the range for the progress bar using the full 32-bit numbers for the + * range. + * + * @param min Optional. The low end of the range. 0 is the default. + * @param max Optional. The high end of the range. 100 is the default. + * + * @return The previous range in the form of a string with word(1) being the + * low end of the previous range and word(2) being the previous high + * end of the range. + * + * @note The returned range is not necessarily correct if the previous range + * has been set using the full 32-bit numbers now allowed by the + * progress bar control. The returned numbers are restricted to + * 0xFFFF. + * + * The range is returned as a string because that was the way it was + * previously documented. + * + * Use the getRange() method to get the correct range. + * + */ RexxMethod3(RexxStringObject, pbc_setRange, OPTIONAL_int32_t, min, OPTIONAL_int32_t, max, OSELF, self) { TCHAR buf[64]; @@ -4519,27 +4540,25 @@ return context->String(buf); } -RexxMethod1(RexxStringObject, pbc_getRange, OSELF, self) +RexxMethod1(RexxObjectPtr, pbc_getRange, OSELF, self) { - TCHAR buf[64]; - HWND hwnd = rxGetWindowHandle(context, self); PBRANGE pbr; + SendMessage(rxGetWindowHandle(context, self), PBM_GETRANGE, TRUE, (LPARAM)&pbr); - SendMessage(hwnd, PBM_GETRANGE, TRUE, (LPARAM)&pbr); - _snprintf(buf, sizeof(buf), "%d %d", pbr.iLow, pbr.iHigh); + RexxDirectoryObject d = context->NewDirectory(); + context->DirectoryPut(d, context->Int32(pbr.iLow), "MIN"); + context->DirectoryPut(d, context->Int32(pbr.iHigh), "MAX"); - return context->String(buf); + return d; } RexxMethod2(int, pbc_setStep, OPTIONAL_int32_t, newStep, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - if ( argumentOmitted(1) ) { newStep = 10; } - return (int)SendMessage(hwnd, PBM_SETSTEP, newStep, 0); + return (int)SendMessage(rxGetWindowHandle(context, self), PBM_SETSTEP, newStep, 0); } /** @@ -4589,43 +4608,17 @@ * * Sets the background color of the progress bar. * - * @param r [Required] This can be either the COLORREF value, if the - * number of args is exactly one, or the red value of a - * COLORREF if the args are exactly 3. + * @param colorRef [Required] A COLOREF, the new background color. * - * @param g [Optional] The green value of a COLORREF. This arg is only - * optional if arg 1 is a COLORREF. - * - * @param b [Optional] The blue value of a COLORREF. This arg is only - * optional if arg 1 is a COLORREF. - * * @return The previous background color, or CLR_DEFAULT if the previous color * was the defualt. This is returned as a COLORREF number. * * The progress bar control only supports this function under Windows Classic * Theme. */ -RexxMethod4(uint32_t, pbc_setBkColor, uint32_t, r, OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b, OSELF, self) +RexxMethod2(uint32_t, pbc_setBkColor, uint32_t, colorRef, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - size_t count = rxArgCount(context); - COLORREF rgb; - - if ( count == 1 ) - { - rgb = r; - } - else if ( count == 3 ) - { - rgb = RGB((uint8_t)r, g, b); - } - else - { - context->RaiseException1(Rexx_Error_Incorrect_method_minarg, context->WholeNumberToObject(3)); - return 0; - } - - return (uint32_t)SendMessage(hwnd, PBM_SETBKCOLOR, 0, rgb); + return (uint32_t)SendMessage(rxGetWindowHandle(context, self), PBM_SETBKCOLOR, 0, colorRef); } /** @@ -4633,55 +4626,20 @@ * * Sets the bar color of the progress bar. * - * @param r [Required] This can be either the COLORREF value, if the - * number of args is exactly one, or the red value of a - * COLORREF if the args are exactly 3. + * @param colorRef [Required] A COLOREF, the new bar color. * - * @param g [Optional] The green value of a COLORREF. This arg is only - * optional if arg 1 is a COLORREF. - * - * @param b [Optional] The blue value of a COLORREF. This arg is only - * optional if arg 1 is a COLORREF. - * * @return The previous bar color, or CLR_DEFAULT if the previous color * was the defualt. This is returned as a COLORREF number. * * The progress bar control only supports this function under Windows Classic * Theme. */ -RexxMethod4(uint32_t, pbc_setBarColor, uint32_t, r, OPTIONAL_uint8_t, g, OPTIONAL_uint8_t, b, OSELF, self) +RexxMethod2(uint32_t, pbc_setBarColor, uint32_t, colorRef, OSELF, self) { - HWND hwnd = rxGetWindowHandle(context, self); - size_t count = rxArgCount(context); - COLORREF rgb; - - if ( count == 1 ) - { - rgb = r; - } - else if ( count == 3 ) - { - rgb = RGB((uint8_t)r, g, b); - } - else - { - context->RaiseException1(Rexx_Error_Incorrect_method_minarg, context->WholeNumberToObject(3)); - return 0; - } - return (uint32_t)SendMessage(hwnd, PBM_SETBARCOLOR, 0, rgb); + return (uint32_t)SendMessage(rxGetWindowHandle(context, self), PBM_SETBARCOLOR, 0, colorRef); } -/** - * This function stub is used for testing. - */ -RexxMethod5(size_t, pbc_test, OPTIONAL_int32_t, n1, - OPTIONAL_int32_t, n2, OSELF, self, OPTIONAL_int32_t, n3, OPTIONAL_int32_t, n4) -{ - return rxArgCount(context); -} - - /** * Methods for the .ListControl class. */ Modified: main/trunk/extensions/platform/windows/oodialog/oovutil.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-04 02:58:08 UTC (rev 4065) +++ main/trunk/extensions/platform/windows/oodialog/oovutil.cpp 2009-02-04 03:04:30 UTC (rev 4066) @@ -2167,7 +2167,6 @@ REXX_METHOD_PROTOTYPE(pbc_setMarquee); REXX_METHOD_PROTOTYPE(pbc_setBkColor); REXX_METHOD_PROTOTYPE(pbc_setBarColor); -REXX_METHOD_PROTOTYPE(pbc_test); REXX_METHOD_PROTOTYPE(stc_getText); REXX_METHOD_PROTOTYPE(stc_setText); @@ -2302,6 +2301,9 @@ REXX_METHOD(lv_getColumnCount, lv_getColumnCount), REXX_METHOD(lv_getColumnOrder, lv_getColumnOrder), REXX_METHOD(lv_setColumnOrder, lv_setColumnOrder), + REXX_METHOD(lv_insertColumnEx, lv_insertColumnEx), + REXX_METHOD(lv_columnWidthEx, lv_columnWidthEx), + REXX_METHOD(lv_stringWidthEx, lv_stringWidthEx), REXX_METHOD(tv_setImageList, tv_setImageList), REXX_METHOD(tv_getImageList, tv_getImageList), @@ -2318,7 +2320,6 @@ REXX_METHOD(pbc_setMarquee, pbc_setMarquee), REXX_METHOD(pbc_setBkColor, pbc_setBkColor), REXX_METHOD(pbc_setBarColor, pbc_setBarColor), - REXX_METHOD(pbc_test, pbc_test), REXX_METHOD(stc_getText, stc_getText), REXX_METHOD(stc_setText, stc_setText), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |