From: <mie...@us...> - 2009-09-28 18:30:02
|
Revision: 5217 http://oorexx.svn.sourceforge.net/oorexx/?rev=5217&view=rev Author: miesfeld Date: 2009-09-28 18:29:45 +0000 (Mon, 28 Sep 2009) Log Message: ----------- 2860344 ooDialog - unify dialog control methods To instantiate a dialog control object the method names will be newXXX() with XXX being the unified control name. I.e. edit, treeView, listView, listBox, etc.. To connect a dialog control to a dialog attribute and add it to the data table, the method names will be connectXXX() with XXX beind the unified control name. The set and get 'data' methods will also use unified method names. The names will contain the word data in them to distinguish them from other set and get methods names. I.e., setXXXData() or getXXXData() where XXX is the unified control name. These methods have been reworked to remove the use of interpret from them on the Rexx side and to use an enum to identify the type of dialog control, rathar than using magic numbers, on the C / C++ side. The use of deprecated methods in the ooDialog sample programs, related to the above changes, has been fixed. Modified Paths: -------------- main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 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/ooDialog.cpp main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp main/trunk/extensions/platform/windows/oodialog/oodControl.cpp main/trunk/extensions/platform/windows/oodialog/oodControl.hpp main/trunk/extensions/platform/windows/oodialog/oodData.cpp main/trunk/extensions/platform/windows/oodialog/oodData.hpp main/trunk/extensions/platform/windows/oodialog/oodPackageEntry.cpp main/trunk/extensions/platform/windows/oodialog/oodUser.cpp main/trunk/extensions/platform/windows/oodialog/oodialog.mak main/trunk/extensions/platform/windows/oodialog/oovother.cpp main/trunk/extensions/platform/windows/oodialog/plbdlg.cls main/trunk/extensions/platform/windows/oodialog/stddlg.cls main/trunk/extensions/platform/windows/oodialog/stdext.cls main/trunk/samples/windows/ole/oleinfo/oleinfo.rex main/trunk/samples/windows/oodialog/ooRexxTry/ooRexxTry.rex main/trunk/samples/windows/oodialog/oobandit.rex main/trunk/samples/windows/oodialog/oobmpvu.rex main/trunk/samples/windows/oodialog/oodlist.rex main/trunk/samples/windows/oodialog/ooticket.rex main/trunk/samples/windows/oodialog/oovideo.rex main/trunk/samples/windows/oodialog/oowalker.rex main/trunk/samples/windows/oodialog/tutorial/em_categ.rex main/trunk/samples/windows/oodialog/tutorial/emp_mend.rex main/trunk/samples/windows/oodialog/tutorial/emp_menu.rex main/trunk/samples/windows/oodialog/tutorial/employe5.rex main/trunk/samples/windows/oodialog/tutorial/employe6.rex main/trunk/samples/windows/oodialog/tutorial/employe7.rex main/trunk/samples/windows/oodialog/tutorial/employe8.rex main/trunk/samples/windows/oodialog/tutorial/employe9.rex main/trunk/samples/windows/oodialog/tutorial/empvalid.rex main/trunk/samples/windows/oodialog/tutorial/textscrl.rex Modified: main/trunk/extensions/platform/windows/oodialog/APICommon.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/APICommon.hpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -69,7 +69,6 @@ extern void executionErrorException(RexxThreadContext *c, CSTRING msg); extern void doOverException(RexxThreadContext *c, RexxObjectPtr obj); extern void failedToRetrieveException(RexxThreadContext *c, CSTRING item, RexxObjectPtr source); -extern void failedToRetrieveDlgAdmException(RexxThreadContext *c, RexxObjectPtr source); extern void missingIndexInDirectoryException(RexxThreadContext *c, int argPos, CSTRING index); extern void emptyArrayException(RexxThreadContext *c, int argPos); extern void nullObjectException(RexxThreadContext *c, CSTRING name, int pos); Modified: main/trunk/extensions/platform/windows/oodialog/advctrl.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/advctrl.cls 2009-09-28 18:29:45 UTC (rev 5217) @@ -46,23 +46,71 @@ ::class 'AdvancedControls' Mixinclass Object public ::method putControl private unguarded external "LIBRARY oodialog advCtrl_putControl_pvt" -::method getStaticControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getButtonControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getTreeControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getListControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getTabControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getEditControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getRadioControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getCheckControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getGroupBox unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getListBox unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getComboBox unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getScrollBar unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getProgressBar unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getSliderControl unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getMonthCalendar unguarded external "LIBRARY oodialog advCtrl_getControl" -::method getDateTimePicker unguarded external "LIBRARY oodialog advCtrl_getControl" +::method newStatic unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getStaticControl unguarded + forward message 'newStatic' + +::method newPushButton unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getButtonControl unguarded + forward message 'newPushButton' + +::method newRadioButton unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getRadioControl unguarded + forward message 'newRadioButton' + +::method newCheckBox unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getCheckControl unguarded + forward message 'newCheckBox' + +::method newGroupBox unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getGroupBox unguarded + forward message 'newGroupBox' + +::method newEdit unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getEditControl unguarded + forward message 'newEdit' + +::method newComboBox unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getComboBox unguarded + forward message 'newComboBox' + +::method newListBox unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getListBox unguarded + forward message 'newListBox' + +::method newScrollBar unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getScrollBar unguarded + forward message 'newScrollBar' + +::method newTreeView unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getTreeControl unguarded + forward message 'newTreeView' + +::method newListView unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getListControl unguarded + forward message 'newListView' + +::method newTab unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getTabControl unguarded + forward message 'newTab' + +::method newProgressBar unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getProgressBar unguarded + forward message 'newProgressBar' + +::method newTrackBar unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getSliderControl unguarded + forward message 'newTrackBar' + +::method newMonthCalendar unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getMonthCalendar unguarded + forward message 'newMonthCalendar' + +::method newDateTimePicker unguarded external "LIBRARY oodialog advCtrl_getControl" +::method getDateTimePicker unguarded + forward message 'newDateTimePicker' + ::method test unguarded external "LIBRARY oodialog advCtrl_test" /***************************************************************************************************************/ @@ -139,12 +187,15 @@ use arg left, top, right, bottom return WindowRect("CLR", self~oDlg~adm, self~hwnd,left,top,right,bottom) -::method value unguarded - return self~oDlg~internalGetItemData(self~Id, self~hDlg) +::method value unguarded -- TODO this method won't work if this control is on a category page. + -- Implement in native code + --return self~oDlg~getControlData(self~id, self~hDlg) + return self~oDlg~getControlData(self~id) -::method "value=" unguarded - use arg data - self~oDlg~internalSetItemData(self~Id, data, self~hDlg) +::method "value=" unguarded -- TODO same as a above + use strict arg data + --self~oDlg~setControlData(self~Id, data, self~hDlg) + self~oDlg~setControlData(self~Id, data) ::method captureMouse return Wnd_Desktop("CAP", self~hDlg, self~hwnd) @@ -1404,6 +1455,8 @@ ::class 'ListBox' subclass DialogControl public +::method getText external "LIBRARY oodialog lb_getText" + ::method Add use arg data if arg(1,'o') = 1 then return -1 @@ -1491,11 +1544,6 @@ ::method GetFirstVisible return self~Message2Parent(0x0000018E, 0, 0) + 1 -::method GetText - use arg ndx - len = SendWinMsg("DLG", self~hDlg, self~id, 0x0000018A, ndx-1,0) - if len <= 0 then return "" - else return SendWinMsg("PTR", self~hDlg, self~id, 0x00000189, ndx-1,"G" || len+1) ::method Modify use arg index, dataString Modified: main/trunk/extensions/platform/windows/oodialog/catdlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/catdlg.cls 2009-09-28 18:29:45 UTC (rev 5217) @@ -280,40 +280,40 @@ ,lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "") end else do - self~addOkCancelRightBottom + self~createOkCancelRightBottom if self~Wizard = 1 then self~createButtonGroup(5, self~sizeY - 15,,, lbtext" 11 PreviousPage" rbtext" 12 NextPage", 1, "") end self~createBlackFrame(-1, 0, self~sizeY - 20, self~sizeX, 1) -::method CreateCategoryDialog private external "LIBRARY oodialog catdlg_createCategoryDialog" +::method createCategoryDialog private external "LIBRARY oodialog catdlg_createCategoryDialog" ::method initDialog protected /* set the mark to the first radio button */ - if self~catstyle~wordpos('DROPDOWN') > 0 then - do + if self~catstyle~wordpos('DROPDOWN') > 0 then do do i = 1 to self~catalog['count'] - self~AddComboEntry(9001, self~catalog['names'][i]) + self~addComboEntry(9001, self~catalog['names'][i]) end - self~SetComboLine(9001, self~catalog['names'][1]) + self~setComboBoxData(9001, self~catalog['names'][1]) end - else self~SendMessageToItem(9001,"0x000000F1",1,0) - if self~Wizard = 1 then self~DisableItem(11) + else self~sendMessageToItem(9001,"0x000000F1",1,0) + if self~wizard then self~disableItem(11) /* call InitXXX for each category if such a method exists */ do i = 1 to self~catalog['count'] self~catalog['category'] = i - msg = "Init" || self~catalog['names'][i]~space(0) - if self~HasMethod(msg) = 1 then interpret("self~"||msg) /* does user class provide the Init method? If so call it */ + msg = "init" || self~catalog['names'][i]~space(0) + -- Does user class provide the initXXX method? If so invoke it. + if self~hasMethod(msg) then self~send(msg) end /* activate first page */ self~catalog['category'] = 1 - self~ShowWindow(self~catalog['handles'][self~catalog['category']]) + self~showWindow(self~catalog['handles'][self~catalog['category']]) /* */ -::method InitCategories protected +::method initCategories protected return @@ -321,21 +321,20 @@ /* the first page is selected. */ ::method GetSelectedPage unguarded - if self~catstyle~wordpos('DROPDOWN') = 0 then - do + if self~catstyle~wordpos('DROPDOWN') = 0 then do np = 9001 - do while self~GetRadioButton(np) = 0 & np < (9001 + self~catalog['count']) + do while self~getRadioButtonData(np) = 0 & np < (9001 + self~catalog['count']) np = np + 1 end end else do - cur = self~GetComboLine(9001) + cur = self~getComboBoxData(9001) np = 1 do while np <= ( self~catalog['count']) & cur \= self~catalog['names'][np] np = np + 1 end - if np > self~catalog['count'] then return 0 - np = np + 9000 + if np > self~catalog['count'] then return 0 + np = np + 9000 end return np-9000 @@ -359,23 +358,20 @@ end else self~SetCurrentComboIndex(9001, NewPage) end - if (NewPage = self~catalog['category']) |, - (NewPage < 1 | NewPage> self~catalog['count']) then return 0 + if (NewPage = self~catalog['category']) | (NewPage < 1 | NewPage> self~catalog['count']) then return 0 + self~HideWindowFast(self~catalog['handles'][self~catalog['category']]) self~catalog['category'] = NewPage - if self~Wizard = 1 then - do - if NewPage = 1 then - do + if self~Wizard = 1 then do + if NewPage = 1 then do self~DisableItem(11) self~EnableItem(12) - end; else - if NewPage = self~catalog['count'] then - do + end + else if NewPage = self~catalog['count'] then do self~EnableItem(11) self~DisableItem(12) - end; else - do + end + else do self~EnableItem(11) self~EnableItem(12) end @@ -525,27 +521,7 @@ ::method SetCategoryListTabulators unguarded external "LIBRARY oodialog generic_setListTabulators" -::method connectEdit external "LIBRARY oodialog generic_connectControl" -::method connectEntryLine external "LIBRARY oodialog generic_connectControl" -::method connectComboBox external "LIBRARY oodialog generic_connectControl" -::method connectCheckBox external "LIBRARY oodialog generic_connectControl" -::method connectRadioButton external "LIBRARY oodialog generic_connectControl" -::method connectListBox external "LIBRARY oodialog generic_connectControl" -::method connectMultiListBox external "LIBRARY oodialog generic_connectControl" -::method connectSeparator external "LIBRARY oodialog generic_connectControl" -::method connectTreeView unguarded external "LIBRARY oodialog generic_connectControl" -::method connectTreeControl unguarded external "LIBRARY oodialog generic_connectControl" -::method connectListView unguarded external "LIBRARY oodialog generic_connectControl" -::method connectListControl unguarded external "LIBRARY oodialog generic_connectControl" -::method connectTrackBar unguarded external "LIBRARY oodialog generic_connectControl" -::method connectSliderControl unguarded external "LIBRARY oodialog generic_connectControl" -::method connectTab unguarded external "LIBRARY oodialog generic_connectControl" -::method connectTabControl unguarded external "LIBRARY oodialog generic_connectControl" -::method connectDateTimePicker unguarded external "LIBRARY oodialog generic_connectControl" -::method connectMonthCalendar unguarded external "LIBRARY oodialog generic_connectControl" - - ::method CategoryListAddDirectory unguarded use arg id, drvpath, fattr, category READWRITE = 0 @@ -563,111 +539,88 @@ return self~BoxMessage(category, id, 0x00000184, 0, 0) -::method GetCategoryEntryLine unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 0) +-- The following methods are to set or get the 'data' of a single dialog control on one of +-- the category pages of the CategroyDialog. It is necessary to know the category page number +-- of the dialog control in order for to correctly identify the control. If the page number +-- argument is omitted, it is assumed the page number is the current page number. -::method GetCategoryListLine unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 3) +::method getControlDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" +::method getCheckBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" +::method getRadioButtonDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" +::method getEditDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" +::method getListBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" +::method getComboBoxDataPage unguarded external "LIBRARY oodialog catdlg_getControlDataPage" -::method GetCategoryComboLine unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 0) +::method setControlDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setStaticDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setCheckBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setRadioButtonDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setEditDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setListBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" +::method setComboBoxDataPage unguarded external "LIBRARY oodialog catdlg_setControlDataPage" -::method GetCategoryCheckBox unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 1) - -::method GetCategoryRadioButton unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 2) - -::method GetCategoryMultiList unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category], 4) - -::method GetCategoryValue unguarded - use arg id, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalGetItemData(id, self~catalog['handles'][category]) - -::method GetCategoryAttrib unguarded - use arg aname, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - i = self~dataConnection~First - do while (i \= .NIL) - if self~dataConnection[i] = aname then - do - s = "self~"aname"= self~GetValue("i", category)" - interpret(s) +::method getControlDataAttribute unguarded + use arg attributeName, category + if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current */ + id = self~dataConnection~first + do while (id \= .nil) + if self~dataConnection[id] = attributeName then do + data = self~getControlData(id, category) + self~sendWith(attributeName'=', .array~of(data)) return end i = self~dataConnection~Next(i) end - -::method SetCategoryStaticText unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 0) - -::method SetCategoryEntryLine unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 0) - -::method SetCategoryListLine unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 3) - -::method SetCategoryComboLine unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 0) - -::method SetCategoryCheckBox unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 1) - -::method SetCategoryRadioButton unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 2) - -::method SetCategoryMultiList unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category], 4) - -::method SetCategoryValue unguarded - use arg id, data, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - return self~internalSetItemData(id, data, self~catalog['handles'][category]) - -::method SetCategoryAttrib unguarded - use arg aname, category - if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ - i = self~dataConnection~First - do while (i \= .NIL) - if self~dataConnection[i] = aname then - do - s = "self~SetCategoryValue("i", self~"aname", category)" - interpret(s) - return +::method setControlDataAttribute unguarded + use arg attributeName, category + if arg(2, 'O') | \ category~datatype("W") then category = self~catalog['category'] /* try current category page */ + id = self~dataConnection~first + do while (id \= .nil) + if self~dataConnection[id] = attributeName then do + data = self~send(attributeName) + return self~setControlData(id, data, category) end - i = self~dataConnection~Next(i) + id = self~dataConnection~next(id) end +-- DEPRECATED +::method getCategoryEntryLine unguarded + forward message 'getEditDataPage' +::method getCategoryListLine unguarded + forward message 'getListBoxDataPage' +::method getCategoryComboLine unguarded + forward message 'getComboBoxDataPage' +::method getCategoryCheckBox unguarded + forward message 'getCheckBoxDataPage' +::method getCategoryRadioButton unguarded + forward message 'getRadioButtonDataPage' +::method getCategoryMultiList unguarded + forward message 'getListBoxDataPage' +::method getCategoryValue unguarded + forward message 'getControlDataPage' +::method getCategoryAttrib unguarded + forward message 'getControlDataAttribute' +::method setCategoryStaticText unguarded + forward message 'setStaticDataPage' +::method setCategoryEntryLine unguarded + forward message 'setEditDataPage' +::method setCategoryListLine unguarded + forward message 'setListBoxDataPage' +::method setCategoryComboLine unguarded + forward message 'setComboBoxDataPage' +::method setCategoryCheckBox unguarded + forward message 'setCheckBoxDataPage' +::method setCategoryRadioButton unguarded + forward message 'setRadioButtonDataPage' +::method setCategoryMultiList unguarded + forward message 'setListBoxDataPage' +::method setCategoryValue unguarded + forward message 'setControlDataPage' +::method setCategoryAttrib unguarded + forward message 'setControlDataAttribute' + ::method EnableCategoryItem unguarded use arg id, category if arg(2,'o') = 1 | category~DataType("N") = 0 then category = self~catalog['category'] /* try current */ Modified: main/trunk/extensions/platform/windows/oodialog/dlgext.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/dlgext.cls 2009-09-28 18:29:45 UTC (rev 5217) @@ -159,6 +159,7 @@ if id = -1 then return -1 return HandleScrollBar("GP",self~getItem(id)) +-- TODO connectScrollBarEvent ::method connectScrollBar use arg id, progUp, progDn, progPos, min, max, pos, progPgUp, progPgDn, progTop, progBottom, progTrack, progEndSc @@ -210,7 +211,7 @@ ::method CombineELwithSB use arg elid, sbid, step, poscode - pos = self~GetEntryLine(elid) + pos = self~getEditData(elid) parse value self~GetSBRange(sbid) with min max if pos~DataType("N") = 0 then return @@ -231,7 +232,7 @@ pos = .DlgUtil~hiWord(poscode) end self~SetSBPos(sbid, pos) - self~SetEntryLine(elid,pos) + self~setEditData(elid,pos) return 0 Modified: main/trunk/extensions/platform/windows/oodialog/dyndlg.cls =================================================================== --- main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/dyndlg.cls 2009-09-28 18:29:45 UTC (rev 5217) @@ -970,7 +970,7 @@ return ret - +-- DEPRECATED (to end of file.) ::method addStatic external "LIBRARY oodialog dyndlg_createStatic" ::method addImage external "LIBRARY oodialog dyndlg_createStaticImage" ::method addButton external "LIBRARY oodialog dyndlg_addButton" Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.cpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -44,6 +44,7 @@ #include <shlwapi.h> #include "APICommon.hpp" #include "oodCommon.hpp" +#include "oodControl.hpp" #include "oodText.hpp" #include "oodData.hpp" #include "oodResourceIDs.hpp" @@ -73,10 +74,11 @@ class LoopThreadArgs { public: + RexxMethodContext *context; // Used for data autodetection only. DIALOGADMIN *dlgAdmin; uint32_t resourceId; bool autoDetect; - bool *release; // used for a return value + bool *release; // Used for a return value }; @@ -585,8 +587,7 @@ LoopThreadArgs *args = (LoopThreadArgs *)arg; - - dlgAdm = args->dlgAdmin; /* thread local admin pointer from startDialog() */ + dlgAdm = args->dlgAdmin; dlgAdm->TheDlg = CreateDialogParam(dlgAdm->TheInstance, MAKEINTRESOURCE(args->resourceId), 0, (DLGPROC)RexxDlgProc, dlgAdm->Use3DControls); /* pass 3D flag to WM_INITDIALOG */ dlgAdm->ChildDlg[0] = dlgAdm->TheDlg; @@ -595,7 +596,7 @@ { if ( args->autoDetect ) { - if ( ! DataAutodetection(dlgAdm) ) + if ( ! doDataAutoDetection(args->context, dlgAdm) ) { dlgAdm->TheThread = NULL; return 0; @@ -605,7 +606,7 @@ *release = true; /* Release wait in startDialog() */ do { - if (GetMessage(&msg,NULL, 0,0)) + if ( GetMessage(&msg,NULL, 0,0) ) { if ( ! IsDialogMessage(dlgAdm->TheDlg, &msg) ) { @@ -619,7 +620,7 @@ *release = true; } EnterCriticalSection(&crit_sec); - if (dialogInAdminTable(dlgAdm)) + if ( dialogInAdminTable(dlgAdm) ) { ret = DelDialog(dlgAdm); dlgAdm->TheThread = NULL; @@ -1751,6 +1752,40 @@ } +/** PlainBaseDialog::getItem() + * + * Gets the window handle of a dialog control. + * + * @param rxID The resource ID of the control, which may be numeric or + * symbolic. + * @param _hDlg [optional] The window handle of the dialog the control + * belongs to. If omitted, the handle of this dialog is used. + * + * @return The window handle of the specified dialog control on success. -1 if + * the ID can not be resolved. A null handle there is no such control. + */ +RexxMethod3(RexxObjectPtr, pbdlg_getItem, RexxObjectPtr, rxID, OPTIONAL_RexxStringObject, _hDlg, CSELF, pCSelf) +{ + pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + + uint32_t id; + if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) + { + return TheNegativeOneObj; + } + + HWND hDlg; + if ( argumentOmitted(2) ) + { + hDlg = pcpbd->hDlg; + } + else + { + hDlg = (HWND)string2pointer(context, _hDlg); + } + return pointer2string(context, GetDlgItem(hDlg, id)); +} + /** PlainBaseDialog::isDialogActive() * * Tests if the Windows dialog is still active. @@ -1772,6 +1807,53 @@ } +/** PlainBaseDialog::connectControl() + * + * Connects a windows dialog control with a 'data' attribute of the Rexx dialog + * object. The attribute is added to the Rexx object and an entry is made in + * the data table using the control's resource ID. + * + * @param rxID The resource ID of the control, can be numeric or + * symbolic. + * @param attributeName [optional] The name of the attribute to be added. + * If omitted, the addAttribute() method will design a + * name from the information available. + * @param opts [optional] Not used, but must be present for + * backwards compatibility. Was only used in + * connectComboBox() to distinguish between types of + * combo boxes. That functionality has been moved to + * the native code. + * + * @remarks The control type is determined by the invoking Rexx method name. + * oodName2control() special cases connectSeparator to + * winNotAControl. winNotAControls is what is expected by the data + * table code. + * + */ +RexxMethod6(RexxObjectPtr, pbdlg_connectControl, RexxObjectPtr, rxID, OPTIONAL_RexxObjectPtr, attributeName, + OPTIONAL_CSTRING, opts, NAME, msgName, OSELF, self, CSELF, pCSelf) +{ + pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + if ( pcpbd->dlgAdm == NULL ) + { + return TheOneObj; + } + // result will be the resolved resource ID, which may be -1 on error. + RexxObjectPtr result = context->ForwardMessage(NULLOBJECT, "ADDATTRIBUTE", NULLOBJECT, NULLOBJECT); + + int id; + if ( ! context->Int32(result, &id) || id == -1 ) + { + return TheNegativeOneObj; + } + + oodControl_t type = oodName2controlType(msgName + 7); + + uint32_t category = getCategoryNumber(context, self); + return ( addToDataTable(context, pcpbd->dlgAdm, id, type, category) == 0 ? TheZeroObj : TheOneObj ); +} + + RexxMethod2(uint32_t, pbdlg_setDlgDataFromStem_pvt, RexxStemObject, internDlgData, CSELF, pCSelf) { pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; @@ -1786,10 +1868,40 @@ } -RexxMethod4(RexxObjectPtr, pbdlg_internalGetItemData_pvt, RexxObjectPtr, rxID, OPTIONAL_RexxStringObject, _hDlg, - OPTIONAL_int, ctrlType, CSELF, pCSelf) +/** PlainBaseDialog::getControlData() + * + * Gets the 'data' from a single dialog control. + * + * The original ooDialog implementation seemed to use the abstraction that the + * state of a dialog control was its 'data' and this abstraction influenced the + * naming of many of the instance methods. I.e., getData() setData(). + * + * The method getControlData() is, in the Rexx code, a general purpose method + * that replaces getValue() after 4.0.0. getValue() forwards to + * getControlData(). The old doc: + * + * "The getValue method gets the value of a dialog item, regardless of its + * type. The item must have been connected before." + * + * @param rxID The reosource ID of control. + * + * @return The 'data' value of the dialog control. This of course varies + * depending on the type of the dialog control. + * + * @remarks The control type is determined by the invoking method name. When + * the general purpose GETCONTROLDATA + 3 name is passed to + * oodName2controlType() it won't resolve and winUnknown will be + * returned. This is the value that signals getControlData() to do a + * data table look up by resource ID. + */ +RexxMethod3(RexxObjectPtr, plbdlg_getControlData, RexxObjectPtr, rxID, NAME, msgName, CSELF, pCSelf) { pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + if ( pcpbd->hDlg == NULL ) + { + noWindowsDialogException(context, pcpbd); + return TheNegativeOneObj; + } uint32_t id; if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) @@ -1797,29 +1909,47 @@ return TheNegativeOneObj; } - HWND hDlg; - if ( argumentOmitted(2) ) - { - hDlg = pcpbd->hDlg; - } - else - { - hDlg = (HWND)string2pointer(context, _hDlg); - } + oodControl_t ctrlType = oodName2controlType(msgName + 3); - if ( argumentOmitted(3) ) - { - ctrlType = -1; - } - - return internalGetItemData(context, pcpbd, id, hDlg, ctrlType); + return getControlData(context, pcpbd, id, pcpbd->hDlg, ctrlType); } -RexxMethod5(uint32_t, pbdlg_internalSetItemData_pvt, RexxObjectPtr, rxID, CSTRING, data, OPTIONAL_RexxStringObject, _hDlg, - OPTIONAL_int, ctrlType, CSELF, pCSelf) +/** PlainBaseDialog::setControlData() + * + * Sets the 'data' for a single dialog control. + * + * The original ooDialog implementation seemed to use the abstraction that the + * state of a dialog control was its 'data' and this abstraction influenced the + * naming of many of the instance methods. I.e., getData() setData(). + * + * The method setControlData() is, in the Rexx code, a general purpose method + * that replaces setValue() after 4.0.0. setValue() forwards to + * setControlData(). The old doc: + * + * "The setValue() method sets the value of a dialog item. You do not have to + * know what kind of item it is. The dialog item must have been connected + * before." + * + * @param rxID The reosource ID of control. + * @param data The 'data' to set the control with. + * + * @return 0 for success, 1 for error, -1 for bad resource ID. + * + * @remarks The control type is determined by the invoking method name. When + * the general purpose SETCONTROLDATA + 3 name is passed to + * oodName2controlType() it won't resolve and winUnknown will be + * returned. This is the value that signals setControlData() to do a + * data table look up by resource ID. + */ +RexxMethod4(int32_t, pbdlg_setControlData, RexxObjectPtr, rxID, CSTRING, data, NAME, msgName, CSELF, pCSelf) { pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; + if ( pcpbd->hDlg == NULL ) + { + noWindowsDialogException(context, pcpbd); + return -1; + } uint32_t id; if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) @@ -1827,47 +1957,12 @@ return -1; } - HWND hDlg; - if ( argumentOmitted(3) ) - { - hDlg = pcpbd->hDlg; - } - else - { - hDlg = (HWND)string2pointer(context, _hDlg); - } + oodControl_t ctrlType = oodName2controlType(msgName + 3); - if ( argumentOmitted(4) ) - { - ctrlType = -1; - } - - return internalSetItemData(context, pcpbd, id, data, hDlg, ctrlType); + return setControlData(context, pcpbd, id, data, pcpbd->hDlg, ctrlType); } -RexxMethod3(RexxObjectPtr, pbdlg_getItem, RexxObjectPtr, rxID, OPTIONAL_RexxStringObject, _hDlg, CSELF, pCSelf) -{ - pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; - - uint32_t id; - if ( ! oodSafeResolveID(&id, context, pcpbd->rexxSelf, rxID, -1, 1) || (int)id < 0 ) - { - return TheNegativeOneObj; - } - - HWND hDlg; - if ( argumentOmitted(2) ) - { - hDlg = pcpbd->hDlg; - } - else - { - hDlg = (HWND)string2pointer(context, _hDlg); - } - return pointer2string(context, GetDlgItem(hDlg, id)); -} - RexxMethod2(int32_t, pbdlg_stopIt, OPTIONAL_RexxObjectPtr, caller, CSELF, pCSelf) { pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; @@ -2109,53 +2204,6 @@ } -RexxMethod6(RexxObjectPtr, generic_connectControl, RexxObjectPtr, rxID, OPTIONAL_RexxObjectPtr, attributeName, - OPTIONAL_CSTRING, opts, NAME, msgName, OSELF, self, CSELF, pCSelf) -{ - pCPlainBaseDialog pcpbd = (pCPlainBaseDialog)pCSelf; - if ( pcpbd->dlgAdm == NULL ) - { - return TheOneObj; - } - // result will be the resolved resource ID, which may be -1 on error. - RexxObjectPtr result = context->ForwardMessage(NULLOBJECT, "ADDATTRIBUTE", NULLOBJECT, NULLOBJECT); - - int id; - if ( ! context->Int32(result, &id) || id == -1 ) - { - return TheNegativeOneObj; - } - - // TODO these numbers need to be mapped to the oodControl_t enum. - uint32_t typ; - if ( strcmp("CONNECTEDIT", msgName) == 0 ) {typ = 0;} - else if ( strcmp("CONNECTENTRYLINE", msgName) == 0 ) {typ = 0;} - else if ( strcmp("CONNECTCOMBOBOX", msgName) == 0 ) {typ = (opts != NULL && StrStrI(opts, "LIST") != NULL) ? 5 : 0;} - else if ( strcmp("CONNECTCHECKBOX", msgName) == 0 ) {typ = 1;} - else if ( strcmp("CONNECTRADIOBUTTON", msgName) == 0 ) {typ = 2;} - else if ( strcmp("CONNECTLISTBOX", msgName) == 0 ) {typ = 3;} - else if ( strcmp("CONNECTMULTILISTBOX", msgName) == 0 ) {typ = 4;} - else if ( strcmp("CONNECTSEPARATOR", msgName) == 0 ) {typ = 999;} - else if ( strcmp("CONNECTTREEVIEW", msgName) == 0 ) {typ = 6;} - else if ( strcmp("CONNECTTREECONTROL", msgName) == 0 ) {typ = 6;} - else if ( strcmp("CONNECTLISTVIEW", msgName) == 0 ) {typ = 7;} - else if ( strcmp("CONNECTLISTCONTROL", msgName) == 0 ) {typ = 7;} - else if ( strcmp("CONNECTTRACKBAR", msgName) == 0 ) {typ = 8;} - else if ( strcmp("CONNECTSLIDERCONTROL", msgName) == 0 ) {typ = 8;} - else if ( strcmp("CONNECTTAB", msgName) == 0 ) {typ = 9;} - else if ( strcmp("CONNECTTABCONTROL", msgName) == 0 ) {typ = 9;} - else if ( strcmp("CONNECTDATETIMEPICKER", msgName) == 0 ) {typ = 10;} - else if ( strcmp("CONNECTMONTHCALENDAR", msgName) == 0 ) {typ = 11;} - else - { - return TheOneObj; - } - - uint32_t category = getCategoryNumber(context, self); - return ( addToDataTable(context, pcpbd->dlgAdm, id, typ, category) == 0 ? TheZeroObj : TheOneObj ); -} - - /** * Methods for the .ResDialog class. */ @@ -2237,6 +2285,7 @@ } LoopThreadArgs threadArgs; + threadArgs.context = context; threadArgs.dlgAdmin = dlgAdm; threadArgs.resourceId = dlgID; threadArgs.autoDetect = autoDetect ? true : false; @@ -3058,7 +3107,7 @@ { itoa(dlgAdm->DataTab[i].id, data, 10); if (!SetRexxStem(buffer, i+1, "ID", data)) { RETERR; } - itoa(dlgAdm->DataTab[i].typ, data, 10); + itoa(dlgAdm->DataTab[i].type, data, 10); if (!SetRexxStem(buffer, i+1, "type", data)) { RETERR; } itoa(dlgAdm->DataTab[i].category, data, 10); if (!SetRexxStem(buffer, i+1, "category", data)) { RETERR; } Modified: main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/ooDialog.hpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -145,6 +145,34 @@ ReplyTrue = 2, // Message matched and handled return TRUE to the system } MsgReplyType; + +// Enum for the type of Windows dialog control. +typedef enum +{ + winStatic = 1, + winPushButton = 2, + winCheckBox = 3, + winRadioButton = 4, + winGroupBox = 5, + winEdit = 6, + winComboBox = 7, + winListBox = 8, + winScrollBar = 9, + winTreeView = 10, + winListView = 11, + winTrackBar = 12, + winProgressBar = 13, + winTab = 14, + winDateTimePicker = 15, + winMonthCalendar = 16, + + // A special value used by the data table / data table connection functions. + winNotAControl = 42, + + winUnknown = 55 +} oodControl_t; + + /* macros to check the number of arguments */ #define CHECKARG(argexpct) { \ if (argc != argexpct) \ @@ -291,9 +319,9 @@ } MESSAGETABLEENTRY; typedef struct { - ULONG id; - USHORT typ; - USHORT category; + oodControl_t type; + uint32_t id; + uint32_t category; } DATATABLEENTRY; typedef struct { Modified: main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/oodCommon.cpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -77,9 +77,26 @@ c->RaiseException1(Rexx_Error_Interpretation_user_defined, c->String(buf)); } -inline void failedToRetrieveDlgAdmException(RexxThreadContext *c, RexxObjectPtr source) +// + +/** + * 93.900 + * Error 93 - Incorrect call to method + * The specified method, built-in function, or external routine exists, + * but you used it incorrectly. + * + * The connectEdit method can not be invoked on a StyleDlg when the Windows + * dialog does not exist. + * + * @param c + * @param pcpbd + */ +void noWindowsDialogException(RexxMethodContext *c, pCPlainBaseDialog pcpbd) { - failedToRetrieveException(c, "dialog administration block", source); + TCHAR buf[512]; + _snprintf(buf, sizeof(buf), "The %s method can not be invoked on %s when the Windows dialog does not exist.", + c->GetMessageName(), c->ObjectToStringValue(pcpbd->rexxSelf)); + c->RaiseException1(Rexx_Error_Incorrect_method_user_defined, c->String(buf)); } bool requiredComCtl32Version(RexxMethodContext *context, const char *methodName, DWORD minimum) @@ -95,6 +112,12 @@ } +inline void failedToRetrieveDlgAdmException(RexxThreadContext *c, RexxObjectPtr source) +{ + failedToRetrieveException(c, "dialog administration block", source); +} + + /** * Given an unknown Rexx object and a list of possible ooDialog classes, * determines the ooDialog class of the object. Modified: main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/oodCommon.hpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -153,7 +153,10 @@ extern BOOL AddTheMessage(DIALOGADMIN *, UINT, UINT, WPARAM, ULONG_PTR, LPARAM, ULONG_PTR, CSTRING, ULONG); -extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); +extern void ooDialogInternalException(RexxMethodContext *, char *, int, char *, char *); +extern void noWindowsDialogException(RexxMethodContext *c, pCPlainBaseDialog pcpbd); +extern inline void failedToRetrieveDlgAdmException(RexxThreadContext *c, RexxObjectPtr source); + extern oodClass_t oodClass(RexxMethodContext *, RexxObjectPtr, oodClass_t *, size_t); extern uint32_t oodResolveSymbolicID(RexxMethodContext *, RexxObjectPtr, RexxObjectPtr, int, int); extern bool oodSafeResolveID(uint32_t *, RexxMethodContext *, RexxObjectPtr, RexxObjectPtr, int, int); @@ -201,8 +204,6 @@ #define GET_HWND(p) ((HWND)string2pointer(p)) #define GET_POINTER(p) string2pointer(p) -inline void failedToRetrieveDlgAdmException(RexxThreadContext *, RexxObjectPtr); - inline void *string2pointer(CONSTRXSTRING *string) { return string2pointer(string->strptr); } inline void *string2pointer(CONSTRXSTRING &string) { return string2pointer(string.strptr); } Modified: main/trunk/extensions/platform/windows/oodialog/oodControl.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/oodControl.cpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -87,20 +87,18 @@ } -TCHAR *controlType2winName(oodControl_t control) +const char *controlType2winName(oodControl_t control) { switch ( control ) { case winStatic : return WC_STATIC; - case winButton : return WC_BUTTON; + case winPushButton : return WC_BUTTON; case winRadioButton : return WC_BUTTON; case winCheckBox : return WC_BUTTON; case winGroupBox : return WC_BUTTON; case winEdit : return WC_EDIT; case winListBox : return WC_LISTBOX; - case winSingleSelectListBox : return WC_LISTBOX; case winComboBox : return WC_COMBOBOX; - case winSimpleComboBox : return WC_COMBOBOX; case winScrollBar : return WC_SCROLLBAR; case winTreeView : return WC_TREEVIEW; case winListView : return WC_LISTVIEW; @@ -113,6 +111,82 @@ } } + +const char *controlType2className(oodControl_t control) +{ + switch ( control ) + { + case winStatic : return "STATICCONTROL"; + case winPushButton : return "BUTTONCONTROL"; + case winRadioButton : return "RADIOBUTTON"; + case winCheckBox : return "CHECKBOX"; + case winGroupBox : return "GROUPBOX"; + case winEdit : return "EDITCONTROL"; + case winListBox : return "LISTBOX"; + case winComboBox : return "COMBOBOX"; + case winScrollBar : return "SCROLLBAR"; + case winTreeView : return "TREECONTROL"; + case winListView : return "LISTCONTROL"; + case winTab : return "TABCONTROL"; + case winProgressBar : return "PROGRESSBAR"; + case winTrackBar : return "SLIDERCONTROL"; + case winMonthCalendar : return "MONTHCALENDAR"; + case winDateTimePicker : return "DATETIMEPICKER"; + default : return ""; + } +} + + +oodControl_t winName2controlType(const char *className) +{ + if ( strcmp(className, WC_STATIC ) == 0 ) return winStatic; + else if ( strcmp(className, WC_BUTTON ) == 0 ) return winPushButton; + else if ( strcmp(className, WC_EDIT ) == 0 ) return winEdit; + else if ( strcmp(className, WC_LISTBOX ) == 0 ) return winListBox; + else if ( strcmp(className, WC_COMBOBOX ) == 0 ) return winComboBox; + else if ( strcmp(className, WC_SCROLLBAR ) == 0 ) return winScrollBar; + else if ( strcmp(className, WC_TREEVIEW ) == 0 ) return winTreeView; + else if ( strcmp(className, WC_LISTVIEW ) == 0 ) return winListView; + else if ( strcmp(className, WC_TABCONTROL ) == 0 ) return winTab; + else if ( strcmp(className, PROGRESS_CLASS ) == 0 ) return winProgressBar; + else if ( strcmp(className, TRACKBAR_CLASS ) == 0 ) return winTrackBar; + else if ( strcmp(className, MONTHCAL_CLASS ) == 0 ) return winMonthCalendar; + else if ( strcmp(className, DATETIMEPICK_CLASS) == 0 ) return winDateTimePicker; + else + { + return winUnknown; + } +} + +oodControl_t control2controlType(HWND hControl) +{ + oodControl_t type = winUnknown; + + TCHAR buf[64]; + if ( RealGetWindowClass(hControl, buf, sizeof(buf)) ) + { + type = winName2controlType(buf); + if ( type == winPushButton ) + { + BUTTONTYPE buttonType = getButtonInfo(hControl, NULL, NULL); + if ( buttonType == check ) + { + type = winCheckBox; + } + else if ( buttonType == radio ) + { + type = winRadioButton; + } + else if ( buttonType == group ) + { + type = winGroupBox; + } + } + } + + return type; +} + /** * Determine if a dialog control belongs to the specified dialog control class. * @@ -122,10 +196,10 @@ * * @return True if the dialog control is the type specified, otherwise false. */ -bool checkControlClass(HWND hControl, oodControl_t control) +bool isControlMatch(HWND hControl, oodControl_t control) { - TCHAR buf[64]; - TCHAR *pClass = controlType2winName(control); + char buf[64]; + const char *pClass = controlType2winName(control); if ( ! RealGetWindowClass(hControl, buf, sizeof(buf)) || strcmp(buf, pClass) != 0 ) { @@ -160,62 +234,59 @@ return true; } - +/** + * Resolves a string to the type of windows control it is. The function only + * compares enough letters to determine unequivocally if it matches one of the + * supported dialog controls. + * + * Example: + * + * CSTRING msgName = "CONNECTEDITDATA"; + * oodControl_t ctrl = oodName2controlType(msgName + 7); + * + * @param name The name to resolve. + * + * @return The windows control type. winUnknown is returned for no match and + * the name "separator" is special cased to winNotAControl. (Separator + * is used along with the data table stuff.) + * + * @remarks There are some generic message names such as getControlDataPage + * that need to match to winUnknown. CO is not sufficient to + * distinguish between comboBox and control. + */ oodControl_t oodName2controlType(CSTRING name) { - if ( strcmp(name, "STATICCONTROL" ) == 0 ) return winStatic; - else if ( strcmp(name, "BUTTONCONTROL" ) == 0 ) return winButton; - else if ( strcmp(name, "RADIOCONTROL" ) == 0 ) return winRadioButton; - else if ( strcmp(name, "CHECKCONTROL" ) == 0 ) return winCheckBox; - else if ( strcmp(name, "GROUPBOX" ) == 0 ) return winGroupBox; - else if ( strcmp(name, "EDITCONTROL" ) == 0 ) return winEdit; - else if ( strcmp(name, "EDIT" ) == 0 ) return winEdit; - else if ( strcmp(name, "LISTBOX" ) == 0 ) return winListBox; - else if ( strcmp(name, "COMBOBOX" ) == 0 ) return winComboBox; - else if ( strcmp(name, "SCROLLBAR" ) == 0 ) return winScrollBar; - else if ( strcmp(name, "PROGRESSBAR" ) == 0 ) return winProgressBar; - else if ( strcmp(name, "SLIDERCONTROL" ) == 0 ) return winTrackBar; - else if ( strcmp(name, "TRACKBAR" ) == 0 ) return winTrackBar; - else if ( strcmp(name, "TREECONTROL" ) == 0 ) return winTreeView; - else if ( strcmp(name, "TREEVIEW" ) == 0 ) return winTreeView; - else if ( strcmp(name, "LISTCONTROL" ) == 0 ) return winListView; - else if ( strcmp(name, "LISTVIEW" ) == 0 ) return winListView; - else if ( strcmp(name, "TABCONTROL" ) == 0 ) return winTab; - else if ( strcmp(name, "TAB" ) == 0 ) return winTab; - else if ( strcmp(name, "MONTHCALENDAR" ) == 0 ) return winMonthCalendar; - else if ( strcmp(name, "DATETIMEPICKER") == 0 ) return winDateTimePicker; + if ( StrCmpN(name, "CHECKBOX", 3 ) == 0 ) return winCheckBox; + else if ( StrCmpN(name, "COMBOBOX", 3 ) == 0 ) return winComboBox; + else if ( StrCmpN(name, "DATETIMEPICKER", 1) == 0 ) return winDateTimePicker; + else if ( StrCmpN(name, "EDIT", 1 ) == 0 ) return winEdit; + else if ( StrCmpN(name, "GROUPBOX", 1 ) == 0 ) return winGroupBox; + else if ( StrCmpN(name, "LISTBOX", 5 ) == 0 ) return winListBox; + else if ( StrCmpN(name, "LISTVIEW", 5 ) == 0 ) return winListView; + else if ( StrCmpN(name, "MONTHCALENDAR", 1 ) == 0 ) return winMonthCalendar; + else if ( StrCmpN(name, "PROGRESSBAR", 2 ) == 0 ) return winProgressBar; + else if ( StrCmpN(name, "PUSHBUTTON", 2 ) == 0 ) return winPushButton; + else if ( StrCmpN(name, "RADIOBUTTON", 1 ) == 0 ) return winRadioButton; + else if ( StrCmpN(name, "SCROLLBAR", 2 ) == 0 ) return winScrollBar; + else if ( StrCmpN(name, "SEPARATOR", 2 ) == 0 ) return winNotAControl; + else if ( StrCmpN(name, "STATIC", 2 ) == 0 ) return winStatic; + else if ( StrCmpN(name, "TAB", 3 ) == 0 ) return winTab; + else if ( StrCmpN(name, "TRACKBAR", 3 ) == 0 ) return winTrackBar; + else if ( StrCmpN(name, "TREEVIEW", 3 ) == 0 ) return winTreeView; else return winUnknown; - - } -RexxClassObject getControlClass(RexxMethodContext *c, CSTRING className, oodControl_t *controlType) +RexxClassObject oodClass4controlType(RexxMethodContext *c, oodControl_t controlType) { RexxClassObject controlClass = NULLOBJECT; - oodControl_t ctrl = oodName2controlType(className); + const char *className = controlType2className(controlType); - if ( ctrl == winUnknown ) - { - goto done_out; - } - else if ( ctrl == winRadioButton ) - { - className = "RADIOBUTTON"; - } - else if ( ctrl == winCheckBox ) - { - className = "CHECKBOX"; - } - controlClass = rxGetContextClass(c, className); if ( controlClass == NULLOBJECT ) { // An exception has been raised, which we don't want. So, clear it. c->ClearCondition(); } - -done_out: - *controlType = ctrl; return controlClass; } @@ -415,7 +486,8 @@ * checked to see if there is already an instantiated object and if so * returns that object. */ -RexxMethod3(RexxObjectPtr, advCtrl_getControl, RexxObjectPtr, rxID, OPTIONAL_uint32_t, categoryPageID, OSELF, self) +RexxMethod4(RexxObjectPtr, advCtrl_getControl, RexxObjectPtr, rxID, OPTIONAL_uint32_t, categoryPageID, + NAME, msgName, OSELF, self) { RexxMethodContext *c = context; RexxObjectPtr result = TheNilObj; @@ -454,16 +526,11 @@ // Check that the underlying Windows control is the control type requested // by the programmer. Return .nil if this is not true. - oodControl_t controlType; - RexxClassObject controlCls = getControlClass(context, c->GetMessageName() + 3, &controlType); - if ( controlCls == NULLOBJECT ) + oodControl_t controlType = oodName2controlType(msgName + 3); + if ( ! isControlMatch(hControl, controlType) ) { goto out; } - if ( ! checkControlClass(hControl, controlType) ) - { - goto out; - } RexxObjectPtr rxControl = (RexxObjectPtr)getWindowPtr(hControl, GWLP_USERDATA); if ( rxControl != NULLOBJECT ) @@ -485,6 +552,12 @@ goto out; } + RexxClassObject controlCls = oodClass4controlType(context, controlType); + if ( controlCls == NULLOBJECT ) + { + goto out; + } + pArgs->hwnd = hControl; pArgs->hwndDlg = hDlg; pArgs->id = id; @@ -541,3 +614,48 @@ } return TheNilObj; } + + +/** + * Methods for the ListBox class. + */ +#define LISTBOX_CLASS "ListBox" + + +/** ListBox::getText() + * + * Return the text of the item at the specified index. + * + * @param index The 1-based item index. (The underlying list box uses + * 0-based indexes.) + * + * @return The item's text or the empty string on error. + */ +RexxMethod2(RexxObjectPtr, lb_getText, uint32_t, index, CSELF, pCSelf) +{ + pCDialogControl pcdc = (pCDialogControl)pCSelf; + RexxStringObject result = context->NullString(); + + if ( index-- > 0 ) + { + LRESULT l = SendMessage(pcdc->hCtrl, LB_GETTEXTLEN, index, 0); + if ( l > 0 ) + { + char *buf = (char *)malloc(l + 1); + if ( buf == NULL ) + { + outOfMemoryException(context->threadContext); + return result; + } + + l = SendMessage(pcdc->hCtrl, LB_GETTEXT, (WPARAM)buf, 0); + if ( l > 0 ) + { + result = context->String(buf); + } + free(buf); + } + } + return result; +} + Modified: main/trunk/extensions/platform/windows/oodialog/oodControl.hpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/oodControl.hpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -39,41 +39,15 @@ #ifndef oodControl_Included #define oodControl_Included -// Enum for the type of Windows dialog control. -typedef enum -{ - winEdit = 0, - winCheckBox = 1, - winRadioButton = 2, - winSingleSelectListBox = 3, - winListBox = 4, - winComboBox = 5, - winTreeView = 6, - winListView = 7, - winTrackBar = 8, - winTab = 9, - winDateTimePicker = 10, - winMonthCalendar = 11, - winStatic = 20, - winButton = 21, - winGroupBox = 22, - winScrollBar = 23, - winProgressBar = 24, - - // Special values used by the data table connection, winSingleSelectListBox is also one. - winSimpleComboBox = 40, - winNotAControl = 42, - - winUnknown = 55 -} oodControl_t; - - extern uint32_t listViewStyle(CSTRING opts, uint32_t style); -extern TCHAR *controlType2winName(oodControl_t control); -extern bool checkControlClass(HWND, oodControl_t); -extern oodControl_t oodName2controlType(CSTRING name); +extern oodControl_t control2controlType(HWND hControl); +extern oodControl_t winName2controlType(const char *className); +extern const char *controlType2winName(oodControl_t control); +extern oodControl_t oodName2controlType(CSTRING name); +extern bool isControlMatch(HWND, oodControl_t); + #define ButtonAtom 0x0080 #define EditAtom 0x0081 #define StaticAtom 0x0082 Modified: main/trunk/extensions/platform/windows/oodialog/oodData.cpp =================================================================== --- main/trunk/extensions/platform/windows/oodialog/oodData.cpp 2009-09-28 16:40:57 UTC (rev 5216) +++ main/trunk/extensions/platform/windows/oodialog/oodData.cpp 2009-09-28 18:29:45 UTC (rev 5217) @@ -64,9 +64,10 @@ #include "APICommon.hpp" #include "oodCommon.hpp" +#include "oodControl.hpp" #include "oodData.hpp" -static inline int searchDataTable(DIALOGADMIN *dlgAdm, uint32_t id) +static inline oodControl_t searchDataTable(DIALOGADMIN *dlgAdm, uint32_t id) { if ( dlgAdm->Da... [truncated message content] |